2026年9月12日 星期六

Easybuilder pro + WOKWI esp32 DHT22 控制 (MQTT)

Easybuilder pro + WOKWI esp32 DHT22 控制  (MQTT)




EasyBuilder Pro 點位與暫存器對應說明

要在 HMI 畫面上正確顯示數值(如您上圖中的「數值顯示欄」與「表盤」):

  1. MQTT 物件設定:

    • 訂閱主題 1: alex9ufo/temp $\rightarrow$ 映射至 LW-0(資料型態選擇 32-bit Float 或 16-bit 浮點數,視元件設定而定)

    • 訂閱主題 2: alex9ufo/humi $\rightarrow$ 映射至 LW-2

  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("----------------------------------------");
  }
}

沒有留言:

張貼留言

ESP32 門禁感應端 與 電腦管理中控端 透過 MQTT 通訊協定 所架構出的 遠端智慧門禁與 Telegram 雙向控制系統 (2)

ESP32 門禁感應端 與 電腦管理中控端 透過 MQTT 通訊協定 所架構出的 遠端智慧門禁與 Telegram 雙向控制系統 (2) 優化 Telegram 警報訊息,最直觀且便利的方式是利用 Telegram 的 Inline Code ( 單行程式碼塊 ) 語法。 ...