#include <WiFi.h>
#include <Firebase_ESP_Client.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
// Firebase Helper Files
#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"
// WiFi credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Firebase project API Key
#define API_KEY "AIzaSyB1vc2H9QXWLZ3ylSylNMKijlSwZWmGaFo"
#define DATABASE_URL "smart-home-monitor-360fa-default-rtdb.firebaseio.com/"
// Firebase objects
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
// MQ2 sensor pin
#define MQ2PIN 34
// DHT22
#define DHTPIN 19
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Ultrasonic sensor pins
#define TRIG_PIN 17
#define ECHO_PIN 16
// Timing
unsigned long sendDataPrevMillis = 0;
bool signupOK = false;
// Variables
float gasValue = 0.0;
float temperature = 0.0;
float humidity = 0.0;
float distance = 0.0;
void setup() {
Serial.begin(115200);
// Initialize sensors
dht.begin();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Connect WiFi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(300);
}
Serial.println();
Serial.println("Connected with IP: " + WiFi.localIP().toString());
// Firebase config
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
if (Firebase.signUp(&config, &auth, "", "")) {
Serial.println("Firebase signup OK");
signupOK = true;
} else {
Serial.printf("Firebase signup failed: %s\n", config.signer.signupError.message.c_str());
}
config.token_status_callback = tokenStatusCallback;
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
}
void loop() {
if (Firebase.ready() && signupOK && (millis() - sendDataPrevMillis > 15000 || sendDataPrevMillis == 0)) {
sendDataPrevMillis = millis();
// Read MQ2 gas sensor
gasValue = analogRead(MQ2PIN);
gasValue = map(gasValue, 0, 4095, 0, 100);
Serial.printf("Gas Value: %.2f%%\n", gasValue);
if (Firebase.RTDB.setFloat(&fbdo, "/MQ2/GasValue", gasValue)) {
Serial.println("Gas data sent to Firebase successfully");
} else {
Serial.println("Failed to send gas data");
Serial.println("REASON: " + fbdo.errorReason());
}
// Read DHT sensor
humidity = dht.readHumidity();
temperature = dht.readTemperature();
if (!isnan(humidity) && !isnan(temperature)) {
if (Firebase.RTDB.setFloat(&fbdo, "/DHT/Temperature", temperature)) {
Serial.println("Temperature data sent successfully");
} else {
Serial.println("Failed to send temperature data");
Serial.println("REASON: " + fbdo.errorReason());
}
if (Firebase.RTDB.setFloat(&fbdo, "/DHT/Humidity", humidity)) {
Serial.println("Humidity data sent successfully");
} else {
Serial.println("Failed to send humidity data");
Serial.println("REASON: " + fbdo.errorReason());
}
} else {
Serial.println("Failed to read from DHT sensor!");
}
// Read Ultrasonic distance
distance = readUltrasonicDistance();
Serial.printf("Ultrasonic Distance: %.2f cm\n", distance);
if (Firebase.RTDB.setFloat(&fbdo, "/Ultrasonic/Distance", distance)) {
Serial.println("Ultrasonic distance sent successfully");
} else {
Serial.println("Failed to send ultrasonic distance");
Serial.println("REASON: " + fbdo.errorReason());
}
Serial.println("Waiting for next reading...\n");
}
}
// Ultrasonic sensor reading function
float readUltrasonicDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distanceCm = duration * 0.034 / 2;
return distanceCm;
}