#define PIN_RED 2
#define PIN_YELLOW 3
#define PIN_GREEN 4
#define PIN_BTN 7
#define TIME_GREEN 4000
#define TIME_YELLOW 4000
#define TIME_RED 8000
#define STATE_GREEN 0
#define STATE_YELLOW 1
#define STATE_RED 2
int state = STATE_GREEN;
unsigned long startTime = 0;
void setup() {
pinMode(PIN_RED, OUTPUT);
pinMode(PIN_YELLOW, OUTPUT);
pinMode(PIN_GREEN, OUTPUT);
pinMode(PIN_BTN, INPUT_PULLUP);
startTime = millis();
updateLights();
}
void loop() {
unsigned long now = millis();
unsigned long elapsed = now - startTime;
if (digitalRead(PIN_BTN) == LOW && state != STATE_GREEN) {
transitionTo(STATE_GREEN);
return; //
}
switch (state) {
case STATE_GREEN:
if (elapsed >= TIME_GREEN) {
transitionTo(STATE_YELLOW);
}
break;
case STATE_YELLOW:
if (elapsed >= TIME_YELLOW) {
transitionTo(STATE_RED);
}
break;
case STATE_RED:
if (elapsed >= TIME_RED) {
transitionTo(STATE_GREEN);
}
break;
}
}
void transitionTo(int nextState) {
state = nextState;
startTime = millis();
updateLights();
}
void updateLights() {
digitalWrite(PIN_RED, (state == STATE_RED) ? HIGH : LOW);
digitalWrite(PIN_YELLOW, (state == STATE_YELLOW) ? HIGH : LOW);
digitalWrite(PIN_GREEN, (state == STATE_GREEN) ? HIGH : LOW);
}