#include <SevSeg.h>
#include "Button.h"
#include "AlarmTone.h"
#include "config.h"
const int COLON_PIN = 13;
const int SPEAKER_PIN = A3;
Button hourButton(A0);
Button minuteButton(A1);
Button startButton(A2);
AlarmTone alarmTone;
SevSeg sevseg;
enum DisplayState {
DisplayCountdown,
DisplayCountdownActive,
DisplayAlarm
};
DisplayState displayState = DisplayCountdown;
long lastStateChange = 0;
int countdownMinutes = 0;
int countdownSeconds = 0;
bool countdownActive = false;
void changeDisplayState(DisplayState newValue) {
displayState = newValue;
lastStateChange = millis();
}
long millisSinceStateChange() {
return millis() - lastStateChange;
}
void setColon(bool value) {
digitalWrite(COLON_PIN, value ? LOW : HIGH);
}
void displayTime() {
bool blinkState = countdownSeconds % 2 == 0;
sevseg.setNumber(countdownMinutes * 100 + countdownSeconds);
setColon(blinkState);
}
void countdownState() {
displayTime();
if (hourButton.pressed()) {
countdownMinutes = (countdownMinutes + 1) % 60;
}
if (minuteButton.pressed()) {
countdownSeconds = (countdownSeconds + 1) % 60;
}
if (startButton.pressed()) {
countdownActive=true;
changeDisplayState(DisplayCountdownActive);
}
}
void countdownActiveState() {
if (countdownActive) {
if (startButton.pressed()) {
countdownActive=!countdownActive;
changeDisplayState(DisplayCountdown);
}
if (millisSinceStateChange() >= 1000) {
lastStateChange = millis();
if (countdownSeconds > 0) {
countdownSeconds--;
} else if (countdownMinutes > 0) {
countdownMinutes--;
countdownSeconds = 59;
} else {
countdownActive = false;
changeDisplayState(DisplayAlarm);
return;
}
}
}
displayTime();
}
void alarmState() {
alarmTone.play();
if (startButton.pressed()) {
alarmTone.stop();
changeDisplayState(DisplayCountdown);
countdownMinutes = 0;
countdownSeconds = 0;
}
}
void setup() {
Serial.begin(115200);
hourButton.begin();
hourButton.set_repeat(500, 200);
minuteButton.begin();
minuteButton.set_repeat(500, 200);
startButton.begin();
startButton.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, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}
void loop() {
sevseg.refreshDisplay();
switch (displayState) {
case DisplayCountdown:
countdownState();
break;
case DisplayCountdownActive:
countdownActiveState();
break;
case DisplayAlarm:
alarmState();
break;
}
}