#include <Wire.h>
#include <RTClib.h>
#include <EEPROM.h>
#include <LiquidCrystal.h>
#include <DHT.h>
#define DHTPIN 13
#define Humidity 10
#define Element 6
#define Motor A0
#define Ir_Sensor A1
#define DHTTYPE DHT11 // DHT 11 (AM2302)
#define MENU 7
#define UP 9
#define DOWN 8
#include <EasyButton.h>
// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 RTC;
// initialize the library with the numbers of the interface pins
int Year_1 = 0;
int Year_2 = 0;
int Year_3 = 0;
int Year_4 = 0;
int Month_1 = 0;
int Month_2 = 0;
int Day_1 = 0;
int Day_2 = 0;
int Fday_1 = 0;
int Fday_2 = 0;
int address = 0; // آدرس شروع حافظه EEPROM برای خواندن مقادیر
int year = 0;
int month = 0;
int day = 0;
int year_value = 0;
int month_value = 0;
int day_value = 0;
int Day = 0;
bool isCleared = false; // متغیر بولین برای ذخیره وضعیت پاک شدن محتوای LCD
bool isCleared_2 = false;
bool isEEpromSave = false;
int current_temperature;
int current_humidity;
//************************TimerStart
unsigned long lastMillis;
int minutes = 1;
int State = 0;
long Timestamp_Button_Pressed;
unsigned long Countdown_start;
int time_end_state = 0;
String current_time;
//************************TimerEnd
void(* resetFunc) (void) = 0; //declare reset function @ address 0
const int rs = 12, en = 11, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int menue_counter = 0;
// buttons setup
//EasyButton up(UP);
//EasyButton down(DOWN);
EasyButton Menu(MENU);
void setup() {
//****************Timer
Timestamp_Button_Pressed = millis();
lastMillis = millis();
//***************/EndeTimer
//Begin----------------------------------Part
dht.begin();
lcd.begin(16, 2);
Serial.begin(9600);
Wire.begin();
RTC.begin();
//PinMode---------------------------------Part
pinMode(Element, OUTPUT);
pinMode(Humidity, OUTPUT);
pinMode(Motor, OUTPUT);
pinMode(Ir_Sensor, INPUT);
// pinMode(UP, INPUT);
// pinMode(MENU, INPUT);
//
if (!RTC.isrunning()) {
Serial.println("RTC is NOT running!");
/// RTC.adjust(DateTime(__DATE__, __TIME__));
}
EEPROM.get(address, year_value);
EEPROM.get(address + sizeof(year), month_value);
EEPROM.get(address + sizeof(year) + sizeof(month), day_value);
Serial.println(year_value);
Serial.println(month_value);
Serial.println(day_value);
lcd.setCursor(0, 0); // bottom left
lcd.print("***** SANE *****");
lcd.setCursor(0, 1); // bottom left
lcd.print("TechnicalServices");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // bottom left
lcd.print("Date Set :");
lcd.setCursor(0, 1); // bottom left
lcd.print(year_value);
lcd.print("/");
lcd.print(month_value);
lcd.print("/");
lcd.print(day_value);
delay(5000);
lcd.clear();
}
void loop() {
//*********Timer**************
if (minutes * 60000 > (millis() - Countdown_start))
{
current_time = TimeLeft((minutes * 60000 - (millis() - Countdown_start)));
time_end_state = 1;
} else {
time_end_state = 0;
}
if (time_end_state == 0) {
int ir_Sernsor ;
while (true) {
ir_Sernsor = analogRead(Ir_Sensor);
digitalWrite(Motor, 1023);
if(ir_Sernsor > 900){
break;
}
}
digitalWrite(Motor, 0);
call_timer();
}
//*****************EndTimer***************
Menu.update();
Serial.println(menue_counter);
if ( Menu.isPressed() ) {
menue_counter++;
delay(200);
if (menue_counter >= 15) {
menue_counter = 0;
}
}
switch (menue_counter) {
case 0:
isCleared = false;
isEEpromSave = false;
main_page();
break;
case 1:
isCleared = false;
date_time_placeholder();
break;
case 2:
Year_1 = set_value(Year_1);
Display_x(String(Year_1), 5);
break;
case 3:
Year_2 = set_value(Year_2);
Display_x(String(Year_2), 6);
break;
case 4:
Year_3 = set_value(Year_3);
Display_x(String(Year_3), 7);
break;
case 5:
Year_4 = set_value(Year_4);
Display_x(String(Year_4), 8);
break;
case 6:
Display_x("/", 9);
break;
case 7:
Month_1 = set_value(Month_1);
Display_x(String(Month_1), 10);
break;
case 8:
Month_2 = set_value(Month_2);
Display_x(String(Month_2), 11);
break;
case 9:
Display_x("/", 12);
break;
case 10:
Day_1 = set_value(Day_1);
Display_x(String(Day_1), 13);
break;
case 11:
Day_2 = set_value(Day_2);
Display_x(String(Day_2), 14);
break;
case 12:
lcd.setCursor(14, 1);
lcd.print(" ");
Fday_1 = set_value(Fday_1);
Display_y(String(Fday_1), 5);
break;
case 13:
Fday_2 = set_value(Fday_2);
Display_y(String(Fday_2), 6);
break;
case 14:
adjest_date("Done....");
resetFunc(); //call reset
break;
}
// Serial.println(menue_counter);
DateTime now = RTC.now();
// خواندن تاریخ و زمان فعلی
int year = now.year();
int month = now.month();
int day = now.day();
//Serial.println(day_remain());
}
int set_value(int temp) {
if ( digitalRead(UP) == HIGH ) {
temp++;
delay(200);
if (temp >= 10) {
temp = 0;
}
return temp;
}
if ( digitalRead(DOWN) == HIGH ) {
temp--;
delay(200);
if (temp >= 10 || temp <= 0) {
temp = 0;
}
return temp;
}
}
void date_time_placeholder() {
lcd.setCursor(0, 0); // bottom left
lcd.print("Date: ");
lcd.setCursor(0, 1); // bottom left
lcd.print("Day: ");
}
void Display_x(String value, int x ) {
lcd.setCursor(x, 0); // bottom left
lcd.print(value);
lcd.setCursor(x - 1, 1); // bottom left
lcd.print(" ");
lcd.setCursor(x, 1); // bottom left
lcd.print("^");
}
void Display_y(String value, int x ) {
lcd.setCursor(x, 1); // bottom left
lcd.print(value);
lcd.setCursor(x + 1, 1); // bottom left
lcd.print("<");
}
void adjest_date(String value) {
String Year = String(Year_1) + String(Year_2) + String(Year_3) + String(Year_4);
String Month = String(Month_1) + String(Month_2);
String Day = String(Day_1) + String(Day_2);
String Fday = String(Fday_1) + String(Fday_2);
RTC.adjust(DateTime(Year.toInt(), Month.toInt(), Day.toInt(), 0, 0, 0));
day_remain_date_save_eeprom(Fday.toInt());
if (!isCleared_2) {
lcd.clear(); // پاک کردن محتوای ال سی دی
isCleared_2 = true; // تغییر وضعیت به پاک شده
}
lcd.setCursor(0, 0); // bottom left
lcd.print(value);
}
void day_remain_date_save_eeprom(int day_f) {
if (!isEEpromSave) {
DateTime futureDate = RTC.now() + TimeSpan(day_f, 0, 0, 0); // 20 روز = 20 * 24 ساعت * 60 دقیقه * 60 ثانیه
// خواندن تاریخ جدید
year = futureDate.year();
month = futureDate.month();
day = futureDate.day();
EEPROM.put(address, year);
EEPROM.put(address + sizeof(year), month);
EEPROM.put(address + sizeof(year) + sizeof(month), day);
isEEpromSave = true;
}
}
int day_remain() {
// محاسبه تاریخ دیگر
DateTime otherDate(year_value, month_value, day_value, 0, 0, 0); // ساعت 00:00:00، تاریخ 2024/03/01
// محاسبه تفاوت روزها
TimeSpan difference = otherDate - RTC.now();
int daysDifference = difference.days();
return daysDifference;
}
void main_page() {
current_temperature = dht.readTemperature();
current_humidity = dht.readHumidity();
lcd.setCursor(0, 0);
lcd.print(current_time);
lcd.print(" S D:-> ");
//lcd.setCursor(8, 0);
lcd.print(day_remain());
//lcd.setCursor(10, 0);
lcd.print(" ******");
lcd.setCursor(0, 1);
lcd.print("Temp:");
lcd.print(current_temperature);
lcd.print((char)223);
lcd.print("C");
lcd.print(" Hum:");
lcd.print(current_humidity);
lcd.print("%");
lcd.print((char)140);
control (current_temperature, current_humidity) ;
delay(100);
}
void control (int temp, int hum) {
int day_R = day_remain();
if (day_R > 4) {
if (temp < 37) {
digitalWrite(Element, HIGH);
} else {
digitalWrite(Element, LOW);
}
if (hum < 55) {
digitalWrite(Humidity, HIGH);
} else {
digitalWrite(Humidity, LOW);
}
} else {
if (temp > 33) {
digitalWrite(Element, HIGH);
} else {
digitalWrite(Element, LOW);
}
if (hum > 55) {
digitalWrite(Humidity, HIGH);
} else {
digitalWrite(Humidity, LOW);
}
}
}
void call_timer() {
if (time_end_state == 0) {
if (millis() - Timestamp_Button_Pressed > 200) {
if (State == 0) {
Countdown_start = millis();
}
}
}
}
String TimeLeft(unsigned long MsLeft) {
String Result;
int M;
int S;
M = (long)MsLeft / 60000;
if (M < 10) Result = (String)"0" + M + ":"; else Result = (String)M + ":";
S = (long)((MsLeft - M * 60000) / 1000);
if (S < 10) Result = (String)Result + "0" + S ; else Result = (String)Result + S;
return Result;
}