const int pin_red = 13;
const int pin_yellow = 12;
const int pin_green = 11;
const int pin_red_ped = 10;
const int pin_green_ped = 9;
const int pin_button = 8;
enum State_t {
red, yellow, green, pedestrian
};
State_t curr_state;
State_t prev_state;
unsigned long greenStartTime = 0;
const long greenDuration = 5000;
bool buttonPressed = false;
bool buttonHandled = false;
void setup() {
pinMode(pin_red, OUTPUT);
pinMode(pin_yellow, OUTPUT);
pinMode(pin_green, OUTPUT);
pinMode(pin_red_ped, OUTPUT);
pinMode(pin_green_ped, OUTPUT);
pinMode(pin_button, INPUT);
curr_state = red;
prev_state = red;
digitalWrite(pin_red_ped, HIGH);
}
void loop() {
bool buttonState = digitalRead(pin_button) == HIGH;
if (buttonState && !buttonHandled) {
buttonPressed = true;
buttonHandled = true;
}
if (!buttonState) {
buttonHandled = false;
}
switch (curr_state) {
case red:
digitalWrite(pin_red, HIGH);
digitalWrite(pin_green, LOW);
digitalWrite(pin_yellow, LOW);
digitalWrite(pin_red_ped, LOW);
digitalWrite(pin_green_ped, HIGH);
delay(5000);
digitalWrite(pin_red, LOW);
curr_state = yellow;
prev_state = red;
break;
case yellow:
digitalWrite(pin_red_ped, HIGH);
digitalWrite(pin_green_ped, LOW);
digitalWrite(pin_yellow, HIGH);
delay(1000);
digitalWrite(pin_yellow, LOW);
if (prev_state == green) {
curr_state = red;
} else {
curr_state = green;
greenStartTime = millis();
}
break;
case green:
digitalWrite(pin_green, HIGH);
digitalWrite(pin_red, LOW);
digitalWrite(pin_yellow, LOW);
digitalWrite(pin_red_ped, HIGH);
digitalWrite(pin_green_ped, LOW);
if (buttonPressed) {
buttonPressed = false;
curr_state = pedestrian;
break;
}
if (millis() - greenStartTime >= greenDuration) {
digitalWrite(pin_green, LOW);
curr_state = yellow;
prev_state = green;
}
break;
case pedestrian:
digitalWrite(pin_yellow, HIGH);
digitalWrite(pin_red, LOW);
digitalWrite(pin_green, LOW);
delay(1000);
digitalWrite(pin_yellow, LOW);
digitalWrite(pin_green, LOW);
digitalWrite(pin_red, HIGH);
digitalWrite(pin_red_ped, LOW);
digitalWrite(pin_green_ped, HIGH);
delay(5000);
digitalWrite(pin_green_ped, LOW);
digitalWrite(pin_red_ped, HIGH);
digitalWrite(pin_yellow, HIGH);
digitalWrite(pin_red, LOW);
delay(1000);
digitalWrite(pin_yellow, LOW);
curr_state = green;
greenStartTime = millis();
break;
}
}