#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Time variables
int hours = 0, minutes = 0, seconds = 0;
// Alarm variables
int alarmHour = 0, alarmMinute = 0;
bool alarmSet = false;
// Pins
const int btnHour = 2;
const int btnMin = 3;
const int btnAlarm = 4;
const int buzzer = 8;
unsigned long lastTick = 0;
void setup() {
lcd.init();
lcd.backlight();
pinMode(btnHour, INPUT_PULLUP);
pinMode(btnMin, INPUT_PULLUP);
pinMode(btnAlarm, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
lcd.setCursor(0, 0);
lcd.print(" Digital Clock ");
delay(1500);
lcd.clear();
}
void loop() {
// Tick every second
if (millis() - lastTick >= 1000) {
lastTick = millis();
seconds++;
if (seconds == 60) { seconds = 0; minutes++; }
if (minutes == 60) { minutes = 0; hours++; }
if (hours == 24) { hours = 0; }
}
// Button: Set Hour
if (digitalRead(btnHour) == LOW) {
hours = (hours + 1) % 24;
delay(300);
}
// Button: Set Minute
if (digitalRead(btnMin) == LOW) {
minutes = (minutes + 1) % 60;
delay(300);
}
// Button: Toggle Alarm (cycles through alarm times)
if (digitalRead(btnAlarm) == LOW) {
alarmMinute = (alarmMinute + 1) % 60;
if (alarmMinute == 0) alarmHour = (alarmHour + 1) % 24;
alarmSet = true;
delay(300);
}
// Check alarm
if (alarmSet && hours == alarmHour && minutes == alarmMinute && seconds == 0) {
tone(buzzer, 1000, 2000); // Beep for 2 seconds
}
// Display time on row 1
lcd.setCursor(0, 0);
lcd.print("Time: ");
printTwoDigits(hours);
lcd.print(":");
printTwoDigits(minutes);
lcd.print(":");
printTwoDigits(seconds);
// Display alarm on row 2
lcd.setCursor(0, 1);
if (alarmSet) {
lcd.print("Alarm:");
printTwoDigits(alarmHour);
lcd.print(":");
printTwoDigits(alarmMinute);
lcd.print(" ON ");
} else {
lcd.print("Alarm: --:-- OFF");
}
delay(100);
}
void printTwoDigits(int num) {
if (num < 10) lcd.print("0");
lcd.print(num);
}