const int RED_PIN = 8;
const int GREEN_PIN = 5;
const int YELLOW_PIN = 3;
const int BLUE_PIN = 2;
//const int BTN_PIN = 2;
const unsigned long RED_BLUE_DURATION = 8000; // RED+BLUE on together
const unsigned long YELLOW_BLUE_DURATION = 4000; // YELLOW+BLUE on together
const unsigned long GREEN_DURATION = 6000; // GREEN only, BLUE OFF
enum TrafficState { STATE_RED_BLUE, STATE_YELLOW_BLUE, STATE_GREEN };
TrafficState currentState = STATE_RED_BLUE;
unsigned long stateStartTime = 0;
unsigned long lastSerialTime = 0;
void setup() {
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(YELLOW_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
//pinMode(BTN_PIN, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Traffic Light Started!");
enterState(STATE_RED_BLUE);
}
void loop() {
unsigned long now = millis();
updateTrafficLight(now);
updateSerial(now);
}
void enterState(TrafficState newState) {
currentState = newState;
stateStartTime = millis();
// Turn ALL off first
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
switch (newState) {
case STATE_RED_BLUE:
digitalWrite(RED_PIN, HIGH); // RED on
digitalWrite(BLUE_PIN, HIGH); // BLUE on (pedestrian walks)
Serial.println(">>> RED + BLUE ON — Cars stop, pedestrian walks");
break;
case STATE_YELLOW_BLUE:
digitalWrite(YELLOW_PIN, HIGH); // YELLOW on
digitalWrite(BLUE_PIN, HIGH); // BLUE on (pedestrian finishing)
Serial.println(">>> YELLOW + BLUE ON — Warning, pedestrian finishing");
break;
case STATE_GREEN:
digitalWrite(GREEN_PIN, HIGH); // GREEN on
// BLUE stays OFF
Serial.println(">>> GREEN ON — Cars go, pedestrian stopped");
break;
}
}
void updateTrafficLight(unsigned long now) {
unsigned long elapsed = now - stateStartTime;
switch (currentState) {
case STATE_RED_BLUE:
if (elapsed >= RED_BLUE_DURATION)
enterState(STATE_YELLOW_BLUE);
break;
case STATE_YELLOW_BLUE:
if (elapsed >= YELLOW_BLUE_DURATION)
enterState(STATE_GREEN);
break;
case STATE_GREEN:
if (elapsed >= GREEN_DURATION)
enterState(STATE_RED_BLUE);
break;
}
}
void updateSerial(unsigned long now) {
if (now - lastSerialTime >= 1000) {
lastSerialTime = now;
unsigned long dur = 0;
switch (currentState) {
case STATE_RED_BLUE: dur = RED_BLUE_DURATION; break;
case STATE_YELLOW_BLUE: dur = YELLOW_BLUE_DURATION; break;
case STATE_GREEN: dur = GREEN_DURATION; break;
}
long rem = ((long)dur - (long)(now - stateStartTime)) / 1000;
if (rem < 0) rem = 0;
Serial.print(" Time remaining: ");
Serial.print(rem);
Serial.println("s");
}
}