#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
#define MQTT_HOST "mqtt3.thingspeak.com"
#define MQTT_PORT 1883
#define MQTT_CLIENT_ID "ICUzCTYHFAA3PDgcEBsVDz0"
#define MQTT_USERNAME "ICUzCTYHFAA3PDgcEBsVDz0"
#define MQTT_PASSWORD "ispP4S4VBaYKA4Z5i1hX/tbD"
#define CHANNEL_ID_SENSORS "3064334"
#define CHANNEL_ID_CONTROL "3064332"
#define DHTPIN 15
#define DHTTYPE DHT22
#define FAN_PIN 2
#define HEATER_PIN 4
DHT dht(DHTPIN, DHTTYPE);
WiFiClient wc;
PubSubClient mqtt(wc);
String TP_PUB = "channels/" + String(CHANNEL_ID_SENSORS) + "/publish";
String TP_FAN = "channels/" + String(CHANNEL_ID_CONTROL) + "/subscribe/fields/field2";
String TP_HEAT = "channels/" + String(CHANNEL_ID_CONTROL) + "/subscribe/fields/field3";
void fan(bool on) {
digitalWrite(FAN_PIN, on ? HIGH : LOW);
Serial.println(on ? "[ACT] Fan ON" : "[ACT] Fan OFF");
}
void heater(bool on) {
digitalWrite(HEATER_PIN, on ? HIGH : LOW);
Serial.println(on ? "[ACT] Heater ON" : "[ACT] Heater OFF");
}
String trimmed(String s) {
s.trim();
return s;
}
void onMsg(char* topic, byte* msg, unsigned int len) {
String t = String(topic);
String payload;
for (unsigned int i = 0; i < len; i++) payload += (char)msg[i];
payload = trimmed(payload);
Serial.print("[CTRL] "); Serial.print(t);
Serial.print(" -> "); Serial.println(payload);
if (t == TP_FAN) fan(payload == "1");
if (t == TP_HEAT) heater(payload == "1");
}
void reconnect() {
while (!mqtt.connected()) {
Serial.print("[MQTT] Connecting...");
if (mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
Serial.println("Connected!");
mqtt.subscribe(TP_FAN.c_str());
mqtt.subscribe(TP_HEAT.c_str());
Serial.println("[MQTT] Subscribed to control fields.");
} else {
Serial.print("Failed, rc="); Serial.print(mqtt.state());
Serial.println(" retry in 5s");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(FAN_PIN, OUTPUT);
pinMode(HEATER_PIN, OUTPUT);
fan(false);
heater(false);
dht.begin();
Serial.print("[WiFi] Connecting to WiFi");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) { delay(400); Serial.print("."); }
Serial.println("\n[WiFi] Connected!");
mqtt.setServer(MQTT_HOST, MQTT_PORT);
mqtt.setCallback(onMsg);
}
unsigned long lastPub = 0;
const unsigned long PUBLISH_MS = 20000; // كل 20 ثانية
void loop() {
if (!mqtt.connected()) reconnect();
mqtt.loop();
unsigned long now = millis();
if (now - lastPub > PUBLISH_MS) {
lastPub = now;
float t = dht.readTemperature();
float h = dht.readHumidity();
if (!isnan(t) && !isnan(h)) {
String payload = "field1=" + String(t, 1) + "&field2=" + String(h, 1);
bool ok = mqtt.publish(TP_PUB.c_str(), payload.c_str());
Serial.print(ok ? "[PUB] " : "[PUB FAIL] ");
Serial.println(payload);
} else {
Serial.println("[ERROR] Failed to read DHT!");
}
}
}