#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;
const unsigned long interval = 3000;
const unsigned long pedestrianInterval = 30000; // Pedestrian crossing interval (30 seconds)
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);
currentState = RED;
lastChangeTime = millis();
}
void loop() {
Blynk.run();
delay(10);
bool motionDetected = digitalRead(motionSensorPin) == HIGH;
unsigned long currentTime = millis();
// Handle traffic light state transitions
if (motionDetected) {
currentState = RED;
lastChangeTime = currentTime;
} else {
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;
}
}
// Update LED states
digitalWrite(redLedPin, currentState == RED ? HIGH : LOW);
digitalWrite(yellowLedPin, currentState == YELLOW ? HIGH : LOW);
digitalWrite(greenLedPin, currentState == GREEN ? HIGH : LOW);
// Update Blynk status LEDs
Blynk.virtualWrite(V1, currentState == RED ? 255 : 0);
Blynk.virtualWrite(V2, currentState == YELLOW ? 255 : 0);
Blynk.virtualWrite(V3, currentState == GREEN ? 255 : 0);
// Handle LCD and Blynk display
if (motionDetected) {
Blynk.virtualWrite(V4, "Ambulance! Wait!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Red");
lcd.setCursor(0, 1);
lcd.print("Ambulance! Wait!");
} else {
if (currentTime - lastChangeTime >= pedestrianInterval) {
currentState = GREEN; // Allow pedestrian crossing
lastChangeTime = currentTime;
// Update Blynk and LCD display for pedestrian crossing
Blynk.virtualWrite(V4, "Pedestrian Crossing");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Green");
lcd.setCursor(0, 1);
lcd.print("Pedestrian Crossing");
// Wait for the pedestrian interval
delay(pedestrianInterval);
// After pedestrian interval, switch back to normal traffic
currentState = RED;
lastChangeTime = millis();
} else {
// Normal traffic state
Blynk.virtualWrite(V4, "Normal Traffic");
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;
}
}
}
delay(1000);
}