#include <WiFi.h>
#include <WebServer.h>
#include <DHT.h>
#include <ESP32Servo.h>
// إعداد الشبكة
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
WebServer server(80);
// تعريف الحساسات والأجهزة
#define DHTPIN 15
#define DHTTYPE DHT22
#define LED_RED 32
#define LED_GREEN 33
#define LED_BLUE 14
#define RELAY1 23
#define RELAY2 22
#define RELAY3 21
#define RELAY4 19
#define BUZZER 12
#define PIR_SENSOR 4
#define LDR_SENSOR 36
#define GAS_SENSOR 5
#define SOUND_SENSOR 39
#define RAIN_SENSOR 34
#define ULTRA_TRIG 18
#define ULTRA_ECHO 19
Servo doorServo;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, pass);
Serial.println();
Serial.print("Connecting to WiFi");
int retry = 0;
while (WiFi.status() != WL_CONNECTED && retry < 20) {
delay(500);
Serial.print(".");
retry++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi connected ✅");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\nWiFi connection FAILED ❌");
}
dht.begin();
doorServo.setPeriodHertz(50);
doorServo.attach(27);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(PIR_SENSOR, INPUT);
pinMode(LDR_SENSOR, INPUT);
pinMode(GAS_SENSOR, INPUT);
pinMode(SOUND_SENSOR, INPUT);
pinMode(RAIN_SENSOR, INPUT);
pinMode(ULTRA_TRIG, OUTPUT);
pinMode(ULTRA_ECHO, INPUT);
server.on("/", handleRoot);
server.on("/control", handleControl);
server.on("/sensors", handleSensors);
server.begin();
Serial.println("HTTP server started ✅");
}
void loop() {
server.handleClient();
}
// عرض رسالة افتراضية على المتصفح
void handleRoot() {
server.send(200, "text/plain", "Smart Home Controller is Running!");
}
// التحكم بالأجهزة عبر الموقع
void handleControl() {
String device = server.arg("device");
String action = server.arg("action");
if (device == "led_red") digitalWrite(LED_RED, action == "on" ? HIGH : LOW);
else if (device == "led_green") digitalWrite(LED_GREEN, action == "on" ? HIGH : LOW);
else if (device == "led_blue") digitalWrite(LED_BLUE, action == "on" ? HIGH : LOW);
else if (device == "relay1") digitalWrite(RELAY1, action == "on" ? LOW : HIGH);
else if (device == "relay2") digitalWrite(RELAY2, action == "on" ? LOW : HIGH);
else if (device == "relay3") digitalWrite(RELAY3, action == "on" ? LOW : HIGH);
else if (device == "relay4") digitalWrite(RELAY4, action == "on" ? LOW : HIGH);
else if (device == "buzzer") digitalWrite(BUZZER, action == "on" ? HIGH : LOW);
else if (device == "door") {
if (action == "open") doorServo.write(90);
else if (action == "close") doorServo.write(0);
}
server.send(200, "text/plain", "OK");
}
// قراءة القيم من الحساسات
void handleSensors() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int ldrValue = analogRead(LDR_SENSOR);
int gasValue = analogRead(GAS_SENSOR);
int soundValue = analogRead(SOUND_SENSOR);
int rainValue = analogRead(RAIN_SENSOR);
bool motionDetected = digitalRead(PIR_SENSOR);
// قراءة المسافة من Ultrasonic
digitalWrite(ULTRA_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(ULTRA_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRA_TRIG, LOW);
long duration = pulseIn(ULTRA_ECHO, HIGH);
float distance = duration * 0.034 / 2;
// طباعة القيم باستخدام printf
Serial.println("========== Sensor Readings ==========");
Serial.printf("Temperature: %.1f °C\n", temperature);
Serial.printf("Humidity : %.1f %%\n", humidity);
Serial.printf("LDR Light : %d\n", ldrValue);
Serial.printf("Gas Level : %d\n", gasValue);
Serial.printf("Sound Level: %d\n", soundValue);
Serial.printf("Rain Value : %d\n", rainValue);
Serial.printf("Motion : %d\n", motionDetected);
Serial.printf("Distance : %.1f cm\n", distance);
Serial.println("======================================");
// إرسال القيم إلى المتصفح بصيغة JSON
String json = "{";
json += "\"temperature\":" + String(temperature, 1) + ",";
json += "\"humidity\":" + String(humidity, 1) + ",";
json += "\"ldr\":" + String(ldrValue) + ",";
json += "\"gas\":" + String(gasValue) + ",";
json += "\"sound\":" + String(soundValue) + ",";
json += "\"rain\":" + String(rainValue) + ",";
json += "\"motion\":" + String(motionDetected) + ",";
json += "\"distance\":" + String(distance, 1);
json += "}";
server.send(200, "application/json", json);
}