// ============================================
// Smart Street Light System
// Microcontroller: STM32 NUCLEO C031C6
// Added: LCD Display
// Simulator: Wokwi
// ============================================
#include <LiquidCrystal.h>
// ---- Pin Definitions ----
#define LDR_PIN A0 // LDR Analog input
#define PIR_PIN D2 // PIR Digital input
#define LED1_PIN D3 // Street Light 1
#define LED2_PIN D4 // Street Light 2
#define LED3_PIN D5 // Street Light 3
#define LED4_PIN D6 // Street Light 4
// LCD Pins (RS, EN, D4, D5, D6, D7)
LiquidCrystal lcd(D8, D9, D10, D11, D12, D13);
// ---- Threshold ----
#define LIGHT_THRESHOLD 512
#define MOTION_DELAY 5000
// ---- Variables ----
int ldrValue = 0;
int pirValue = 0;
bool isDark = false;
bool motionDetected = false;
unsigned long lastMotionTime = 0;
void setup() {
Serial.begin(9600);
// LED pins
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(LED4_PIN, OUTPUT);
// PIR pin
pinMode(PIR_PIN, INPUT);
// LCD Setup
lcd.begin(16, 2);
lcd.clear();
// Welcome message on LCD
lcd.setCursor(0, 0);
lcd.print("Smart Street");
lcd.setCursor(0, 1);
lcd.print("Light System");
delay(2000);
lcd.clear();
// Turn off everything
turnOffAllLights();
Serial.println("==============================");
Serial.println(" Smart Street Light System");
Serial.println(" STM32 NUCLEO C031C6");
Serial.println("==============================");
}
void loop() {
// Read sensors
ldrValue = analogRead(LDR_PIN);
pirValue = digitalRead(PIR_PIN);
// Check darkness
isDark = (ldrValue < LIGHT_THRESHOLD);
// Check motion
if (pirValue == HIGH) {
motionDetected = true;
lastMotionTime = millis();
}
// Reset motion after delay
if (millis() - lastMotionTime > MOTION_DELAY) {
motionDetected = false;
}
// ---- MAIN CONTROL LOGIC ----
// NIGHT MODE
if (isDark) {
turnOnAllLights();
// LCD Display
lcd.setCursor(0, 0);
lcd.print("Mode: NIGHT ");
lcd.setCursor(0, 1);
lcd.print("Lights: ON ");
Serial.println("NIGHT MODE: All Lights ON");
// DAY + MOTION MODE
} else if (!isDark && motionDetected) {
turnOnAllLights();
// LCD Display
lcd.setCursor(0, 0);
lcd.print("Mode: MOTION! ");
lcd.setCursor(0, 1);
lcd.print("Lights: ON ");
Serial.println("MOTION DETECTED: Lights ON");
// DAY MODE
} else {
turnOffAllLights();
// LCD Display
lcd.setCursor(0, 0);
lcd.print("Mode: DAY ");
lcd.setCursor(0, 1);
lcd.print("Lights: OFF ");
Serial.println("DAY MODE: All Lights OFF");
}
// Print Sensor Values on Serial
Serial.print("LDR: ");
Serial.print(ldrValue);
Serial.print(" | Dark: ");
Serial.print(isDark ? "YES" : "NO");
Serial.print(" | Motion: ");
Serial.println(motionDetected ? "YES" : "NO");
Serial.println("------------------------------");
delay(500);
}
// Turn ON all street lights
void turnOnAllLights() {
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, HIGH);
digitalWrite(LED3_PIN, HIGH);
digitalWrite(LED4_PIN, HIGH);
}
// Turn OFF all street lights
void turnOffAllLights() {
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, LOW);
digitalWrite(LED3_PIN, LOW);
digitalWrite(LED4_PIN, LOW);
}