#include <Wire.h>
#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <MQUnifiedsensor.h>
#include "DHTesp.h"
#include <PubSubClient.h>
#include "ThingSpeak.h" // Include ThingSpeak library
#define Board ("ESP-32")
#define Pin (4)
#define Type ("MQ-2")
#define Voltage_Resolution (3.3)
#define ADC_Bit_Resolution (12)
#define RatioMQ2CleanAir (9.83)
MQUnifiedsensor MQ2(Board, Voltage_Resolution, ADC_Bit_Resolution, Pin, Type);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Define pins for LEDs and Buzzer
#define GREEN_LED_PIN (14)
#define YELLOW_LED_PIN (12)
#define RED_LED_PIN (13)
#define BUZZER_PIN (2)
const int DHT_PIN = 15;
DHTesp dhtSensor;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.begin(16, 2);
lcd.clear();
lcd.backlight();
lcd.print("START");
delay(1000);
// Set LED and buzzer pins as outputs
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(YELLOW_LED_PIN, OUTPUT);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(Pin , INPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
MQ2.setRegressionMethod(1);
MQ2.setA(36974);
MQ2.setB(-3.10);
MQ2.init();
/*
Exponential regression:
Gas | a | b
H2 | 987.99 | -2.162
LPG | 574.25 | -2.222
CO | 36974 | -3.109
Alcohol| 3616.1 | -2.675
Propane| 658.71 | -2.168
*/
float calcR0 = 0;
for (int i = 1; i <= 10; i++) { // Reduced from 10 to 5 iterations
MQ2.update();
calcR0 += MQ2.calibrate(RatioMQ2CleanAir);
delay(100); // Added small delay to ensure stability
}
calcR0 /= 10; // Calculate average
MQ2.setR0(calcR0);
Serial.print("R0: ");
Serial.println(calcR0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQ2 = ");
lcd.print(calcR0);
delay(500);
if (isinf(calcR0) || calcR0 == 0) {
Serial.println("Sensor Calibration Failed");
while(1);
}
MQ2.serialDebug(true);
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float temperature = data.temperature;
float humidity = data.humidity;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humid: ");
lcd.print(humidity);
lcd.print(" %");
delay(2000);
MQ2.update();
MQ2.readSensor();
int valor_gas = analogRead(Pin);
valor_gas = map(valor_gas, 0, 4095, 0, 100);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQ2 = ");
lcd.print(valor_gas);
delay(2000);
// Control LEDs based on gas levels
if (valor_gas <= 70) {
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, LOW);
noTone(BUZZER_PIN);
} else if (valor_gas > 70 && valor_gas <= 85) {
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, HIGH);
digitalWrite(RED_LED_PIN, LOW);
tone(BUZZER_PIN, 500);
delay(2000);
noTone(BUZZER_PIN);
} else {
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(YELLOW_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, HIGH);
tone(BUZZER_PIN, 1000);
}
delay(1000);
}