硬體接線:
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)... 成功!
沒有留言:
張貼留言