學習目標
- ✓比較 DHT11 與 DHT22 的使用情境。
- ✓使用桃園版 Blockly 的 DHT22 溫度與濕度積木。
- ✓以合理的更新週期建立環境資料記錄。
SENSOR / PLAYROBOTDHT22
DHT22 同樣以數位封包回傳溫度與相對濕度,但量測範圍與精度通常比 DHT11 更適合做環境觀察。它仍然需要至少約 2 秒的讀取間隔。
先確認這一課要學會什麼,以及桌面上需要哪些材料。
DHT22 以熱敏電阻與電容式濕度元件量測環境,再將數位結果送出;較寬的規格範圍不代表可以更快讀取。
設定 DATA 腳位與 DHT22 型號。
分別取得攝氏溫度與相對濕度。
遵守模組更新速度,避免資料無效。
DHT22 常見建議每 2 秒讀取一次;實際仍以所用模組與函式庫說明為準。
DHT22 的資料線、電源與地線接法與 DHT11 類似,但程式與 Blockly 必須選 DHT22 型號。
| 模組腳位 | 接到控制板 | 訊號方向 | 檢查重點 |
|---|---|---|---|
| VCC | 5V | 電源 | 依模組標示供電。 |
| DATA | D2 | 單線數位資料 | 對應 playrobot_dht22 積木的 PIN。 |
| GND | GND | 地線 | 與 Arduino 共地。 |
已將 3 條線路依同一筆資料逐列對齊;電壓仍須依手上模組版本確認。
積木名稱與型別以桃園版 Blockly 現行程式為準,不以通用積木替代。
playrobot_dht22_temperature取得攝氏溫度
位置:感測器 → 環境感測器 → 溫度/濕度(DHT22)playrobot_dht22_humidity取得相對濕度
位置:感測器 → 環境感測器 → 溫度/濕度(DHT22)serial_println記錄長時間環境資料
位置:輸出controls_delay遵守 DHT22 更新間隔
位置:控制每 2 秒讀取一次 DHT22,累積窗邊與室內不同位置的資料。
arduino_delaysensor_blocksensor_blockserial_printlncontrols_delayarduino_delaysensor_blocksensor_blockserial_printlncontrols_delay在積木與下載程式中都使用 DHT22。
為什麼:DHT library 需要知道感測器型號。不要用 100 ms 的快速迴圈讀取。
為什麼:過快讀取會造成錯誤或重複的資料。讓感測器在每個位置放置相同時間再記錄。
為什麼:避免剛移動造成的暫態影響比較結果。playrobot_dht22_temperature:取得攝氏溫度
下載桃園版 Blockly 專案或對應的文字程式。
| 測試情境 | 可能讀值 | 判讀 |
|---|---|---|
| 感測器移到窗邊 | 溫度或濕度與室內不同 | 位置與氣流會改變微環境。 |
| 讀取間隔太短 | 出現無效或重複資料 | DHT22 的更新速度有限。 |
這段程式把「溫濕度感測器(DHT22)」的實體接線、桃園版 Blockly 積木與 Arduino 執行流程接在一起。先對照腳位,再看初始化、讀值、輸出與等待的順序;每一步都可以回到本頁的積木範例實測。
#include <DHT.h>
const int DHT_PIN = 2;
DHT dht(DHT_PIN, DHT22);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (!isnan(temperature) && !isnan(humidity)) {
Serial.print(temperature);
Serial.print(" C, ");
Serial.print(humidity);
Serial.println(" %");
}
delay(2000);
}#include <DHT.h>函式庫提供桃園版 Blockly 產生器所需的底層功能;若這裡的函式庫或物件名稱不對,後面的 playrobot_dht22_temperature 就算接線正確也無法使用。
const int DHT_PIN = 2;本頁接線是 VCC → 5V、DATA → D2、GND → GND。程式常數、積木欄位與實體線材必須使用同一組設定;若改了其中一邊,另外兩邊也要一起改。
void setup() {啟動序列埠、I²C/UART 或感測器初始化通常只需要做一次,所以要放在「初始化」區,不要每一圈重複建立裝置。這也對應範例中的啟動積木。
void loop() {重複執行區先讓感測器更新,再讀取 DHT22 溫度(°C)。若元件有 data ready、可用性或逾時條件,先判斷狀態再使用數值,避免把無效資料當成真實測量。
if (!isnan(temperature) && !isnan(humidity)) {先把原始值、單位或狀態送到序列埠,才能和預期結果比較;等待時間則決定更新速度。若看到亂碼,先檢查鮑率;若數值跳動,先增加合理的取樣間隔或做校正。
先從「電源、接線、腳位、物體」四個方向檢查,再修改程式。
先檢查:確認 DHT22 型號、DATA 腳位與間隔。
處理方式:選用 DHT22、檢查 D2 接線,並等待至少 2 秒。
先檢查:確認感測器是否被外殼或手遮住。
處理方式:讓感測器暴露在空氣中,並等待數個更新週期。
先檢查:比較模組規格、位置與校正狀態。
處理方式:在同一位置同時記錄,再討論誤差而非直接判斷誰正確。
從顯示數值,逐步走向條件判斷、燈號回饋與雷達專題。
題目:每 2 秒記錄一筆,觀察 5 分鐘。
這題要延伸「DHT22 溫度(°C)」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
題目:濕度高於設定值時啟動風扇或 LED。
這題要延伸「DHT22 溫度(°C)」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。把結果接到題目指定的輸出元件。
題目:在同一位置同步量測,分析範圍、更新速度與差異。
這題要延伸「DHT22 溫度(°C)」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
比較 DHT11 與 DHT22 的溫濕度範圍、精度與更新速度。
補充函式庫、讀取間隔與錯誤處理。
對照 playrobot_dht22_temperature 與 humidity 積木。