// Define pin numbers
const int nsweRedPin = 15;
const int nsweGreenPin = 16;
const int nsTrafficRedPin = 2;
const int nsTrafficYellowPin = 3;
const int nsTrafficGreenPin = 4;
const int weTrafficRedPin = 11;
const int weTrafficYellowPin = 12;
const int weTrafficGreenPin = 13;
const int button1Pin = 17;
// Timing constants
const unsigned long trafficGreenTime = 5000;
const unsigned long trafficYellowTime = 2000;
const unsigned long pedestrianGreenTime = 5000;
const unsigned long allRedPauseTime = 3000;
// State machine variables
unsigned long previousMillis = 0;
unsigned long stateDuration = 0;
int state = 0;
bool pedestrianRequest = false;
void setup() {
Serial.begin(9600);
pinMode(nsweRedPin, OUTPUT);
pinMode(nsweGreenPin, OUTPUT);
pinMode(nsTrafficRedPin, OUTPUT);
pinMode(nsTrafficYellowPin, OUTPUT);
pinMode(nsTrafficGreenPin, OUTPUT);
pinMode(weTrafficRedPin, OUTPUT);
pinMode(weTrafficYellowPin, OUTPUT);
pinMode(weTrafficGreenPin, OUTPUT);
pinMode(button1Pin, INPUT_PULLUP);
turnOffAll();
}
void loop() {
checkPedestrianRequest();
updateTrafficLights();
}
void checkPedestrianRequest() {
if (digitalRead(button1Pin) == LOW) {
pedestrianRequest = true;
Serial.println("Pedestrian button pressed - request latched!");
delay(500); // basic debounce
}
}
void updateTrafficLights() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= stateDuration) {
previousMillis = currentMillis;
switch (state) {
case 0: // NS Green, WE Red
turnOffAll();
digitalWrite(nsTrafficGreenPin, HIGH);
digitalWrite(weTrafficRedPin, HIGH);
stateDuration = trafficGreenTime;
state = 1;
break;
case 1: // NS Yellow
digitalWrite(nsTrafficGreenPin, LOW);
digitalWrite(nsTrafficYellowPin, HIGH);
stateDuration = trafficYellowTime;
state = 2;
break;
case 2: // WE Green, NS Red
digitalWrite(nsTrafficYellowPin, LOW);
digitalWrite(nsTrafficRedPin, HIGH);
digitalWrite(weTrafficRedPin, LOW);
digitalWrite(weTrafficGreenPin, HIGH);
stateDuration = trafficGreenTime;
state = 3;
break;
case 3: // WE Yellow
digitalWrite(weTrafficGreenPin, LOW);
digitalWrite(weTrafficYellowPin, HIGH);
stateDuration = trafficYellowTime;
state = 4;
break;
case 4: // All Red pause
digitalWrite(weTrafficYellowPin, LOW);
digitalWrite(weTrafficRedPin, HIGH);
stateDuration = allRedPauseTime;
state = (pedestrianRequest) ? 5 : 0; // If request, go to pedestrian crossing
break;
case 5: // Pedestrian Crossing
activatePedestrianCrossing();
pedestrianRequest = false;
state = 0;
break;
}
}
}
void activatePedestrianCrossing() {
turnOffAll();
digitalWrite(nsTrafficRedPin, HIGH);
digitalWrite(weTrafficRedPin, HIGH);
delay(1000);
digitalWrite(nsweRedPin, LOW);
digitalWrite(nsweGreenPin, HIGH);
delay(pedestrianGreenTime);
// Flash pedestrian red
for (int i = 0; i < 5; i++) {
digitalWrite(nsweGreenPin, LOW);
digitalWrite(nsweRedPin, HIGH);
delay(300);
digitalWrite(nsweRedPin, LOW);
delay(300);
}
digitalWrite(nsweGreenPin, LOW);
digitalWrite(nsweRedPin, HIGH);
delay(1000);
}
void turnOffAll() {
digitalWrite(nsTrafficRedPin, LOW);
digitalWrite(nsTrafficYellowPin, LOW);
digitalWrite(nsTrafficGreenPin, LOW);
digitalWrite(weTrafficRedPin, LOW);
digitalWrite(weTrafficYellowPin, LOW);
digitalWrite(weTrafficGreenPin, LOW);
digitalWrite(nsweRedPin, HIGH);
digitalWrite(nsweGreenPin, LOW);
}
N
S
W
E
All Red Pause:
- End of one traffic light sequence.
- Traffic can make right turn.
- Traffic can not make right turn
when pedestrian crossing is taking place.
North (N) and South (S) green light:
- N and S traffic can make left turn as well.
West (W) and East (E) green light:
- W and E traffic can make left turn as well.
Pedestrian Crossing:
- Press any button to request for Pedestrian
Crossing.
- All N, S, W and E pedestrian crossing at
the same time (scramble crossing).