#include <LiquidCrystal_I2C.h>
#include<EEPROM.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int stsp = A0;
const int inc = A1;
const int dec = A2;
const int set = A3;

const int buzz = 9;
const int relay = 8;

int Min = 0;
int Sec = 0;

unsigned int check_val = 50;
int add_chk = 0;
int add_min = 1;
int add_sec = 10;

bool RUN = true;
bool min_flag = true;
bool sec_flag = true;

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("KITCHEN TIMER");
  lcd.setCursor(0, 1);
  lcd.print(" Ready to go ");

  pinMode(stsp, INPUT_PULLUP);
  pinMode(inc, INPUT_PULLUP);
  pinMode(dec, INPUT_PULLUP);
  pinMode(set, INPUT_PULLUP);
  pinMode(buzz, OUTPUT);
  pinMode(relay, OUTPUT);

  digitalWrite(relay, LOW); 
  noTone(buzz);

  if (EEPROM.read(add_chk) != check_val) {
    EEPROM.write(add_chk, check_val);
    EEPROM.write(add_min, 1);
    EEPROM.write(add_sec, 1);
  } else {
    Min = EEPROM.read(add_min);
    Sec = EEPROM.read(add_sec);
  }
  delay(1500);
  INIT();
}

void loop() {
  if (digitalRead(stsp) == LOW) {
    lcd.clear();
    delay(250);
    RUN = true;
    while (RUN) {
      if (digitalRead(stsp) == LOW) {
        delay(1000);
        if (digitalRead(stsp) == LOW) {
          digitalWrite(relay, LOW); 
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print(" TIMER  STOPPED ");
          delay(2000);
          RUN = false;
          INIT();
          break;
        }
      }

      digitalWrite(relay, HIGH); 
      Sec = Sec - 1;
      delay(1000);

      if (Sec == -1) {
        Sec = 59;
        Min = Min - 1;
      }
      if (Min == -1){
        Min = 59;
      }

      lcd.setCursor(4, 0);
      if (Min <= 9){
        lcd.print('0');
      }
        lcd.print(Min);
        lcd.print(':');
      if (Sec <= 9) {
        lcd.print('0');
      }
        lcd.print(Sec);
      lcd.setCursor(0, 1);
      lcd.print("Stop LongPress");

      if (Min == 0 && Sec == 0) {
        digitalWrite(relay, LOW); 
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("    TIMES UP    ");
        delay(100);
        RUN = false;
        for (int i = 0; i < 50; i++)
        {
          tone(buzz, 783);
          delay(100);

          noTone(buzz);
          delay(100);
        }
        INIT();
      }
    }
  }

  if (digitalRead(set) == LOW) {
    delay(500);

    while (min_flag) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Set Minutes: ");
      lcd.print(Min);
      lcd.setCursor(0, 1);
      lcd.print("     +    -   ->");
      delay(100);
      
      if (digitalRead(inc) == LOW) {
        delay(1000)
        Min = Min + 10;
        if (Min >= 60) Min = 0;
        delay(100);
      } else {
          Min = Min + 1;
          if (Min >= 60) Min = 0;
          delay(100);
        }
      if (digitalRead(dec) == LOW) {
        Min = Min - 1;
        if (Min < 0) Min = 59;
        delay(100);
      }
      if (digitalRead(set) == LOW) {
        min_flag = false;
        delay(250);
      }
    }

    while (sec_flag) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Set Seconds: ");
      lcd.print(Sec);
      lcd.setCursor(0, 1);
      lcd.print("     +    -   ->");
      delay(100);
      
      if (digitalRead(inc) == LOW) {
        Sec = Sec + 1;
        if (Sec >= 60) Sec = 0;
        delay(100);
      }
      if (digitalRead(inc) == LOW) {
        Sec = Sec + 9;
        if (Sec >= 60) Sec = 0;
        delay(500);
      }
      if (digitalRead(dec) == LOW) {
        Sec = Sec - 1;
        if (Sec < 0) Sec = 59;
        delay(100);
      }
      if (digitalRead(set) == LOW) {
        sec_flag = false;
        delay(250);
      }
    }

    if (Sec == 0 && Min == 0)  {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("  INVALID TIME  ");
      delay(2000);
    } else {
      EEPROM.write(add_sec, Sec);
      EEPROM.write(add_min, Min);
    }
    INIT();
  }
}

void INIT() {
  Sec = EEPROM.read(add_sec);
  Min = EEPROM.read(add_min);
  
  lcd.clear();
  lcd.setCursor(4, 0);

  if (Min <= 9) {
    lcd.print('0');
  }
    lcd.print(Min);
    lcd.print(':');
  if (Sec <= 9) {
    lcd.print('0');
  }
    lcd.print(Sec);
  lcd.setCursor(0, 1);
  lcd.print("Alarm / Set Time");
  
  min_flag = true;
  sec_flag = true;
  delay(500);
}
NOCOMNCVCCGNDINLED1PWRRelay Module