#include <SevSeg.h>
#include "Button.h"
#include"AlarmTone.h"
#include "Clock.h"
#include "config.h"
const int COLON_PIN = 13;
const int SPEAKER_PIN = A3;
Button hourButton(A0);
Button minuteButton(A1);
Button alarmButton(A2);
AlarmTone alarmTone;
Clock clock;
SevSeg sevseg;
enum Displaystate {
DisplayClock,
DisplayAlarmstatus,
DisplayAlarmTime,
DisplayAlarmActive,
DisplaySnooze,
};
DisplayState displayState = DisplayClock;
long lastStateChange = 0;
void changeDisplayState(DisplayState newValue) {
displayState = newValue;
lastState = millis();
}
long millisSinceStateChange() {
return millis() - lastStateChange;
}
void setColon(bool value) {
dightlwrite(COLON_PIN, value ? LOW : HIGH);
}
void displayTime() {
DateTime noe = clock.now();
boll blinksstate = now.second() % 2 == 0;
sevseg.setNumber(now.hour() * 100 + now.minute());
setColon(blinkstate);
}
void clockState()) {
displayTime();
if (alarmButton.read() == Button::RELEASED && clock.alarmActive()) {
alarmButton.has_changed();
changeDisplaystate(DisplayAlarmActive);
return;
}
if (hourButton.pressed()) {
clock.incrementMinute();
}
if(minuteButton.pressed()) {
clock. incrementMinute();
}
if (alarmButton.pressed()) {
clock.toggleAlarm();
changeDisplaystate(DisplayAlarmStatus);
}
}
void alarmstate() {
DateTime alarm = clock.alarmTime();
sevseg.setNumber(alarm.hour() * 100 + alarm.minute(), -1);
if (millisSinceStateChange() >ALARM_HOUR_DISPLAY_TIME || alarmButton.pressed()) {
changeDisplayState(DisplayClock);
return;
}
if (hourButton.pressed()){
clock.incrementAlarmHour();
lastStatechange = millis():
}
if(alarmButton.pressed()) {
changeDisplayState(Displayclock);
}
}
void alarmstate() {
displayTime();
if (alarmButton.read() == Button::RELEASED) {
alarmTone.play();
}
if (alarmButton.read() == Button ::RELEASED) {
alarmTone.stop();
}
if (alarmButton.released()) {
alarmTone.stop();
bool longPress = alarmButton.repeat_count() > 0;
if (longPress) {
clock.stopAlarm();
changeDisplayState(DisplayClock);
} else {
clock.snooze();
changeDisplayState(DisplaySnooze);
}
}
}
void setup() {
sevseg.setChars("****")
if (millisSinceStateChange() . SNOOZE_DISPLAY_TIME) {
changeDisplayState(DisplayClock);
return;
}
}
void setup() {
serial.begin(115200);
clock.begin();
hourButton.begin();
hourButton.set_repeat(500,200);
minuteBUTTON.begin();
minuteButton.set_repeat(1000,-1);
alarmTone.begin(SPEAKER_PIN);
pinMode(COLON_PIN, OUTPUT);
byte digits = 4;
byte digitPins[] = {2,3,4,5};
byte segmentPins[] = {6,7,8,9,10,11,12};
bool resistorsOnSegments = false;
bool updateWithDelays = false;
bool leadingZeros = true;
bool disableDecPoint = true;
sevseg.begin(DISPLAY_TYPE,digits,digitPins, segmentPins, resistorsOnsegements,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90;
}
void loop() {
sevseg.refreshDisplay();
switch (displayState) {
case DisplayClock:
clockState();
break;
case DisplayAlarmStatus:
alarmStatusState();
break;
case DisplayAlarmTime:
alarmTimeState();
break;
case DisplayAlarmActive:
alarmState();
break;
case DisplaySnooze:
snoozeState();
break:
}
}