#define BLYNK_TEMPLATE_ID "TMPL3Nh7x9Jzf"
#define BLYNK_TEMPLATE_NAME "Fire Alert System"
#define BLYNK_AUTH_TOKEN "OQICB50Z7vhKZnYZcavcWhEZ2PV66RmS"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#define FLAME_SENSOR_PIN_1 D1
#define FLAME_SENSOR_PIN_2 D2
#define GAS_SENSOR_PIN D8
#define MOTOR_PIN_1 D5
#define MOTOR_PIN_2 D6
#define RELAY_PIN D7
#define FLAME_THRESHOLD 500
#define GAS_THRESHOLD 600
#define Left 4 // left sensor
#define Right 5 // right sensor
#define Forward 6 // front sensor
#define GAS_SENSOR 7 // Gas sensor
#define LM1 8 // left motor
#define LM2 9 // left motor
#define RM1 10 // right motor
#define RM2 11 // right motor
#define pump 12 // water pump
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
boolean fire = false;
boolean isMovingForward = false;
boolean isTurningLeft = false;
boolean isTurningRight = false;
void setup() {
Serial.begin(74880);
Serial.println("Initializing...");
Blynk.begin(auth, ssid, pass);
// Wait until connected to Blynk server
while (!Blynk.connected()) {
delay(500);
}
pinMode(FLAME_SENSOR_PIN_1, INPUT);
pinMode(FLAME_SENSOR_PIN_2, INPUT);
pinMode(GAS_SENSOR_PIN, INPUT);
pinMode(MOTOR_PIN_1, OUTPUT);
pinMode(MOTOR_PIN_2, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(Left, INPUT);
pinMode(Right, INPUT);
pinMode(Forward, INPUT);
pinMode(GAS_SENSOR, INPUT);
pinMode(LM1, OUTPUT);
pinMode(LM2, OUTPUT);
pinMode(RM1, OUTPUT);
pinMode(RM2, OUTPUT);
pinMode(pump, OUTPUT);
timer.setInterval(1000L, sendSensorData);
}
void loop() {
Serial.println("Looping...");
Blynk.run();
timer.run();
if (digitalRead(Left) == 1 && digitalRead(Right) == 1 && digitalRead(Forward) == 1) {
if (!isMovingForward) {
Serial.println("Moving forward");
isMovingForward = true;
isTurningLeft = false;
isTurningRight = false;
}
digitalWrite(MOTOR_PIN_1, HIGH);
digitalWrite(MOTOR_PIN_2, HIGH);
}
else if (digitalRead(Forward) == 0) {
if (!isTurningLeft) {
Serial.println("Turning left");
isMovingForward = false;
isTurningLeft = true;
isTurningRight = false;
}
digitalWrite(MOTOR_PIN_1, HIGH);
digitalWrite(MOTOR_PIN_2, LOW);
fire = true;
}
else if (digitalRead(Left) == 0) {
if (!isTurningLeft) {
Serial.println("Turning left");
isMovingForward = false;
isTurningLeft = true;
isTurningRight = false;
}
digitalWrite(MOTOR_PIN_1, HIGH);
digitalWrite(MOTOR_PIN_2, LOW);
}
else if (digitalRead(Right) == 0) {
if (!isTurningRight) {
Serial.println("Turning right");
isMovingForward = false;
isTurningLeft = false;
isTurningRight = true;
}
digitalWrite(MOTOR_PIN_1, HIGH);
digitalWrite(MOTOR_PIN_2, HIGH);
}
if (digitalRead(GAS_SENSOR) == 0) {
Serial.println("Gas is Detected.");
// Handle gas detection event here
}
if (fire == true) {
put_off_fire();
Serial.println("Fire Detected.");
// Handle fire detection event here
}
}
void sendSensorData() {
Serial.println("Sending Sensor Data...");
int flame_sensor_data_1 = analogRead(FLAME_SENSOR_PIN_1);
int flame_sensor_data_2 = analogRead(FLAME_SENSOR_PIN_2);
int gas_sensor_data = analogRead(GAS_SENSOR_PIN);
int direction = flame_sensor_data_1 - flame_sensor_data_2;
Blynk.virtualWrite(V0, flame_sensor_data_1);
Blynk.virtualWrite(V1, flame_sensor_data_2);
Blynk.virtualWrite(V2, gas_sensor_data);
if (gas_sensor_data > GAS_THRESHOLD || flame_sensor_data_1 > FLAME_THRESHOLD || flame_sensor_data_2 > FLAME_THRESHOLD) {
Serial.println("Alert triggered.");
Blynk.logEvent("fire_alert_system");
moveTowardsFlame(direction);
activateWaterSprayer();
}
}
void moveTowardsFlame(int direction) {
if (direction > 0) {
digitalWrite(MOTOR_PIN_1, HIGH);
digitalWrite(MOTOR_PIN_2, LOW);
} else if (direction < 0) {
digitalWrite(MOTOR_PIN_1, LOW);
digitalWrite(MOTOR_PIN_2, HIGH);
} else {
digitalWrite(MOTOR_PIN_1, LOW);
digitalWrite(MOTOR_PIN_2, LOW);
}
}
void activateWaterSprayer() {
digitalWrite(RELAY_PIN, HIGH);
delay(5000);
digitalWrite(RELAY_PIN, LOW);
}
void put_off_fire() {
digitalWrite(LM1, HIGH);
digitalWrite(LM2, HIGH);
digitalWrite(RM1, HIGH);
digitalWrite(RM2, HIGH);
digitalWrite(pump, HIGH);
delay(500);
// No servo related code here
digitalWrite(pump, LOW);
fire = false;
}