#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int redLight = 2;
const int yellowLight = 3;
const int greenLight = 4;
const int pedRedLight = 5;
const int pedGreenLight = 6;
const int buttonPin = 7;
const int buzzer = 8;
bool pedRequest = false;
void setup() {
lcd.init();
lcd.backlight();
pinMode(redLight, OUTPUT);
pinMode(yellowLight, OUTPUT);
pinMode(greenLight, OUTPUT);
pinMode(pedRedLight, OUTPUT);
pinMode(pedGreenLight, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
digitalWrite(pedRedLight, HIGH); // Pedestrian red light on by default
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
pedRequest = true;
}
// Traffic light sequence
lcd.setCursor(5, 0);
lcd.print("STOP");
digitalWrite(redLight, HIGH);
delay(2000);
digitalWrite(redLight, LOW);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("GET READY");
digitalWrite(yellowLight, HIGH);
delay(2000);
digitalWrite(yellowLight, LOW);
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("GO");
digitalWrite(greenLight, HIGH);
delay(3000);
digitalWrite(greenLight, LOW);
// Blink green light
for (int i = 0; i < 3; i++) {
digitalWrite(greenLight, HIGH);
delay(500);
digitalWrite(greenLight, LOW);
delay(500);
}
lcd.clear();
pedestrianCrossing();
}
void pedestrianCrossing() {
// Turn on pedestrian green light and buzzer
tone(8, 262, 250);
digitalWrite(pedRedLight, LOW);
digitalWrite(pedGreenLight, HIGH);
for (int i = 0; i < 5; i++) {
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
delay(500);
}
delay(2000);
tone(8, 262, 250);
// Turn off pedestrian green light
digitalWrite(pedGreenLight, LOW);
digitalWrite(pedRedLight, HIGH);
}