#define BLYNK_TEMPLATE_ID "TMPL2eOX2iD_l"
#define BLYNK_TEMPLATE_NAME "WiFeS"
#define BLYNK_AUTH_TOKEN "1cHV5DfpNuBBIDcBzRSPbJCSNu42Pjy_"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Wi-Fi details (Wokwi uses default guest network)
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Blynk virtual pin
#define PIR_PIN 34
#define LED1_PIN 23
int motionState;
#define LDR_PIN 35 // Light sensor analog pin
#define LED2_PIN 19 // LED output pin
const int DARK_THRESHOLD = 500;
int LighValue = LOW; // Variables
bool manualOff = false;
// Manual control flag
bool lightOn = false;
// Light state tracking
#define SMOKE_SENSOR_PIN 32 // MQ-2 analog pin
#define BUZZER_PIN 5 // Buzzer output pin
int smokeLevel = 0;
int threshold = 500; // Adjust sensitivity
bool buzzerEnabled = false; // Controlled by Blynk switch
bool SmokeOn = true ;
BlynkTimer timer;
// Function to read PIR sensor
void checkMotion() {
int motion = digitalRead(PIR_PIN);
if (motion == HIGH && motionState == LOW)
{ motionState = HIGH;
digitalWrite(LED1_PIN, HIGH);
Serial.println("Motion Detected!"); //Send push notification to phone
Blynk.logEvent("motion_alert", "Motion detected in your house!"); //Send update to Blynk dashboard
Blynk.virtualWrite(V1, "Motion Detected");
} else if (motion == LOW && motionState == HIGH) {
motionState = LOW;
digitalWrite(LED1_PIN, LOW);
Serial.println(" No Motion");
Blynk.logEvent("motion_alert: No motion detected"); // Update Blynk dashboard
Blynk.virtualWrite(V1, " No Motion");
}
}
// Function to check LDR value and control LED
void checkLightLevel() {
int lightValue = analogRead(LDR_PIN);
Serial.print("Light Level: ");
Serial.println(lightValue); //Check darkness and manual state
if (lightValue > DARK_THRESHOLD && !manualOff) {
if (!lightOn)
{ lightOn = true;
digitalWrite(LED2_PIN, HIGH);
Serial.println("It's dark - LED turned ON!");
Blynk.logEvent("dark_alert:", "It's dark! Light turned ON.");
Blynk.virtualWrite(V2,1); // update app LED widget
}
} else {
if (lightOn) { lightOn = false;
digitalWrite(LED2_PIN, LOW);
Serial.println(" - LED turned OFF");
Blynk.virtualWrite(V2, 0);
}
}
}
//Manual button handler from app
BLYNK_WRITE(V2) { int buttonState = param.asInt();
if (buttonState == 1) {
manualOff = true;
digitalWrite(LED2_PIN, LOW);
lightOn = false; Serial.println("Manual override: Light turned OFF");
Blynk.logEvent("dark_alert", "Light manually turned OFF."); //Send update to Blynk dashboard
Blynk.virtualWrite(V2, "Light turned OFF");
} else {
manualOff = false;
Serial.println("Manual control released, auto mode resumed.");
}
}
void checkSmokeLevel() {
smokeLevel = analogRead(SMOKE_SENSOR_PIN);
Serial.print("Smoke Level: ");
Serial.println(smokeLevel);
if (smokeLevel > threshold && buzzerEnabled) {
if (SmokeOn) {
SmokeOn = true;
digitalWrite(BUZZER_PIN, HIGH);
Serial.println("Smoke Detected!");
Blynk.logEvent("smoke_alert", "Smoke detected! Please check your home.");
Blynk.virtualWrite(V3, 1);
}
} else {
if (SmokeOn) {
SmokeOn = false;
digitalWrite(BUZZER_PIN, LOW);
Serial.println("No Smoke Detected!");
Blynk.virtualWrite(V3, 1);
} else {
digitalWrite(BUZZER_PIN, LOW);
}
}
//delay(9600);
}
// Blynk switch widget callback
BLYNK_WRITE(V3) {
int value = param.asInt();
if (value == 1) {
buzzerEnabled = true;
digitalWrite(BUZZER_PIN, LOW);
SmokeOn = false;
Serial.println("Buzzer manually turned OFF via Blynk");
Blynk.logEvent("smoke_alert", "Buzzer turned OFF."); //Blynk.virtualWrite(V3, "Buzzer turned OFF");
}
//else {
//buzzerEnabled = false;
//Serial.println("Buzzer control enabled");
//}
}
void setup() {
Serial.begin(115200);
pinMode(LDR_PIN, INPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(PIR_PIN, INPUT);
pinMode(LED1_PIN, OUTPUT);
pinMode(SMOKE_SENSOR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
//digitalWrite(BUZZER_PIN, LOW);
Serial.println(" Connecting to WiFi...");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\n WiFi Connected!"); // Connect to Blynk Cloud
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
Serial.println("Connected to Blynk Cloud!");
// Wait for 5ms beforee reading again
timer.setInterval(500L, checkMotion);
timer.setInterval(500L, checkLightLevel);
timer.setInterval(500L, checkSmokeLevel);
}
void loop()
{
Blynk.run(); timer.run();
}