#include <WiFi.h>
#include <Firebase_ESP_Client.h>
#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"
// ===== إعدادات Wi-Fi =====
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// ===== إعدادات Firebase =====
// هذه هي نفس الإعدادات التي استخدمتها في الكود الأصلي
#define API_KEY "AIzaSyAJm0L5ummDArxH_D364uMatcOdOI_IyEQ"
#define DATABASE_URL "https://iot-project-80617-default-rtdb.firebaseio.com/"
// ===== تعريف الأجهزة المتصلة =====
// الـ LED الخاص بالتحكم موصول بالمنفذ رقم 2
#define LED_PIN 2
// ===== كائنات Firebase =====
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
// متغيرات للتحكم في التوقيت
unsigned long sendDataPrevMillis = 0;
bool lastLedState = false; // لتجنب تكرار الطباعة في السيريال
void setup() {
// بدء الاتصال التسلسلي (Serial)
Serial.begin(115200);
// تهيئة منفذ الـ LED كمخرج
pinMode(LED_PIN, OUTPUT);
// إبقاء الـ LED مطفأ في البداية
digitalWrite(LED_PIN, LOW);
// الاتصال بشبكة الواي فاي
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println("-----------------------------------");
// تهيئة إعدادات Firebase
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
// تسجيل دخول مجهول (Anonymous Sign-Up) إلى Firebase
if (Firebase.signUp(&config, &auth, "", "")) {
Serial.println("Firebase SignUp successful");
} else {
Serial.printf("Firebase SignUp failed: %s\n", config.signer.signupError.message.c_str());
}
// بدء الاتصال بـ Firebase
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
}
void loop() {
// لا تفعل أي شيء إذا لم يكن الاتصال بـ Firebase جاهزًا
if (!Firebase.ready()) {
return;
}
// ==========================================================
// الجزء الأول: إرسال بيانات الحساسات كل 5 ثوانٍ
// ==========================================================
if (millis() - sendDataPrevMillis > 5000 || sendDataPrevMillis == 0) {
sendDataPrevMillis = millis();
// محاكاة بيانات عشوائية للحساسات
int temp = random(20, 35); // درجة الحرارة بين 20 و 34
int humidity = random(40, 80); // الرطوبة بين 40 و 79
int light = random(200, 800); // شدة الإضاءة بين 200 و 799
bool motion = random(0, 2); // حركة (0 أو 1)
// إرسال البيانات إلى المسار /sensors في Firebase
if (Firebase.RTDB.setInt(&fbdo, "/sensors/temp", temp) &&
Firebase.RTDB.setInt(&fbdo, "/sensors/humidity", humidity) &&
Firebase.RTDB.setInt(&fbdo, "/sensors/light", light) &&
Firebase.RTDB.setBool(&fbdo, "/sensors/motion", motion)) {
Serial.println("✅ Data sent successfully:");
Serial.printf(" 🌡️ Temp: %d, 💧 Humidity: %d, 💡 Light: %d, 🚶 Motion: %s\n", temp, humidity, light, motion ? "Yes" : "No");
Serial.println("-----------------------------------");
} else {
Serial.println("❌ FAILED to send data: " + fbdo.errorReason());
}
}
// ==========================================================
// الجزء الثاني: الاستماع لأوامر التحكم من صفحة الويب
// ==========================================================
// يتم استدعاء هذا الجزء في كل دورة للتحقق من وجود أوامر جديدة
if (Firebase.RTDB.getBool(&fbdo, "/control/led")) {
bool ledState = fbdo.boolData(); // احصل على الحالة (true أو false)
// طبّق الحالة الجديدة على الـ LED
digitalWrite(LED_PIN, ledState);
// اطبع الحالة في السيريال فقط عندما تتغير لتجنب تكرار الرسائل
if (ledState != lastLedState) {
Serial.printf("💡 Control command received: LED is now %s\n", ledState ? "ON" : "OFF");
lastLedState = ledState; // تحديث الحالة الأخيرة للـ LED
}
}
// تأخير بسيط لمنح المعالج وقتاً ولتجنب إغراق Firebase بالطلبات
delay(100);
}