#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int buttonPin1 = 2;
const int buttonPin2 = 3;
const int buttonPin3 = 4;
const int buttonPin4 = 5;
volatile int hours = 0;
volatile int minutes = 0;
volatile int seconds = 0;
volatile unsigned long previousMillis = 0;
volatile unsigned long interval = 1000;
volatile boolean setTimeFlag = false;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Set Time: ");
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(buttonPin3, INPUT_PULLUP);
pinMode(buttonPin4, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin1), changeHour, FALLING);
attachInterrupt(digitalPinToInterrupt(buttonPin2), changeMinute, FALLING);
attachInterrupt(digitalPinToInterrupt(buttonPin3), changeSecond, FALLING);
attachInterrupt(digitalPinToInterrupt(buttonPin4), toggleSetTimeFlag, FALLING);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (!setTimeFlag) {
seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
if (minutes >= 60) {
minutes = 0;
hours++;
if (hours >= 24) {
hours = 0;
}
}
}
}
displayTime();
}
}
void displayTime() {
lcd.setCursor(10, 0);
lcd.print(hours);
lcd.print(":");
if (minutes < 10) {
lcd.print("0");
}
lcd.print(minutes);
lcd.print(":");
if (seconds < 10) {
lcd.print("0");
}
lcd.print(seconds);
}
void changeHour() {
if (setTimeFlag) {
hours++;
if (hours >= 24) {
hours = 0;
}
displayTime();
}
}
void changeMinute() {
if (setTimeFlag) {
minutes++;
if (minutes >= 60) {
minutes = 0;
}
displayTime();
}
}
void changeSecond() {
if (setTimeFlag) {
seconds++;
if (seconds >= 60) {
seconds = 0;
}
displayTime();
}
}
void toggleSetTimeFlag() {
setTimeFlag = !setTimeFlag;
if (!setTimeFlag) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Time: ");
displayTime();
}
}