#include "RTClib.h"
#include "Wire.h"
#include <LiquidCrystal_I2C.h>
#include <Button.h>
#include "EEPROM.h"
#include "DHT22.h"

#define ON 1
#define OFF 0

#define DN_PIN 13
#define UP_PIN 12
#define SET_PIN 11
#define ALR_PIN 10
#define PULLUP true
#define INVERT true
#define DEBOUNCE_MS 20
#define REPEAT_FIRST 500
#define REPEAT_INCR 100

#define DHTPIN A0
#define DHTTYPE DHT22

// Custom character definitions
byte znak_a[8] = {
  B00000,
  B01110,
  B00001,
  B01111,
  B10001,
  B01111,
  B00010,
  B00001
};//ą
byte znak_l[8] = {
  B01100,
  B00100,
  B00110,
  B00100,
  B01100,
  B00100,
  B01110,
  B00000
};//ł
byte znak_O[8] = {
  B01101,
  B10010,
  B10101,
  B10001,
  B10001,
  B10001,
  B01110,
  B00000
};//Ó
byte znak_N[8] = {
  B00010,
  B10101,
  B11001,
  B10101,
  B10011,
  B10001,
  B10001,
  B00000
};
byte znak_S[8] = {
  B00001,
  B01110,
  B10000,
  B10000,
  B01110,
  B00001,
  B11110,
  B00000
};//Ś
byte znak_Z[8] = {
  B00010,
  B11111,
  B01001,
  B00010,
  B00100,
  B01000,
  B11111,
  B00000
};//Ź

String days[] = {
  "Niedziela",
  "Poniedzi" + String("znak_l") + "ek",
  "Wtorek",
  String("znak_S") + "roda",
  "Czwartek",
  "Pi" + String("znak_a") + "tek",
  "Sobota"
};

DHT22 dht(DHTPIN);

Button btnUP(UP_PIN);
Button btnDN(DN_PIN);
Button btnSET(SET_PIN);
Button btnALR(ALR_PIN);

enum { WAIT, INCR, DECR };
uint8_t STATE;
int count;
int lastCount = -1;
unsigned long rpt = REPEAT_FIRST;

LiquidCrystal_I2C lcd(0x27, 16, 4);
uint8_t dgrsChar[8] = {0x4, 0xa, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0};

RTC_DS1307 rtc;
DateTime now;

struct Timer {
  uint8_t startHH, startMM, finishHH, finishMM;
};

Timer timers[8];

uint8_t hh = 0, mm = 0, ss = 0, dd = 0, bb = 0;
int yy = 0;
String Day = "   ";
uint8_t setMode = 0, setAlarm = 0;
uint8_t alarmMode = 1;

bool colonState = true; // Stan migania dwukropków
bool timerMode = false; // Stan trybu timera

uint8_t StartHH, StartMM, FinishHH, FinishMM;
uint8_t StartHH2, StartMM2, FinishHH2, FinishMM2;
uint8_t StartHH3, StartMM3, FinishHH3, FinishMM3;
uint8_t StartHH4, StartMM4, FinishHH4, FinishMM4;
uint8_t StartHH5, StartMM5, FinishHH5, FinishMM5;
uint8_t StartHH6, StartMM6, FinishHH6, FinishMM6;
uint8_t StartHH7, StartMM7, FinishHH7, FinishMM7;
uint8_t StartHH8, StartMM8, FinishHH8, FinishMM8;

void setup() {
  Serial.begin(9600);
  //delay(500);
  timerMode = false; // Ustawienie CLOCK na start
  setAlarm = 0;
  for (int i = 2; i <= 9; i++) {
    pinMode(i, OUTPUT);
    digitalWrite(i, OFF);
  }
  pinMode(UP_PIN, INPUT_PULLUP);
  pinMode(DN_PIN, INPUT_PULLUP);
  pinMode(SET_PIN, INPUT_PULLUP);
  pinMode(ALR_PIN, INPUT_PULLUP);

  lcd.begin(16, 4);
  lcd.createChar(1, znak_a);
  lcd.createChar(2, znak_l);
  lcd.createChar(3, znak_N);
  lcd.createChar(4, znak_O);
  lcd.createChar(5, znak_S);
  lcd.createChar(6, znak_Z);

  rtc.begin();
  lcd.createChar(0, dgrsChar);

  lcd.setCursor(0, 1);
  lcd.print(F("        TIMER     "));
  lcd.setCursor(0, 2);//+String("\1")+
  lcd.print("   8 PRZEKA" + String("\6") + "NIK" + String("\4") + "W ");
  delay(1000);
  lcd.clear();

  setAlarm = 0;
  // Inicjalizacja zmiennych timerów
  StartHH = 0; StartMM = 0; FinishHH = 0; FinishMM = 0;
  StartHH2 = 0; StartMM2 = 0; FinishHH2 = 0; FinishMM2 = 0;
  StartHH3 = 0; StartMM3 = 0; FinishHH3 = 0; FinishMM3 = 0;
  StartHH4 = 0; StartMM4 = 0; FinishHH4 = 0; FinishMM4 = 0;
  StartHH5 = 0; StartMM5 = 0; FinishHH5 = 0; FinishMM5 = 0;
  StartHH6 = 0; StartMM6 = 0; FinishHH6 = 0; FinishMM6 = 0;
  StartHH7 = 0; StartMM7 = 0; FinishHH7 = 0; FinishMM7 = 0;
  StartHH8 = 0; StartMM8 = 0; FinishHH8 = 0; FinishMM8 = 0;

  ReadEeprom();
}

void loop() {
  if (btnALR.pressed()) {
    Serial.println("ALR przyciśnięty!");  // Sprawdzenie
    if (timerMode) {
        timerMode = false;
        setAlarm = 0;
    } else {
        timerMode = true;
        setAlarm = 2; // Rozpocznij ustawianie pierwszego timera
    }
}
  float h = dht.getHumidity();
  float t = dht.getTemperature();
  DateTime now = rtc.now();
  int dayOfWeek = now.dayOfTheWeek();
  Day = days[dayOfWeek];

  btnUP.read();
  btnDN.read();
  btnSET.read();
  btnALR.read();

if (digitalRead(ALR_PIN) == LOW) {  // Aktywny stan niski
    delay(50);  // Debounce
    if (digitalRead(ALR_PIN) == LOW) {
        Serial.println("ALR przyciśnięty!");
        timerMode = !timerMode;
        setAlarm = timerMode ? 2 : 0;
        while (digitalRead(ALR_PIN) == LOW);  // Czekaj na puszczenie
    }
}
  if (!timerMode) {
    if (setMode == 0) {
      hh = now.hour();
      mm = now.minute();
      ss = now.second();
      dd = now.day();
      bb = now.month();
      yy = now.year();
    }

    if (isnan(h) || isnan(t)) {
      lcd.setCursor(0, 0);
      lcd.print(F("DHT Error!"));
    } else {
      //if (setAlarm < 2) {
      ss = now.second(); // Aktualizacja sekund
      lcd.setCursor(0, 0);
      lcd.print((dd < 10) ? "0" : "");
      lcd.print(dd);
      lcd.print(".");
      lcd.print((bb < 10) ? "0" : "");
      lcd.print(bb);
      lcd.print(".");
      lcd.print(yy);
      lcd.print("  ");
      lcd.print((hh < 10) ? "0" : "");
      lcd.print(hh);
      lcd.print(colonState ? ":" : " "); // Migające dwukropki
      lcd.print((mm < 10) ? "0" : "");
      lcd.print(mm);
      lcd.print(".");
      lcd.print((ss < 10) ? "0" : "");
      lcd.print(ss);
      lcd.setCursor(0, 1);
      lcd.print(Day);
      //}
      lcd.setCursor(0, 2);
      lcd.print("H:");
      lcd.print(h);
      lcd.print("%");
      lcd.setCursor(11, 2);
      lcd.print("T:");
      lcd.print(t);
      lcd.print((char)0);
      lcd.print("C");

      lcd.setCursor(0, 3);
      lcd.print("T: ");
      for (int i = 0; i < 8; i++) {
        if (handleTimer(timers[i], i + 2)) {
          lcd.print(char(255)); // Wyświetl cyfrę w negatywie
          lcd.print(" ");
        } else {
          lcd.print(i + 1);
          lcd.print(" ");
        }
      }
    }
  }
  colonState = !colonState;
  //blinking();
  setupClock();
  if (timerMode && setAlarm > 1) { // Wywołaj setTimer() tylko, gdy setAlarm > 1
    setTimer();
  }
  delay(1000);
}

bool handleTimer(Timer t, int relayPin) {
  if (alarmMode == 1 && hh == t.startHH && mm == t.startMM) {
    digitalWrite(relayPin, ON);
    return true; // Timer jest aktywny
  }
  if (alarmMode == 1 && hh == t.finishHH && mm == t.finishMM) {
    digitalWrite(relayPin, OFF);
    return false; // Timer nie jest aktywny
  }
  return digitalRead(relayPin) == HIGH; // Zwróć aktualny stan przekaźnika
}

void blinking () {
  // BLINKING SCREEN
  if (setAlarm < 2 && setMode != 0) {
    delay (100);
  }
  if (setAlarm < 2 && setMode == 1) {
    lcd.setCursor(5, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setAlarm < 2 && setMode == 2 && bb > 9) {
    lcd.setCursor(8, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setAlarm < 2 && setMode == 2 && bb <= 9) {
    lcd.setCursor(8, 0);
    lcd.print(F(" "));
    delay(100);
  }
  if (setAlarm < 2 && setMode == 3 && bb > 9) {
    lcd.setCursor(11, 0);
    lcd.print(F("    "));
    delay(100);
  }
  if (setAlarm < 2 && setMode == 3 && bb <= 9) {
    lcd.setCursor(10, 0);
    lcd.print(F("    "));
    delay(100);
  }
  if (setAlarm < 2 && setMode == 4) {
    lcd.setCursor(0, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setAlarm < 2 && setMode == 5) {
    lcd.setCursor(3, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setAlarm < 2 && setMode == 6) {
    lcd.setCursor(6, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm != 0  && setAlarm != 1) {
    delay (100);
  }
  // Relay1
  if (setMode == 0 && setAlarm == 2) {
    lcd.setCursor(11, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 3) {
    lcd.setCursor(14, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 4) {
    lcd.setCursor(11, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 5) {
    lcd.setCursor(14, 1);
    lcd.print(F("  "));
    delay(100);
  }
  // Relay2
  if (setMode == 0 && setAlarm == 6) {
    lcd.setCursor(11, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 7) {
    lcd.setCursor(14, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 8) {
    lcd.setCursor(11, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 9) {
    lcd.setCursor(14, 1);
    lcd.print(F("  "));
    delay(100);
  }
  // Relay3
  if (setMode == 0 && setAlarm == 10) {
    lcd.setCursor(11, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 11) {
    lcd.setCursor(14, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 12) {
    lcd.setCursor(11, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 13) {
    lcd.setCursor(14, 1);
    lcd.print(F("  "));
    delay(100);
  }
  // Relay4
  if (setMode == 0 && setAlarm == 14) {
    lcd.setCursor(11, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 15) {
    lcd.setCursor(14, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 16) {
    lcd.setCursor(11, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 17) {
    lcd.setCursor(14, 1);
    lcd.print(F("  "));
    delay(100);
  }
  // Relay5
  if (setMode == 0 && setAlarm == 18) {
    lcd.setCursor(11, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 19) {
    lcd.setCursor(14, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 20) {
    lcd.setCursor(11, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 21) {
    lcd.setCursor(14, 1);
    lcd.print(F("  "));
    delay(100);
  }
  // Relay6
  if (setMode == 0 && setAlarm == 22) {
    lcd.setCursor(11, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 23) {
    lcd.setCursor(14, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 24) {
    lcd.setCursor(11, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 25) {
    lcd.setCursor(14, 1);
    lcd.print(F("  "));
    delay(100);
  }
  // Relay7
  if (setMode == 0 && setAlarm == 26) {
    lcd.setCursor(11, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 27) {
    lcd.setCursor(14, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 28) {
    lcd.setCursor(11, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 29) {
    lcd.setCursor(14, 1);
    lcd.print(F("  "));
    delay(100);
  }
  // Relay8
  if (setMode == 0 && setAlarm == 30) {
    lcd.setCursor(11, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 31) {
    lcd.setCursor(14, 0);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 32) {
    lcd.setCursor(11, 1);
    lcd.print(F("  "));
    delay(100);
  }
  if (setMode == 0 && setAlarm == 33) {
    lcd.setCursor(14, 1);
    lcd.print(F("  "));
    delay(100);
  }
}

// Ustawianie zegara, wskazówek, alarmu/timera
void setupClock(void) {
  btnUP.read();
  btnDN.read();
  btnSET.read();
  btnALR.read();

  if (setMode == 7) {
    lcd.setCursor(0, 0);
    lcd.print(F("Set Date Finish "));
    lcd.setCursor(0, 1);
    lcd.print(F("Set Time Finish "));
    delay(1000);
    rtc.adjust(DateTime(yy, bb, dd, hh, mm, ss));
    lcd.clear();
    setMode = 0;
  }

  if (setAlarm == 34) {
    lcd.setCursor(0, 0);
    lcd.print(F("Set Timer Finish"));
    lcd.setCursor(0, 1);
    lcd.print(F("-EEPROM Updated-"));
    WriteEeprom();
    delay(2000);
    lcd.clear();
    setAlarm = 0;
    alarmMode = 1;
  }

  if (setAlarm > 0) {
    alarmMode = 0;
  }

  switch (STATE) {
    case WAIT:
      if (btnSET.pressed()) {
        if (setAlarm > 1 && setAlarm < 34) {
          setAlarm++; // Przejdź do następnego timera/kroku
        } else {
          setMode = setMode + 1; // Przejdź do następnego trybu ustawiania (zegar/data/etc.)
        }
      }
      if (btnALR.pressed()) {
        if (timerMode) {
          timerMode = false; // Wyłącz tryb timera
          setAlarm = 0; // Wyjdź z ustawiania timera
        } else {
          setAlarm = 2; // Rozpocznij ustawianie timera 1
          timerMode = true;
        }
      }
      if (btnUP.pressed()) {
        STATE = INCR;
      } else if (btnDN.pressed()) {
        STATE = DECR;
      } else if (btnUP.released()) {
        rpt = REPEAT_FIRST;
      } else if (btnDN.released()) {
        rpt = REPEAT_FIRST;
      }
      break;

    case INCR:
      if (setAlarm < 2 && setMode == 1 && dd < 31)dd = dd + 1;
      if (setAlarm < 2 && setMode == 2 && bb < 12)bb = bb + 1;
      if (setAlarm < 2 && setMode == 3 && yy < 2050)yy = yy + 1;
      if (setAlarm < 2 && setMode == 4 && hh < 23)hh = hh + 1;
      if (setAlarm < 2 && setMode == 5 && mm < 59)mm = mm + 1;
      if (setAlarm < 2 && setMode == 6 && ss < 59)ss = ss + 1;
      // Relay1
      if (setMode == 0 && setAlarm == 2 && StartHH < 23)StartHH = StartHH + 1;
      if (setMode == 0 && setAlarm == 3 && StartMM < 59)StartMM = StartMM + 1;
      if (setMode == 0 && setAlarm == 4 && FinishHH < 23)FinishHH = FinishHH + 1;
      if (setMode == 0 && setAlarm == 5 && FinishMM < 59)FinishMM = FinishMM + 1;
      // Relay2
      if (setMode == 0 && setAlarm == 6 && StartHH2 < 23)StartHH2 = StartHH2 + 1;
      if (setMode == 0 && setAlarm == 7 && StartMM2 < 59)StartMM2 = StartMM2 + 1;
      if (setMode == 0 && setAlarm == 8 && FinishHH2 < 23)FinishHH2 = FinishHH2 + 1;
      if (setMode == 0 && setAlarm == 9 && FinishMM2 < 59)FinishMM2 = FinishMM2 + 1;
      // Relay3
      if (setMode == 0 && setAlarm == 10 && StartHH3 < 23)StartHH3 = StartHH3 + 1;
      if (setMode == 0 && setAlarm == 11 && StartMM3 < 59)StartMM3 = StartMM3 + 1;
      if (setMode == 0 && setAlarm == 12 && FinishHH3 < 23)FinishHH3 = FinishHH3 + 1;
      if (setMode == 0 && setAlarm == 13 && FinishMM3 < 59)FinishMM3 = FinishMM3 + 1;
      // Relay4
      if (setMode == 0 && setAlarm == 14 && StartHH4 < 23)StartHH4 = StartHH4 + 1;
      if (setMode == 0 && setAlarm == 15 && StartMM4 < 59)StartMM4 = StartMM4 + 1;
      if (setMode == 0 && setAlarm == 16 && FinishHH4 < 23)FinishHH4 = FinishHH4 + 1;
      if (setMode == 0 && setAlarm == 17 && FinishMM4 < 59)FinishMM4 = FinishMM4 + 1;
      // Relay5
      if (setMode == 0 && setAlarm == 18 && StartHH5 < 23)StartHH5 = StartHH5 + 1;
      if (setMode == 0 && setAlarm == 19 && StartMM5 < 59)StartMM5 = StartMM5 + 1;
      if (setMode == 0 && setAlarm == 20 && FinishHH5 < 23)FinishHH5 = FinishHH5 + 1;
      if (setMode == 0 && setAlarm == 21 && FinishMM5 < 59)FinishMM5 = FinishMM5 + 1;
      // Relay6
      if (setMode == 0 && setAlarm == 22 && StartHH6 < 23)StartHH6 = StartHH6 + 1;
      if (setMode == 0 && setAlarm == 23 && StartMM6 < 59)StartMM6 = StartMM6 + 1;
      if (setMode == 0 && setAlarm == 24 && FinishHH6 < 23)FinishHH6 = FinishHH6 + 1;
      if (setMode == 0 && setAlarm == 25 && FinishMM6 < 59)FinishMM6 = FinishMM6 + 1;
      // Relay7
      if (setMode == 0 && setAlarm == 26 && StartHH7 < 23)StartHH7 = StartHH7 + 1;
      if (setMode == 0 && setAlarm == 27 && StartMM7 < 59)StartMM7 = StartMM7 + 1;
      if (setMode == 0 && setAlarm == 28 && FinishHH7 < 23)FinishHH7 = FinishHH7 + 1;
      if (setMode == 0 && setAlarm == 29 && FinishMM7 < 59)FinishMM7 = FinishMM7 + 1;
      // Relay8
      if (setMode == 0 && setAlarm == 30 && StartHH8 < 23)StartHH8 = StartHH8 + 1;
      if (setMode == 0 && setAlarm == 31 && StartMM8 < 59)StartMM8 = StartMM8 + 1;
      if (setMode == 0 && setAlarm == 32 && FinishHH8 < 23)FinishHH8 = FinishHH8 + 1;
      if (setMode == 0 && setAlarm == 33 && FinishMM8 < 59)FinishMM8 = FinishMM8 + 1;

      STATE = WAIT;
      break;

    case DECR:
      if (setAlarm < 2 && setMode == 1 && dd > 1)dd = dd - 1;
      if (setAlarm < 2 && setMode == 2 && bb > 1)bb = bb - 1;
      if (setAlarm < 2 && setMode == 3 && yy > 2000)yy = yy - 1;
      if (setAlarm < 2 && setMode == 4 && hh > 0)hh = hh - 1;
      if (setAlarm < 2 && setMode == 5 && mm > 0)mm = mm - 1;
      if (setAlarm < 2 && setMode == 6 && ss > 0)ss = ss - 1;
      // Relay1
      if (setMode == 0 && setAlarm == 2 && StartHH > 0)StartHH = StartHH - 1;
      if (setMode == 0 && setAlarm == 3 && StartMM > 0)StartMM = StartMM - 1;
      if (setMode == 0 && setAlarm == 4 && FinishHH > 0)FinishHH = FinishHH - 1;
      if (setMode == 0 && setAlarm == 5 && FinishMM > 0)FinishMM = FinishMM - 1;
      // Relay2
      if (setMode == 0 && setAlarm == 6 && StartHH2 > 0)StartHH2 = StartHH2 - 1;
      if (setMode == 0 && setAlarm == 7 && StartMM2 > 0)StartMM2 = StartMM2 - 1;
      if (setMode == 0 && setAlarm == 8 && FinishHH2 > 0)FinishHH2 = FinishHH2 - 1;
      if (setMode == 0 && setAlarm == 9 && FinishMM2 > 0)FinishMM2 = FinishMM2 - 1;
      // Relay3
      if (setMode == 0 && setAlarm == 10 && StartHH3 > 0)StartHH3 = StartHH3 - 1;
      if (setMode == 0 && setAlarm == 11 && StartMM3 > 0)StartMM3 = StartMM3 - 1;
      if (setMode == 0 && setAlarm == 12 && FinishHH3 > 0)FinishHH3 = FinishHH3 - 1;
      if (setMode == 0 && setAlarm == 13 && FinishMM3 > 0)FinishMM3 = FinishMM3 - 1;
      // Relay4
      if (setMode == 0 && setAlarm == 14 && StartHH4 > 0)StartHH4 = StartHH4 - 1;
      if (setMode == 0 && setAlarm == 15 && StartMM4 > 0)StartMM4 = StartMM4 - 1;
      if (setMode == 0 && setAlarm == 16 && FinishHH4 > 0)FinishHH4 = FinishHH4 - 1;
      if (setMode == 0 && setAlarm == 17 && FinishMM4 > 0)FinishMM4 = FinishMM4 - 1;
      // Relay5
      if (setMode == 0 && setAlarm == 18 && StartHH5 > 0)StartHH5 = StartHH5 - 1;
      if (setMode == 0 && setAlarm == 19 && StartMM5 > 0)StartMM5 = StartMM5 - 1;
      if (setMode == 0 && setAlarm == 20 && FinishHH5 > 0)FinishHH5 = FinishHH5 - 1;
      if (setMode == 0 && setAlarm == 21 && FinishMM5 > 0)FinishMM5 = FinishMM5 - 1;
      // Relay6
      if (setMode == 0 && setAlarm == 22 && StartHH6 > 0)StartHH6 = StartHH6 - 1;
      if (setMode == 0 && setAlarm == 23 && StartMM6 > 0)StartMM6 = StartMM6 - 1;
      if (setMode == 0 && setAlarm == 24 && FinishHH6 > 0)FinishHH6 = FinishHH6 - 1;
      if (setMode == 0 && setAlarm == 25 && FinishMM6 > 0)FinishMM6 = FinishMM6 - 1;
      // Relay7
      if (setMode == 0 && setAlarm == 26 && StartHH7 > 0)StartHH7 = StartHH7 - 1;
      if (setMode == 0 && setAlarm == 27 && StartMM7 > 0)StartMM7 = StartMM7 - 1;
      if (setMode == 0 && setAlarm == 28 && FinishHH7 > 0)FinishHH7 = FinishHH7 - 1;
      if (setMode == 0 && setAlarm == 29 && FinishMM7 > 0)FinishMM7 = FinishMM7 - 1;
      // Relay8
      if (setMode == 0 && setAlarm == 30 && StartHH8 > 0)StartHH8 = StartHH8 - 1;
      if (setMode == 0 && setAlarm == 31 && StartMM8 > 0)StartMM8 = StartMM8 - 1;
      if (setMode == 0 && setAlarm == 32 && FinishHH8 > 0)FinishHH8 = FinishHH8 - 1;
      if (setMode == 0 && setAlarm == 33 && FinishMM8 > 0)FinishMM8 = FinishMM8 - 1;

      STATE = WAIT;
      break;
  }
}

void Timer1 (uint8_t StartHH, uint8_t StartMM, uint8_t FinishHH, uint8_t FinishMM) {
  // Timer ON
  if (alarmMode == 1 && hh >= StartHH && mm >= StartMM) {
    digitalWrite(2, ON);
  }
  // Timer OFF
  if (alarmMode == 1 && hh >= FinishHH && mm >= FinishMM ) {
    digitalWrite(2, OFF);
    // alarmMode = 0;
  }
}
void Timer2 (uint8_t StartHH2, uint8_t StartMM2, uint8_t FinishHH2, uint8_t FinishMM2) {
  //T imer ON
  if (alarmMode == 1 && hh >= StartHH2 && mm >= StartMM2) {
    digitalWrite(3, ON);
  }
  // Timer OFF
  if (alarmMode == 1 && hh >= FinishHH2 && mm >= FinishMM2 ) {
    digitalWrite(3, OFF);
    // alarmMode = 0;
  }
}
void Timer3 (uint8_t StartHH3, uint8_t StartMM3, uint8_t FinishHH3, uint8_t FinishMM3) {
  // Timer ON
  if (alarmMode == 1 && hh >= StartHH3 && mm >= StartMM3) {
    digitalWrite(4, ON);
  }
  // Timer OFF
  if (alarmMode == 1 && hh >= FinishHH3 && mm >= FinishMM3 ) {
    digitalWrite(4, OFF);
    // alarmMode = 0;
  }
}
void Timer4 (uint8_t StartHH4, uint8_t StartMM4, uint8_t FinishHH4, uint8_t FinishMM4) {
  // Timer ON
  if (alarmMode == 1 && hh >= StartHH4 && mm >= StartMM4) {
    digitalWrite(5, ON);
  }
  // Timer OFF
  if (alarmMode == 1 && hh >= FinishHH4 && mm >= FinishMM4 ) {
    digitalWrite(5, OFF);
    //alarmMode = 0;
  }
}
void Timer5 (uint8_t StartHH5, uint8_t StartMM5, uint8_t FinishHH5, uint8_t FinishMM5) {
  // Timer ON
  if (alarmMode == 1 && hh >= StartHH5 && mm >= StartMM5) {
    digitalWrite(6, ON);
  }
  // Timer OFF
  if (alarmMode == 1 && hh >= FinishHH5 && mm >= FinishMM5 ) {
    digitalWrite(6, OFF);
    // alarmMode = 0;
  }
}
void Timer6 (uint8_t StartHH6, uint8_t StartMM6, uint8_t FinishHH6, uint8_t FinishMM6) {
  // Timer ON
  if (alarmMode == 1 && hh >= StartHH6 && mm >= StartMM6) {
    digitalWrite(7, ON);
  }
  // Timer OFF
  if (alarmMode == 1 && hh >= FinishHH6 && mm >= FinishMM6 ) {
    digitalWrite(7, OFF);
    // alarmMode = 0;
  }
}
void Timer7 (uint8_t StartHH7, uint8_t StartMM7, uint8_t FinishHH7, uint8_t FinishMM7) {
  // Timer ON
  if (alarmMode == 1 && hh >= StartHH7 && mm >= StartMM7) {
    digitalWrite(8, ON);
  }
  // Timer OFF
  if (alarmMode == 1 && hh >= FinishHH7 && mm >= FinishMM7 ) {
    digitalWrite(8, OFF);
    // alarmMode = 0;
  }
}
void Timer8 (uint8_t StartHH8, uint8_t StartMM8, uint8_t FinishHH8, uint8_t FinishMM8) {
  //Timer ON
  if (alarmMode == 1 && hh >= StartHH8 && mm >= StartMM8) {
    digitalWrite(9, ON);
  }
  // Timer OFF
  if (alarmMode == 1 && hh >= FinishHH8 && mm >= FinishMM8 ) {
    digitalWrite(9, OFF);
    // alarmMode = 0;
  }
}

void setTimer() {

  if (setAlarm > 1) {

    int timerIndex = (setAlarm - 2) / 4;
    int editMode = (setAlarm - 2) % 4;

    lcd.setCursor(0, 0);
    lcd.print("K");
    lcd.print(timerIndex + 1);
    lcd.print(" ");
  }

  // Relay1
  if (setMode == 0 && setAlarm != 0 && setAlarm != 1 && setAlarm >= 2 && setAlarm <= 5 ) {
    lcd.setCursor (0, 0);
    lcd.print(F("K1 Start :"));
    lcd.setCursor (11, 0);
    if (StartHH < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartHH); lcd.print(F(":"));
    if (StartMM < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartMM);
    lcd.setCursor (0, 1);
    lcd.print(F("K1 Koniec:"));
    lcd.setCursor (11, 1);
    if (FinishHH < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishHH); lcd.print(F(":"));
    if (FinishMM < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishMM);
  }
  // Relay2
  if (setMode == 0 && setAlarm != 0 && setAlarm != 1 && setAlarm >= 6 && setAlarm <= 9 ) {
    lcd.setCursor (0, 0);
    lcd.print(F("K2 Start :"));
    lcd.setCursor (11, 0);
    if (StartHH2 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartHH2); lcd.print(F(":"));
    if (StartMM2 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartMM2);
    lcd.setCursor (0, 1);
    lcd.print(F("K2 Koniec:"));
    lcd.setCursor (11, 1);
    if (FinishHH2 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishHH2); lcd.print(F(":"));
    if (FinishMM2 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishMM2);
  }
  // Relay3
  if (setMode == 0 && setAlarm != 0 && setAlarm != 1 && setAlarm >= 10 && setAlarm <= 13 ) {
    lcd.setCursor (0, 0);
    lcd.print(F("K3 Start :"));
    lcd.setCursor (11, 0);
    if (StartHH3 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartHH3); lcd.print(F(":"));
    if (StartMM3 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartMM3);

    lcd.setCursor (0, 1);
    lcd.print(F("K3 Koniec:"));
    lcd.setCursor (11, 1);
    if (FinishHH3 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishHH3); lcd.print(F(":"));
    if (FinishMM3 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishMM3);
  }
  // Relay4
  if (setMode == 0 && setAlarm != 0 && setAlarm != 1 && setAlarm >= 14 && setAlarm <= 17 ) {
    lcd.setCursor (0, 0);
    lcd.print(F("K4 Start :"));
    lcd.setCursor (11, 0);
    if (StartHH4 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartHH4); lcd.print(F(":"));
    if (StartMM4 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartMM4);
    lcd.setCursor (0, 1);
    lcd.print(F("K4 Koniec:"));
    lcd.setCursor (11, 1);
    if (FinishHH4 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishHH4); lcd.print(F(":"));
    if (FinishMM4 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishMM4);
  }
  // Relay5
  if (setMode == 0 && setAlarm != 0 && setAlarm != 1 && setAlarm >= 18 && setAlarm <= 21 ) {
    lcd.setCursor (0, 0);
    lcd.print(F("K5 Start :"));
    lcd.setCursor (11, 0);
    if (StartHH5 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartHH5); lcd.print(F(":"));
    if (StartMM5 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartMM5);
    lcd.setCursor (0, 1);
    lcd.print(F("K5 Koniec:"));
    lcd.setCursor (11, 1);
    if (FinishHH5 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishHH5); lcd.print(F(":"));
    if (FinishMM5 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishMM5);
  }
  // Relay6
  if (setMode == 0 && setAlarm != 0 && setAlarm != 1 && setAlarm >= 22 && setAlarm <= 25 ) {
    lcd.setCursor (0, 0);
    lcd.print(F("K6 Start :"));
    lcd.setCursor (11, 0);
    if (StartHH6 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartHH6); lcd.print(F(":"));
    if (StartMM6 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartMM6);
    lcd.setCursor (0, 1);
    lcd.print(F("K6 Koniec:"));
    lcd.setCursor (11, 1);
    if (FinishHH6 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishHH6); lcd.print(F(":"));
    if (FinishMM6 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishMM6);
  }
  // Relay7
  if (setMode == 0 && setAlarm != 0 && setAlarm != 1 && setAlarm >= 26 && setAlarm <= 29 ) {
    lcd.setCursor (0, 0);
    lcd.print(F("K7 Start :"));
    lcd.setCursor (11, 0);
    if (StartHH7 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartHH7); lcd.print(F(":"));
    if (StartMM7 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartMM7);
    lcd.setCursor (0, 1);
    lcd.print(F("K7 Koniec:"));
    lcd.setCursor (11, 1);
    if (FinishHH7 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishHH7); lcd.print(F(":"));
    if (FinishMM7 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishMM7);
  }
  // Relay8
  if (setMode == 0 && setAlarm != 0 && setAlarm != 1 && setAlarm >= 30 && setAlarm <= 33 ) {
    lcd.setCursor (0, 0);
    lcd.print(F("K8 Start :"));
    lcd.setCursor (11, 0);
    if (StartHH8 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartHH8); lcd.print(F(":"));
    if (StartMM8 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (StartMM8);
    lcd.setCursor (0, 1);
    lcd.print(F("K8 Koniec:"));
    lcd.setCursor (11, 1);
    if (FinishHH8 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishHH8); lcd.print(F(":"));
    if (FinishMM8 < 10) {
      lcd.print(F("0"));
    }
    lcd.print (FinishMM8);
  }
}

void ReadEeprom () {
  StartHH = EEPROM.read(1);
  StartMM = EEPROM.read(2);
  FinishHH = EEPROM.read(3);
  FinishMM = EEPROM.read(4);

  StartHH2 = EEPROM.read(5);
  StartMM2 = EEPROM.read(6);
  FinishHH2 = EEPROM.read(7);
  FinishMM2 = EEPROM.read(8);

  StartHH3 = EEPROM.read(9);
  StartMM3 = EEPROM.read(10);
  FinishHH3 = EEPROM.read(11);
  FinishMM3 = EEPROM.read(12);

  StartHH4 = EEPROM.read(13);
  StartMM4 = EEPROM.read(14);
  FinishHH4 = EEPROM.read(15);
  FinishMM4 = EEPROM.read(16);

  StartHH5 = EEPROM.read(17);
  StartMM5 = EEPROM.read(18);
  FinishHH5 = EEPROM.read(19);
  FinishMM5 = EEPROM.read(20);

  StartHH6 = EEPROM.read(21);
  StartMM6 = EEPROM.read(22);
  FinishHH6 = EEPROM.read(23);
  FinishMM6 = EEPROM.read(24);

  StartHH7 = EEPROM.read(25);
  StartMM7 = EEPROM.read(26);
  FinishHH7 = EEPROM.read(27);
  FinishMM7 = EEPROM.read(28);

  StartHH8 = EEPROM.read(29);
  StartMM8 = EEPROM.read(30);
  FinishHH8 = EEPROM.read(31);
  FinishMM8 = EEPROM.read(32);
}

void WriteEeprom () {
  EEPROM.write(1, StartHH);
  EEPROM.write(2, StartMM);
  EEPROM.write(3, FinishHH);
  EEPROM.write(4, FinishMM);

  EEPROM.write(5, StartHH2);
  EEPROM.write(6, StartMM2);
  EEPROM.write(7, FinishHH2);
  EEPROM.write(8, FinishMM2);

  EEPROM.write(9, StartHH3);
  EEPROM.write(10, StartMM3);
  EEPROM.write(11, FinishHH3);
  EEPROM.write(12, FinishMM3);

  EEPROM.write(13, StartHH4);
  EEPROM.write(14, StartMM4);
  EEPROM.write(15, FinishHH4);
  EEPROM.write(16, FinishMM4);

  EEPROM.write(17, StartHH5);
  EEPROM.write(18, StartMM5);
  EEPROM.write(19, FinishHH5);
  EEPROM.write(20, FinishMM5);

  EEPROM.write(21, StartHH6);
  EEPROM.write(22, StartMM6);
  EEPROM.write(23, FinishHH6);
  EEPROM.write(24, FinishMM6);

  EEPROM.write(25, StartHH7);
  EEPROM.write(26, StartMM7);
  EEPROM.write(27, FinishHH7);
  EEPROM.write(28, FinishMM7);

  EEPROM.write(29, StartHH8);
  EEPROM.write(30, StartMM8);
  EEPROM.write(31, FinishHH8);
  EEPROM.write(32, FinishMM8);
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
NOCOMNCVCCGNDINLED1PWRRelay Module
relay1:VCC
relay1:GND
relay1:IN
relay1:NC
relay1:COM
relay1:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay2:VCC
relay2:GND
relay2:IN
relay2:NC
relay2:COM
relay2:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay3:VCC
relay3:GND
relay3:IN
relay3:NC
relay3:COM
relay3:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay4:VCC
relay4:GND
relay4:IN
relay4:NC
relay4:COM
relay4:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay5:VCC
relay5:GND
relay5:IN
relay5:NC
relay5:COM
relay5:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay6:VCC
relay6:GND
relay6:IN
relay6:NC
relay6:COM
relay6:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay7:VCC
relay7:GND
relay7:IN
relay7:NC
relay7:COM
relay7:NO
NOCOMNCVCCGNDINLED1PWRRelay Module
relay8:VCC
relay8:GND
relay8:IN
relay8:NC
relay8:COM
relay8:NO
GND5VSDASCLSQWRTCDS1307+
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND