#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 hrs = 0;
int Min = 0;
int sec = 0;
unsigned int check_val = 50;
int add_chk = 0;
int add_hrs = 1;
int add_min = 2;
bool RUN = true;
bool min_flag = true;
bool hrs_flag = true;
void setup() {
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("COUNTDOWN TIMER");
lcd.setCursor(0, 1);
lcd.print(" mh_zuhdi ");
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_hrs, 0);
EEPROM.write(add_min, 1);
} else {
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
}
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;
hrs = hrs - 1;
}
if (hrs == -1) hrs = 0;
lcd.setCursor(4, 0);
if (hrs <= 9) {
lcd.print('0');
}
lcd.print(hrs);
lcd.print(':');
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");
if (hrs == 0 && Min == 0 && sec == 0) {
digitalWrite(relay, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TIMES UP ");
RUN = false;
for (int i = 0; i < 30; i++)
{
tone(buzz, 783);
delay(100);
noTone(buzz);
delay(100);
}
INIT();
}
}
}
if (digitalRead(set) == LOW) {
delay(500);
while (hrs_flag) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Jam : ");
lcd.print(hrs);
lcd.setCursor(0, 1);
lcd.print(" + - ->");
delay(100);
if (digitalRead(inc) == LOW) {
hrs = hrs + 1;
if (hrs > 23) hrs = 0;
delay(100);
}
if (digitalRead(dec) == LOW) {
hrs = hrs - 1;
if (hrs < 0) hrs = 23;
delay(100);
}
if (digitalRead(set) == LOW) {
hrs_flag = false;
delay(250);
}
}
while (min_flag) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Menit: ");
lcd.print(Min);
lcd.setCursor(0, 1);
lcd.print(" + - ->");
delay(100);
if (digitalRead(inc) == LOW) {
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);
}
}
if (hrs == 0 && Min == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" INVALID TIME ");
delay(2000);
} else {
EEPROM.write(add_hrs, hrs);
EEPROM.write(add_min, Min);
}
INIT();
}
}
void INIT() {
hrs = EEPROM.read(add_hrs);
Min = EEPROM.read(add_min);
sec = 0;
lcd.clear();
lcd.setCursor(4, 0);
if (hrs <= 9) {
lcd.print('0');
}
lcd.print(hrs);
lcd.print(':');
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("Start / Set Time");
min_flag = true;
hrs_flag = true;
delay(500);
}