#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Pin assignments
const int buttonPin = 7; // Button pin
const int carRedLED = 2; // Car traffic red LED
const int carYellowLED = 3; // Car traffic yellow LED
const int carGreenLED = 4; // Car traffic green LED
const int pedRedLED = 5; // Pedestrian red LED
const int pedGreenLED = 6; // Pedestrian green LED
// Debounce variables
bool buttonPressed = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adjust the I2C address if needed
void setup() {
pinMode(carRedLED, OUTPUT);
pinMode(carYellowLED, OUTPUT);
pinMode(carGreenLED, OUTPUT);
pinMode(pedRedLED, OUTPUT);
pinMode(pedGreenLED, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // Using internal pull-up resistor
lcd.init();
lcd.backlight();
displayInitialMessage();
initializeTrafficLights();
}
void loop() {
// Check if button is pressed (LOW when pressed due to pull-up resistor)
if (digitalRead(buttonPin) == LOW) {
activateCrossingSequence();
}
}
void displayInitialMessage() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Press button to");
lcd.setCursor(0, 1);
lcd.print("cross the road");
}
void initializeTrafficLights() {
digitalWrite(carGreenLED, HIGH); // Start with green light for cars
digitalWrite(carYellowLED, LOW);
digitalWrite(carRedLED, LOW);
digitalWrite(pedRedLED, HIGH); // Red light for pedestrians
digitalWrite(pedGreenLED, LOW);
}
void activateCrossingSequence() {
// Turn car green off and yellow on
digitalWrite(carGreenLED, LOW);
digitalWrite(carYellowLED, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ready to cross ");
countdownYellowLight(8); // 2 seconds countdown for yellow light
// Change to red for cars and green for pedestrians
digitalWrite(carYellowLED, LOW);
digitalWrite(carRedLED, HIGH);
digitalWrite(pedRedLED, LOW);
digitalWrite(pedGreenLED, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Cross now");
startCountdown(10); // 5 seconds countdown
// Reset to initial state
digitalWrite(carRedLED, LOW);
digitalWrite(pedGreenLED, LOW);
digitalWrite(pedRedLED, HIGH);
digitalWrite(carGreenLED, HIGH); // Green light for cars
displayInitialMessage();
}
void startCountdown(int seconds) {
for (int i = seconds; i > 0; i--) {
lcd.setCursor(0, 1);
lcd.print("Seconds left: ");
lcd.print(i);
lcd.print(" "); // Clear any remaining digits
if (i <= 3) {
blinkPedestrianLights(); // Blink the pedestrian lights during the last 3 seconds
} else {
delay(1000);
}
}
}
void countdownYellowLight(int seconds) {
for (int i = seconds; i > 0; i--) {
lcd.setCursor(0, 1);
lcd.print(i);
lcd.print(" sec ");
delay(1000);
}
}
void blinkPedestrianLights() {
digitalWrite(pedGreenLED, LOW);
delay(500);
digitalWrite(pedGreenLED, HIGH);
delay(500);
}