#define BLYNK_TEMPLATE_ID "TMPL3iUF2ruQb"
#define BLYNK_TEMPLATE_NAME "Sahil Tiwari"
#include <DHT.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <ThingSpeak.h>
#include <ESP32Servo.h>
WiFiClient client;
// ThingSpeak credentials
unsigned long myChannelNumber = 2800313;
const char* myWriteAPIKey = "PW8N8IPKHZD2YQYZ";
// DHT sensor configuration
#define DHTPIN 25 // Pin connected to the DHT22 sensor
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Pin definitions for ultrasonic, PIR, flame sensors
#define TRIG1 2
#define ECHO1 4
#define TRIG2 5
#define ECHO2 18
#define TRIG3 19
#define ECHO3 21
#define PIR1 22
#define PIR2 23
#define PIR3 26
#define FLAME1 27
#define FLAME2 32
#define FLAME3 33
#define BUZZER 15
// LED pins
#define LED1 14
#define LED2 12
#define LED3 13
// Servo pins
#define SERVO1_PIN 13
#define SERVO2_PIN 14
#define SERVO3_PIN 12
// Blynk credentials
char auth[] = "DaVI--GeOxBWVFUp0kb6VsRPo3JUzA3g";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Timer variables
unsigned long lastThingSpeakUpdate = 0;
const unsigned long thingSpeakInterval = 15000; // Update ThingSpeak every 15 seconds
unsigned long lastBlynkUpdate = 0;
const unsigned long blynkInterval = 1000; // Update Blynk every second
// Servo objects
Servo servo1;
Servo servo2;
Servo servo3;
// Variables to store sensor data
float temperature = 0.0;
float humidity = 0.0;
void setup() {
Serial.begin(115200);
// Initialize Wi-Fi
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
// Initialize ThingSpeak
ThingSpeak.begin(client);
// Initialize Blynk
Blynk.begin(auth, ssid, pass);
// Initialize DHT sensor
dht.begin();
// Initialize pins for ultrasonic sensors
pinMode(TRIG1, OUTPUT);
pinMode(ECHO1, INPUT);
pinMode(TRIG2, OUTPUT);
pinMode(ECHO2, INPUT);
pinMode(TRIG3, OUTPUT);
pinMode(ECHO3, INPUT);
// Initialize pins for PIR sensors
pinMode(PIR1, INPUT);
pinMode(PIR2, INPUT);
pinMode(PIR3, INPUT);
// Initialize pins for flame sensors
pinMode(FLAME1, INPUT);
pinMode(FLAME2, INPUT);
pinMode(FLAME3, INPUT);
// Initialize buzzer
pinMode(BUZZER, OUTPUT);
digitalWrite(BUZZER, LOW);
// Initialize LEDs
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
// Attach servos to pins
servo1.attach(SERVO1_PIN);
servo2.attach(SERVO2_PIN);
servo3.attach(SERVO3_PIN);
}
void loop() {
Blynk.run();
// Read data from DHT22 sensor
temperature = dht.readTemperature();
humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Update Blynk every second
if ((millis() - lastBlynkUpdate )>= blynkInterval) {
lastBlynkUpdate = millis();
// Send data to Blynk
Blynk.virtualWrite(V0, temperature); // Temperature on Virtual Pin V0
Blynk.virtualWrite(V1, humidity); // Humidity on Virtual Pin V1
// Ultrasonic sensor readings
long distance1 = measureDistance(TRIG1, ECHO1);
long distance2 = measureDistance(TRIG2, ECHO2);
long distance3 = measureDistance(TRIG3, ECHO3);
// PIR sensor readings
int motion1 = digitalRead(PIR1);
int motion2 = digitalRead(PIR2);
int motion3 = digitalRead(PIR3);
// Flame sensor readings
int flame1 = digitalRead(FLAME1);
int flame2 = digitalRead(FLAME2);
int flame3 = digitalRead(FLAME3);
// Update sensor readings to Blynk
Blynk.virtualWrite(V3, motion1);
Blynk.virtualWrite(V4, !flame1); // Invert flame state for 'normal' reading
Blynk.virtualWrite(V6, motion2);
Blynk.virtualWrite(V7, !flame2);
Blynk.virtualWrite(V9, motion3);
Blynk.virtualWrite(V10, !flame3);
// Activate buzzer if any flame is detected
if (!flame1 || !flame2 || !flame3) {
digitalWrite(BUZZER, HIGH);
} else {
digitalWrite(BUZZER, LOW);
}
// Servo control based on distance
servo1.write(distance1 < 20 ? 90 : 0);
servo2.write(distance2 < 20 ? 90 : 0);
servo3.write(distance3 < 20 ? 90 : 0);
// LED control based on PIR sensors
if (motion1) {
digitalWrite(LED1, HIGH);
}
if (motion2) {
digitalWrite(LED2, HIGH);
}
if (motion3) {
digitalWrite(LED3, HIGH);
}
}
// Update ThingSpeak every 15 seconds
if (millis() - lastThingSpeakUpdate >= thingSpeakInterval) {
lastThingSpeakUpdate = millis();
if (!isnan(temperature) && !isnan(humidity)) {
// Send data to ThingSpeak
ThingSpeak.setField(1, temperature); // Field 1 for Temperature
ThingSpeak.setField(2, humidity); // Field 2 for Humidity
int responseCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (responseCode == 200) {
Serial.println("ThingSpeak update successful");
} else {
Serial.println("ThingSpeak update failed, error: " + String(responseCode));
}
}
}
}
// Function to measure distance from ultrasonic sensor
long measureDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
long distance = duration * 0.034 / 2; // Convert to cm
return distance;
}