#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>
#include <DHT_U.h>
#include <FirebaseESP32.h> // Firebase library for ESP32
#include "creds.h"
// #define DONT_HAVE_SENSORS
#define MQ5PIN 27 // GPIO27 (Change if needed)
#define DHTPIN 26 // GPIO26 (Change if needed)
#define DHTTYPE DHT11
#define BAUDRATE 115200
struct readings {
bool gas; // Gas status: true if gas detected
float hum; // Humidity in Percent (%)
float temp; // Temperature in Celsius (°C)
} readings;
DHT dht(DHTPIN, DHTTYPE);
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
unsigned long previousMillis = 0;
const long interval = 2000;
void connectToWiFi(const char *ssid, const char *password);
void readSensors(struct readings *r);
void displaySensors(struct readings r);
void sendDataToFirebase(struct readings r);
void setup() {
pinMode(MQ5PIN, INPUT);
Serial.begin(BAUDRATE);
connectToWiFi(SSID, PASSWORD);
config.api_key = FIREBASE_API_KEY;
config.database_url = FIREBASE_HOST;
Firebase.begin(&config, &auth);
dht.begin();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
readSensors(&readings);
displaySensors(readings);
sendDataToFirebase(readings);
}
}
void connectToWiFi(const char *ssid, const char *password) {
Serial.println("\nConnecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void readSensors(struct readings *r) {
#ifdef DONT_HAVE_SENSORS
readings.gas = !readings.gas;
readings.temp = random(0, 80);
readings.hum = random(0, 80);
#else
r->gas = digitalRead(MQ5PIN);
r->hum = dht.readHumidity();
r->temp = dht.readTemperature();
if (isnan(r->hum) || isnan(r->temp)) {
Serial.println("[ERROR] Failed to read from DHT sensor!");
return;
}
#endif
}
void displaySensors(struct readings r) {
if (r.gas) {
Serial.println("[ALERT] Gas DETECTED!!!");
}
Serial.printf("[INFO] Gas Status: %d\n", r.gas);
Serial.printf("[INFO] Humidity: %.2f%%\n", r.hum);
Serial.printf("[INFO] Temperature: %.2f°C\n", r.temp);
}
void sendDataToFirebase(struct readings r) {
if (Firebase.pushInt(fbdo, "/mq5/gas", r.gas)) {
Serial.println("[INFO] Gas status uploaded.");
} else {
Serial.printf("[ERROR] Firebase pushInt failed: %s\n", fbdo.errorReason().c_str());
}
if (Firebase.pushFloat(fbdo, "/dht11/humidity", r.hum)) {
Serial.println("[INFO] Humidity uploaded.");
} else {
Serial.printf("[ERROR] Firebase pushFloat failed: %s\n", fbdo.errorReason().c_str());
}
if (Firebase.pushFloat(fbdo, "/dht11/temperature", r.temp)) {
Serial.println("[INFO] Temperature uploaded.");
} else {
Serial.printf("[ERROR] Firebase pushFloat failed: %s\n", fbdo.errorReason().c_str());
}
}