Easybuilder pro + WOKWI esp32 DHT22 控制 (MQTT)
EasyBuilder Pro 點位與暫存器對應說明
要在 HMI 畫面上正確顯示數值(如您上圖中的「數值顯示欄」與「表盤」):
MQTT 物件設定:
訂閱主題 1:
alex9ufo/temp$\rightarrow$ 映射至 LW-0(資料型態選擇 32-bit Float 或 16-bit 浮點數,視元件設定而定)訂閱主題 2:
alex9ufo/humi$\rightarrow$ 映射至 LW-2
畫面元件設定:
溫度數值欄 / 溫度儀表盤: 讀取位址設定為 LW-0,格式選擇 Float(浮點數),小數位數設為
2。濕度數值欄 / 濕度儀表盤: 讀取位址設定為 LW-2,格式選擇 Float(浮點數),小數位數設為
2。
這是在 Wokwi 模擬器中讀取 DHT22 溫濕度感測器 並透過 MQTT 發行數值給 EasyBuilder Pro(對應 LW-0 與 LW-2)的完整程式碼與電路圖 JSON。
為了確保 EasyBuilder Pro 的 MQTT 物件能順利解析數值,程式除了發行純數字字串外,也同時支援 EasyBuilder Pro 預設的 JSON 格式 {"value":[數值]} 發行。
1. ESP32 程式碼 (sketch.ino)
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// DHT22 設定
#define DHTPIN 15 // DHT22 Data 引腳連接至 ESP32 GPIO 15
#define DHTTYPE DHT22 // DHT22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
// WiFi 與 MQTT 設定
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com"; // 即 mqtt-dashboard.com
const int mqtt_port = 1883;
// MQTT 發行主題 (Publish Topics)
const char* topic_temp = "alex9ufo/temp";
const char* topic_humi = "alex9ufo/humi";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
const long interval = 10000; // 每 2 秒讀取並發行一次數據
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("[WiFi] Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("[WiFi] Connected successfully!");
Serial.print("[WiFi] IP Address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("[MQTT] Attempting connection to ");
Serial.print(mqtt_server);
Serial.print("...");
String clientId = "ESP32DHTClient-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println(" connected!");
} else {
Serial.print(" failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n========================================");
Serial.println(" ESP32 DHT22 MQTT Publisher ");
Serial.println("========================================");
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > interval) {
lastMsg = now;
// 讀取溫濕度
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 檢查是否讀取失敗
if (isnan(humidity) || isnan(temperature)) {
Serial.println("[DHT22 ERROR] Failed to read from DHT sensor!");
return;
}
// 格式 1:發送 JSON 格式以配合 EasyBuilder Pro 預設的 JSON 解析器
// 如 EBPro 設定 Parse JSON, 會自動解出 value 陣列寫入 LW-0 / LW-2
String tempJson = "{\"value\":[" + String(temperature, 2) + "]}";
String humiJson = "{\"value\":[" + String(humidity, 2) + "]}";
// 發行到 MQTT Broker
client.publish(topic_temp, tempJson.c_str());
client.publish(topic_humi, humiJson.c_str());
// 印出至 Serial Monitor
Serial.println("----------------------------------------");
Serial.print("[DHT22 Read] Temp: ");
Serial.print(temperature, 2);
Serial.print(" °C | Humi: ");
Serial.print(humidity, 2);
Serial.println(" %");
Serial.print("[MQTT TX] ");
Serial.print(topic_temp);
Serial.print(" -> ");
Serial.println(tempJson);
Serial.print("[MQTT TX] ");
Serial.print(topic_humi);
Serial.print(" -> ");
Serial.println(humiJson);
Serial.println("----------------------------------------");
}
}












沒有留言:
張貼留言