#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define MQTT_BROKER "broker.hivemq.com"
#define MQTT_PORT 1883
#define MQTT_TOPIC "esp32/eden"
#define ALERT_TOPIC "esp32/alert"
#define DHTPIN 4
#define DHTTYPE DHT22
#define LED_PIN 5
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
unsigned long lastMsgTime = 0;
const long interval = 3600000; // ساعة واحدة = 3600000 ميلي ثانية
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi ");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
client.setServer(MQTT_BROKER, MQTT_PORT);
client.setKeepAlive(4000); // التأكد من أن الاتصال لا ينقطع بسرعة
client.setCallback(callback);
reconnectMQTT();
dht.begin();
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
sendSensorData(); // إرسال القراءة الأولى فور التشغيل
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi Disconnected! Reconnecting...");
WiFi.disconnect();
WiFi.reconnect();
delay(5000);
}
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
unsigned long now = millis();
if (now - lastMsgTime >= interval) { // بابلش كل ساعة فقط
lastMsgTime = now;
sendSensorData();
}
}
void reconnectMQTT() {
if (client.connected()) return; // لو متصل مش محتاج تعيد الاتصال
Serial.println("Checking MQTT connection...");
int maxRetries = 5; // عدد محاولات الاتصال قبل التوقف مؤقتًا
int attempt = 0;
while (!client.connected() && attempt < maxRetries) {
Serial.print("Attempting MQTT connection... (Try ");
Serial.print(attempt + 1);
Serial.println(")");
if (client.connect("eden")) {
Serial.println("MQTT Connected!");
client.subscribe(ALERT_TOPIC); // الاشتراك في موضوع التنبيه
return; // خروج بمجرد نجاح الاتصال
} else {
Serial.print("MQTT Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying...");
}
attempt++;
delay(5000); // انتظار قبل إعادة المحاولة
}
if (!client.connected()) {
Serial.println("Max retries reached. Waiting before retrying...");
delay(30000);
}
}
void sendSensorData() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (!isnan(temperature) && !isnan(humidity)) {
String payload = "{\"temperature\": " + String(temperature) + ", \"humidity\": " + String(humidity) + "}";
client.publish(MQTT_TOPIC, payload.c_str() , true);
Serial.println("Published: " + payload);
} else {
Serial.println("Failed to read from DHT sensor!");
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message received on topic ");
Serial.print(topic);
Serial.print(": ");
Serial.println(message);
if (String(topic) == ALERT_TOPIC) {
int alert = message.toInt();
if (alert == 1) {
Serial.println("🔥 High temperature detected! Turning LED ON for 10 seconds.");
digitalWrite(LED_PIN, HIGH);
delay(10000);
digitalWrite(LED_PIN, LOW);
} else {
Serial.println("✅ Temperature normal. LED OFF.");
digitalWrite(LED_PIN, LOW);
}
}
}