#define BLYNK_TEMPLATE_ID "TMPL3M0TZv3M7"
#define BLYNK_TEMPLATE_NAME "Traffic Intensity Detection"
#define BLYNK_AUTH_TOKEN "EZ3-4DOs0LIfhcMm7KoC9jpU0fKRu6YD"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
// Pin Definitions
const int triggerPins[4] = {23, 22, 21, 19};
const int echoPins[4] = {2, 4, 16, 17};
const int redLEDs[4] = {14, 27, 26, 25};
const int yellowLEDs[4] = {32, 33, 4, 5};
const int greenLEDs[4] = {18, 19, 21, 22};
const int ledPin = 13;
// WiFi Credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
void setup() {
Serial.begin(115200);
Serial.println("Initializing System...");
for (int i = 0; i < 4; i++) {
pinMode(triggerPins[i], OUTPUT);
pinMode(echoPins[i], INPUT);
pinMode(redLEDs[i], OUTPUT);
pinMode(yellowLEDs[i], OUTPUT);
pinMode(greenLEDs[i], OUTPUT);
}
pinMode(ledPin, OUTPUT);
Serial.println("Connecting to Blynk...");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi Connection Failed! Check Credentials.");
while (true);
}
Serial.println("Blynk Connected!");
timer.setInterval(1000L, controlTraffic);
Serial.println("Setup Complete. Starting...");
}
void controlTraffic() {
int trafficDensities[4] = {0};
int totalDensity = 0;
// Measure traffic density for each lane
for (int i = 0; i < 4; i++) {
trafficDensities[i] = detectTraffic(triggerPins[i], echoPins[i]);
totalDensity += trafficDensities[i];
Serial.print("Lane ");
Serial.print(i + 1);
Serial.print(" Traffic Density: ");
Serial.println(trafficDensities[i]);
}
// Skip empty lanes and allocate proportional green light time
for (int i = 0; i < 4; i++) {
if (trafficDensities[i] > 0) {
int greenTime = (trafficDensities[i] * 10) / (totalDensity + 1); // Proportional time
Serial.print("Allocating Green Light for Lane ");
Serial.print(i + 1);
Serial.print(" for ");
Serial.print(greenTime);
Serial.println(" seconds.");
activateGreenLight(i, greenTime);
} else {
Serial.print("Lane ");
Serial.print(i + 1);
Serial.println(": Skipped (No Traffic)");
activateRedLight(i);
}
}
// Blinking additional LED for debugging
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
}
int detectTraffic(int triggerPin, int echoPin) {
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
long duration = pulseIn(echoPin, HIGH);
int distance = duration * 0.034 / 2;
if (duration == 0 || distance > 400) {
Serial.println("No valid echo detected or object out of range.");
return 0; // Default to no traffic
}
Serial.print("Measured Distance: ");
Serial.print(distance);
Serial.println(" cm");
if (distance > 200) {
return 100; // High traffic density
} else if (distance > 150 && distance <= 200) {
return 75; // Moderate traffic density
} else if (distance > 100 && distance <= 150) {
return 50; // Medium traffic density
} else if (distance > 40 && distance <= 100) {
return 25; // Low traffic density
} else {
return 10; // Very low traffic density
}
}
void activateRedLight(int lane) {
digitalWrite(redLEDs[lane], HIGH);
digitalWrite(yellowLEDs[lane], LOW);
digitalWrite(greenLEDs[lane], LOW);
Blynk.virtualWrite(V1 + lane, "Red Light ON");
Serial.print("Lane ");
Serial.print(lane + 1);
Serial.println(": Red Light ON");
}
void activateGreenLight(int lane, int greenTime) {
digitalWrite(redLEDs[lane], LOW);
digitalWrite(yellowLEDs[lane], LOW);
digitalWrite(greenLEDs[lane], HIGH);
Blynk.virtualWrite(V1 + lane, "Green Light ON");
Serial.print("Lane ");
Serial.print(lane + 1);
Serial.println(": Green Light ON");
delay(greenTime * 1000);
digitalWrite(greenLEDs[lane], LOW);
digitalWrite(yellowLEDs[lane], HIGH);
Blynk.virtualWrite(V1 + lane, "Yellow Light ON");
Serial.print("Lane ");
Serial.print(lane + 1);
Serial.println(": Yellow Light ON");
delay(2000);
digitalWrite(yellowLEDs[lane], LOW);
digitalWrite(redLEDs[lane], HIGH);
}
void loop() {
Blynk.run();
timer.run();
}