// ── Pin Definitions ──────────────────────────────
const int RED_PIN = 2;
const int YELLOW_PIN = 3;
const int GREEN_PIN = 4;
const int BLUE_PIN = 5; // Pedestrian LED
// ── Durations (ms) ───────────────────────────────
const unsigned long RED_DUR = 5000;
const unsigned long YELLOW_DUR = 2000;
const unsigned long GREEN_DUR = 5000;
const unsigned long PED_DUR = 3000;
const unsigned long BLINK_SLOW = 500;
const unsigned long BLINK_FAST = 300;
// ── State Machine ────────────────────────────────
enum State {
STATE_RED,
STATE_YELLOW_RG,
STATE_GREEN,
STATE_YELLOW_GR,
STATE_PEDESTRIAN
};
State currentState = STATE_RED;
// ── Timing Variables ─────────────────────────────
unsigned long stateStart = 0;
unsigned long lastBlink = 0;
bool blinkOn = false;
// ── Helper ───────────────────────────────────────
void allOff() {
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
}
// ── Setup ────────────────────────────────────────
void setup() {
pinMode(RED_PIN, OUTPUT);
pinMode(YELLOW_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
Serial.begin(9600);
Serial.println("=========================");
Serial.println(" Traffic Light Started!");
Serial.println("=========================");
allOff();
digitalWrite(RED_PIN, HIGH);
stateStart = millis();
Serial.println(">> State: RED");
}
// ── Loop ─────────────────────────────────────────
void loop() {
unsigned long now = millis();
unsigned long elapsed = now - stateStart;
switch (currentState) {
case STATE_RED:
// Blue pedestrian blinks slowly while RED
if (now - lastBlink >= BLINK_SLOW) {
lastBlink = now;
blinkOn = !blinkOn;
digitalWrite(BLUE_PIN, blinkOn);
}
if (elapsed >= RED_DUR) {
allOff();
digitalWrite(YELLOW_PIN, HIGH);
currentState = STATE_YELLOW_RG;
stateStart = now;
Serial.println(">> State: YELLOW (Red → Green)");
}
break;
case STATE_YELLOW_RG:
if (elapsed >= YELLOW_DUR) {
allOff();
digitalWrite(GREEN_PIN, HIGH);
currentState = STATE_GREEN;
stateStart = now;
Serial.println(">> State: GREEN");
}
break;
case STATE_GREEN:
if (elapsed >= GREEN_DUR) {
allOff();
digitalWrite(YELLOW_PIN, HIGH);
currentState = STATE_YELLOW_GR;
stateStart = now;
Serial.println(">> State: YELLOW (Green → Red)");
}
break;
case STATE_YELLOW_GR:
if (elapsed >= YELLOW_DUR) {
allOff();
digitalWrite(RED_PIN, HIGH);
currentState = STATE_PEDESTRIAN;
stateStart = now;
Serial.println(">> State: PEDESTRIAN CROSSING");
}
break;
case STATE_PEDESTRIAN:
// Blue pedestrian blinks FAST
if (now - lastBlink >= BLINK_FAST) {
lastBlink = now;
blinkOn = !blinkOn;
digitalWrite(BLUE_PIN, blinkOn);
}
if (elapsed >= PED_DUR) {
allOff();
digitalWrite(RED_PIN, HIGH);
currentState = STATE_RED;
stateStart = now;
Serial.println(">> State: RED");
}
break;
}
}