2025年5月26日 星期一

[NodeMCU-32s] NodeMCU-32s DHT11 硬體接線 及 程式碼 (3/3)

硬體接線:

DHT11 VCC (電源)  ESP32 的 3.3V 腳位

DHT11 GND (接地) ESP32 的 GND 腳位

DHT11 DATA (數據) ESP32 的 GPIO 4 腳位


WIFI 環境準備:

準備 WIFI SSID及密碼


Arduino 程式碼:

#include <WiFi.h> // ESP32 的 Wi-Fi 函式庫

#include <Adafruit_MQTT.h> // Adafruit MQTT 函式庫

#include <Adafruit_MQTT_Client.h> // Adafruit MQTT 客戶端函式庫

#include "DHT.h" // DHT 溫濕度感測器函式庫


// --- Wi-Fi 設定 ---

#define WIFI_SSID "你的Wi-Fi名稱"      // <<<< 請替換為你的 Wi-Fi 名稱 >>>>

#define WIFI_PASSWORD "你的Wi-Fi密碼"  // <<<< 請替換為你的 Wi-Fi 密碼 >>>>


// --- Adafruit IO 設定 ---

#define AIO_SERVER      "io.adafruit.com" // Adafruit IO 伺服器地址

#define AIO_SERVERPORT  1883              // 標準 MQTT 埠

#define AIO_USERNAME    "你的Adafruit_IO_用戶名"  // <<<< 請替換為你的 Adafruit IO 用戶名 >>>>

#define AIO_KEY         "你的Adafruit_IO_AIO_金鑰"   // <<<< 請替換為你的 Adafruit IO AIO Key >>>>


// --- DHT11 感測器設定 ---

#define DHTPIN 4     // DHT 感測器數據腳位連接到 ESP32 的 GPIO 4

#define DHTTYPE DHT11 // 感測器類型 (如果是 DHT22 請改為 DHT22)

DHT dht(DHTPIN, DHTTYPE); // 初始化 DHT 感測器物件


// 設定 Wi-Fi 客戶端

WiFiClient client;


// 設定 Adafruit MQTT 客戶端

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);


// 設定 Adafruit IO Feed 物件

// 這些 Feed 名稱必須與你在 Adafruit IO 上建立的 Feed 名稱完全一致

Adafruit_MQTT_Publish temperatureFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

Adafruit_MQTT_Publish humidityFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humidity");


// 定義上傳時間間隔

const long uploadInterval = 30000; // 每 30 秒上傳一次數據 (單位: 毫秒)

unsigned long lastUploadTime = 0;


void connectWiFi() {

  Serial.print("連接到 Wi-Fi: ");

  Serial.println(WIFI_SSID);


  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);


  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }


  Serial.println("\nWi-Fi 已連接!");

  Serial.print("IP 位址: ");

  Serial.println(WiFi.localIP());

}


// 函數:連接到 Adafruit IO MQTT 伺服器

void connectMQTT() {

  int8_t ret; // 返回值


  // 嘗試連接 MQTT,直到成功

  while ((ret = mqtt.connect()) != 0) { // mqtt.connect() 返回 0 表示成功

    Serial.print(mqtt.connectErrorString(ret)); // 打印連接錯誤信息

    Serial.println("。重新嘗試 MQTT 連接...");

    mqtt.disconnect(); // 斷開現有連接

    delay(5000); // 等待 5 秒後重試

  }

  Serial.println("MQTT 已連接到 Adafruit IO!");

}


void setup() {

  Serial.begin(115200); // 設置序列埠鮑率為 115200

  delay(10);

  Serial.println("\n");


  dht.begin(); // 初始化 DHT 感測器


  connectWiFi(); // 連接 Wi-Fi

}


void loop() {

  // 確保 MQTT 連接已建立

  connectMQTT(); // 每次 loop 都檢查並確保連接


  // 檢查是否到了上傳時間

  if (millis() - lastUploadTime > uploadInterval) {

    Serial.println("讀取 DHT11 數據...");


    // 讀取濕度、溫度

    float h = dht.readHumidity();

    float t = dht.readTemperature();


    // 檢查讀取是否成功

    if (isnan(h) || isnan(t)) {

      Serial.println("讀取 DHT 感測器失敗!請檢查接線。");

      return; // 失敗則不進行上傳

    }


    Serial.print("溫度: ");

    Serial.print(t);

    Serial.print(" °C, 濕度: ");

    Serial.print(h);

    Serial.println(" %");


    // 將數據發佈到 Adafruit IO

    Serial.print("上傳溫度 ("); Serial.print(t); Serial.print(")... ");

    if (temperatureFeed.publish(t)) {

      Serial.println("成功!");

    } else {

      Serial.println("失敗!");

    }


    Serial.print("上傳濕度 ("); Serial.print(h); Serial.print(")... ");

    if (humidityFeed.publish(h)) {

      Serial.println("成功!");

    } else {

      Serial.println("失敗!");

    }

    

    lastUploadTime = millis(); // 更新上次上傳時間

  }


  // 保持 MQTT 客戶端活躍,處理收到的訊息 (如果有的話)

  mqtt.processPackets(100); // 處理 100ms 的 MQTT 數據包

  delay(1); // 短暫延遲

}


編譯上傳成功畫面:

Writing at 0x000e3972... (97 %)

Writing at 0x000e907e... (100 %)

Wrote 912288 bytes (588687 compressed) at 0x00010000 in 52.1 seconds (effective 140.2 kbit/s)...

Hash of data verified.

Leaving...

Hard resetting via RTS pin...

說明:

(1)紅字看似錯誤訊息,其實程式已上傳,並開始運作,我們可以從序列埠監控,可以看到上傳成功的設息,所以不用擔心。

(2)可以提供外接電源給開發板,這樣就可以源源不斷餵資料到 Afafruit網站。


序列埠監控畫面訊息:

MQTT 已連接到 Adafruit IO!

讀取 DHT11 數據...

溫度: 24.80 °C, 濕度: 72.00 %

上傳溫度 (24.80)... 成功!

上傳濕度 (72.00)... 成功!



沒有留言:

熱門文章