#include <WiFi.h>
#include <FirebaseESP32.h>
// تعاريف الحساسات والأجهزة
#define MQ2_PIN 34
#define RED_LED 18
#define GREEN_LED 19
#define BUZZER 22
#define GAS_VALVE_LED 21 // صمام الغاز
#define WINDOW_LED 16 // الشباك
// بيانات WiFi
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// بيانات Firebase
#define API_KEY "AIzaSyAB_BjkwQkycpxZGpBAQeWhI-YV-dKiAts"
#define DATABASE_URL "https://gazleakageproject-default-rtdb.europe-west1.firebasedatabase.app/"
// كائنات Firebase
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
int threshold = 3000; // الحد المسموح لقيمة الغاز
// دالة لمتابعة حالة الـ Token
void tokenStatusCallback(TokenInfo info) {
Serial.print("Token Status: ");
Serial.println(info.status);
}
void setup() {
Serial.begin(115200);
delay(2000);
// تهيئة الأجهزة
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(GAS_VALVE_LED, OUTPUT);
pinMode(WINDOW_LED, OUTPUT);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(BUZZER, LOW);
digitalWrite(GAS_VALVE_LED, LOW);
digitalWrite(WINDOW_LED, LOW);
// الاتصال بشبكة WiFi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected");
// إعداد Firebase
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
config.token_status_callback = tokenStatusCallback;
if (Firebase.signUp(&config, &auth, "", "")) {
Serial.println("Firebase Signed up successfully");
} else {
Serial.printf("Firebase SignUp Failed: %s\n", config.signer.signupError.message.c_str());
while (true);
}
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
while (auth.token.uid == "") {
Serial.println("Waiting for token...");
delay(1000);
}
Serial.println("Firebase Initialized");
}
void loop() {
int gasValue = analogRead(MQ2_PIN);
Serial.print("Gas Level: ");
Serial.println(gasValue);
bool danger = gasValue >= threshold;
// حالة الخطر
if (danger) {
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
tone(BUZZER, 1000);
digitalWrite(GAS_VALVE_LED, HIGH); // إغلاق الصمام
Firebase.setInt(fbdo, "/window", 1);
} else {
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
noTone(BUZZER);
digitalWrite(GAS_VALVE_LED, LOW); // فتح الصمام
}
// إرسال بيانات إلى Firebase
Firebase.setInt(fbdo, "/gasValue", gasValue);
Firebase.setInt(fbdo, "/gasValveState", digitalRead(GAS_VALVE_LED));
// قراءة أمر الشباك من Firebase
int windowCommand = 0;
if (Firebase.getInt(fbdo, "/window")) {
windowCommand = fbdo.intData();
} else {
Serial.println("Failed to get window state from Firebase");
}
int windowState=0;
// تفعيل تلقائي للشباك عند وجود خطر
if (danger) {
windowState = 1;
}else{
windowState = windowCommand;
}
digitalWrite(WINDOW_LED, windowState);
delay(5000);
}