// ESP32 - Sensor Monitor → Firebase Dashboard + SIM800 SMS
// By: Muhmmad Ali
#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define FIREBASE_URL "https://sim800-controller-default-rtdb.firebaseio.com"
#define FIREBASE_AUTH "YUdjhcfUvLbp9s2ELz1x2wSx1iHhA1QnHAaQMzxw"
#define PHONE_NUMBER "+923001234567"
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define PIR_PIN 26
#define TEMP_THRESHOLD 40.0
#define HUMID_THRESHOLD 80.0
#define ALERT_COOLDOWN 30000
#define FIREBASE_INTERVAL 1000 // Firebase every 1 second
DHT dht(DHT_PIN, DHT_TYPE);
HardwareSerial sim800(2);
unsigned long lastTempAlert = 0;
unsigned long lastHumidAlert = 0;
unsigned long lastMotionAlert = 0;
unsigned long lastFirebase = 0;
void connectWiFi() {
Serial.print("Connecting WiFi");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
int tries = 0;
while (WiFi.status() != WL_CONNECTED && tries < 20) {
delay(300); Serial.print("."); tries++;
}
Serial.println(WiFi.status() == WL_CONNECTED ? "\n✅ WiFi OK" : "\n❌ Failed");
}
void initSIM800() {
sim800.begin(9600, SERIAL_8N1, 16, 17);
delay(500);
sim800.println("AT"); delay(300);
sim800.println("AT+CMGF=1"); delay(300);
Serial.println("✅ SIM800 Ready");
}
void sendSMS(String msg) {
sim800.println("AT+CMGS=\"" + String(PHONE_NUMBER) + "\"");
delay(500);
sim800.print(msg);
sim800.write(26);
delay(2000);
Serial.println("✅ SMS: " + msg);
}
void sendToFirebase(float temp, float humid, bool motion) {
if (WiFi.status() != WL_CONNECTED) { connectWiFi(); return; }
HTTPClient http;
http.setReuse(true); // Keep connection alive = faster!
http.begin(String(FIREBASE_URL) + "/sensors.json?auth=" + FIREBASE_AUTH);
http.addHeader("Content-Type", "application/json");
String body = "{\"temperature\":" + String(temp, 1) +
",\"humidity\":" + String(humid, 1) +
",\"motion\":" + String(motion ? "true" : "false") +
",\"timestamp\":" + String(millis()) + "}";
int code = http.PUT(body);
Serial.println(code == 200 ? "✅ Firebase OK" : "❌ " + String(code));
http.end();
}
void logAlert(String sensor, String message) {
if (WiFi.status() != WL_CONNECTED) return;
HTTPClient http;
http.begin(String(FIREBASE_URL) + "/sensorAlerts.json?auth=" + FIREBASE_AUTH);
http.addHeader("Content-Type", "application/json");
http.POST("{\"sensor\":\"" + sensor + "\",\"message\":\"" + message + "\",\"timestamp\":" + String(millis()) + "}");
http.end();
}
void checkAlert(bool condition, unsigned long &last, String sensor, String sms) {
if (condition && millis() - last > ALERT_COOLDOWN) {
last = millis();
sendSMS(sms);
logAlert(sensor, sms);
Serial.println("🚨 " + sensor);
}
}
void setup() {
Serial.begin(115200);
Serial.println("=== Sensor Monitor ===");
pinMode(PIR_PIN, INPUT);
dht.begin();
initSIM800();
connectWiFi();
Serial.println("✅ Ready!");
}
void loop() {
if (WiFi.status() != WL_CONNECTED) connectWiFi();
float temp = dht.readTemperature();
float humid = dht.readHumidity();
bool motion = digitalRead(PIR_PIN) == HIGH;
if (isnan(temp) || isnan(humid)) { delay(200); return; }
Serial.printf("🌡️ %.1f°C | 💧 %.1f%% | 🚶 %s\n", temp, humid, motion ? "YES" : "NO");
// Firebase every 1 second
if (millis() - lastFirebase >= FIREBASE_INTERVAL) {
lastFirebase = millis();
sendToFirebase(temp, humid, motion);
}
// Alerts
checkAlert(temp > TEMP_THRESHOLD, lastTempAlert, "Temperature", "ALERT: High Temp! " + String(temp,1) + "C");
checkAlert(humid > HUMID_THRESHOLD, lastHumidAlert, "Humidity", "ALERT: High Humidity! " + String(humid,1) + "%");
checkAlert(motion, lastMotionAlert, "Motion", "ALERT: Motion detected!");
delay(100);
}