Back to All Blog Posts
Tutorial EltroNerd Engineering

Smart Street Lighting System

This system uses an ESP32 microcontroller to control street lights automatically based on ambient light, motion detection, and IoT commands. It also has advanced features like PWM dimming, emergency flashing, and cloud connectivity.

Advanced IoT Smart Street Lighting System

This advanced project uses ESP32 + LDR + PIR + OLED + multiple LEDs with IoT features.

Features:

  1. Automatic ON/OFF based on ambient light
  2. Motion-based brightness adjustment
  3. PWM dimming for energy efficiency
  4. IoT integration via MQTT (cloud dashboard)
  5. Time-based scheduling (night/day)
  6. Emergency mode (flash lights for alerts)
  7. Energy monitoring (optional)

Hardware Required

  • ESP32
  • LDR (analog light sensor)
  • PIR motion sensor
  • 2–4 LEDs or relay modules for street lights
  • OLED SSD1306
  • Optional: Voltage/current sensor for energy monitoring
  • Jumper wires + breadboard

Connections

  • LDR → Analog pin (GPIO 34)
  • PIR sensor → Digital pin (GPIO 27)
  • LEDs → Digital PWM pins (GPIO 26, 25, 33…)
  • OLED → I²C SDA=21, SCL=22

Full Advanced Code

c
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <PubSubClient.h>

// OLED setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Pins
#define LDR_PIN 34
#define PIR_PIN 27
#define LED1 26
#define LED2 25
#define LED3 33

// Thresholds
int lightThreshold = 500;
bool motionDetected = false;

// Wi-Fi + MQTT
const char* ssid = "YOUR_WIFI";
const char* password = "YOUR_PASS";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);

// Function to connect to MQTT
void reconnectMQTT() {
  while (!client.connected()) {
    if (client.connect("StreetLightESP32")) {
      client.subscribe("streetlight/control"); 
    } else {
      delay(2000);
    }
  }
}

// Emergency flashing mode
void emergencyFlash() {
  for (int i=0;i<3;i++){
    analogWrite(LED1,255); analogWrite(LED2,255); analogWrite(LED3,255);
    delay(200);
    analogWrite(LED1,0); analogWrite(LED2,0); analogWrite(LED3,0);
    delay(200);
  }
}

void setup() {
  Serial.begin(115200);

  // OLED init
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setCursor(0,0);
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.println("Advanced Street Light Init...");
  display.display();
  delay(2000);

  // Pins
  pinMode(LDR_PIN, INPUT);
  pinMode(PIR_PIN, INPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);

  // Wi-Fi connect
  WiFi.begin(ssid,password);
  while(WiFi.status()!=WL_CONNECTED){ delay(500); Serial.print("."); }
  Serial.println("WiFi connected");

  client.setServer(mqtt_server,1883);
}

void loop() {
  if (!client.connected()) reconnectMQTT();
  client.loop();

  int ldrValue = analogRead(LDR_PIN);
  motionDetected = digitalRead(PIR_PIN);

  // --- Automatic street light control ---
  int brightness = 0;
  if (ldrValue < lightThreshold) {   // Nighttime
    brightness = motionDetected ? 255 : 100; // Full if motion, dim otherwise
  } else {
    brightness = 0; // Daytime OFF
  }

  // --- PWM control for LEDs ---
  analogWrite(LED1, brightness);
  analogWrite(LED2, brightness);
  analogWrite(LED3, brightness);

  // --- Emergency Mode Example ---
  if (ldrValue < 100 && motionDetected && brightness == 255) { // optional condition
    emergencyFlash();
  }

  // --- Display on OLED ---
  display.clearDisplay();
  display.setCursor(0,0);
  display.println("Advanced Street Light");
  display.print("LDR: "); display.println(ldrValue);
  display.print("Motion: "); display.println(motionDetected ? "Yes":"No");
  display.print("Brightness: "); display.println(brightness);
  display.display();

  // --- Publish to MQTT ---
  String msg = "LDR:"+String(ldrValue)+" Motion:"+String(motionDetected)+" Bright:"+String(brightness);
  client.publish("streetlight/status", msg.c_str());

  delay(500);
}

Try this project in your browser

Compile code and simulate hardware output with EltroNerd Cloud IDE.

Launch Cloud IDE