#define BLYNK_TEMPLATE_ID "TMPL3DoTa8aLk"
#define BLYNK_TEMPLATE_NAME "Iot Project"
#define BLYNK_AUTH_TOKEN "7jtEfGGXTRqZMzUuaXZt--IcOc_dacS_"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// LCD settings
LiquidCrystal_I2C LCD(0x27, 16, 2);
const int sensorPin1 = 34; // Sensor 1 (potentiometer)
const int sensorPin2 = 35; // Sensor 2 (potentiometer)
const int sensorPin3 = 32; // Sensor 3 (potentiometer)
const int sensorPin4 = 33; // Sensor 4 (potentiometer)
// Emergency vehicle pins
const int emePin1 = 26;
const int emePin2 = 27;
const int emePin3 = 14;
const int emePin4 = 12;
// LED pins for each lane
const int r1 = 16;
const int g1 = 17;
const int r2 = 18;
const int g2 = 19;
const int r3 = 21;
const int g3 = 22;
const int r4 = 23;
const int g4 = 25;
// Threshold for traffic detection
const int threshold = 500;
// Timing
const unsigned long greenDuration = 10000; // 10 seconds
const unsigned long switchDelay = 5000; // 5 seconds delay after detecting equal traffic
unsigned long previousMillis = 0;
unsigned long switchStartMillis = 0;
int currentLane = 1; // Start with lane 1
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
LCD.init();
LCD.backlight();
// Initialize LED pins as output
pinMode(r1, OUTPUT);
pinMode(g1, OUTPUT);
pinMode(r2, OUTPUT);
pinMode(g2, OUTPUT);
pinMode(r3, OUTPUT);
pinMode(g3, OUTPUT);
pinMode(r4, OUTPUT);
pinMode(g4, OUTPUT);
// Initialize emergency switch pins as input with pull-up resistors
pinMode(emePin1, INPUT_PULLUP);
pinMode(emePin2, INPUT_PULLUP);
pinMode(emePin3, INPUT_PULLUP);
pinMode(emePin4, INPUT_PULLUP);
LCD.setCursor(0, 0);
LCD.print("Traffic Control");
delay(2000);
LCD.clear();
setAllRed();
setLane(currentLane, true); // Set initial lane to green
}
void loop() {
Blynk.run();
// Read sensor values
int traffic1 = analogRead(sensorPin1);
int traffic2 = analogRead(sensorPin2);
int traffic3 = analogRead(sensorPin3);
int traffic4 = analogRead(sensorPin4);
// Check emergency vehicle presence
bool emergency1 = digitalRead(emePin1) == LOW;
bool emergency2 = digitalRead(emePin2) == LOW;
bool emergency3 = digitalRead(emePin3) == LOW;
bool emergency4 = digitalRead(emePin4) == LOW;
// Print debug information
Serial.print("Traffic 1: "); Serial.println(traffic1);
Serial.print("Traffic 2: "); Serial.println(traffic2);
Serial.print("Traffic 3: "); Serial.println(traffic3);
Serial.print("Traffic 4: "); Serial.println(traffic4);
Serial.print("Emergency 1: "); Serial.println(emergency1);
Serial.print("Emergency 2: "); Serial.println(emergency2);
Serial.print("Emergency 3: "); Serial.println(emergency3);
Serial.print("Emergency 4: "); Serial.println(emergency4);
unsigned long currentMillis = millis();
// Emergency vehicle handling
if (emergency1) {
handleEmergency(1);
} else if (emergency2) {
handleEmergency(2);
} else if (emergency3) {
handleEmergency(3);
} else if (emergency4) {
handleEmergency(4);
} else {
// Normal traffic handling
int maxTraffic = max(max(traffic1, traffic2), max(traffic3, traffic4));
if (maxTraffic > threshold) {
// which lane has the highest traffic
if (traffic1 == maxTraffic) {
manageTraffic(1, traffic1);
} else if (traffic2 == maxTraffic) {
manageTraffic(2, traffic2);
} else if (traffic3 == maxTraffic) {
manageTraffic(3, traffic3);
} else if (traffic4 == maxTraffic) {
manageTraffic(4, traffic4);
}
switchStartMillis = currentMillis;
} else {
// Round-robin lane control
if (currentMillis - switchStartMillis >= switchDelay) {
switchStartMillis = currentMillis;
currentLane = (currentLane % 4) + 1; // Cycle through lanes 1 to 4
setAllRed();
setLane(currentLane, true);
Serial.print("Switching to lane: "); Serial.println(currentLane);
}
}
}
}
void manageTraffic(int lane, int traffic) {
if (currentLane != 0 && currentLane != lane) {
setLane(currentLane, false);
}
currentLane = lane;
unsigned long startMillis = millis();
setLane(lane, true);
Serial.print("Managing traffic for lane: "); Serial.println(lane);
while (millis() - startMillis < greenDuration) {
delay(1000);
switch (lane) {
case 1:
traffic = analogRead(sensorPin1);
break;
case 2:
traffic = analogRead(sensorPin2);
break;
case 3:
traffic = analogRead(sensorPin3);
break;
case 4:
traffic = analogRead(sensorPin4);
break;
}
Serial.print("Lane "); Serial.print(lane); Serial.print(" traffic: "); Serial.println(traffic);
if (traffic <= threshold) {
break;
}
}
}
void handleEmergency(int lane) {
Serial.println("Handling emergency");
Serial.print("Emergency lane: "); Serial.println(lane);
setAllRed();
currentLane = lane;
setLane(lane, true);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Emergency Lane ");
LCD.print(lane);
delay(greenDuration);
setAllRed();
currentLane = 1;
setLane(currentLane, true);
}
void setLane(int lane, bool isGreen) {
int redLed, greenLED;
switch (lane) {
case 1:
redLed = r1;
greenLED = g1;
break;
case 2:
redLed = r2;
greenLED = g2;
break;
case 3:
redLed = r3;
greenLED = g3;
break;
case 4:
redLed = r4;
greenLED = g4;
break;
default:
return;
}
if (isGreen) {
digitalWrite(redLed, LOW);
digitalWrite(greenLED, HIGH);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Lane ");
LCD.print(lane);
LCD.print(": Green");
Serial.print("Lane "); Serial.print(lane); Serial.println(": Green");
} else {
digitalWrite(redLed, HIGH);
digitalWrite(greenLED, LOW);
Serial.print("Lane "); Serial.print(lane); Serial.println(": Red");
}
}
void setAllRed() {
digitalWrite(r1, HIGH);
digitalWrite(g1, LOW);
digitalWrite(r2, HIGH);
digitalWrite(g2, LOW);
digitalWrite(r3, HIGH);
digitalWrite(g3, LOW);
digitalWrite(r4, HIGH);
digitalWrite(g4, LOW);
Serial.println("All lanes set to Red");
}