#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Define the digital pins for sensors and LEDs
#define BUTTON1 18 // Vehicle detection sensor (Road 1)
#define BUTTON2 19 // Vehicle detection sensor (Road 2)
#define RED1 4
#define YELLOW1 5
#define GREEN1 16
#define RED2 17
#define YELLOW2 21
#define GREEN2 22
#define BUZZER 23
// Initialize the LCD with the I2C address and dimensions (16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// Initialize serial communication for debugging
Serial.begin(115200);
// Initialize the LCD
lcd.init();
// Turn on the backlight of the LCD
lcd.backlight();
// Set the cursor to the top-left corner (column 0, row 0)
lcd.setCursor(0, 0);
// Print a startup message on the LCD
lcd.print("Smart Traffic");
// Configure the button pins as inputs with internal pull-up resistors
pinMode(BUTTON1, INPUT_PULLUP);
pinMode(BUTTON2, INPUT_PULLUP);
// Configure the LED pins as outputs
pinMode(RED1, OUTPUT);
pinMode(YELLOW1, OUTPUT);
pinMode(GREEN1, OUTPUT);
pinMode(RED2, OUTPUT);
pinMode(YELLOW2, OUTPUT);
pinMode(GREEN2, OUTPUT);
// Configure the buzzer pin as output
pinMode(BUZZER, OUTPUT);
// Initialize traffic lights to a safe starting state (Road 1 Red, Road 2 Green)
digitalWrite(RED1, HIGH);
digitalWrite(YELLOW1, LOW);
digitalWrite(GREEN1, LOW);
digitalWrite(RED2, LOW);
digitalWrite(YELLOW2, LOW);
digitalWrite(GREEN2, HIGH);
}
void loop() {
// Read the state of the vehicle detection sensors
bool road1_traffic = digitalRead(BUTTON1) == LOW; // LOW indicates vehicle detected (due to pull-up)
bool road2_traffic = digitalRead(BUTTON2) == LOW;
// Print the sensor readings to the serial monitor for debugging
Serial.print("Road 1: ");
Serial.println(road1_traffic ? "Vehicle Detected" : "Clear");
Serial.print("Road 2: ");
Serial.println(road2_traffic ? "Vehicle Detected" : "Clear");
// Implement a simple priority-based traffic control logic
if (road1_traffic && !road2_traffic) {
controlTraffic(1); // Give priority to Road 1 if traffic is detected and Road 2 is clear
} else if (road2_traffic && !road1_traffic) {
controlTraffic(2); // Give priority to Road 2 if traffic is detected and Road 1 is clear
} else {
controlTraffic(0); // Enter a normal alternating mode if both or neither roads have traffic
}
// Introduce a delay for the main loop to avoid excessive readings
delay(300);
}
// Function to control the traffic lights based on priority
void controlTraffic(int priority) {
if (priority == 1) {
// Road 1 has priority
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Road 1 Open");
lcd.setCursor(0, 1);
lcd.print("Road 2 Wait");
// Set Road 1 to Green, Road 2 to Red
digitalWrite(RED1, LOW);
digitalWrite(YELLOW1, LOW);
digitalWrite(GREEN1, HIGH);
digitalWrite(RED2, HIGH);
digitalWrite(YELLOW2, LOW);
digitalWrite(GREEN2, LOW);
// Keep Road 1 open for a certain duration
delay(5000);
// Transition Road 1 to Red through Yellow
digitalWrite(GREEN1, LOW);
digitalWrite(YELLOW1, HIGH);
delay(2000);
digitalWrite(YELLOW1, LOW);
digitalWrite(RED1, HIGH);
}
else if (priority == 2) {
// Road 2 has priority
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Road 2 Open");
lcd.setCursor(0, 1);
lcd.print("Road 1 Wait");
// Set Road 2 to Green, Road 1 to Red
digitalWrite(RED1, HIGH);
digitalWrite(YELLOW1, LOW);
digitalWrite(GREEN1, LOW);
digitalWrite(RED2, LOW);
digitalWrite(YELLOW2, LOW);
digitalWrite(GREEN2, HIGH);
// Keep Road 2 open for a certain duration
delay(5000);
// Transition Road 2 to Red through Yellow
digitalWrite(GREEN2, LOW);
digitalWrite(YELLOW2, HIGH);
delay(2000);
digitalWrite(YELLOW2, LOW);
digitalWrite(RED2, HIGH);
}
else {
// Normal alternating mode (simplified) - give a short green to Road 2 by default if no clear priority
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Normal Mode");
// Road 1 Red, Road 2 Green
digitalWrite(RED1, HIGH);
digitalWrite(YELLOW1, LOW);
digitalWrite(GREEN1, LOW);
digitalWrite(RED2, LOW);
digitalWrite(YELLOW2, LOW);
digitalWrite(GREEN2, HIGH);
delay(3000);
// Transition Road 2 to Red through Yellow
digitalWrite(GREEN2, LOW);
digitalWrite(YELLOW2, HIGH);
delay(2000);
digitalWrite(YELLOW2, LOW);
digitalWrite(RED2, HIGH);
// Road 2 Red, Road 1 Green
digitalWrite(RED1, LOW);
digitalWrite(YELLOW1, LOW);
digitalWrite(GREEN1, HIGH);
digitalWrite(RED2, HIGH);
digitalWrite(YELLOW2, LOW);
digitalWrite(GREEN2, LOW);
delay(3000);
// Transition Road 1 to Red through Yellow
digitalWrite(GREEN1, LOW);
digitalWrite(YELLOW1, HIGH);
delay(2000);
digitalWrite(YELLOW1, LOW);
digitalWrite(RED1, HIGH);
}
}