#include <WiFi.h>
#include <ModbusMaster.h>
#include <WebServer.h>
// إعدادات Wi-Fi
const char* ssid = "Wokwi-GUEST"; // اسم الشبكة الافتراضية
const char* password = ""; // لا توجد كلمة مرور لهذه الشبكة
// خادم ويب
WebServer server(80);
// Modbus Master object
ModbusMaster node;
// حالة الريلاي
bool relayState = false;
// دبابيس الإدخال/الإخراج
const int relayPin = 25;
void setup() {
Serial.begin(115200);
// إعداد الريلاي
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW);
// الاتصال بشبكة WiFi
WiFi.mode(WIFI_STA); // تعيين وضع ESP32 كعميل للشبكة
WiFi.begin(ssid, password); // الاتصال بالشبكة الافتراضية
Serial.println("Connecting to WiFi...");
// الانتظار حتى يتم الاتصال بالواي فاي
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Connected to WiFi");
Serial.print("ESP32 IP Address: ");
Serial.println(WiFi.localIP());
delay(2000); // طباعة عنوان الـ IP
// إعداد مسارات الويب
server.on("/", []() {
String html = "<html><body><h1>Home Automation</h1>";
html += "<p><a href='/on'><button>Turn ON</button></a></p>";
html += "<p><a href='/off'><button>Turn OFF</button></a></p>";
html += "</body></html>";
server.send(200, "text/html", html);
});
server.on("/on", []() {
digitalWrite(relayPin, HIGH);
relayState = true;
server.send(200, "text/html", "<p>Relay ON! <a href='/'>Go back</a></p>");
});
server.on("/off", []() {
digitalWrite(relayPin, LOW);
relayState = false;
server.send(200, "text/html", "<p>Relay OFF! <a href='/'>Go back</a></p>");
});
// بدء الخادم
server.begin();
// إعداد Modbus Master
node.begin(1, Serial); // تحديد ID الجهاز واستخدام Serial للتواصل
}
void loop() {
// تحديث Modbus
uint8_t result = node.readHoldingRegisters(0x0001, 1); // قراءة سجل من العنوان 0x0001
if (result == node.ku8MBSuccess) {
uint16_t value = node.getResponseBuffer(0); // الحصول على القيمة من السجل
Serial.print("Modbus Value: ");
Serial.println(value);
// يمكنك استخدام هذه القيمة في شيء آخر مثل تغيير حالة الريلاي بناءً على القيمة
// على سبيل المثال:
if (value > 1000) { // شرط افتراضي، يمكنك تعديله بناءً على الحاجة
digitalWrite(relayPin, HIGH); // تشغيل الريلاي
} else {
digitalWrite(relayPin, LOW); // إيقاف الريلاي
}
} else {
Serial.println("Failed to read Modbus registers");
}
// التعامل مع الطلبات الواردة لخادم الويب
server.handleClient(); // الاستجابة للطلبات الواردة من المتصفح
delay(100); // تقليل التأخير لتحسين الاستجابة
}