#define BLYNK_TEMPLATE_ID "TMPL3L0_xMRrw"
#define BLYNK_TEMPLATE_NAME "smart traffic diversion system for road congestion"
#define BLYNK_AUTH_TOKEN "1vgYy_xfHmENQf7RDvdexCsO38hS92c3"
#include <Wire.h>
#include <Arduino.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include "DHTesp.h"
#define PPM_PIN 16 // Pin connected to MQ135 sensor
#define PIR_PIN 2
#define ULTRASONIC_TRIG_PIN 5
#define ULTRASONIC_ECHO_PIN 13
#define LED_RED 12
#define LED_YELLOW 4
#define LED_GREEN 27
const char *ssid = "Wokwi-GUEST";
const char *password = "";
long distance;
DHTesp dhtSensor;
// Virtual Pins
#define VIRTUAL_PIN_DISTANCE V1
#define VIRTUAL_PIN_PPM V2
#define VIRTUAL_PIN_TEMP V3
#define VIRTUAL_PIN_HUMIDITY V4
#define VIRTUAL_PIN_MOTION V5
void setup_wifi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
Serial.println("Connected");
}
void processSensorData(long distance) {
// Traffic light control based on distance
if (distance < 20) {
// Unsafe Distance - Stop Traffic
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_RED, HIGH);
Serial.println("Unsafe Distance - Stop Traffic");
} else if (distance >= 20 && distance <= 50) {
// Moderate Distance - Use Caution
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, HIGH);
digitalWrite(LED_RED, LOW);
Serial.println("Moderate Distance - Use Caution");
} else if (distance > 50 && distance <= 400) {
// Safe Distance - Allow Traffic
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_RED, LOW);
Serial.println("Safe Distance - Allow Traffic");
}
}
void setup() {
Wire.begin(23, 22);
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(ULTRASONIC_TRIG_PIN, OUTPUT);
pinMode(ULTRASONIC_ECHO_PIN, INPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
// Initialize DHT sensor
dhtSensor.setup(23, DHTesp::DHT22);
// Initialize WiFi
setup_wifi();
// Initialize Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
}
void loop() {
Blynk.run();
// Read PIR sensor
int pirValue = digitalRead(PIR_PIN);
if (pirValue == HIGH) {
// Motion detected - Stop Traffic
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_GREEN, LOW);
Serial.println("Motion detected - Stop Traffic");
Blynk.virtualWrite(VIRTUAL_PIN_MOTION, 1); // Motion detected
} else {
Blynk.virtualWrite(VIRTUAL_PIN_MOTION, 0); // No motion detected
// Read ultrasonic sensor
digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(ULTRASONIC_TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
long duration = pulseIn(ULTRASONIC_ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
// Process sensor data and control traffic lights
processSensorData(distance);
// Send distance data to Blynk
Blynk.virtualWrite(VIRTUAL_PIN_DISTANCE, distance);
// Read PPM value from MQ135 sensor
int16_t ppmValue = analogRead(PPM_PIN);
// Map the correct value as the ADC expects a max voltage of 3.3 V, but we're sending 5 V
int mappedPpmValue = ppmValue * (5.0 / 3.3);
Serial.print("PPM: ");
Serial.println(mappedPpmValue);
// Send PPM data to Blynk
Blynk.virtualWrite(VIRTUAL_PIN_PPM, mappedPpmValue);
}
delay(1000);
// Read temperature and humidity
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float temperature = data.temperature;
float humidity = data.humidity;
// Send temperature and humidity data to Blynk
Blynk.virtualWrite(VIRTUAL_PIN_TEMP, temperature);
Blynk.virtualWrite(VIRTUAL_PIN_HUMIDITY, humidity);
delay(1000);
}