#define BLYNK_TEMPLATE_ID "TMPL3gZzrc9kY"
#define BLYNK_TEMPLATE_NAME "Smart traffic diversion system for road congestion"
#define BLYNK_AUTH_TOKEN "nrjkyjBJb7iQqb-zRxWHtXiZZsrleGcV"
#include <LiquidCrystal.h>
#include <BlynkSimpleEsp32.h> // Include Blynk library
#define IR_PIN 4
#define IR_P1 2
#define REDS_LED 16
#define GREENS_LED 17
#define YELLOWS_LED 22
#define REDR_LED 13
#define GREENR_LED 12
#define REDS1_LED 14
#define GREENS1_LED 27
#define YELLOWS1_LED 26
#define REDL_LED 25
#define GREENL_LED 33
#define YELLOWL_LED 32
#define RED_SIGNAL 1
#define GREEN_SIGNAL 2
#define YELLOW_SIGNAL 3
const byte LCD_RS = 19;
const byte LCD_E = 23;
const byte LCD_D4 = 18;
const byte LCD_D5 = 21;
const byte LCD_D6 = 5;
const byte LCD_D7 = 15;
int flag1 = 1;
int flag2 = 0;
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
// Define custom characters for the arrows
uint8_t leftArrow[8] = {
0b00000,
0b00100,
0b01100,
0b11111,
0b01100,
0b00100,
0b00000,
0b00000
};
uint8_t rightArrow[8] = {
0b00000,
0b00100,
0b00110,
0b11111,
0b00110,
0b00100,
0b00000,
0b00000
};
uint8_t straightArrow[8] = {
0b00100,
0b01110,
0b11111,
0b00100,
0b00100,
0b00100,
0b00100,
0b00000
};
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
void setup() {
pinMode(IR_PIN, INPUT);
pinMode(REDS_LED, OUTPUT);
pinMode(GREENS_LED, OUTPUT);
pinMode(YELLOWS_LED, OUTPUT);
pinMode(REDR_LED, OUTPUT);
pinMode(GREENR_LED, OUTPUT);
pinMode(IR_P1, INPUT);
pinMode(REDS1_LED, OUTPUT);
pinMode(GREENS1_LED, OUTPUT);
pinMode(YELLOWS1_LED, OUTPUT);
pinMode(REDL_LED, OUTPUT);
pinMode(GREENL_LED, OUTPUT);
pinMode(YELLOWL_LED, OUTPUT);
lcd.begin(8, 4);
// Create custom characters
lcd.createChar(0, leftArrow);
lcd.createChar(1, rightArrow);
lcd.createChar(2, straightArrow);
// Display the initial message
lcd.setCursor(0, 2);
lcd.print("Go straight");
lcd.setCursor(12, 1);
lcd.write(byte(2)); // Display left arrow
Serial.begin(115200);
// Blynk setup
Blynk.begin(auth, ssid, pass);
}
void loop() {
Blynk.run();
NormalCommon();
int irValue2 = digitalRead(IR_PIN);
Serial.print("IR2 Value: ");
Serial.println(irValue2);
Blynk.virtualWrite(V1, irValue2); // Send IR value to Blynk app
// Check IR sensor if light is green
if (digitalRead(GREENS_LED) == HIGH) {
Serial.println("GREENS_LED is HIGH, checking IR_PIN");
delay(5000);
if (digitalRead(IR_PIN) == HIGH) {
Serial.println("IR_PIN is HIGH, waiting 2 seconds");
delay(2000); // Wait for T seconds
if (digitalRead(IR_PIN) == HIGH) {
Serial.println("IR_PIN is still HIGH, diverting left");
sendSMS("Traffic jam detected in 2nd intersection. Please divert.");
controlSignal1S(RED_SIGNAL);
controlSignal1L(GREEN_SIGNAL);
lcd.setCursor(0, 0);
lcd.print("Take diversion left!");
lcd.setCursor(13, 2);
lcd.write(byte(0)); // Display left arrow
} else {
Serial.println("IR_PIN is LOW after delay, normal flow 2");
NormalFlow2();
}
} else {
Serial.println("IR_PIN is LOW, normal flow 2");
NormalFlow2();
}
}
int irValue1 = digitalRead(IR_P1);
Serial.print("IR1 Value: ");
Serial.println(irValue1);
Blynk.virtualWrite(V2, irValue1); // Send IR value to Blynk app
// Check IR sensor if light is green
if (digitalRead(GREENL_LED) == HIGH) {
Serial.println("GREENL_LED is HIGH, checking IR_P1");
delay(10000);
if (digitalRead(IR_P1) == HIGH) {
Serial.println("IR_P1 is HIGH, waiting 2 seconds");
delay(2000); // Wait for T seconds
if (digitalRead(IR_P1) == HIGH) {
Serial.println("IR_P1 is still HIGH, keep straight");
sendSMS("Traffic jam detected in Left direction. KEEP STRAIGHT.");
controlSignal1L(RED_SIGNAL);
controlSignal1S(GREEN_SIGNAL);
lcd.setCursor(0, 0);
lcd.print("Keep going Straight!");
lcd.setCursor(13, 2);
lcd.write(byte(2)); // Display straight arrow
} else {
Serial.println("IR_P1 is LOW after delay, normal flow 1");
NormalFlow1();
}
} else {
Serial.println("IR_P1 is LOW, normal flow 1");
NormalFlow1();
}
}
delay(10000); // Delay between readings
}
void NormalCommon() {
Serial.println("NormalCommon: Setting signals");
controlSignal2S(RED_SIGNAL);
controlSignal2R(GREEN_SIGNAL);
controlSignal1S(RED_SIGNAL);
controlSignal1L(GREEN_SIGNAL);
delay(10000);
controlSignal2S(GREEN_SIGNAL);
controlSignal2R(RED_SIGNAL);
controlSignal1S(GREEN_SIGNAL);
controlSignal1L(RED_SIGNAL);
}
void NormalFlow2() {
Serial.println("NormalFlow2: Setting signals");
controlSignal2S(RED_SIGNAL);
controlSignal2R(GREEN_SIGNAL);
delay(10000);
controlSignal2S(GREEN_SIGNAL);
controlSignal2R(RED_SIGNAL);
}
void NormalFlow1() {
Serial.println("NormalFlow1: Setting signals");
controlSignal1S(RED_SIGNAL);
controlSignal1L(GREEN_SIGNAL);
delay(10000);
controlSignal1S(GREEN_SIGNAL);
controlSignal1L(RED_SIGNAL);
}
void sendSMS(String message) {
// Code to send SMS using GSM module
Serial.print("Sending SMS: ");
Serial.println(message);
Blynk.logEvent("traffic_alert", message); // Send notification to Blynk app
}
void controlSignal1S(int signal) {
switch (signal) {
case RED_SIGNAL:
digitalWrite(REDS1_LED, LOW);
digitalWrite(GREENS1_LED, LOW);
digitalWrite(YELLOWS1_LED, HIGH);
delay(2000);
digitalWrite(REDS1_LED, HIGH);
digitalWrite(GREENS1_LED, LOW);
digitalWrite(YELLOWS1_LED, LOW);
break;
case GREEN_SIGNAL:
digitalWrite(REDS1_LED, LOW);
digitalWrite(GREENS1_LED, HIGH);
digitalWrite(YELLOWS1_LED, LOW);
break;
case YELLOW_SIGNAL:
digitalWrite(REDS1_LED, LOW);
digitalWrite(GREENS1_LED, LOW);
digitalWrite(YELLOWS1_LED, HIGH);
break;
default:
break;
}
}
void controlSignal1L(int signal) {
switch (signal) {
case RED_SIGNAL:
digitalWrite(REDL_LED, LOW);
digitalWrite(GREENL_LED, LOW);
digitalWrite(YELLOWL_LED, HIGH);
delay(2000);
digitalWrite(REDL_LED, HIGH);
digitalWrite(GREENL_LED, LOW);
digitalWrite(YELLOWL_LED, LOW);
break;
case GREEN_SIGNAL:
digitalWrite(REDL_LED, LOW);
digitalWrite(GREENL_LED, HIGH);
digitalWrite(YELLOWL_LED, LOW);
break;
case YELLOW_SIGNAL:
digitalWrite(REDL_LED, LOW);
digitalWrite(GREENL_LED, LOW);
digitalWrite(YELLOWL_LED, HIGH);
break;
default:
break;
}
}
void controlSignal2S(int signal) {
switch (signal) {
case RED_SIGNAL:
digitalWrite(REDS_LED, LOW);
digitalWrite(GREENS_LED, LOW);
digitalWrite(YELLOWS_LED, HIGH);
delay(2000);
digitalWrite(REDS_LED, HIGH);
digitalWrite(GREENS_LED, LOW);
digitalWrite(YELLOWS_LED, LOW);
break;
case GREEN_SIGNAL:
digitalWrite(REDS_LED, LOW);
digitalWrite(GREENS_LED, HIGH);
digitalWrite(YELLOWS_LED, LOW);
break;
case YELLOW_SIGNAL:
digitalWrite(REDS_LED, LOW);
digitalWrite(GREENS_LED, LOW);
digitalWrite(YELLOWS_LED, HIGH);
break;
default:
break;
}
}
void controlSignal2R(int signal) {
switch (signal) {
case RED_SIGNAL:
digitalWrite(REDR_LED, LOW);
digitalWrite(GREENR_LED, LOW);
digitalWrite(YELLOWS_LED, HIGH);
delay(2000);
digitalWrite(REDR_LED, HIGH);
digitalWrite(GREENR_LED, LOW);
digitalWrite(YELLOWS_LED, LOW);
break;
case GREEN_SIGNAL:
digitalWrite(REDR_LED, LOW);
digitalWrite(GREENR_LED, HIGH);
digitalWrite(YELLOWS_LED, LOW);
break;
case YELLOW_SIGNAL:
digitalWrite(REDR_LED, LOW);
digitalWrite(GREENR_LED, LOW);
digitalWrite(YELLOWS_LED, HIGH);
break;
default:
break;
}
}