#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
// DHT22 sensor
#define DHTPIN 19
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Relay
#define RELAY 14
int relayState = LOW;
// WiFi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// MQTT Broker
const char *mqtt_broker = "broker.emqx.io";
const char *mqtt_topic = "emqx/esp32/temp_humid";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
void callback(char *topic, byte *payload, unsigned int length) {
// แปลง payload เป็น String
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
if (message == "ON" || message == "OFF") {
Serial.print("Message arrived in topic : ");
Serial.println(topic);
Serial.print("React Message [ ");
Serial.print(message);
Serial.println(" ]");
// ถ้าข้อความที่ได้รับเป็น "ON" ให้เปิดรีเลย์
if (message == "ON") {
relayState = HIGH;
digitalWrite(RELAY, relayState);
}
// ถ้าข้อความที่ได้รับเป็น "OFF" ให้ปิดรีเลย์
else if (message == "OFF") {
relayState = LOW;
digitalWrite(RELAY, relayState);
}
}
}
void reconnect() {
// Loop นี้จะถูกเรียกใช้เมื่อเกิดการต่อเชื่อมล้มเหลวหรือตัดการเชื่อมต่อ
while (!client.connected()) {
Serial.print("Attempting MQTT connection... ");
if (client.connect("ESP32Client", mqtt_username, mqtt_password)) {
Serial.println("- Connected -");
client.subscribe(mqtt_topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, relayState);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the Wi-Fi network");
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
}
void loop() {
// ตรวจสอบการเชื่อมต่อ MQTT
if (!client.connected()) {
reconnect();
}
// รอรับข้อความจาก MQTT Broker
client.loop();
// อ่านค่าอุณหภูมิและความชื้นจาก DHT22 sensor
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
Serial.print("Temp : ");
Serial.print(temperature);
Serial.print("°C ");
Serial.print("Humd : ");
Serial.print(humidity);
Serial.println("%");
// สร้าง payload โดยรอรับคำสั่งจาก MQTT
String payload = "Temp : " + String(temperature) + "°C" + " Humd : " + String(humidity) + "%";
// ส่งค่าอุณหภูมิและความชื้นไปยัง MQTT Broker
client.publish(mqtt_topic, payload.c_str());
delay(3000);
// }
}