#include <LiquidCrystal.h>
#include <EEPROM.h>
// Inisialisasi LCD (rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
const int relayPin = 7;
const int buzzerPin = 6;
const int upButton = 5;
const int downButton = 4;
const int setButton = 3;
const int resetButton = A0;
unsigned long countdownTime = 0;
unsigned long hourMeter = 0;
unsigned long startTime;
bool isRunning = false;
bool settingMode = true;
bool settingMinutes = true;
int setHours = 0;
int setMinutes = 1;
void setup() {
pinMode(relayPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(setButton, INPUT_PULLUP);
pinMode(resetButton, INPUT_PULLUP);
lcd.begin(16, 2);
lcd.print("Set Time:");
lcd.setCursor(0, 1);
lcd.print(setHours);
lcd.print(":");
lcd.print(setMinutes);
lcd.print(" H:M");
EEPROM.get(0, hourMeter);
}
void loop() {
if (digitalRead(setButton) == LOW) {
delay(200); // Debounce delay
if (settingMode) {
settingMinutes = !settingMinutes;
if (!settingMinutes) {
countdownTime = (setHours * 3600 + setMinutes * 60) * 1000;
lcd.clear();
lcd.print("Set Time:");
lcd.setCursor(0, 1);
lcd.print(setHours);
lcd.print(":");
lcd.print(setMinutes);
lcd.print(" H:M");
delay(2000);
lcd.clear();
lcd.print("Timer Running");
startTime = millis();
isRunning = true;
settingMode = false;
digitalWrite(relayPin, HIGH);
}
}
}
if (settingMode) {
if (settingMinutes) {
if (digitalRead(upButton) == LOW) {
delay(200); // Debounce delay
setMinutes++;
if (setMinutes >= 60) setMinutes = 0;
lcd.setCursor(0, 1);
lcd.print(setHours);
lcd.print(":");
lcd.print(setMinutes);
lcd.print(" ");
}
if (digitalRead(downButton) == LOW) {
delay(200); // Debounce delay
if (setMinutes > 0) setMinutes--;
lcd.setCursor(0, 1);
lcd.print(setHours);
lcd.print(":");
lcd.print(setMinutes);
lcd.print(" ");
}
} else {
if (digitalRead(upButton) == LOW) {
delay(200); // Debounce delay
setHours++;
lcd.setCursor(0, 1);
lcd.print(setHours);
lcd.print(":");
lcd.print(setMinutes);
lcd.print(" ");
}
if (digitalRead(downButton) == LOW) {
delay(200); // Debounce delay
if (setHours > 0) setHours--;
lcd.setCursor(0, 1);
lcd.print(setHours);
lcd.print(":");
lcd.print(setMinutes);
lcd.print(" ");
}
}
} else {
if (isRunning) {
unsigned long currentTime = millis();
unsigned long elapsed = currentTime - startTime;
if (elapsed >= countdownTime) {
isRunning = false;
digitalWrite(relayPin, LOW);
digitalWrite(buzzerPin, HIGH);
delay(1000);
digitalWrite(buzzerPin, LOW);
lcd.clear();
lcd.print("Time's up!");
delay(2000);
lcd.clear();
settingMode = true;
hourMeter += countdownTime;
EEPROM.put(0, hourMeter);
} else {
unsigned long remaining = countdownTime - elapsed;
unsigned long remainingSeconds = remaining / 1000;
unsigned long remainingMinutes = remainingSeconds / 60;
unsigned long remainingHours = remainingMinutes / 60;
remainingMinutes %= 60;
remainingSeconds %= 60;
lcd.setCursor(0, 0);
lcd.print("Time Left:");
delay(1000);
lcd.setCursor(0, 1);
lcd.print(remainingHours);
lcd.print(":");
lcd.print(remainingMinutes);
lcd.print(":");
lcd.print(remainingSeconds);
lcd.print(" ");
}
}
if (digitalRead(resetButton) == LOW) {
delay(200); // Debounce delay
hourMeter = 0;
EEPROM.put(0, hourMeter);
lcd.clear();
lcd.print("Reset Hour Meter");
delay(2000);
lcd.clear();
}
}
// Display Hour Meter
unsigned long totalSeconds = hourMeter / 1000;
unsigned long totalHours = totalSeconds / 3600;
unsigned long totalMinutes = (totalSeconds % 3600) / 60;
unsigned long totalSecondsRemain = totalSeconds % 60;
lcd.setCursor(0, 0);
lcd.print("H:");
lcd.print(totalHours);
lcd.print(" M:");
lcd.print(totalMinutes);
lcd.print(" S:");
lcd.print(totalSecondsRemain);
lcd.print(" ");
}