int RED = 12; // Vehicle red LED
int YELLOW = 13; // Vehicle yellow LED
int GREEN = 14; // Vehicle green LED
int GREEN2 = 25; // Pedestrian green LED
int RED2 = 26; // Pedestrian red LED
int BUTTON = 27; // Pedestrian pushbutton
int BUZZER = 33; // Buzzer
int crossTime = 5000; // Pedestrian walk time (5 sec)
unsigned long lastChange = 0; // Prevent repeated triggers
bool crossing = false;
void setup() {
pinMode(RED, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(RED2, OUTPUT);
pinMode(GREEN2, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(BUTTON, INPUT);
// Initial state
digitalWrite(GREEN, HIGH); // Traffic green
digitalWrite(RED, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(RED2, HIGH); // Pedestrian don't walk
digitalWrite(GREEN2, LOW);
}
void loop() {
// Traffic stays green for 5 seconds minimum
if (!crossing && digitalRead(BUTTON) == HIGH && millis() - lastChange >= 5000) {
crossing = true;
changeLights();
lastChange = millis();
crossing = false;
}
}
void changeLights() {
// Traffic: Green → Yellow
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, HIGH);
delay(2000); // Yellow = 2 seconds
// Traffic: Yellow → Red
digitalWrite(YELLOW, LOW);
digitalWrite(RED, HIGH);
// Pedestrian: Walk
digitalWrite(RED2, LOW);
digitalWrite(GREEN2, HIGH);
tone(BUZZER, 1000); // Buzzer ON
delay(crossTime); // Walk = 5 seconds
noTone(BUZZER);
delay(500); // Short pause
// Pedestrian flashing warning (2 seconds total)
for (int i = 0; i < 5; i++) {
digitalWrite(GREEN2, LOW);
delay(200);
digitalWrite(GREEN2, HIGH);
delay(200);
}
// Reset to normal traffic flow
digitalWrite(GREEN2, LOW);
digitalWrite(RED2, HIGH);
digitalWrite(RED, LOW);
digitalWrite(GREEN, HIGH);
}