2025年6月13日 星期五

使用 esp32 dht22 將溫度 濕度 發布於 Adafruit IO上

 使用 esp32 +dht22 將溫度 濕度 發布於 Adafruit IO上









要使用 ESP32 和 DHT22 感測器將溫度和濕度數據發佈到 Adafruit IO,您需要使用 Adafruit 的官方函式庫。這個過程涉及 Wi-Fi 連線、DHT22 讀取以及將數據透過 MQTT 傳輸到 Adafruit IO。


準備工作

1. 硬體準備

  • ESP32 開發板: 任何 ESP32 型號都可以。
  • DHT22 溫度濕度感測器: 如果是模組化的 DHT22,通常有 VCC、GND、Data 三條線。如果不是模組化,則需要額外一個 10K 歐姆的拉高電阻 (pull-up resistor) 接在 Data 腳位和 VCC 之間。
  • 麵包板杜邦線
  • USB 傳輸線

2. 接線圖 (Wiring Diagram)

  • DHT22 VCC (或 +): 連接到 ESP32 的 3.3V5V (DHT22 通常支持 3.3V-5V,但 ESP32 的 GPIO 是 3.3V)。
  • DHT22 Data (或 Out): 連接到 ESP32 的一個 GPIO pin,例如 GPIO4 (程式碼中會使用此腳位)。
    • 重要:如果是非模組化的 DHT22,請務必在 Data pin 和 VCC 之間串接一個 10K 歐姆的拉高電阻
  • DHT22 GND (或 -): 連接到 ESP32 的 GND

3. Adafruit IO 設定

  1. 建立 Adafruit IO 帳戶:
  2. 取得您的 AIO Key 和 AIO Username:
    • 登入 Adafruit IO 帳戶。
    • 點擊頁面上方導覽列的 "My Key" 按鈕(一個鑰匙圖標)。
    • 您會看到您的 "Username""AIO Key"。請務必複製這兩組資訊,稍後在程式碼中會用到。
  3. 建立 Feed (數據源):
    • 在 Adafruit IO 介面左側導覽欄,點擊 "Feeds"
    • 點擊 "Actions" -> "Create a New Feed"
    • 建立兩個新的 Feed:一個命名為 temperature,另一個命名為 humidity。這些 Feed 將用於接收來自 ESP32 的數據。

4. Arduino IDE 環境設定

  1. 安裝 ESP32 Boards: (如果已經安裝過,可跳過)
    • 開啟 Arduino IDE。
    • 進入 "檔案" -> "偏好設定"。
    • 在 "額外的開發板管理員網址" (Additional Boards Manager URLs) 中加入:https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    • 進入 "工具" -> "開發板" -> "開發板管理員"。
    • 搜尋 "esp32" 並安裝 "esp32 by Espressif Systems"。
  2. 安裝 Adafruit IO 函式庫:
    • 進入 "工具" -> "管理程式庫"。
    • 搜尋 "Adafruit IO Arduino" 並安裝 "Adafruit IO Arduino" 函式庫。
  3. 安裝 DHT 感測器函式庫:
    • 進入 "工具" -> "管理程式庫"。
    • 搜尋 "DHT sensor library" 並安裝 "DHT sensor library by Adafruit"
  4. 安裝 Adafruit Unified Sensor 函式庫: (這是 DHT 函式庫的依賴項)
    • 進入 "工具" -> "管理程式庫"。
    • 搜尋 "Adafruit Unified Sensor" 並安裝 "Adafruit Unified Sensor by Adafruit"

ESP32 Arduino 程式碼

#include <WiFi.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <DHT.h>
#include <Adafruit_Sensor.h>

/********************************** Constants **********************************/

#define WLAN_SSID       "Wokwi-GUEST"      // 替換成您的 Wi-Fi 名稱
#define WLAN_PASS       ""                 // 替換成您的 Wi-Fi 密碼

#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883                   // 使用標準 MQTT 端口
#define AIO_USERNAME    "alex9ufo"    // 替換成您的 Adafruit IO Username
#define AIO_KEY         "6d20e3a15993844863ac4dc15a7495756d9b"         // 替換成您的 Adafruit IO Key

// DHT22 感測器設定
#define DHTPIN 4        // DHT22 連接的 ESP32 GPIO Pin (例如 GPIO4)
#define DHTTYPE DHT22   // 或 DHT11

// 發佈數據的頻率 (毫秒)
#define PUBLISH_INTERVAL 10000 // 每 10 秒發佈一次

/********************************** Global Variables **********************************/

// 創建一個 WiFiClient 物件,用於 Wi-Fi 連線
WiFiClient client;

// 創建一個 Adafruit_MQTT_Client 物件,用於 MQTT 通訊
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

// 創建 Adafruit IO Feed 物件
// 語法: Adafruit_MQTT_Publish(MQTT_Client, "AIO_USERNAME/feeds/FEED_NAME");
Adafruit_MQTT_Publish temperatureFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/Temperature");
Adafruit_MQTT_Publish humidityFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/Humidity");

// 創建 DHT 感測器物件
DHT dht(DHTPIN, DHTTYPE);

unsigned long lastPublishTime = 0; // 用於控制發佈頻率的時間戳記

/********************************** Functions **********************************/

// 連接到 Adafruit IO MQTT Broker 的函數
void MQTT_connect() {
  int8_t ret;

  // 如果 MQTT 已經連線,則直接返回
  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to Adafruit IO MQTT... ");

  // 嘗試連線。只要連線不成功 (返回非 0),就重試
  while ((ret = mqtt.connect()) != 0) {
    Serial.println(mqtt.connectErrorString(ret)); // 打印錯誤信息
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect(); // 斷開當前連線
    delay(5000);       // 等待 5 秒後重試
  }
  Serial.println("Adafruit IO MQTT Connected!");
}

/********************************** Setup **********************************/

void setup() {
  Serial.begin(115200);
  delay(100);

  Serial.print("Connecting to WiFi: ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" WiFi Connected!");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // 初始化 DHT 感測器
  dht.begin();
  Serial.println("DHT sensor initialized.");
}

/********************************** Loop **********************************/

void loop() {
  // 確保 MQTT 連線保持活躍
  MQTT_connect();

  // 檢查是否到了發佈數據的時間
  unsigned long currentMillis = millis();
  if (currentMillis - lastPublishTime >= PUBLISH_INTERVAL) {
    lastPublishTime = currentMillis; // 更新上次發佈時間

    // 讀取 DHT22 感測器數據
    float h = dht.readHumidity();
    float t = dht.readTemperature(); // 讀取攝氏溫度

    // 檢查是否有讀取錯誤
    if (isnan(h) || isnan(t)) {
      Serial.println(F("Failed to read from DHT sensor!"));
      return; // 讀取失敗則不發送數據
    }

    // 將讀取到的溫濕度數據列印到序列埠監控器
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");

    // 將溫度發佈到 Adafruit IO 的 temperature feed
    if (temperatureFeed.publish(t)) {
      Serial.println("Temperature published successfully!");
    } else {
      Serial.println("Failed to publish temperature.");
    }

    // 將濕度發佈到 Adafruit IO 的 humidity feed
    if (humidityFeed.publish(h)) {
      Serial.println("Humidity published successfully!");
    } else {
      Serial.println("Failed to publish humidity.");
    }
  }

  // MQTT 函式庫的循環處理,必須定期呼叫以維持連線和處理訊息
  mqtt.processPackets(100); // 處理數據包,等待 100ms
  mqtt.ping();             // 定期發送 ping 以保持連線活躍
}

為了讓您的 ESP32 + DHT22 數據顯示在 Adafruit IO 的 Dashboard (儀表板) 上,您不需要修改程式碼本身。程式碼的功能是將數據發送到 Adafruit IO 的 Feeds (數據源)

Dashboard 是一個視覺化的介面,它從您的 Feeds 中提取數據並以圖表、儀表、文字等形式呈現。您需要做的是在 Adafruit IO 網站上進行設定,將您的 temperaturehumidity Feed 連接到儀表板上的顯示元件。

以下是將數據顯示在 Adafruit IO Dashboard 上的步驟:


在 Adafruit IO Dashboard 上設定顯示

1. 登入 Adafruit IO 並進入 Dashboards 頁面


2. 建立一個新的 Dashboard (如果還沒有的話)

  • 點擊右側的 "Actions" 按鈕,然後選擇 "Create a New Dashboard"
  • 為您的 Dashboard 命名,例如 My_ESP32_Dashboard,然後點擊 "Create"
  • 如果您已經有現有的 Dashboard,可以直接點擊進入。

3. 將數據 Feed 添加到 Dashboard

進入您剛建立或選擇的 Dashboard 後:

  • 點擊 Dashboard 右上角的藍色 "Add block" 按鈕。

  • 您會看到各種可以添加的顯示元件。根據您的需求選擇:

    • 顯示溫度 (Gauge 儀表 或 Chart 圖表)

      • 選擇 "Gauge" (儀表)"Line Chart" (線圖)
      • 在彈出的視窗中,點擊 "Choose feed"
      • 選擇您的 temperature Feed。
      • 設定您想要的儀表範圍 (例如 0 到 50 攝氏度) 或圖表顯示的歷史數據範圍。
      • 為該顯示元件設定一個標題 (例如 "當前溫度")。
      • 點擊 "Create block"
    • 顯示濕度 (Gauge 儀表 或 Chart 圖表)

      • 再次點擊 "Add block"
      • 選擇 "Gauge" (儀表)"Line Chart" (線圖)
      • 在彈出的視窗中,點擊 "Choose feed"
      • 選擇您的 humidity Feed。
      • 設定您想要的儀表範圍 (例如 0 到 100 濕度百分比) 或圖表顯示的歷史數據範圍。
      • 為該顯示元件設定一個標題 (例如 "當前濕度")。
      • 點擊 "Create block"
  • 您也可以嘗試添加 "Text""Number" 塊來直接顯示最新的數值。


4. 排列與調整 Dashboard

  • 添加完區塊後,您可以拖曳它們來調整佈局。
  • 點擊區塊右上角的齒輪圖標,可以編輯區塊的屬性,例如標題、顏色、大小等。











沒有留言:

張貼留言

ESP32 (ESP-IDF in VS Code) MFRC522 + MQTT + PYTHON TKinter +SQLite

 ESP32 (ESP-IDF in VS Code) MFRC522 + MQTT + PYTHON TKinter +SQLite  ESP32 VS Code 程式 ; PlatformIO Project Configuration File ; ;   Build op...