#define BLYNK_TEMPLATE_ID "TMPL33-ygH834"
#define BLYNK_TEMPLATE_NAME "Smart Traffic"
#define BLYNK_AUTH_TOKEN "lhSWhde6isKGh-AvG99raRkwg7VEhm9D"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
const int redLedPin = 25;
const int yellowLedPin = 26;
const int greenLedPin = 27;
const int motionSensorPin = 32;
LiquidCrystal_I2C lcd(0x27, 16, 2);
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
enum TrafficLightState {
RED,
YELLOW,
GREEN
};
TrafficLightState currentState = RED;
unsigned long lastChangeTime = 0;
unsigned long interval = 3000; // Default interval
bool isAmbulanceRequested = false;
bool isPedestrianRequested = false;
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
lcd.init();
lcd.backlight();
pinMode(redLedPin, OUTPUT);
pinMode(yellowLedPin, OUTPUT);
pinMode(greenLedPin, OUTPUT);
pinMode(motionSensorPin, INPUT);
// Setup Blynk widget for displaying traffic status
Blynk.virtualWrite(V4, "Normal Traffic");
// Attach virtual button handlers
Blynk.virtualWrite(V1, "Ambulance");
Blynk.virtualWrite(V2, "Pedestrian");
// Set up interval for normal operation
currentState = RED;
lastChangeTime = millis();
}
void loop() {
Blynk.run();
unsigned long currentTime = millis();
if (currentState == RED && currentTime - lastChangeTime >= interval) {
currentState = GREEN;
lastChangeTime = currentTime;
} else if (currentState == GREEN && currentTime - lastChangeTime >= interval) {
currentState = YELLOW;
lastChangeTime = currentTime;
} else if (currentState == YELLOW && currentTime - lastChangeTime >= interval / 2) {
currentState = RED;
lastChangeTime = currentTime;
}
// Handle special events
if (isAmbulanceRequested) {
handleAmbulance();
isAmbulanceRequested = false;
} else if (isPedestrianRequested) {
handlePedestrian();
isPedestrianRequested = false;
} else {
// Normal traffic operation
updateTrafficLights();
updateLCD();
}
// Update Traffic Light Color on Blynk V3
updateTrafficLightColorWidget();
delay(1000);
}
void updateTrafficLights() {
digitalWrite(redLedPin, currentState == RED ? HIGH : LOW);
digitalWrite(yellowLedPin, currentState == YELLOW ? HIGH : LOW);
digitalWrite(greenLedPin, currentState == GREEN ? HIGH : LOW);
}
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
switch (currentState) {
case RED:
lcd.print("Red");
lcd.setCursor(0, 1);
lcd.print("Normal Traffic");
break;
case GREEN:
lcd.print("Green");
lcd.setCursor(0, 1);
lcd.print("Normal Traffic");
break;
case YELLOW:
lcd.print("Yellow");
lcd.setCursor(0, 1);
lcd.print("Normal Traffic");
break;
}
}
void updateTrafficLightColorWidget() {
String color;
switch (currentState) {
case RED:
color = "Red";
break;
case YELLOW:
color = "Yellow";
break;
case GREEN:
color = "Green";
break;
}
Blynk.virtualWrite(V3, color);
}
BLYNK_WRITE(V1) {
int value = param.asInt();
if (value == 1) {
isAmbulanceRequested = true;
}
}
BLYNK_WRITE(V2) {
int value = param.asInt();
if (value == 1) {
isPedestrianRequested = true;
}
}
void handleAmbulance() {
currentState = RED; // Immediately switch to red for ambulance
updateTrafficLights();
Blynk.virtualWrite(V4, "Ambulance Passing");
Blynk.virtualWrite(V3,"Red");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Red");
lcd.setCursor(0, 1);
lcd.print("Ambulance");
delay(5000); // Wait for 2 seconds for the ambulance to pass
currentState = RED; // Switch back to red after ambulance passes
Blynk.virtualWrite(V4, "Normal Traffic");
Blynk.virtualWrite(V3,"Red");
updateTrafficLights();
}
void handlePedestrian() {
currentState = RED; // Immediately switch to red for pedestrian
updateTrafficLights();
Blynk.virtualWrite(V4, "Pedestrian Crossing");
Blynk.virtualWrite(V3,"Red");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Red");
lcd.setCursor(0, 1);
lcd.print("Pedestrian Crossing");
delay(10000); // Wait for 15 seconds for the pedestrian to cross
currentState = RED; // Switch back to green after pedestrian crosses
Blynk.virtualWrite(V4, "Normal Traffic");
Blynk.virtualWrite(V3, "Red");
updateTrafficLights();
}