#include <DHT22.h>
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
unsigned long time;
float Real_time;
float Real_time_1;
float Real_time_2;
unsigned long timer = 0;
unsigned long timer_1 = 0;
unsigned long timer_2 = 0;
RTC_DS1307 rtc;
int h = 0, m = 0, T = 0, h_1 = 0, m_1 = 0, h_2 = 0, m_2 = 0, save_T = 0;
short mode = 1;
bool flag_1 = false, flag_2 = false, flag_3 = false, flag_4 = false,
flag_mode_1 = false, flag_mode_2 = false, flag_mode_3 = false,
flag_mode_4 = false;
void setup() {
rtc.begin();
LCD.init();
LCD.backlight();
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
pinMode(7, INPUT);
pinMode(6, INPUT);
pinMode(5, INPUT);
pinMode(4, INPUT);
pinMode(10, OUTPUT);
}
void loop() {
DateTime now = rtc.now();
time = millis();
if (digitalRead(4) != HIGH) {
if (flag_1 == false && timer_1 <= time) {
timer_1 = time + 100;
mode = mode + 1;
flag_mode_1 = false;
flag_mode_2 = false;
flag_mode_3 = false;
flag_mode_4 = false;
}
if (mode > 4) {
mode = 1;
}
flag_1 = true;
} else {
flag_1 = false;
}
if (digitalRead(7) != HIGH) {
if (flag_2 == false && timer_1 <= time) {
timer_1 = time + 100;
if (mode == 1) {
save_T = save_T - 10;
}
if (mode == 2) {
m_1 = m_1 - 10;
if (m_1 < 0) {
h_1 = h_1 - 1;
m_1 = 0;
}
if (h_1 < 0) {
h_1 = 0;
}
}
if (mode == 3) {
m_2 = m_2 - 10;
if (m_2 < 0) {
h_2 = h_2 - 1;
m_2 = 0;
}
if (h_2 < 0) {
h_2 = 0;
}
}
if (mode == 4) {
m = m - 10;
if (m < 0) {
h = h - 1;
m = 0;
}
if (h < 0) {
h = 0;
}
}
}
if (save_T < 0) {
save_T = 0;
}
EEPROM.put(0 * sizeof(int), save_T);
flag_2 = true;
} else {
flag_2 = false;
}
if (digitalRead(6) != HIGH) {
if (flag_3 == false && timer_1 <= time) {
timer_1 = time + 100;
if (mode == 1) {
save_T = save_T + 10;
}
if (mode == 2) {
m_1 = m_1 + 10;
if (m_1 >= 60) {
h_1 = h_1 + 1;
m_1 = 0;
}
if (h_1 >= 24) {
h_1 = 24;
m_1 = 0;
}
}
if (mode == 3) {
m_2 = m_2 + 10;
if (m_2 >= 60) {
h_2 = h_2 + 1;
m_2 = 0;
}
if (h_2 >= 24) {
h_2 = 24;
m_2 = 0;
}
}
if (mode == 4) {
m = m + 10;
if (m >= 60) {
h = h + 1;
m = 0;
}
if (h >= 24) {
h = 24;
m = 0;
}
}
}
if (save_T >= 1440) {
save_T = 1440;
}
EEPROM.put(0 * sizeof(int), save_T);
flag_3 = true;
} else {
flag_3 = false;
}
if (digitalRead(5) != HIGH) {
if (flag_4 == false && timer_1 <= time) {
timer_1 = time + 100;
digitalWrite(10, LOW);
if (mode == 1) {
flag_mode_1 = !flag_mode_1;
EEPROM.get(0 * sizeof(int), T);
}
if (mode == 2) {
flag_mode_2 = !flag_mode_2;
}
if (mode == 3) {
flag_mode_3 = !flag_mode_3;
}
if (mode == 4) {
flag_mode_4 = !flag_mode_4;
EEPROM.get(0 * sizeof(int), T);
}
}
flag_4 = true;
} else {
flag_4 = false;
}
if (timer_2 <= time) {
timer_2 = time + 1000;
if (flag_mode_1) {
if (T > 0) {
T = T - 1;
digitalWrite(10, HIGH);
} else {
digitalWrite(10, LOW);
}
}
if (flag_mode_4 && (now.hour() + (float)now.minute() / 60 +
(float)now.second() / 60 / 60) > (h + (float)m / 60)) {
if (T > 0) {
T = T - 1;
digitalWrite(10, HIGH);
} else {
digitalWrite(10, LOW);
}
}
}
if (flag_mode_2 || flag_mode_3) {
Real_time = (float)now.hour() + (float)now.minute() / 60 +
(float)now.second() / 60 / 60;
Real_time_1 = (float)h_1 + (float)m_1 / 60;
Real_time_2 = (float)h_2 + (float)m_2 / 60;
if (Real_time_1 < Real_time && Real_time_2 > Real_time) {
digitalWrite(10, HIGH);
} else {
digitalWrite(10, LOW);
}
}
if (timer <= time) {
timer = time + 500;
LCD.clear();
LCD.setCursor(0, 0);
LCD.print(now.hour(), DEC);
LCD.print(':');
LCD.print(now.minute(), DEC);
LCD.print(':');
LCD.print(now.second(), DEC);
LCD.setCursor(0, 1);
if (mode == 1) {
LCD.print("Timer:");
if (!flag_mode_1) {
LCD.print(save_T, DEC);
} else {
LCD.print(T, DEC);
}
}
if (mode == 2) {
LCD.print('[');
LCD.print(h_1, DEC);
LCD.print(':');
LCD.print(m_1, DEC);
LCD.print(']');
LCD.print('-');
LCD.print(h_2, DEC);
LCD.print(':');
LCD.print(m_2, DEC);
}
if (mode == 3) {
LCD.print(h_1, DEC);
LCD.print(':');
LCD.print(m_1, DEC);
LCD.print('-');
LCD.print('[');
LCD.print(h_2, DEC);
LCD.print(':');
LCD.print(m_2, DEC);
LCD.print(']');
}
if (mode == 4) {
LCD.print(h, DEC);
LCD.print(':');
LCD.print(m, DEC);
LCD.setCursor(6, 1);
LCD.print("Timer:");
if (!flag_mode_4) {
LCD.print(save_T, DEC);
} else {
LCD.print(T, DEC);
}
}
LCD.setCursor(9, 0);
LCD.print("M:");
LCD.print(mode, DEC);
if (flag_mode_1 || flag_mode_2 || flag_mode_3 || flag_mode_4) {
LCD.print(":On");
} else {
LCD.print(":Off");
}
}
}