#define BLYNK_TEMPLATE_ID "TMPL3d_EQhRys"
#define BLYNK_TEMPLATE_NAME "SMART HOME AUTOMATION AND GAS LEAK DETECTION"
#define BLYNK_AUTH_TOKEN "UDSwyJp1cEOz7Ijh92nR3p7i-av372Kx"
#include <MQUnifiedsensor.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
#define BLYNK_PRINT Serial
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define Board ("Arduino UNO")
#define MQ2_Pin (A0)
#define Type ("MQ-2")
#define Voltage_Resolution (5)
#define ADC_Bit_Resolution (10)
#define RatioMQ2CleanAir (9.83)
MQUnifiedsensor MQ2(Board, Voltage_Resolution, ADC_Bit_Resolution, MQ2_Pin, Type);
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define button1_pin 13
#define button2_pin 12
#define button3_pin 14
#define button4_pin 27
#define relay1_pin 5
#define relay2_pin 18
#define relay3_pin 19
#define relay4_pin 23
int relay1_state = 0;
int relay2_state = 0;
int relay3_state = 0;
int relay4_state = 0;
#define button1_vpin V1
#define button2_vpin V2
#define button3_vpin V3
#define button4_vpin V4
const int buzzer_pin = 25;
BlynkTimer timer;
BLYNK_CONNECTED() {
Blynk.syncVirtual(button1_vpin);
Blynk.syncVirtual(button2_vpin);
Blynk.syncVirtual(button3_vpin);
Blynk.syncVirtual(button4_vpin);
}
BLYNK_WRITE(button1_vpin) {
relay1_state = param.asInt();
digitalWrite(relay1_pin, relay1_state);
}
BLYNK_WRITE(button2_vpin) {
relay2_state = param.asInt();
digitalWrite(relay2_pin, relay2_state);
}
BLYNK_WRITE(button3_vpin) {
relay3_state = param.asInt();
digitalWrite(relay3_pin, relay3_state);
}
BLYNK_WRITE(button4_vpin) {
relay4_state = param.asInt();
digitalWrite(relay4_pin, relay4_state);
}
void setup() {
Serial.begin(9600);
MQ2.setRegressionMethod(1);
MQ2.setA(574.25); MQ2.setB(-2.222);
pinMode(MQ2_Pin, INPUT);
pinMode(buzzer_pin, OUTPUT);
MQ2.init();
lcd.init();
lcd.backlight();
Serial.print("Calibrating please wait.");
float calcR0 = 0;
for(int i = 1; i<=10; i ++) {
MQ2.update();
calcR0 += MQ2.calibrate(RatioMQ2CleanAir);
Serial.print(".");
}
MQ2.setR0(calcR0/10);
Serial.println(" done!.");
if(isinf(calcR0)) {
Serial.println("Warning: Connection issue, R0 is infinite (Open circuit detected). Please check your wiring and supply");
while(1);
}
if(calcR0 == 0) {
Serial.println("Warning: Connection issue found, R0 is zero (Analog pin shorts to ground). Please check your wiring and supply");
while(1);
}
MQ2.serialDebug(true);
pinMode(button1_pin, INPUT_PULLUP);
pinMode(button2_pin, INPUT_PULLUP);
pinMode(button3_pin, INPUT_PULLUP);
pinMode(button4_pin, INPUT_PULLUP);
pinMode(relay1_pin, OUTPUT);
pinMode(relay2_pin, OUTPUT);
pinMode(relay3_pin, OUTPUT);
pinMode(relay4_pin, OUTPUT);
digitalWrite(relay1_pin, HIGH);
digitalWrite(relay2_pin, HIGH);
digitalWrite(relay3_pin, HIGH);
digitalWrite(relay4_pin, HIGH);
Blynk.begin(auth, ssid, pass);
}
void loop() {
MQ2.update();
MQ2.readSensor();
Serial.print("Gas : ");
Serial.println(MQ2.readSensor());
Blynk.virtualWrite(V5, MQ2.readSensor()); // Virtual Pin V5 for gas sensor data
lcd.setCursor(0, 0);
lcd.print("Gas : ");
lcd.println(MQ2.readSensor());
if(MQ2.readSensor() > 700) {
tone(buzzer_pin, 1000);
delay(2000);
noTone(buzzer_pin);
delay(100);
lcd.setCursor(0, 1);
lcd.println("GAS LEAKAGE");
lcd.setCursor(0, 2);
lcd.println("DETECTED");
} else {
noTone(buzzer_pin);
lcd.setCursor(0, 1);
lcd.println("NO LEAKAGE");
lcd.setCursor(0, 2);
lcd.println(" ");
}
Blynk.run();
timer.run();
listen_push_buttons();
}
void listen_push_buttons() {
if(digitalRead(button1_pin) == LOW) {
delay(100);
control_relay(1);
Blynk.virtualWrite(button1_vpin, relay1_state);
} else if (digitalRead(button2_pin) == LOW) {
delay(100);
control_relay(2);
Blynk.virtualWrite(button2_vpin, relay2_state);
} else if (digitalRead(button3_pin) == LOW) {
delay(100);
control_relay(3);
Blynk.virtualWrite(button3_vpin, relay3_state);
} else if (digitalRead(button4_pin) == LOW) {
delay(100);
control_relay(4);
Blynk.virtualWrite(button4_vpin, relay4_state);
}
}
void control_relay(int relay) {
if(relay == 1) {
relay1_state = !relay1_state;
digitalWrite(relay1_pin, relay1_state);
Serial.print("Relay1 State = ");
Serial.println(relay1_state);
delay(50);
} else if(relay == 2) {
relay2_state = !relay2_state;
digitalWrite(relay2_pin, relay2_state);
delay(50);
} else if(relay == 3) {
relay3_state = !relay3_state;
digitalWrite(relay3_pin, relay3_state);
delay(50);
} else if(relay == 4) {
relay4_state = !relay4_state;
digitalWrite(relay4_pin, relay4_state);
delay(50);
}
}