(暫時未有能力直接控制恆溫裝置,但可以提醒再手動開關)
又尋找手頭上有沒有一些零件工具能做到目標效果……
若果閣下購買 Arduino Starter Kit ,套件中包含一件 DHT模組
若果閣下購買 Arduino Sensor Kit ,套件中包含一件 KY-015版本DHT模組
Arduino Starter Kit 的 DHT模組 會比較長窄,Arduino Sensor Kit 的 KY-015版本DHT模組 則比較短闊
DHT 全名是 Digital Humidity and Temperature Sensor 是一種數碼濕度及溫度感應器
感應誤差 濕度大約5%正負差 及 溫度大約3度正負差
感應器外觀
DHT模組 側面
DHT模組 背面
背面有引腳通孔,有需要可以焊接額外引腳連接
KY-015版本DHT模組 側面
KY-015版本DHT模組 背面
(KY-015 製作比較參差)
DHT模組 正面, 3支引腳由左至右分別為
- 電源引腳 (+)
- 訊號引腳 (out)
- 接地引腳 (-)
KY-015版本DHT模組 正面, 3支引腳由左至右分別為
- 訊號引腳 (S)
- 電源引腳
- 接地引腳 (-)
DHT模組 及 KY-015版本DHT模組 並排比較
雖然兩種模組的引腳排列有些微分別,但操作上是相同
原本的 DHT 實際有 4支引腳,由左至右分別為
- 電源引腳
- 訊號引腳
- 無效引腳
- 接地引腳
引腳用途
編號 | 引腳 | 方向 | 用途 |
---|---|---|---|
1 | 電源 | 接受 2.0V 至 5.5V | |
2 | 訊號 | 輸入/輸出 | 發送指令訊號週期 及 接收資料訊號週期 |
3 | 無效 | 沒有電子功用,輔助零件穩定地安裝在電路板上 | |
4 | 接地 |
接駁方法
Arduino 接駁 DHT 的方法
Arduino 實際接駁 DHT 線路
Arduino 實際接駁 KY-015版本DHT 線路
又是在下的懶惰接駁方法,直接將 DHT 引腳接駁到 Arduino 引腳
其中一支引腳為電源引腳、另一支引腳為接地引腳、最後一支引腳為訊號引腳
在下將 2個 DHT 都接駁到 Arduino
訊號資料
由於 DHT 只使用一支訊號引腳 發送指令訊號 及 接收資料訊號引腳 | 發送指令訊號週期 | ACL | 接收資料訊號週期 | 完成 | ||
---|---|---|---|---|---|---|
延遲 | 20毫秒 | 40微秒 | 不固定時間,但不少於40微秒 | 2秒 | ||
SIG | 低 | 高 | 低 | 高 | 高或低 |
訊號波紋時序圖
引腳 | ACL | 接收位元訊號週期 (共5次) | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
第7 | 第6 | 第5 | 第4 | 第3 | 第2 | 第1 | 第0 | |||||||||||
延遲 | 不固定時間,但不少於40微秒 | |||||||||||||||||
SIG | 低 | 高 | 低 | 高 | 低 | 高 | 低 | 高 | 低 | 高 | 低 | 高 | 低 | 高 | 低 | 高 | 低 | 高 |
訊號波紋時序圖
- 設定 SIG引腳 為 輸出,以 發送指令訊號
- SIG引腳 發出低電壓訊號
- 延遲 20毫秒
- SIG引腳 發出高電壓訊號
- 延遲 40微秒
- 設定 SIG引腳 為 輸入,以 接收資料訊號
- ACL
- 等待低電壓訊號完結
- 等待高電壓訊號完結
- 接收 5次 資料訊號週期
- 接收 8次 位元 (1位元組) 訊號
- 偵測是否低電壓訊號
- 偵測是否高電壓訊號
- 如果低電壓訊號與高電壓訊號超過 40微秒,讀取位元資料 (由 最高有效位 (MSB) 開始)
- 接收 8次 位元 (1位元組) 訊號
- ACL
- 延遲 2秒
資料說明
DHT 傳回的的 5組 8位元 資料分別是- 濕度 (整數位值)
- 濕度 (小數位值)
- 溫度 (整數位值)
- 溫度 (小數位值)
- 校對總和 ,前4組數值的總和 並只取 前8位元資料
測試程式
在下的測試程式byte SIG_PIN = 2; byte data[5]; void setup() { Serial.begin(115200); } void loop() { updateDHT(); if (((data[0] + data[1] + data[2] + data[3]) & 0xFF) == data[4]) { Serial.println(); Serial.print("Humidity (%): "); Serial.print(data[0]); Serial.print("."); Serial.print(data[1]); Serial.println(); Serial.print("Temperature (C): "); Serial.print(data[2]); Serial.print("."); Serial.print(data[3]); Serial.println(); } } void updateDHT() { pinMode(SIG_PIN, OUTPUT); digitalWrite(SIG_PIN, LOW); delay(20); digitalWrite(SIG_PIN, HIGH); delayMicroseconds(40); pinMode(SIG_PIN, INPUT); wait(LOW); wait(HIGH); const byte LENGTH = sizeof(data) / sizeof(byte); for (byte i = 0; i < LENGTH; i++) { data[i] = readData(); } delay(2000); } byte readData() { byte data = 0; for (byte i = 0x80; i > 0; i >>= 1) { wait(LOW); unsigned long microseconds = micros(); wait(HIGH); if ((micros() - microseconds) > 40) { data |= i; } } return data; } void wait(byte signal) { unsigned int retry = 0xFFFF; while (digitalRead(SIG_PIN) == signal) { if (retry-- == 0) { return; } } }
總結
濕度及溫度感應器操作上算是比較麻煩由於只使用一支訊號引腳,需要不斷切換 輸入模式 及 輸出模式 來 發送指令訊號 及 接收資料訊號
而且還需要等待 接收資料訊號 的電壓狀態 來辨識資料訊號,比過往的元件不同
雖然向 DHT 發送指令號訊 操作的延遲時間會固定,但 接收資料資訊 卻不固定
由於讀取訊號的時間並不固定,因此需要使用 迴圈 (Loop) 不斷嘗試偵測訊號變化
在下將濕度及溫度感應器製作成函式庫方便使用
可以到 https://create.arduino.cc/editor/hkgoldenmra/fda824d2-a842-4757-9dc9-9bb68578bf1d/preview
或 https://bitbucket.org/hkgoldenmra/dhtmodule
或在 Terminal 輸入
git clone "https://bitbucket.org/hkgoldenmra/dhtmodule.git" --depth=1下載
沒有留言 :
張貼留言