#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
RTC_DS1307 rtc;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
int hour_button = 2;
int minute_button = 3;
int set_button = 4;
int exit_button = 5;
int show_alarms_button = 7;
int led1 = 6;
const int numTimers = 3;
int alarmHour[numTimers] = {0, 0, 0};
int alarmMinute[numTimers] = {0, 0, 0};
int activate[numTimers] = {0, 0, 0};
int setAlarm[numTimers] = {0, 0, 0};
bool setTimeMode = false;
int activeTimer = 0;
bool alarmTriggered = false;
int triggeredAlarmIndex = -1;
unsigned long setButtonPressStartTime = 0;
unsigned long hourButtonPressStartTime = 0;
bool hourButtonLongPressed = false;
enum DaysOfWeek { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
void setDefaultTime();
String getDayOfWeek(int day);
void displayCurrentTime(DateTime currentTime);
void displaySetTime(int timerIndex, int hour, int minute);
void displayActiveAlarms();
void stopAlarm();
void cycleAlarmSettings();
void incrementAlarmAndDisplay();
void showButtonInterrupt();
void setup() {
pinMode(hour_button, INPUT_PULLUP);
pinMode(minute_button, INPUT_PULLUP);
pinMode(set_button, INPUT_PULLUP);
pinMode(exit_button, INPUT_PULLUP);
pinMode(show_alarms_button, INPUT_PULLUP);
pinMode(led1, OUTPUT);
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println(F("Couldn't find RTC"));
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;) {
}
}
display.display();
delay(50);
display.clearDisplay();
display.display();
attachInterrupt(digitalPinToInterrupt(show_alarms_button), showButtonInterrupt, FALLING);
}
void showButtonInterrupt() {
static unsigned long showButtonPressStartTime = 0;
static bool showButtonLongPressed = false;
if (digitalRead(show_alarms_button) == LOW) {
if (showButtonPressStartTime == 0) {
showButtonPressStartTime = millis();
} else {
unsigned long currentTime = millis();
if (currentTime - showButtonPressStartTime >= 1000 && !showButtonLongPressed) {
showButtonLongPressed = true;
showButtonPressStartTime = 0;
setDefaultTime();
}
}
} else {
showButtonPressStartTime = 0;
showButtonLongPressed = false;
}
}
String getDayOfWeek(int day) {
switch (day) {
case 1:
return "Monday";
case 2:
return "Tuesday";
case 3:
return "Wednesday";
case 4:
return "Thursday";
case 5:
return "Friday";
case 6:
return "Saturday";
case 7:
return "Sunday";
default:
return "Invalid Day";
}
}
void setDefaultTime() {
int defaultHour = 12;
int defaultMinute = 0;
DaysOfWeek defaultDay = Monday;
display.clearDisplay();
display.setTextSize(1.5);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Set Default Time");
display.print("Hour:");
display.setCursor(100, 20);
display.print(defaultHour);
display.setCursor(0, 35);
display.print("Minute:");
display.setCursor(100, 35);
display.print(defaultMinute);
display.setCursor(0, 50);
display.print("Day:");
display.setCursor(100, 50);
display.print(getDayOfWeek(defaultDay));
display.display();
while (1) {
int hour_button_state = digitalRead(hour_button);
int minute_button_state = digitalRead(minute_button);
int exit_button_state = digitalRead(exit_button);
int set_button_state = digitalRead(set_button);
if (hour_button_state == LOW) {
defaultHour++;
if (defaultHour > 23) {
defaultHour = 0;
}
display.setCursor(100, 20);
display.print(" ");
display.setCursor(100, 20);
display.print(defaultHour);
delay(50);
}
if (minute_button_state == LOW) {
defaultMinute++;
if (defaultMinute > 59) {
defaultMinute = 0;
}
display.setCursor(100, 35);
display.print(" ");
display.setCursor(100, 35);
display.print(defaultMinute);
delay(50);
}
if (exit_button_state == LOW) {
setTimeMode = false;
display.clearDisplay();
displayCurrentTime(rtc.now());
return;
}
if (set_button_state == LOW) {
// Set the default time for both RTC and display
rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), rtc.now().day(), defaultHour, defaultMinute, 0));
display.clearDisplay();
displayCurrentTime(rtc.now());
return;
}
}
}
void displayCurrentTime(DateTime currentTime) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(getDayOfWeek(currentTime.dayOfTheWeek()));
display.print(currentTime.month());
display.print("/");
display.print(currentTime.day());
display.print("/");
display.println(currentTime.year());
display.setCursor(0, 32);
display.print(currentTime.hour());
display.print(":");
display.print(currentTime.minute());
display.print(":");
display.println(currentTime.second());
display.display();
}
void displaySetTime(int timerIndex, int hour, int minute) {
display.clearDisplay();
display.setTextSize(1.5);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Set Alarm ");
display.print(timerIndex + 1);
display.setCursor(0, 20);
display.print("Hour:");
display.setCursor(100, 20);
display.print(hour);
display.setCursor(0, 35);
display.print("Minute:");
display.setCursor(100, 35);
display.print(minute);
display.display();
}
void displayActiveAlarms() {
display.clearDisplay();
display.setTextSize(1.5);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Active Alarms");
for (int i = 0; i < numTimers; ++i) {
display.print("Timer ");
display.print(i + 1);
display.print(": ");
display.print(alarmHour[i]);
display.print(":");
display.print(alarmMinute[i]);
display.println();
}
display.display();
}
void stopAlarm() {
digitalWrite(led1, LOW);
alarmTriggered = false;
if (triggeredAlarmIndex != -1) {
setAlarm[triggeredAlarmIndex] = 0;
triggeredAlarmIndex = -1;
}
}
void cycleAlarmSettings() {
activeTimer = (activeTimer + 1) % numTimers;
display.clearDisplay();
}
void incrementAlarmAndDisplay() {
activeTimer = (activeTimer + 1) % numTimers;
displaySetTime(activeTimer, alarmHour[activeTimer], alarmMinute[activeTimer]);
}
void loop() {
int set_button_state = digitalRead(set_button);
int exit_button_state = digitalRead(exit_button);
int show_alarms_button_state = digitalRead(show_alarms_button);
int hour_button_state = digitalRead(hour_button);
if (activate[activeTimer] == 0) {
DateTime now = rtc.now();
displayCurrentTime(now);
delay(50);
for (int i = 0; i < numTimers; ++i) {
if (setAlarm[i] == 1 && now.hour() == alarmHour[i] && now.minute() == alarmMinute[i]) {
if (!alarmTriggered) {
digitalWrite(led1, HIGH);
alarmTriggered = true;
triggeredAlarmIndex = i;
}
display.setTextSize(1.5);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 48);
display.println("Alarm Triggered!");
display.display();
if (exit_button_state == LOW) {
stopAlarm();
display.clearDisplay();
displayCurrentTime(now);
return;
} else {
delay(3000);
stopAlarm();
displayCurrentTime(now);
}
}
}
}
if (set_button_state == LOW && activate[activeTimer] == 0) {
setButtonPressStartTime = millis();
activate[activeTimer] = 1;
setTimeMode = !setTimeMode;
display.clearDisplay();
}
if (setTimeMode) {
if (set_button_state == HIGH) {
unsigned long currentTime = millis();
if (currentTime - setButtonPressStartTime >= 1000) {
cycleAlarmSettings();
setButtonPressStartTime = currentTime;
}
}
static unsigned long showAlarmsButtonPressStartTime = 0;
if (show_alarms_button_state == LOW) {
if (showAlarmsButtonPressStartTime == 0) {
showAlarmsButtonPressStartTime = millis();
} else {
unsigned long currentTime = millis();
if (currentTime - showAlarmsButtonPressStartTime >= 1000) {
showAlarmsButtonPressStartTime = 0;
setDefaultTime();
}
}
} else {
showAlarmsButtonPressStartTime = 0;
}
if (hour_button_state == LOW) {
if (millis() - hourButtonPressStartTime >= 1000 && !hourButtonLongPressed) {
hourButtonLongPressed = true;
hourButtonPressStartTime = 0;
setDefaultTime();
}
} else {
hourButtonPressStartTime = millis();
hourButtonLongPressed = false;
}
if (show_alarms_button_state == LOW) {
display.clearDisplay();
incrementAlarmAndDisplay();
}
if (exit_button_state == LOW) {
setTimeMode = false;
activate[activeTimer] = 0;
setAlarm[activeTimer] = 1;
delay(50);
cycleAlarmSettings();
}
}
if (show_alarms_button_state == LOW) {
if (setTimeMode) {
display.clearDisplay();
incrementAlarmAndDisplay();
} else {
if (alarmTriggered) {
stopAlarm();
}
displayActiveAlarms();
delay(3500);
displayCurrentTime(rtc.now());
}
}
while (activate[activeTimer] == 1) {
if (setTimeMode) {
displaySetTime(activeTimer, alarmHour[activeTimer], alarmMinute[activeTimer]);
int hour_button_state = digitalRead(hour_button);
if (hour_button_state == LOW) {
alarmHour[activeTimer]++;
if (alarmHour[activeTimer] > 23) {
alarmHour[activeTimer] = 0;
}
delay(50);
}
int minute_button_state = digitalRead(minute_button);
if (minute_button_state == LOW) {
alarmMinute[activeTimer]++;
if (alarmMinute[activeTimer] > 59) {
alarmMinute[activeTimer] = 0;
}
delay(50);
}
int exit_button_state = digitalRead(exit_button);
if (exit_button_state == LOW) {
setTimeMode = false;
activate[activeTimer] = 0;
setAlarm[activeTimer] = 1;
delay(50);
cycleAlarmSettings();
}
} else {
displayCurrentTime(rtc.now());
}
delay(20);
}
if (setAlarm[activeTimer] == 1) {
DateTime now = rtc.now();
displayCurrentTime(now);
delay(50);
display.clearDisplay();
display.display();
setAlarm[activeTimer] = 0;
}
}