// Define pin numbers for pedestrian signals (NS only)
const int nsweRedPin = 15;
const int nsweGreenPin = 16;
// Define pin numbers for traffic light LEDs
const int nsTrafficRedPin = 2;
const int nsTrafficYellowPin = 3;
const int nsTrafficGreenPin = 4;
const int weTrafficRedPin = 11;
const int weTrafficYellowPin = 12;
const int weTrafficGreenPin = 13;
// Define pin number for button
const int button1Pin = 17;
// Define timing constants
const unsigned long trafficGreenDuration = 5000; // Green light duration (in milliseconds)
const unsigned long trafficYellowDuration = 2000; // Yellow light duration (in milliseconds)
bool pedestrianRequest = false; // Flag to track if pedestrian request was made
bool buttonState = HIGH; // Current state of the button (pressed or not)
bool lastButtonState = HIGH; // Previous state of the button
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50; // Debounce delay to avoid multiple readings from one press
void setup() {
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); // Button with internal pull-up resistor
Serial.begin(9600); // Start Serial Monitor for debugging
turnOffAll(); // Initialize the system with all lights off
digitalWrite(nsweRedPin, HIGH); // Pedestrian light should be red by default
}
void loop() {
checkPedestrianButton(); // Check for button presses
vehicleLightSequence(); // Run the traffic light sequence
}
void checkPedestrianButton() {
int reading = digitalRead(button1Pin);
// Detect if the button state has changed (debouncing)
if (reading != lastButtonState) {
lastDebounceTime = millis(); // Reset debounce timer
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading == LOW && buttonState == HIGH) {
pedestrianRequest = true; // Set pedestrian request if button is pressed
Serial.println("Button Pressed ✅");
}
buttonState = reading; // Update the current button state
}
lastButtonState = reading; // Store the last button state
}
void vehicleLightSequence() {
// NS Green, WE Red (Traffic starts with NS green, WE red)
digitalWrite(weTrafficRedPin, HIGH);
digitalWrite(nsTrafficRedPin, LOW);
digitalWrite(nsTrafficGreenPin, HIGH);
delay(trafficGreenDuration);
// NS Yellow
digitalWrite(nsTrafficGreenPin, LOW);
digitalWrite(nsTrafficYellowPin, HIGH);
delay(trafficYellowDuration);
// WE Green, NS Red
digitalWrite(nsTrafficYellowPin, LOW);
digitalWrite(nsTrafficRedPin, HIGH);
digitalWrite(weTrafficRedPin, LOW);
digitalWrite(weTrafficGreenPin, HIGH);
// Wait for West and East Green light to turn on (while button is pressed)
if (pedestrianRequest) {
blinkPedestrianGreenDuringWE(); // Activate pedestrian crossing (blink lights)
pedestrianRequest = false; // Reset the pedestrian request after crossing
} else {
delay(trafficGreenDuration); // Regular delay for WE Green light duration
}
// WE Yellow
digitalWrite(weTrafficGreenPin, LOW);
digitalWrite(weTrafficYellowPin, HIGH);
delay(trafficYellowDuration);
// All Red pause (for a brief period before starting the next cycle)
digitalWrite(weTrafficYellowPin, LOW);
digitalWrite(weTrafficRedPin, HIGH);
delay(1000);
}
void blinkPedestrianGreenDuringWE() {
// Pedestrian crossing: Blink pedestrian green during WE Green light
digitalWrite(nsweRedPin, LOW); // Pedestrian red light off
for (int i = 0; i < 5; i++) {
digitalWrite(nsweGreenPin, HIGH); // Pedestrian green on
delay(500); // Stay on for 500ms
digitalWrite(nsweGreenPin, LOW); // Pedestrian green off
delay(500); // Stay off for 500ms
}
digitalWrite(nsweRedPin, HIGH); // After blinking, set pedestrian light back to red
}
void turnOffAll() {
// Turn off all traffic lights and pedestrian signals
digitalWrite(nsTrafficRedPin, LOW);
digitalWrite(nsTrafficYellowPin, LOW);
digitalWrite(nsTrafficGreenPin, LOW);
digitalWrite(weTrafficRedPin, LOW);
digitalWrite(weTrafficYellowPin, LOW);
digitalWrite(weTrafficGreenPin, LOW);
digitalWrite(nsweRedPin, HIGH); // Pedestrian red light by default
digitalWrite(nsweGreenPin, LOW);
}