// Traffic Light FSM - XIAO ESP32-S3
// Red → Yellow → Green → Yellow → repeat
enum State {
RED,
RED_YELLOW,
GREEN,
YELLOW
};
const int RED_PIN = D2;
const int YELLOW_PIN = D3;
const int GREEN_PIN = D4;
State currentState = RED;
unsigned long lastChange = 0;
void setLights(bool r, bool y, bool g) {
digitalWrite(RED_PIN, r);
digitalWrite(YELLOW_PIN, y);
digitalWrite(GREEN_PIN, g);
}
void setup() {
pinMode(RED_PIN, OUTPUT);
pinMode(YELLOW_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
}
void loop() {
unsigned long now = millis();
switch (currentState) {
case RED:
setLights(true, false, false);
if (now - lastChange > 2000) {
currentState = RED_YELLOW;
lastChange = now;
}
break;
case RED_YELLOW:
setLights(true, true, false);
if (now - lastChange > 1000) {
currentState = GREEN;
lastChange = now;
}
break;
case GREEN:
setLights(false, false, true);
if (now - lastChange > 3000) {
currentState = YELLOW;
lastChange = now;
}
break;
case YELLOW:
setLights(false, true, false);
if (now - lastChange > 1000) {
currentState = RED;
lastChange = now;
}
break;
}
}