// Blynk app token and template
#define BLYNK_TEMPLATE_ID "TMPL6vfoq_ofO"
#define BLYNK_TEMPLATE_NAME "Smart Home Security System"
#define BLYNK_AUTH_TOKEN "qVcLmCuB4Atfr8O6LNtkQ_9905Bv1u5w"
// Include libraries
#include "DHTesp.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// WiFi credentials
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Define pins
#define DHT_PIN 27
#define MOTION_SENSOR_PIN 15
#define FLAME_SENSOR_PIN 4
#define GAS_SENSOR_PIN 36
#define WATER_SENSOR_PIN 39
#define PUMP_PIN 2
#define BUZZER_PIN 14
// Blynk virtual pins
#define VIRTUAL_GAS_SENSOR V1
#define VIRTUAL_WATER_SENSOR V2
#define VIRTUAL_FLAME_SENSOR V3
#define VIRTUAL_MOTION_SENSOR V4
#define VIRTUAL_TEMPERATURE_SENSOR V5
#define VIRTUAL_PUMP V7
BlynkTimer timer;
DHTesp dht;
uint32_t lastUpdate = 0;
const int UPDATE_INTERVAL = 1000;
int pirState = LOW;
bool pumpActive = false;
// Callback when connected to Blynk
BLYNK_CONNECTED() {
Blynk.syncAll();
}
void setup() {
Serial.begin(115200);
// Set pin modes
pinMode(MOTION_SENSOR_PIN, INPUT);
pinMode(GAS_SENSOR_PIN, INPUT);
pinMode(FLAME_SENSOR_PIN, INPUT);
pinMode(WATER_SENSOR_PIN, INPUT);
pinMode(PUMP_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Initialize DHT sensor
dht.setup(DHT_PIN, DHTesp::DHT22);
// Connect to Blynk
Blynk.begin(auth, ssid, pass);
}
void loop() {
Blynk.run();
timer.run();
monitorGasSensor();
monitorWaterSensor();
monitorTemperatureSensor();
monitorMotionSensor();
monitorFlameSensor();
}
void monitorGasSensor() {
int gasValue = analogRead(GAS_SENSOR_PIN);
int gasLevel = map(gasValue, 0, 4095, 0, 255);
if (gasLevel > 165 && !pumpActive) {
Serial.println("Gas Leakage Detected!");
Blynk.virtualWrite(VIRTUAL_GAS_SENSOR, 1);
Blynk.virtualWrite(VIRTUAL_PUMP, 1);
Blynk.logEvent("warning_message", "Gas Leakage Detected!");
pumpActive = true;
digitalWrite(PUMP_PIN, HIGH);
} else if (gasLevel <= 165 && pumpActive) {
digitalWrite(PUMP_PIN, LOW);
Blynk.virtualWrite(VIRTUAL_GAS_SENSOR, 0);
Blynk.virtualWrite(VIRTUAL_PUMP, 0);
pumpActive = false;
}
}
void monitorWaterSensor() {
int waterValue = analogRead(WATER_SENSOR_PIN);
int waterLevel = map(waterValue, 0, 4095, 0, 255);
if (waterLevel < 20) {
Serial.println("Low Water Level!");
Blynk.virtualWrite(VIRTUAL_WATER_SENSOR, 1);
Blynk.logEvent("warning_message", "Low Water Level Detected!");
} else {
Blynk.virtualWrite(VIRTUAL_WATER_SENSOR, 0);
}
}
void monitorTemperatureSensor() {
if (millis() - lastUpdate >= UPDATE_INTERVAL) {
lastUpdate = millis();
TempAndHumidity data = dht.getTempAndHumidity();
Blynk.virtualWrite(VIRTUAL_TEMPERATURE_SENSOR, data.temperature);
if (data.temperature > 50 && !pumpActive) {
Serial.println("High Temperature Alert!");
Blynk.logEvent("warning_message", "Over Temperature Detected!");
digitalWrite(PUMP_PIN, HIGH);
pumpActive = true;
} else if (data.temperature <= 50 && pumpActive) {
digitalWrite(PUMP_PIN, LOW);
pumpActive = false;
}
}
}
void monitorMotionSensor() {
int motionDetected = digitalRead(MOTION_SENSOR_PIN);
if (motionDetected == HIGH && pirState == LOW) {
Serial.println("Motion Detected!");
Blynk.virtualWrite(VIRTUAL_MOTION_SENSOR, 1);
Blynk.logEvent("warning_message", "Potential Intruder Detected!");
pirState = HIGH;
} else if (motionDetected == LOW && pirState == HIGH) {
Serial.println("Motion Ended!");
Blynk.virtualWrite(VIRTUAL_MOTION_SENSOR, 0);
pirState = LOW;
}
}
void monitorFlameSensor() {
if (digitalRead(FLAME_SENSOR_PIN) == HIGH) {
Serial.println("Fire Detected!");
Blynk.virtualWrite(VIRTUAL_FLAME_SENSOR, 1);
Blynk.virtualWrite(VIRTUAL_PUMP, 1);
Blynk.logEvent("warning_message", "Fire Detected!");
// Sound buzzer intermittently
while (digitalRead(FLAME_SENSOR_PIN) == HIGH) {
digitalWrite(BUZZER_PIN, HIGH);
delay(500);
digitalWrite(BUZZER_PIN, LOW);
delay(500);
}
} else {
digitalWrite(PUMP_PIN, LOW);
Blynk.virtualWrite(VIRTUAL_FLAME_SENSOR, 0);
Blynk.virtualWrite(VIRTUAL_PUMP, 0);
}
}