Smart Traffic Light System Using ESP32
Overview
Traffic congestion is a major challenge in urban areas. A smart traffic light system can optimize vehicle flow, reduce waiting times, and improve safety at intersections. Using ESP32, this system can be connected to sensors and IoT networks to make traffic lights adaptive based on real-time traffic conditions. This adaptive approach ensures efficient intersection management while enabling remote monitoring and control through connected dashboards.
Features
- Adaptive Traffic Control based on vehicle flow
- Pedestrian Crossing Integration with push buttons
- IoT Connectivity to send traffic data to a central dashboard
- Emergency Vehicle Priority to clear paths for ambulances or fire trucks
- Low-Cost and Scalable solution using ESP32
Components
- ESP32 Dev Board
- LEDs for Red, Yellow, Green lights (or use relay-controlled street lights)
- IR/Ultrasonic Sensors for vehicle detection
- Push Buttons for pedestrian crossing
- OLED Display (optional) for intersection status
- Wi-Fi or MQTT broker for IoT monitoring
System Architecture
- Sensors detect vehicle presence in each lane.
- ESP32 processes sensor data and determines light duration dynamically.
- Lights change based on traffic density, with standard safety delays.
- IoT Dashboard displays real-time traffic status and logs events.
- Pedestrian Button requests a walk signal safely.
Example Code (ESP32 Traffic Light Controller)
#include <Arduino.h>
// LED Pins
#define RED_PIN 12
#define YELLOW_PIN 14
#define GREEN_PIN 27
// Sensor Pins
#define SENSOR_PIN 33
#define PED_BUTTON 32
// Traffic light timing (seconds)
int redTime = 10;
int greenTime = 15;
int yellowTime = 3;
void setup() {
Serial.begin(115200);
pinMode(RED_PIN, OUTPUT);
pinMode(YELLOW_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(SENSOR_PIN, INPUT);
pinMode(PED_BUTTON, INPUT_PULLUP);
}
void loop() {
int sensorState = digitalRead(SENSOR_PIN);
int pedState = digitalRead(PED_BUTTON);
// If pedestrian button pressed, give priority
if (pedState == LOW) {
pedestrianCrossing();
} else {
if (sensorState == HIGH) {
// Vehicles detected, normal cycle
trafficCycle();
} else {
// No vehicles, keep green for main road
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(RED_PIN, LOW);
delay(5000);
}
}
}
void trafficCycle() {
// Green Light
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(RED_PIN, LOW);
delay(greenTime * 1000);
// Yellow Light
digitalWrite(GREEN_PIN, LOW);
digitalWrite(YELLOW_PIN, HIGH);
delay(yellowTime * 1000);
// Red Light
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(RED_PIN, HIGH);
delay(redTime * 1000);
}
void pedestrianCrossing() {
// Red light for vehicles
digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
// Optional: blink pedestrian LED
delay(10000); // pedestrian crossing duration
}