#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// ================= WIFI =================
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ================= MQTT =================
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_topic = "smartroom/piyanat/data";
//https://www.hivemq.com/demos/websocket-client/
//Host:broker.hivemq.com
//Port:8884
//ClientID:webClient1
// ================= PIN =================
#define DHTPIN 4
#define DHTTYPE DHT22
#define BUTTON_PIN 33
#define RELAY_PIN 26
#define BUZZER_PIN 25
#define LED_WIFI 18
#define LED_ALERT 19
// ================= THRESHOLD =================
#define TEMP_ON 30.0
#define TEMP_OFF 28.0
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
unsigned long previousMillis = 0;
const long interval = 5000;
bool tempAlertActive = false;
// ================= WIFI CONNECT =================
void connectWiFi() {
WiFi.begin(ssid, password);
Serial.print("Connecting WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
digitalWrite(LED_WIFI, !digitalRead(LED_WIFI)); // กระพริบตอนต่อ
}
Serial.println("\nWiFi Connected");
digitalWrite(LED_WIFI, HIGH); // ค้างเมื่อสำเร็จ
}
// ================= MQTT CONNECT =================
void connectMQTT() {
while (!client.connected()) {
Serial.print("Connecting MQTT...");
if (client.connect("ESP32_Piyanat")) {
Serial.println("Connected");
} else {
Serial.print("Failed, rc=");
Serial.println(client.state());
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLDOWN);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_WIFI, OUTPUT);
pinMode(LED_ALERT, OUTPUT);
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_ALERT, LOW);
dht.begin();
connectWiFi();
client.setServer(mqtt_server, mqtt_port);
}
// ================= LOOP =================
void loop() {
// ตรวจ WiFi
if (WiFi.status() != WL_CONNECTED) {
digitalWrite(LED_WIFI, LOW);
connectWiFi();
}
// ตรวจ MQTT
if (!client.connected()) {
connectMQTT();
}
client.loop();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int buttonState = digitalRead(BUTTON_PIN);
if (isnan(temperature) || isnan(humidity)) {
Serial.println("DHT Error");
return;
}
// ================= RELAY (Hysteresis) =================
if (!tempAlertActive && temperature > TEMP_ON) {
tempAlertActive = true;
}
if (tempAlertActive && temperature < TEMP_OFF) {
tempAlertActive = false;
}
if (tempAlertActive) {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_ALERT, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(LED_ALERT, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
// ================= JSON =================
String payload = "{";
payload += "\"temperature\":" + String(temperature, 2) + ",";
payload += "\"humidity\":" + String(humidity, 2) + ",";
payload += "\"button\":" + String(buttonState) + ",";
payload += "\"alert\":" + String(tempAlertActive);
payload += "}";
client.publish(mqtt_topic, payload.c_str());
// ================= SERIAL =================
Serial.println("------ ROOM STATUS ------");
Serial.println(payload);
Serial.println("-------------------------");
}
}