#define RED_LIGHT 14
#define YELLOW_LIGHT 12
#define GREEN_LIGHT 13
#define PED_LIGHT 5
#define BUTTON 4
#define BUZZER 18
#define LATCH_PIN 23
#define CLOCK_PIN 22
#define DATA_PIN 21
volatile bool pedestrian_requested = false;
unsigned long last_interrupt_time = 0;
const byte numbers[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
// Interrupt Service Routine (ISR) for button press
void IRAM_ATTR pedestrian_request() {
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 500) { // Debounce
pedestrian_requested = true;
}
last_interrupt_time = interrupt_time;
}
// Function to update 7-segment display
void displayNumber(int num) {
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, numbers[num]);
digitalWrite(LATCH_PIN, HIGH);
}
void setup() {
pinMode(RED_LIGHT, OUTPUT);
pinMode(YELLOW_LIGHT, OUTPUT);
pinMode(GREEN_LIGHT, OUTPUT);
pinMode(PED_LIGHT, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
attachInterrupt(BUTTON, pedestrian_request, FALLING);
Serial.begin(115200);
}
void loop() {
if (!pedestrian_requested) {
// Normal traffic light cycle
digitalWrite(GREEN_LIGHT, HIGH);
digitalWrite(YELLOW_LIGHT, LOW);
digitalWrite(RED_LIGHT, LOW);
digitalWrite(PED_LIGHT, LOW);
digitalWrite(BUZZER, LOW);
displayNumber(0); // Display 0 when in normal state
}
else {
// Handle pedestrian crossing
digitalWrite(GREEN_LIGHT, LOW);
digitalWrite(YELLOW_LIGHT, HIGH);
delay(2000); // Yellow warning
digitalWrite(YELLOW_LIGHT, LOW);
digitalWrite(RED_LIGHT, HIGH);
digitalWrite(PED_LIGHT, HIGH);
Serial.println("Pedestrians may cross...");
// Countdown from 5 to 0
for (int i = 5; i >= 0; i--) {
displayNumber(i);
digitalWrite(BUZZER, HIGH);
delay(250);
digitalWrite(BUZZER, LOW);
delay(750);
}
delay(1000); // Additional delay before resetting
// Reset system
digitalWrite(PED_LIGHT, LOW);
digitalWrite(RED_LIGHT, LOW);
pedestrian_requested = false;
}
delay(500);
}