#include <Arduino.h>
#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 credentials
#define API_KEY "AIzaSyCeBH5aIPHmiS3vSSGiR89eRdYWlwebEWI"
#define DATABASE_URL "https://enviornment-monitoring-default-rtdb.firebaseio.com/"
// Firebase objects
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
// Sensor Pins
#define MQ2PIN 34
#define DHTPIN 17
#define DHTTYPE DHT22
#define TRIG_PIN 27
#define ECHO_PIN 26
DHT dht(DHTPIN, DHTTYPE);
// Timing and control
unsigned long sendDataPrevMillis = 0;
bool signupOK = false;
// Sensor readings
float gasValue = 0.0;
float temperature = 0.0;
float humidity = 0.0;
float distance = 0.0;
// Forward declaration
float readUltrasonicDistance();
void setup() {
Serial.begin(115200);
// Initialize sensors
dht.begin();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Connect to 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());
// Configure Firebase
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
config.token_status_callback = tokenStatusCallback;
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());
}
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
}
void loop() {
if (Firebase.ready() && signupOK && (millis() - sendDataPrevMillis > 15000 || sendDataPrevMillis == 0)) {
sendDataPrevMillis = millis();
// --- MQ2 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("Failed to send gas data: " + fbdo.errorReason());
}
// --- DHT22 Sensor ---
humidity = dht.readHumidity();
temperature = dht.readTemperature();
if (!isnan(humidity) && !isnan(temperature)) {
Serial.printf("Temp: %.2f°C, Humidity: %.2f%%\n", temperature, humidity);
if (!Firebase.RTDB.setFloat(&fbdo, "/DHT/Temperature", temperature)) {
Serial.println("Failed to send temperature: " + fbdo.errorReason());
}
if (!Firebase.RTDB.setFloat(&fbdo, "/DHT/Humidity", humidity)) {
Serial.println("Failed to send humidity: " + fbdo.errorReason());
}
} else {
Serial.println("Failed to read from DHT sensor!");
}
// --- Ultrasonic Sensor ---
distance = readUltrasonicDistance();
Serial.printf("Ultrasonic Distance: %.2f cm\n", distance);
if (!Firebase.RTDB.setFloat(&fbdo, "/Ultrasonic/Distance", distance)) {
Serial.println("Failed to send ultrasonic distance: " + fbdo.errorReason());
}
Serial.println("Waiting for next reading...\n");
}
}
// --- Ultrasonic 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;
}
//XML Code