This what we have for now:
#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimeLib.h>
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
#define BUTTON1_PIN A0
#define BUTTON2_PIN A2
#define BUTTON3_PIN A1
#define BUTTON4_PIN A3
#define DEBOUNCE_DELAY 50
#define LONG_PRESS_DELAY 5000
#define NO_BUTTON_PRESS_TIMEOUT 5000
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
volatile bool button1Pressed = false;
volatile bool button2Pressed = false;
volatile bool button3Pressed = false;
volatile bool button4Pressed = false;
unsigned long lastButtonPressTime = 0;
void button1ISR();
void button2ISR();
void button3ISR();
void button4ISR();
void handleButtonActions();
void setup() {
lcd.init();
lcd.backlight();
// Adjust contrast (you may need to adjust this value)
lcd.setContrast(50);
setTime(0, 0, 0, 1, 1, 2020);
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
pinMode(BUTTON3_PIN, INPUT_PULLUP);
pinMode(BUTTON4_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BUTTON1_PIN), button1ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON2_PIN), button2ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON3_PIN), button3ISR, CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON4_PIN), button4ISR, CHANGE);
}
void loop() {
static unsigned long lastUpdateTime = 0;
unsigned long currentTime = millis();
if (currentTime - lastUpdateTime >= 1000) {
lastUpdateTime = currentTime;
if (!button3Pressed) {
adjustTime(1);
}
}
int h = hour();
int m = minute();
int s = second();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(h < 10 ? "0" : "");
lcd.print(h);
lcd.print(":");
lcd.print(m < 10 ? "0" : "");
lcd.print(m);
lcd.print(":");
lcd.print(s < 10 ? "0" : "");
lcd.print(s);
handleButtonActions();
}
void button1ISR() {
if (!button3Pressed) return; // Button 1 only works after button 3 has been pressed
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button1Pressed = true;
lastButtonPressTime = millis();
}
void button2ISR() {
if (!button3Pressed) return; // Button 2 only works after button 3 has been pressed
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button2Pressed = true;
lastButtonPressTime = millis();
}
void button3ISR() {
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button3Pressed = true;
lastButtonPressTime = millis();
}
void button4ISR() {
if (millis() - lastButtonPressTime < DEBOUNCE_DELAY) return; // Debounce
button4Pressed = true;
lastButtonPressTime = millis();
}
void handleButtonActions() {
static bool button3LongPressed = false;
unsigned long currentTime = millis();
if (button1Pressed) {
adjustTime(10); // Adjust by 10 minutes
button1Pressed = false;
}
if (button2Pressed) {
adjustTime(-10); // Adjust by -10 minutes
button2Pressed = false;
}
if (button3Pressed) {
if ((currentTime - lastButtonPressTime) >= LONG_PRESS_DELAY) {
button3LongPressed = true;
}
} else {
if (button3LongPressed) {
// Implement alarm setting logic here
button3LongPressed = false;
}
}
if (button4Pressed) {
// Implement buzzer stopping logic here
button4Pressed = false;
}
}