#define RED1 19
#define YELLOW1 18
#define GREEN1 5
#define RED2 26
#define YELLOW2 25
#define GREEN2 33
#define RED3 12
#define YELLOW3 14
#define GREEN3 27
#define RED4 17
#define YELLOW4 16
#define GREEN4 4
#define POT1 13 // Potentiometer 1
#define POT2 2 // Potentiometer 2
#define TRIG1 0 // Ultrasonic Sensor 1 Trigger (Traffic1)
#define ECHO1 15 // Ultrasonic Sensor 1 Echo
#define TRIG2 23 // Ultrasonic Sensor 2 Trigger (Traffic2)
#define ECHO2 22 // Ultrasonic Sensor 2 Echo
#define BUTTON_PIN 21 // Button for stolen vehicle detection
#define BUZZER_PIN 34 // Buzzer for alert
const int EMERGENCY_DISTANCE = 150; // Emergency vehicle detection threshold (cm)
unsigned long startTime; // To track system runtime
// Function prototypes
void controlLights(int redA, int yellowA, int greenA, int redB, int yellowB, int greenB, int redC, int redD, int trafficLevel, int extraDelay = 0, const char* trafficID = "");
long getDistance(int trigPin, int echoPin);
void printTimestamp();
void alertStolenVehicle();
void setup() {
pinMode(RED1, OUTPUT);
pinMode(YELLOW1, OUTPUT);
pinMode(GREEN1, OUTPUT);
pinMode(RED2, OUTPUT);
pinMode(YELLOW2, OUTPUT);
pinMode(GREEN2, OUTPUT);
pinMode(RED3, OUTPUT);
pinMode(YELLOW3, OUTPUT);
pinMode(GREEN3, OUTPUT);
pinMode(RED4, OUTPUT);
pinMode(YELLOW4, OUTPUT);
pinMode(GREEN4, OUTPUT);
pinMode(POT1, INPUT);
pinMode(POT2, INPUT);
pinMode(TRIG1, OUTPUT);
pinMode(ECHO1, INPUT);
pinMode(TRIG2, OUTPUT);
pinMode(ECHO2, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Button with pull-up resistor
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(115200); // Debugging
startTime = millis(); // Initialize time tracking
}
void loop() {
int traffic1 = analogRead(POT1);
int traffic2 = analogRead(POT2);
long distance1 = getDistance(TRIG1, ECHO1);
long distance2 = getDistance(TRIG2, ECHO2);
int emergencyDelay = 0;
bool emergencyDetected = false;
if (distance1 < EMERGENCY_DISTANCE || distance2 < EMERGENCY_DISTANCE) {
emergencyDelay = 5000; // Extra 5 sec for emergency vehicle
emergencyDetected = true;
}
// Check if a stolen vehicle is detected
if (digitalRead(BUTTON_PIN) == LOW) {
alertStolenVehicle();
}
int trafficDifference = abs(traffic1 - traffic2);
Serial.print("[");
printTimestamp();
Serial.print("] ");
Serial.print("Traffic1: ");
Serial.print(traffic1);
Serial.print(" | Traffic2: ");
Serial.print(traffic2);
Serial.print(" | Emergency1: ");
Serial.print(distance1);
Serial.print("cm | Emergency2: ");
Serial.print(distance2);
Serial.println("cm");
if (emergencyDetected) {
Serial.println("🚑 Emergency Vehicle Detected! Extending Green Light Duration.");
}
if (trafficDifference < 100) {
controlLights(RED1, YELLOW1, GREEN1, RED3, YELLOW3, GREEN3, RED2, RED4, 5000, emergencyDelay, "Traffic 1");
controlLights(RED2, YELLOW2, GREEN2, RED4, YELLOW4, GREEN4, RED1, RED3, 5000, emergencyDelay, "Traffic 2");
}
else if (traffic1 > traffic2) {
int extraDelay = trafficDifference / 2;
controlLights(RED1, YELLOW1, GREEN1, RED3, YELLOW3, GREEN3, RED2, RED4, traffic1, extraDelay + emergencyDelay, "Traffic 1");
}
else {
int extraDelay = trafficDifference / 2;
controlLights(RED2, YELLOW2, GREEN2, RED4, YELLOW4, GREEN4, RED1, RED3, traffic2, extraDelay + emergencyDelay, "Traffic 2");
}
}
// Function to control traffic lights
void controlLights(int redA, int yellowA, int greenA, int redB, int yellowB, int greenB, int redC, int redD, int trafficLevel, int extraDelay, const char* trafficID) {
int greenTime = map(trafficLevel, 0, 1023, 3000, 8000) + extraDelay;
Serial.print("[");
printTimestamp();
Serial.print("] ");
Serial.print("🚦 ");
Serial.print(trafficID);
Serial.print(" Green Light ON for ");
Serial.print(greenTime / 1000);
Serial.println(" seconds");
digitalWrite(redC, HIGH);
digitalWrite(redD, HIGH);
digitalWrite(greenA, HIGH);
digitalWrite(greenB, HIGH);
digitalWrite(redA, LOW);
digitalWrite(redB, LOW);
delay(greenTime);
digitalWrite(greenA, LOW);
digitalWrite(greenB, LOW);
digitalWrite(yellowA, HIGH);
digitalWrite(yellowB, HIGH);
delay(2000);
digitalWrite(yellowA, LOW);
digitalWrite(yellowB, LOW);
digitalWrite(redA, HIGH);
digitalWrite(redB, HIGH);
delay(1000);
}
// Function to get distance from ultrasonic sensor
long getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
long distance = duration * 0.034 / 2;
if (distance > 400) return 400;
return distance;
}
// Function to print timestamp (based on millis)
void printTimestamp() {
unsigned long currentMillis = millis();
unsigned long seconds = currentMillis / 1000;
unsigned long minutes = seconds / 60;
unsigned long hours = minutes / 60;
Serial.print(hours);
Serial.print(":");
Serial.print(minutes % 60);
Serial.print(":");
Serial.print(seconds % 60);
}
// Function to handle stolen vehicle alert
void alertStolenVehicle() {
Serial.println("⚠️ ALERT: Stolen/Wanted Vehicle Just Passed! 🚨");
for (int i = 0; i < 5; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(300);
digitalWrite(BUZZER_PIN, LOW);
delay(300);
}
}
Loading
esp32-devkit-c-v4
esp32-devkit-c-v4
Traffic 1
Traffic 2