2025年2月28日 星期五

作業1 MQTT (Relay + DHT22) 控制 ------- 利用MQTT BOX (PC上) MyMQTT (手機上APP)

作業1 MQTT (Relay + DHT22) 控制  ------- 利用MQTT BOX (PC上)   MyMQTT (手機上APP) 


1)系統圖








2) 利用gmail註冊





3) 開新專案




4) 建立電路圖






5 ) 程式與電路圖相關資料

繼電器Relay 接腳

#define Relay1            15     //D15 LED-Orangs = Water-1
#define Relay2            2      //D2   LED-Blue  = Water-2
#define Relay3            19     //D19  LED-Blue   = Motor
#define Relay4            23     //D23  LED-RED    = Fan

DHT22 溫溼度Sensor 接腳
#define DHTPIN 12

WIFI 帳號密碼

#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""

MQTT Broker伺服器

// #define MQTT_HOST "test.mosquitto.org"
#define MQTT_HOST "broker.mqttgo.io"
#define MQTT_PORT 1883




NMKing夜市小霸王

夜市小霸王 輕鬆入門級IoT物聯網應用教學



https://broker.mqttgo.io/


或是另一種 伺服器

#define MQTT_HOST "test.mosquitto.org"
//#define MQTT_HOST "broker.mqttgo.io"
#define MQTT_PORT 1883



6) WOKWI程式如下

下面程式使用broker.mqttgo.io


#include <WiFi.h>
#include <MQTTPubSubClient.h>
#include <Adafruit_Sensor.h>
#include <DHT_U.h>
extern "C" {
  #include "freertos/FreeRTOS.h"
  #include "freertos/timers.h"
}

#define Relay4            15     //D15 LED-Orangs = Water-1
#define Relay3            2      //D2   LED-Blue  = Water-2
#define Relay2            19     //D19  LED-Blue   = Motor
#define Relay1            23     //D23  LED-RED    = Fan

#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""

//#define MQTT_HOST "test.mosquitto.org"
#define MQTT_HOST "broker.mqttgo.io"
#define MQTT_PORT 1883

#define DHTPIN 12
// DHT parameters
#define DHTTYPE    DHT22     // DHT 12
DHT_Unified dht(DHTPIN, DHTTYPE);

WiFiClient client;
MQTTPubSubClient mqtt;
int count;
float temp, hum;
bool Send= false;
String json="";
//=============================================================================
void connect() {
  connect_to_wifi:
    Serial.print("connecting to wifi...");
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(1000);
    }
    Serial.println(" connected!");

  connect_to_host:
    Serial.print("connecting to host...");
    client.stop();
    while (!client.connect(MQTT_HOST, 1883)) {
        Serial.print(".");
        delay(1000);
        if (WiFi.status() != WL_CONNECTED) {
            Serial.println("WiFi disconnected");
            goto connect_to_wifi;
        }
    }
    Serial.println(" connected!");

    Serial.print("connecting to mqtt broker...");
    mqtt.disconnect();
    while (!mqtt.connect("arduino", "", "")) {
        Serial.print(".");
        delay(1000);
        if (WiFi.status() != WL_CONNECTED) {
            Serial.println("WiFi disconnected");
            goto connect_to_wifi;
        }
        if (client.connected() != 1) {
            Serial.println("WiFiClient disconnected");
            goto connect_to_host;
        }
    }
    Serial.println(" connected!");
}
//=============================================================================
void  Publish_message() {
  if (Send){
    mqtt.publish("alex9ufo/esp32/led/status", json);

    Serial.println();  
    Serial.print("publish message to MQTT ---");
    Serial.println(json);
   
    Send= false;
    json="";
  }
}
//=============================================================================
void setup() {
    pinMode(Relay1, OUTPUT);
    pinMode(Relay2, OUTPUT);
    pinMode(Relay3, OUTPUT);
    pinMode(Relay4, OUTPUT);

    Serial.begin(115200);
    dht.begin();
    // Get temperature sensor details.
    sensor_t sensor;
    dht.temperature().getSensor(&sensor);
    dht.humidity().getSensor(&sensor);
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD, 6);
    mqtt.begin(client);
    connect();

    mqtt.subscribe([](const String& topic, const String& payload, const size_t size) {
        Serial.println("mqtt received: " + topic + " - " + payload);
    });

    mqtt.subscribe("alex9ufo/esp32/led/control", [] (const String& payload, const size_t size) {
        Serial.print("alex9ufo/esp32/led/control");
        Serial.println(payload);
       
        String message=payload;
        message.trim();
        Serial.print(message);
        if ( message == "1on" ) {
            digitalWrite(Relay1, HIGH);  // Turn on the LED
            Send = true;
            json="Relay1on";

        }
        if ( message == "1off" ) {
            digitalWrite(Relay1, LOW);  // Turn off the LED
            Send = true;
            json="Relay1off";
        }    
        if ( message == "2on" ) {
            digitalWrite(Relay2, HIGH);  // Turn on the LED
            Send = true;
            json="Relay2on";  
        }
        if ( message == "2off" ) {
            digitalWrite(Relay2, LOW);  // Turn off the LED
            Send = true;
            json="Relay2off";
        }  
        if ( message == "3on" ) {
            digitalWrite(Relay3, HIGH);  // Turn on the LED
            Send = true;
            json="Relay3on";
        }
        if ( message == "3off" ) {
            digitalWrite(Relay3, LOW);  // Turn off the LED
            Send = true;
            json="Relay3off";
        }    
        if ( message == "4on" ) {
            digitalWrite(Relay4, HIGH);  // Turn on the LED
            Send = true;
            json="Relay4on";
        }
        if ( message == "4off" ) {
            digitalWrite(Relay4, LOW);  // Turn off the LED
            Send = true;
            json="Relay4off";
        }
    });
}
//=============================================================================
void loop() {
    mqtt.update();
    Publish_message();

    if (!mqtt.isConnected()) {
        connect();
    }

    // publish message
    static uint32_t prev_ms = millis();
    if (millis() > prev_ms + 2500) {
        prev_ms = millis();
        sensors_event_t event;
      dht.temperature().getEvent(&event);
      if (isnan(event.temperature)) {
          Serial.println(F("Error reading temperature!"));
      }
      else {
        Serial.print(F("Temperature: "));
        temp = event.temperature;
        Serial.print(temp);
        Serial.println(F("°C"));
      }
      // Get humidity event and print its value
      dht.humidity().getEvent(&event);
      if (isnan(event.relative_humidity)) {
        Serial.println(F("Error reading humidity!"));
      }
      else {
        Serial.print(F("Humidity: "));
        hum = event.relative_humidity;
        Serial.print(hum);
        Serial.println(F("%"));
      }
      String msgStr = String(temp) + "," + String(hum) ;

      //mqtt.publish("alex9ufo/esp32/dht/temp", String(temp));
      //delay(100);
      //mqtt.publish("alex9ufo/esp32/dht/humi", String(hum));
      delay(100);  
      mqtt.publish("alex9ufo/esp32/dht/temphumi", msgStr);
    }
}


7) 添加 Library Manager




8) MQTT BOX設定 畫面

下載MQTT BOX


BROKER有test.mosquitto.org 或broker.mqttgo.io

依照 程式的定義
MQTT_HOST "test.mosquitto.org"
MQTT_HOST "broker.mqttgo.io"

主題TOPIC有3種
(對WOKWI程式 訂閱Subscribe 則 對MQTT BOX (My MQTT) 就是發行Publish )

 

MQTT BOX

WOKWI

1主題

alex9ufo/esp32/led/control

發行

alex9ufo/esp32/led/control

訂閱

  訊息

1on,1off,2on,2off,3on,3off,4on,4off

 

 

 

2主題

alex9ufo/esp32/led/status

訂閱

alex9ufo/esp32/led/status

發行

 

 

訊息

Realy1on, Relay1off, Realy2on, Relay2off, Realy3on, Relay3off, Realy4on, Relay4off,

 

3主題

alex9ufo/esp32/dht/temphumi

訂閱

alex9ufo/esp32/dht/temphumi

發行

 

 

訊息

溫度,濕度 (24.0,40.5)

 




alex9ufo/esp32/led/control
        1on , 1off , 2on , 2off, 3on ,3off ,4on ,4off, allon ,alloff

alex9ufo/esp32/led/status
        接收WOKWI ESP32 LED回傳狀態

alex9ufo/esp32/dht/temphumi
        接收WOKWI ESP32 DHT22回傳狀態   
 


下面的HOST

broker.mqttgo.io:1883

依據 WOKWI程式 也可以修改成

test.mosquitto.org:1883





9) 將WOKWI 組譯 (可能需要組譯 多次  因為免費)




10) 調整DHT22 溫度 濕度




11) 測試結果  使用 "test.mosquitto.org" 伺服器




MQTT BOX + WOKWI 畫面







12) MyMQTT 的設定與畫面

 

 

 

 

 

 

或修改成

test.mosquitto.org


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



13) 錄製影片並上傳至YT
  1. 按 Windows鍵+Alt+R 開始錄製剪輯。 在 「聽訊」中,您聽到:「錄製進行中」。 

  2. 若要在錄製期間開啟或關閉麥克風,請按 Windows鍵+Alt+M。

沒有留言:

張貼留言

作業2 MQTT (Relay + DHT22) 控制 ------- 利用Node-Red

作業2 MQTT (Relay + DHT22) 控制 ------- 利用Node-Red 1) 安裝Node-Red  https://ithelp.ithome.com.tw/articles/10201795 https://www.youtube.com/watch?v...