#define BLYNK_TEMPLATE_ID "TMPL3voCSkKuA"
#define BLYNK_TEMPLATE_NAME "Automated Traffic Light Control System"
#define BLYNK_AUTH_TOKEN "YPk4TUr1jz_OFQIN_qFxmGYVWfLtaziJ"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <TM1637Display.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Define the LED pins for traffic lights
#define RED0 15
#define YELLOW0 18
#define GREEN0 22
#define RED1 16
#define YELLOW1 19
#define GREEN1 23
#define RED2 17
#define YELLOW2 21
#define GREEN2 25
// Define the TM1637 display pins
#define CLK_PIN0 26
#define DIO_PIN0 27
#define CLK_PIN1 32
#define DIO_PIN1 33
#define CLK_PIN2 14
#define DIO_PIN2 12
// Define PIR sensor pins for each lane
#define PIR_PIN_LANE0 34
#define PIR_PIN_LANE1 35
#define PIR_PIN_LANE2 13
int currentLane = 0;
int greenTime[3] = {20, 20, 20}; // Green time for each lane in seconds
int yellowTime = 5; // Yellow time for each lane in seconds
bool manualSwitch = false; // Flag to indicate manual switch
TM1637Display display0(CLK_PIN0, DIO_PIN0);
TM1637Display display1(CLK_PIN1, DIO_PIN1);
TM1637Display display2(CLK_PIN2, DIO_PIN2);
BlynkTimer timer;
BLYNK_WRITE(V1) {
int buttonState = param.asInt();
if (buttonState == 1) {
currentLane = 0;
greenTime[0] = 20;
manualSwitch = true;
}
}
BLYNK_WRITE(V2) {
int buttonState = param.asInt();
if (buttonState == 1) {
currentLane = 1;
greenTime[1] = 20;
manualSwitch = true;
}
}
BLYNK_WRITE(V3) {
int buttonState = param.asInt();
if (buttonState == 1) {
currentLane = 2;
greenTime[2] = 20;
manualSwitch = true;
}
}
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
pinMode(RED0, OUTPUT);
pinMode(YELLOW0, OUTPUT);
pinMode(GREEN0, OUTPUT);
pinMode(RED1, OUTPUT);
pinMode(YELLOW1, OUTPUT);
pinMode(GREEN1, OUTPUT);
pinMode(RED2, OUTPUT);
pinMode(YELLOW2, OUTPUT);
pinMode(GREEN2, OUTPUT);
// Initialize traffic lights to RED
digitalWrite(RED0, HIGH);
digitalWrite(YELLOW0, LOW);
digitalWrite(GREEN0, LOW);
digitalWrite(RED1, HIGH);
digitalWrite(YELLOW1, LOW);
digitalWrite(GREEN1, LOW);
digitalWrite(RED2, HIGH);
digitalWrite(YELLOW2, LOW);
digitalWrite(GREEN2, LOW);
display0.setBrightness(0x0f);
display1.setBrightness(0x0f);
display2.setBrightness(0x0f);
pinMode(PIR_PIN_LANE0, INPUT);
pinMode(PIR_PIN_LANE1, INPUT);
pinMode(PIR_PIN_LANE2, INPUT);
timer.setInterval(1000L, countdownTimer); // Timer interval set to 1 second
}
void loop() {
Blynk.run();
timer.run();
}
void countdownTimer() {
if (greenTime[currentLane] > 0) {
greenTime[currentLane]--;
} else {
greenTime[currentLane] = 20; // Reset timer
manualSwitch = false; // End manual switch mode
currentLane = (currentLane + 1) % 3; // Switch to next lane
}
// Update display and LEDs
updateTrafficLights();
// Check PIR sensors
checkPIRSensors();
}
void updateTrafficLights() {
// Turn off all lights first
digitalWrite(RED0, HIGH);
digitalWrite(YELLOW0, LOW);
digitalWrite(GREEN0, LOW);
digitalWrite(RED1, HIGH);
digitalWrite(YELLOW1, LOW);
digitalWrite(GREEN1, LOW);
digitalWrite(RED2, HIGH);
digitalWrite(YELLOW2, LOW);
digitalWrite(GREEN2, LOW);
switch (currentLane) {
case 0:
setTrafficLights(GREEN0, RED1, RED2, display0, greenTime[0], V4);
break;
case 1:
setTrafficLights(GREEN1, RED0, RED2, display1, greenTime[1], V5);
break;
case 2:
setTrafficLights(GREEN2, RED0, RED1, display2, greenTime[2], V6);
break;
}
}
void setTrafficLights(int greenPin, int redPin1, int redPin2, TM1637Display &display, int time, int virtualPin) {
digitalWrite(greenPin, HIGH);
digitalWrite(redPin1, HIGH);
digitalWrite(redPin2, HIGH);
display.showNumberDec(time);
Blynk.virtualWrite(virtualPin, time);
// Reset other lights
for (int pin : {RED0, YELLOW0, GREEN0, RED1, YELLOW1, GREEN1, RED2, YELLOW2, GREEN2}) {
if (pin != greenPin && pin != redPin1 && pin != redPin2) {
digitalWrite(pin, LOW);
}
}
}
void checkPIRSensors() {
if (digitalRead(PIR_PIN_LANE0) == HIGH) {
extendGreenLight(0);
} else if (digitalRead(PIR_PIN_LANE1) == HIGH) {
extendGreenLight(1);
} else if (digitalRead(PIR_PIN_LANE2) == HIGH) {
extendGreenLight(2);
}
}
void extendGreenLight(int lane) {
greenTime[lane] += 10; // Add 10 seconds to green time
// Show updated time on the corresponding display
switch (lane) {
case 0:
display0.showNumberDec(greenTime[0]);
Blynk.virtualWrite(V4, greenTime[0]);
break;
case 1:
display1.showNumberDec(greenTime[1]);
Blynk.virtualWrite(V5, greenTime[1]);
break;
case 2:
display2.showNumberDec(greenTime[2]);
Blynk.virtualWrite(V6, greenTime[2]);
break;
}
}