#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, 0);
EEPROM.write(add_sec, 0);
} 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;
}
}
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");
digitalWrite(relay, HIGH);
Sec = Sec - 1;
delay(1000);
if (Sec == -1) {
Sec = 59;
Min = Min - 1;
}
if (Min == -1){
Min = 59;
}
if (Min == 0 && Sec == 0) {
digitalWrite(relay, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TIMES UP ");
RUN = false;
for (int i = 0; i < 50; i++)
{
tone(buzz, 783);
delay(100);
noTone(buzz);
delay(100);
if (digitalRead(stsp) == LOW) {
digitalWrite(relay, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" ALARM STOPPED ");
delay(2000);
RUN = false;
break;
}
}
INIT();
}
}
}
if (digitalRead(set) == LOW) {
delay(500);
while (min_flag) {
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);
if (digitalRead(inc) == LOW) {
Min = Min + 5;
if (Min >= 60) Min = 0;
delay(100);
}
else {
Min = Min + 1;
if (Min >= 60) Min = 0;
delay(100);
}
lcd.clear();
}
if (digitalRead(dec) == LOW) {
Min = Min - 1;
if (Min < 0) Min = 59;
delay(100);
lcd.clear();
}
if (digitalRead(set) == LOW) {
min_flag = false;
delay(250);
lcd.clear();
}
}
while (sec_flag) {
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 + 10;
if (Sec >= 60) Sec = 0;
delay(100);
lcd.clear();
}
if (digitalRead(dec) == LOW) {
Sec = Sec - 10;
if (Sec < 0) Sec = 50;
delay(100);
lcd.clear();
}
if (digitalRead(set) == LOW) {
sec_flag = false;
delay(250);
lcd.clear();
}
}
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);
}