Advanced IoT Smart Street Lighting System
This advanced project uses ESP32 + LDR + PIR + OLED + multiple LEDs with IoT features.
Features:
- Automatic ON/OFF based on ambient light
- Motion-based brightness adjustment
- PWM dimming for energy efficiency
- IoT integration via MQTT (cloud dashboard)
- Time-based scheduling (night/day)
- Emergency mode (flash lights for alerts)
- 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);
}