Back to All Blog Posts
Tutorial EltroNerd Engineering

Smart traffic light system using ESP32

Traffic congestion in urban areas leads to increased travel times, fuel consumption, and accidents. A smart traffic light system addresses these challenges by dynamically managing signal timings based on real-time traffic conditions.

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

  1. Sensors detect vehicle presence in each lane.
  2. ESP32 processes sensor data and determines light duration dynamically.
  3. Lights change based on traffic density, with standard safety delays.
  4. IoT Dashboard displays real-time traffic status and logs events.
  5. Pedestrian Button requests a walk signal safely.

Example Code (ESP32 Traffic Light Controller)

c
#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
}

Try this project in your browser

Compile code and simulate hardware output with EltroNerd Cloud IDE.

Launch Cloud IDE