#include <SevSeg.h>
#include <TM1637.h>
#include "Button.h"
#include "AlarmTone.h"
#include "config.h"
const int COLON_PIN = 13;
const int SPEAKER_PIN = A3;
int CLK = 2;
int PIRO = 4;
int DIO = 3;
int TESTBUTTON = A4;
bool isfuse1=false;
bool isfuse2=false;
bool isfuse3=false;
bool isfuse4=false;
int testCir = 5;
TM1637 tm(CLK, DIO);
Button hourButton(A0);
Button minuteButton(A1);
Button startButton(A2);
Button testButton(TESTBUTTON);
Button fuse1Button(6);
Button fuse2Button(7);
Button fuse3Button(8);
Button fuse4Button(9);
AlarmTone alarmTone;
enum DisplayState {
DisplayCountdown,
DisplayCountdownActive,
DisplayAlarm,
DisplaySetFuse
};
DisplayState displayState = DisplayCountdown;
long lastStateChange = 0;
int countdownMinutes = 0;
int countdownSeconds = 0;
int selectedFuse = -1;
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;
tm.display(0,countdownMinutes/10);
tm.display(1,countdownMinutes%10);
tm.point(blinkState);
tm.display(2,countdownSeconds/10);
tm.display(3,countdownSeconds%10);
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);
}
if (testButton.pressed()) {
alarmTone.play();
delay(500);
alarmTone.stop();
changeDisplayState(DisplaySetFuse);
}
}
void countdownActiveState() {
if (countdownActive) {
int fusepinState1 = digitalRead(6);
int fusepinState2 = digitalRead(7);
int fusepinState3 = digitalRead(8);
int fusepinState4 = digitalRead(9);
if (fuse1Button.released() || fuse2Button.released() || fuse3Button.released() || fuse4Button.released()) {
if (isfuse1 && fusepinState1 == HIGH ||
isfuse2 && fusepinState2 == HIGH ||
isfuse3 && fusepinState3 == HIGH ||
isfuse4 && fusepinState4 == HIGH) {
countdownActive = false;
changeDisplayState(DisplayCountdown);
} else {
countdownActive = false;
digitalWrite(PIRO, HIGH);
changeDisplayState(DisplayAlarm);
}
}
if (millisSinceStateChange() >= 1000) {
lastStateChange = millis();
if (countdownSeconds > 0) {
countdownSeconds--;
} else if (countdownMinutes > 0) {
countdownMinutes--;
countdownSeconds = 59;
} else {
countdownActive = false;
digitalWrite(PIRO,HIGH);
changeDisplayState(DisplayAlarm);
return;
}
}
}
displayTime();
}
void alarmState() {
alarmTone.play();
if (startButton.pressed()) {
digitalWrite(PIRO,LOW);
alarmTone.stop();
changeDisplayState(DisplayCountdown);
countdownMinutes = 0;
countdownSeconds = 0;
}
}
void setFuseState() {
if (fuse1Button.released()) {
isfuse1 = true;
}
if (fuse2Button.released()) {
isfuse2 = true;
}
if (fuse3Button.released()) {
isfuse3 = true;
}
if (fuse4Button.released()) {
isfuse4 = true;
}
tm.display(0,isfuse4);
tm.display(1,isfuse3);
tm.display(2,isfuse2);
tm.display(3,isfuse1);
if (startButton.pressed()) {
changeDisplayState(DisplayCountdown);
}
if (testButton.pressed()) {
if(digitalRead(A5)==LOW){
alarmTone.play();
delay(500);
alarmTone.stop();
}
}
if (hourButton.pressed()) {
isfuse1=false;
isfuse2=false;
isfuse3=false;
isfuse4=false;
}
}
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);
testButton.begin();
testButton.set_repeat(500, 200);
fuse1Button.begin();
fuse1Button.set_repeat(500, 200);
fuse2Button.begin();
fuse2Button.set_repeat(500, 200);
fuse3Button.begin();
fuse3Button.set_repeat(500, 200);
fuse4Button.begin();
fuse4Button.set_repeat(500, 200);
alarmTone.begin(SPEAKER_PIN);
pinMode(COLON_PIN, OUTPUT);
pinMode(PIRO, OUTPUT);
pinMode(testCir, OUTPUT);
pinMode(A5, INPUT_PULLUP);
tm.init();
tm.set(2);
byte digits = 4;
bool resistorsOnSegments = false;
bool updateWithDelays = false;
bool leadingZeros = true;
bool disableDecPoint = true;
}
void loop() {
switch (displayState) {
case DisplayCountdown:
countdownState();
break;
case DisplayCountdownActive:
countdownActiveState();
break;
case DisplayAlarm:
alarmState();
break;
case DisplaySetFuse:
setFuseState();
break;
}
}