#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MQUnifiedsensor.h>
#include "DHTesp.h"
#include <WiFi.h>
#include <HTTPClient.h>
// Pin configuration
#define trigPin 14
#define echoPin 12
#define Pin 4 // Analog input pin for MQ2 sensor
#define DHT_PIN 13 // Pin for DHT22 sensor
// WiFi credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define SERVER_URL "https://esp32-http-server.free.beeceptor.com/"
int valor_gas = 0; // Gas value from MQ2 sensor
// Create objects for sensors
MQUnifiedsensor MQ2("ESP-32", 3.3, 12, Pin, "MQ-2");
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD object for display
DHTesp dhtSensor; // DHT22 sensor object
// Structs to hold temperature, humidity, and ultrasonic data
struct TempHum {
float temperature;
float humidity;
};
struct TempData {
float distance;
String info;
String location;
};
TempHum tempHumData; // Global instance for tempHum
TempData tempData; // Global instance for tempData
void setup() {
Serial.begin(9600);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Connected to WiFi!");
Serial.print("ESP32 IP Address: ");
Serial.println(WiFi.localIP());
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
lcd.init();
lcd.begin(16, 2);
lcd.clear();
lcd.backlight();
lcd.print("Initializing...");
delay(1000);
// Initialize MQ2 sensor
MQ2.setRegressionMethod(1); // Set the regression method for LPG
MQ2.setA(574.25);
MQ2.setB(-2.222); // Configure the equation to calculate LPG concentration
MQ2.init(); // Initialize the MQ2 sensor
// Calibrate the MQ2 sensor
Serial.print("Calibrating, please wait...");
float calcR0 = 0;
for (int i = 1; i <= 10; i++) {
MQ2.update();
calcR0 += MQ2.calibrate(9.83);
}
MQ2.setR0(calcR0 / 10);
Serial.println(calcR0);
if (isinf(calcR0) || calcR0 == 0) {
Serial.println("Warning: Connection issue detected (R0 is infinite or zero), please check wiring.");
while (1);
}
MQ2.serialDebug(true);
}
float readDistanceCM() {
int duration;
float distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH, 30000);
distance = duration / 58.0;
if (duration == 0) {
return -1; // Indicate no echo detected
}
return distance;
}
TempHum readTempHumData() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
return {data.temperature, data.humidity};
}
void loop() {
float distance = readDistanceCM();
tempHumData = readTempHumData(); // Get the latest temperature and humidity
if (isnan(tempHumData.temperature) || isnan(tempHumData.humidity)) {
Serial.println("The DHT22 sensor is not correctly configured");
} else {
Serial.println("Temperature: " + String(tempHumData.temperature, 2) + "°C");
Serial.println("Humidity: " + String(tempHumData.humidity, 1) + "%");
}
// Handle distance-based info
if (distance < 0) {
tempData = {distance, "Out of range", "Addis Ababa"};
} else if (distance <= 4) {
tempData = {distance, "Severe", "Addis Ababa"};
} else if (distance <= 7) {
tempData = {distance, "Critical", "Addis Ababa"};
} else {
tempData = {distance, "Normal", "Addis Ababa"};
}
// Display values on the LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dist: ");
lcd.print(distance);
lcd.setCursor(0, 1);
lcd.print("Gas: ");
lcd.print(valor_gas);
lcd.setCursor(9, 1);
lcd.print("Temp: ");
lcd.print(tempHumData.temperature, 2);
lcd.print("C");
// Send data to server if WiFi is connected
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(SERVER_URL);
http.addHeader("Content-Type", "application/json");
String jsonData = "{\"sensor_value\": " + String(distance) + ","
"\"temperature\": " + String(tempHumData.temperature, 2) + "}";
int httpResponseCode = http.POST(jsonData);
if (httpResponseCode > 0) {
Serial.println("Data sent successfully!");
Serial.print("Response code: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Error in sending data: ");
Serial.println(httpResponseCode);
}
http.end();
}
delay(2000); // Wait for 2 seconds before updating values
// Read gas level from MQ2 sensor
MQ2.update();
MQ2.readSensor();
valor_gas = analogRead(Pin);
valor_gas = map(valor_gas, 0, 4095, 0, 100);
// Print values to the Serial Monitor
Serial.print("Gas Level (MQ2): ");
Serial.println(valor_gas);
Serial.println("---");
}