diff --git a/src/main.cpp b/src/main.cpp index ec6ea30..05c9131 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,4 @@ -#include +//#include #include #include @@ -25,9 +25,6 @@ LiquidCrystal lcd(LCD_D12, LCD_D11, LCD_D5, LCD_D4, LCD_D3, LCD_D2); // Global Variables bool alarmEnabled = true; bool editMode = false; -bool editingHour = false; -bool editingMinute = false; -bool editingSecond = false; bool isAlarmSet = false; bool menuButtonPressed = false; bool setButtonPressed = false; @@ -42,7 +39,15 @@ byte setSecond = 0; byte alarmHour = 0; byte alarmMinute = 0; float temperature = 0.0; -int ledTimer = 0; +unsigned int ledTimer; + +enum EditModeState{ + EDIT_HOUR, + EDIT_MINUTE, + EDIT_SECOND +}; + +EditModeState editModeState = EDIT_HOUR; enum MenuState { MENU_OFF, @@ -81,9 +86,9 @@ void updateTemperature() { void updateTime() { // Update the time variables based on the elapsed time - second = millis() / 1000; - minute = second / 60; - hour = second / 3600; + second = (millis() / 1000) + setSecond; + minute = (second / 60) + setMinute; + hour = (second / 3600) + setHour; minute %= 60; second %= 60; hour %= 24; @@ -94,7 +99,7 @@ void displayTime() { // Display current time on the LCD lcd.setCursor(0, 0); // Set cursor to top-left corner char str[16]; - snprintf(str, sizeof(str), "%02d:%02d:%02d", hour + setHour, minute + setMinute, second + setSecond); + snprintf(str, sizeof(str), "%02d:%02d:%02d", hour, minute, second); lcd.print(str); } @@ -140,7 +145,7 @@ void displayMenuInfo(){ char str[16]; switch (menuState) { case MENU_TIME: - snprintf(str, sizeof(str), "%02d:%02d:%02d", hour + setHour, minute + setMinute, second); + snprintf(str, sizeof(str), "%02d:%02d:%02d", hour, minute, second); lcd.print(str); break; case MENU_ALARM_TIME: @@ -171,18 +176,26 @@ void handleMenuButton() { case MENU_OFF: lcd.clear(); menuState = MENU_TIME; + editModeState = EDIT_HOUR; + editMode = false; break; case MENU_TIME: lcd.clear(); menuState = MENU_ALARM_TIME; + editModeState = EDIT_HOUR; + editMode = false; break; case MENU_ALARM_TIME: lcd.clear(); menuState = MENU_ALARM_STATUS; + editModeState = EDIT_HOUR; + editMode = false; break; case MENU_ALARM_STATUS: lcd.clear(); menuState = MENU_OFF; + editModeState = EDIT_HOUR; + editMode = false; break; } @@ -204,25 +217,18 @@ void handleSetButton() { editMode = true; } else{ - if(!editingHour){ - editingHour = true; - } - else{ - editingHour = false; - if(!editingMinute){ - editingMinute = true; + switch (editModeState){ + case EDIT_HOUR: + editModeState = EDIT_MINUTE; + break; + case EDIT_MINUTE: + editModeState = EDIT_SECOND; + break; + case EDIT_SECOND: + editMode = false; + editModeState = EDIT_HOUR; + break; } - else{ - editingMinute = false; - if(!editingSecond){ - editingSecond = true; - } - else{ - editingSecond = false; - editMode = false; - } - } - } } break; case MENU_ALARM_TIME: @@ -230,19 +236,14 @@ void handleSetButton() { editMode = true; } else{ - if(!editingHour){ - editingHour = true; - } - else{ - editingHour = false; - if(!editingMinute){ - editingMinute = true; - } - else{ - editingMinute = false; + switch (editModeState){ + case EDIT_HOUR: + editModeState = EDIT_MINUTE; + break; + case EDIT_MINUTE: + editModeState = EDIT_HOUR; editMode = false; - setAlarm(); - } + break; } } break; @@ -277,24 +278,28 @@ void handleGaucheButton() { break; case MENU_TIME: if(editMode){ - if(editingHour){ - setHour++; - } - if(editingMinute){ - setMinute++; - } - if(editingSecond){ - setSecond++; + switch (editModeState){ + case EDIT_HOUR: + setHour++; + break; + case EDIT_MINUTE: + setMinute++; + break; + case EDIT_SECOND: + setSecond++; + break; } } break; case MENU_ALARM_TIME: if(editMode){ - if(editingHour){ - alarmHour++; - } - if(editingMinute){ - alarmMinute++; + switch (editModeState){ + case EDIT_HOUR: + alarmHour++; + break; + case EDIT_MINUTE: + alarmMinute++; + break; } } break; @@ -325,24 +330,28 @@ void handleDroiteButton() { break; case MENU_TIME: if(editMode){ - if(editingHour){ - setHour--; - } - if(editingMinute){ - setMinute--; - } - if(editingSecond){ - setSecond--; + switch (editModeState){ + case EDIT_HOUR: + setHour--; + break; + case EDIT_MINUTE: + setMinute--; + break; + case EDIT_SECOND: + setSecond--; + break; } } break; case MENU_ALARM_TIME: if(editMode){ - if(editingHour){ - alarmHour--; - } - if(editingMinute){ - alarmMinute--; + switch (editModeState){ + case EDIT_HOUR: + alarmHour--; + break; + case EDIT_MINUTE: + alarmMinute--; + break; } } break; @@ -356,10 +365,11 @@ void handleDroiteButton() { } void checkAlarm() { - if (alarmEnabled && (hour + setHour == alarmHour) && (minute + setMinute == alarmMinute) && alarmState == ALARM_OFF) { + if (alarmEnabled && (hour == alarmHour) && (minute == alarmMinute) && alarmState == ALARM_OFF) { // Set alarm state to sound alarmState = ALARM_ON; alarmStartTime = millis(); + ledTimer = 0; } } @@ -434,15 +444,13 @@ void setup() { } void loop() { - + // Update time + updateTime(); if(menuState == MENU_OFF){ // Update temperature updateTemperature(); - // Update time - updateTime(); - // Display information on LCD displayTime(); displayTemperature(); @@ -457,7 +465,18 @@ void loop() { stopAlarm(); break; case ALARM_ON: - + if (ledTimer <= 250){ + digitalWrite(ALARM_LED_PIN, HIGH); + ledTimer += millis(); + } + else if (ledTimer <= 750){ + digitalWrite(ALARM_LED_PIN, LOW); + ledTimer += millis(); + } + else{ + ledTimer = 0; + } + tone(BUZZER_PIN, 300); break; case ALARM_SNOOZE: @@ -465,6 +484,7 @@ void loop() { if (millis() - alarmStartTime >= snoozeDuration) { alarmState = ALARM_ON; alarmStartTime = millis(); + ledTimer = 0; } break; }