const int redLight1 = 6;
const int yellowLight1 = 5;
const int greenLight1 = 4;
const int redLight2 = 3;
const int greenLight2 = 2;
const int buzzer = 7;
const int dataPin = 8;
const int latchPin = 9;
const int clockPin = 10;
const int dataPin2 = 11;
const int latchPin2 = 12;
const int clockPin2 = 13;
unsigned long previousMillis = 0;
const long interval = 250;
int timer = 63;
const int warningTime = 15;
unsigned long lastBlinkTime = 0;
const long blinkInterval = 500;
bool blinkState = false;
unsigned long lastBuzzerTime = 0;
int buzzerInterval = 1000;
int buzzerFrequency = 500;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(latchPin2, OUTPUT);
pinMode(clockPin2, OUTPUT);
pinMode(dataPin2, OUTPUT);
pinMode(redLight1, OUTPUT);
pinMode(yellowLight1, OUTPUT);
pinMode(greenLight1, OUTPUT);
pinMode(redLight2, OUTPUT);
pinMode(greenLight2, OUTPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(latchPin, HIGH);
digitalWrite(latchPin2, HIGH);
}
void loop() {
unsigned long currentMillis = millis();
static int state = 0;
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
switch (state) {
case 0:
timer--;
updateSegment(timer / 4);
buzzerInterval = map(timer, 0, 63, 200, 1000);
buzzerFrequency = map(timer, 0, 63, 2500, 500);
if (currentMillis - lastBuzzerTime >= buzzerInterval) {
lastBuzzerTime = currentMillis;
tone(buzzer, buzzerFrequency, 100);
}
if (timer <= warningTime) {
if (currentMillis - lastBlinkTime >= blinkInterval) {
lastBlinkTime = currentMillis;
blinkState = !blinkState;
digitalWrite(greenLight2, blinkState);
digitalWrite(yellowLight1, HIGH);
}
} else {
digitalWrite(greenLight2, HIGH);
digitalWrite(yellowLight1, LOW);
}
digitalWrite(redLight1, HIGH);
digitalWrite(greenLight1, LOW);
digitalWrite(redLight2, LOW);
if (timer <= 0) {
state = 1;
timer = 40;
noTone(buzzer);
digitalWrite(greenLight2, LOW);
digitalWrite(yellowLight1, LOW);
}
break;
case 1:
digitalWrite(redLight1, LOW);
digitalWrite(yellowLight1, LOW);
digitalWrite(greenLight1, HIGH);
digitalWrite(redLight2, HIGH);
digitalWrite(greenLight2, LOW);
clearDisplay();
if (timer <= 0) {
state = 2;
timer = 15;
}
break;
case 2:
digitalWrite(greenLight1, LOW);
digitalWrite(yellowLight1, HIGH);
digitalWrite(redLight2, HIGH);
digitalWrite(greenLight2, LOW);
clearDisplay();
if (timer <= 0) {
state = 0;
timer = 63;
buzzerFrequency = 1000;
}
break;
}
if (state != 0) timer--;
}
}
void updateSegment(int value) {
if (value < 0) value = 0;
int tens = value / 10;
int units = value % 10;
digitalWrite(latchPin2, LOW);
shiftOut(dataPin2, clockPin2, MSBFIRST, convertSegment(units));
digitalWrite(latchPin2, HIGH);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, convertSegment(tens));
digitalWrite(latchPin, HIGH);
}
void clearDisplay() {
byte blank = 0b00000000;
digitalWrite(latchPin2, LOW);
shiftOut(dataPin2, clockPin2, MSBFIRST, blank);
digitalWrite(latchPin2, HIGH);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, blank);
digitalWrite(latchPin, HIGH);
}
byte convertSegment(int number) {
switch (number) {
case 0: return 0b00111111;
case 1: return 0b00000110;
case 2: return 0b01011011;
case 3: return 0b01001111;
case 4: return 0b01100110;
case 5: return 0b01101101;
case 6: return 0b01111101;
case 7: return 0b00000111;
case 8: return 0b01111111;
case 9: return 0b01101111;
default: return 0b00000000;
}
}