#define LED_YELLOW PA5
#define LED_GREEN PA6
#define BUTTON_PIN PC13
// Тривалості (мс)
const unsigned long YELLOW_ON_TIME = 5000; // 5 с
const unsigned long YELLOW_BLINK_TIME = 2000; // 2 с
const unsigned long BLINK_PERIOD = 167; // ~3 Гц (ON або OFF)
const unsigned long RESTART_DELAY = 10000; // 10 с
unsigned long cycleEndTime = 0;
bool cycleRunning = false;
void setup() {
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_GREEN, LOW);
}
void loop() {
// Читання кнопки (активний LOW)
bool buttonPressed = (digitalRead(BUTTON_PIN) == LOW);
// Якщо цикл не виконується і пройшло 10 с після попереднього
if (!cycleRunning && buttonPressed && millis() - cycleEndTime >= RESTART_DELAY) {
runTrafficLightCycle();
}
}
void runTrafficLightCycle() {
cycleRunning = true;
// Жовтий горить 5 с
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, HIGH);
delay(YELLOW_ON_TIME);
// Жовтий блимає 2 с з частотою 3 Гц
unsigned long blinkStart = millis();
while (millis() - blinkStart < YELLOW_BLINK_TIME) {
digitalWrite(LED_YELLOW, HIGH);
delay(BLINK_PERIOD);
digitalWrite(LED_YELLOW, LOW);
delay(BLINK_PERIOD);
}
// Зелений горить постійно
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_GREEN, HIGH);
// Фіксуємо кінець циклу
cycleEndTime = millis();
cycleRunning = false;
}