#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");
    }
  }
}
NOCOMNCVCCGNDINLED1PWRRelay Module
GND5VSDASCLSQWRTCDS1307+