#define BLYNK_TEMPLATE_ID "TMPL6RmHkHLdJ"
#define BLYNK_TEMPLATE_NAME "SOLAR STREET LIGHT MONITORING SYSTEM"
#define BLYNK_AUTH_TOKEN "O-unFKlzRxIQTXYqj8RTD6QIKs4WOXFt"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
const int PIR_SENSOR_PIN = 35,
LED_PIN_1 = 27,
LED_PIN_2 = 14,
LED_PIN_3 = 25, // LED fault detector
LED_PIN_4 = 26,
LDR_PIN_1 = 32, // ambient light sensor
LDR_PIN_2 = 33; // LED brightness sensor
int ledBrightness = 0; // initialize led brightness to minimum value
bool pirEnabled = false; // flag to enable PIR sensor only at night
BlynkTimer timer;
void setup()
{
Serial.begin(115200);
Serial.print("Connecting to WiFi");
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
pinMode(LED_PIN_3, OUTPUT);
pinMode(LED_PIN_4, OUTPUT);
pinMode(PIR_SENSOR_PIN, INPUT);
pinMode(LDR_PIN_1, INPUT);
pinMode(LDR_PIN_2, INPUT);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected to WiFi");
Blynk.begin(auth, ssid, pass); // Initialize Blynk
timer.setInterval(1000L, sendSensorData); // Set timer to send data every 1 second
}
void loop()
{
Blynk.run();
timer.run(); // Run the Blynk timer
int ldrValue1 = analogRead(LDR_PIN_1); // ambient light sensor
int ldrValue2 = analogRead(LDR_PIN_2); // LED brightness sensor
Serial.print("LDR value 1 (ambient) = ");
Serial.println(ldrValue1);
// Check if it's night time (low LDR value)
if (ldrValue1 > 2000)
{
ledBrightness = 50; // set led brightness to low value
analogWrite(LED_PIN_1, ledBrightness);
analogWrite(LED_PIN_2, ledBrightness);
Serial.println("Street light LEDs on with low brightness");
pirEnabled = true; // enable PIR sensor at night
}
else
{
ledBrightness = 0; // turn off led
analogWrite(LED_PIN_1, ledBrightness);
analogWrite(LED_PIN_2, ledBrightness);
Serial.println("Street light LEDs off");
pirEnabled = false; // disable PIR sensor during the day
}
// Check if motion is detected (only at night)
if (pirEnabled && digitalRead(PIR_SENSOR_PIN) == LOW)
{
ledBrightness = 255; // set led brightness to maximum value
analogWrite(LED_PIN_1, ledBrightness);
analogWrite(LED_PIN_2, ledBrightness);
Serial.println("Street light LEDs on with high brightness");
}
// Check LED fault and brightness (only when streetlights are on at night)
if (pirEnabled)
{
Serial.print("LDR value 2 (LED brightness) = ");
Serial.println(ldrValue2);
if (ldrValue2 > 2000) // adjust this value based on your LED brightness range
{
Serial.println("LED Street Light fault detected!");
digitalWrite(LED_PIN_3, HIGH);
digitalWrite(LED_PIN_4, LOW);
}
else
{
Serial.println("LED is working properly!");
digitalWrite(LED_PIN_3, LOW);
digitalWrite(LED_PIN_4, HIGH);
float maxCurrent = 0.04; // Maximum current for the LED, in amps (40 mA)
float ledCurrent = (ldrValue2 / 4000.0) * maxCurrent; // Proportion of the maximum current
float ledVoltage = 3.3; // Assuming a constant LED voltage of 3.3V
float ledPower = ledCurrent * ledVoltage; // Calculate LED power in watts
Serial.print("LED Current: ");
Serial.print(ledCurrent * 1000, 2); // print with 2 decimal places and convert to mA
Serial.println(" mA");
Serial.print("LED Power: ");
Serial.print(ledPower, 2); // print with 2 decimal places
Serial.println(" W");
}
}
else
{
digitalWrite(LED_PIN_3, LOW);
digitalWrite(LED_PIN_4, LOW);
}
delay(2000);
}
void sendSensorData()
{
int ldrValue1 = analogRead(LDR_PIN_1); // ambient light sensor
int ldrValue2 = analogRead(LDR_PIN_2); // LED brightness sensor
float maxCurrent = 0.04; // Maximum current for the LED, in amps (40 mA)
float ledCurrent = (ldrValue2 / 4000.0) * maxCurrent;
float ledVoltage = 3.3;
float ledPower = ledCurrent * ledVoltage;
bool motionDetected = digitalRead(PIR_SENSOR_PIN) == LOW;
bool ledFaultDetected = digitalRead(LED_PIN_4) == LOW;
Blynk.virtualWrite(V0, ldrValue1);
if (ldrValue1 > 2000) // it's night time
{
Blynk.virtualWrite(V3, ledFaultDetected);
if (ldrValue2 <= 2000)
{
Blynk.virtualWrite(V1, ldrValue2);
Blynk.virtualWrite(V2, motionDetected);
Blynk.virtualWrite(V4, ledPower);
}
else
{
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, false);
Blynk.virtualWrite(V4, 0.0);
}
}
else // it's not night time, send zero values
{
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, false);
Blynk.virtualWrite(V3, 0);
Blynk.virtualWrite(V4, 0.0);
}
}