使用 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.3V 或 5V (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 設定
- 建立 Adafruit IO 帳戶:
- 訪問
並點擊 "Get Started for Free"。完成註冊流程。https://io.adafruit.com/
- 訪問
- 取得您的 AIO Key 和 AIO Username:
- 登入 Adafruit IO 帳戶。
- 點擊頁面上方導覽列的 "My Key" 按鈕(一個鑰匙圖標)。
- 您會看到您的 "Username" 和 "AIO Key"。請務必複製這兩組資訊,稍後在程式碼中會用到。
- 建立 Feed (數據源):
- 在 Adafruit IO 介面左側導覽欄,點擊 "Feeds"。
- 點擊 "Actions" -> "Create a New Feed"。
- 建立兩個新的 Feed:一個命名為
temperature,另一個命名為humidity。這些 Feed 將用於接收來自 ESP32 的數據。
4. Arduino IDE 環境設定
- 安裝 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"。
- 安裝 Adafruit IO 函式庫:
- 進入 "工具" -> "管理程式庫"。
- 搜尋 "Adafruit IO Arduino" 並安裝 "Adafruit IO Arduino" 函式庫。
- 安裝 DHT 感測器函式庫:
- 進入 "工具" -> "管理程式庫"。
- 搜尋 "DHT sensor library" 並安裝 "DHT sensor library by Adafruit"。
- 安裝 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 網站上進行設定,將您的 temperature 和 humidity Feed 連接到儀表板上的顯示元件。
以下是將數據顯示在 Adafruit IO Dashboard 上的步驟:
在 Adafruit IO Dashboard 上設定顯示
1. 登入 Adafruit IO 並進入 Dashboards 頁面
- 登入您的 Adafruit IO 帳號:
https://io.adafruit.com/ - 點擊左側導覽欄的 "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"。
- 選擇您的
temperatureFeed。 - 設定您想要的儀表範圍 (例如 0 到 50 攝氏度) 或圖表顯示的歷史數據範圍。
- 為該顯示元件設定一個標題 (例如 "當前溫度")。
- 點擊 "Create block"。
-
顯示濕度 (Gauge 儀表 或 Chart 圖表):
- 再次點擊 "Add block"。
- 選擇 "Gauge" (儀表) 或 "Line Chart" (線圖)。
- 在彈出的視窗中,點擊 "Choose feed"。
- 選擇您的
humidityFeed。 - 設定您想要的儀表範圍 (例如 0 到 100 濕度百分比) 或圖表顯示的歷史數據範圍。
- 為該顯示元件設定一個標題 (例如 "當前濕度")。
- 點擊 "Create block"。
-
-
您也可以嘗試添加 "Text" 或 "Number" 塊來直接顯示最新的數值。
4. 排列與調整 Dashboard
- 添加完區塊後,您可以拖曳它們來調整佈局。
- 點擊區塊右上角的齒輪圖標,可以編輯區塊的屬性,例如標題、顏色、大小等。















沒有留言:
張貼留言