// Pin definitions for traffic lights
const int redPins[] = {2, 11}; // Red LEDs for North-South, East-West
const int amberPins[] = {3, 12}; // Amber LEDs
const int greenPins[] = {4, 13}; // Green LEDs
const int rgbRedPin = 15; // Red leg of RGB LEDs (Pedestrian lights)
const int rgbGreenPin = 16; // Green leg of RGB LEDs (Pedestrian lights)
const int buttonPin = 17; // Button input
// Timing variables
const unsigned long greenDuration = 5000;
const unsigned long amberDuration = 2000;
const unsigned long transitionDelay = 3000;
const unsigned long pedestrianGreenDuration = 8000; // 8 seconds
bool buttonPressed = false;
bool pedestrianCycleActive = false;
void setup() {
// Initialize traffic light pins as outputs
for (int i = 0; i < 2; i++) {
pinMode(redPins[i], OUTPUT);
pinMode(amberPins[i], OUTPUT);
pinMode(greenPins[i], OUTPUT);
}
// Initialize pedestrian RGB light pins
pinMode(rgbRedPin, OUTPUT);
pinMode(rgbGreenPin, OUTPUT);
// Initialize button pin as input with pull-down resistor
pinMode(buttonPin, INPUT_PULLUP);
// Default states
digitalWrite(redPins[0], LOW);
digitalWrite(redPins[1], HIGH);
digitalWrite(rgbRedPin, HIGH);
digitalWrite(rgbGreenPin, LOW);
}
void loop() {
// Check if the button is pressed and pedestrian cycle is not active
if (digitalRead(buttonPin) == LOW && !pedestrianCycleActive) {
buttonPressed = true;
pedestrianCycleActive = true;
}
// Run normal traffic light sequence
setTrafficLightsNorthSouth();
delay(greenDuration);
setAmberLightsNorthSouth();
delay(amberDuration);
setRedLightsNorthSouth();
delay(transitionDelay);
// Run pedestrian sequence if button was pressed
if (buttonPressed) {
activatePedestrianLights();
buttonPressed = false;
}
setTrafficLightsEastWest();
delay(greenDuration);
setAmberLightsEastWest();
delay(amberDuration);
setRedLightsEastWest();
delay(transitionDelay);
}
void activatePedestrianLights() {
// Turn pedestrian lights green
digitalWrite(rgbRedPin, LOW);
digitalWrite(rgbGreenPin, HIGH);
delay(pedestrianGreenDuration);
// Turn pedestrian lights back to red
digitalWrite(rgbGreenPin, LOW);
digitalWrite(rgbRedPin, HIGH);
pedestrianCycleActive = false;
}
void setTrafficLightsNorthSouth() {
digitalWrite(greenPins[0], HIGH);
digitalWrite(redPins[0], LOW);
digitalWrite(redPins[1], HIGH);
digitalWrite(amberPins[0], LOW);
}
void setAmberLightsNorthSouth() {
digitalWrite(amberPins[0], HIGH);
digitalWrite(greenPins[0], LOW);
}
void setRedLightsNorthSouth() {
digitalWrite(redPins[0], HIGH);
digitalWrite(amberPins[0], LOW);
}
void setTrafficLightsEastWest() {
digitalWrite(greenPins[1], HIGH);
digitalWrite(redPins[1], LOW);
digitalWrite(redPins[0], HIGH);
digitalWrite(amberPins[1], LOW);
}
void setAmberLightsEastWest() {
digitalWrite(amberPins[1], HIGH);
digitalWrite(greenPins[1], LOW);
}
void setRedLightsEastWest() {
digitalWrite(redPins[1], HIGH);
digitalWrite(amberPins[1], LOW);
}