DHT-11 使用 DATA 接腳與處理器之間做通訊與同步,採用串行單線數據格式,一次通訊時間在 4ms 左右,數據分為整數與小數部分,一次完整數據輸出為 40-bit,高位元先輸出:
數據格式:8-bit 濕度整數數據 + 8-bit 濕度小數數據 +
8-bit 溫度整數數據 + 8-bit 溫度小數數據 + 8-bit 檢驗和
檢驗和是溫濕度整數與小數四個數據相加之後取末 8 位元數據資料,至於詳細的通訊過程請參閱 "DHT11溫濕度感測器說明書" 的說明。
下面的例子將使用 Raspberry Pi (樹莓派) 與 DHT-11 作通訊取得溫濕度數據,並將數據顯示在 LCD上。
首先,我們延用部落格網頁 "驅動 16x2 LCD 螢幕 (英文文字型)" 的線路,並增加 DHT-11 於線路中;DHT-11 使用 3.3V 電源供應,資料通訊使用樹莓派 GPIO P1 第 10 支 pin 腳 (也就是 RxD, #15) 連接 DHT-11 DATA 接腳。
ps. #15 表示是 BCM2835 GPIO 15 的意思
材料列表:
- Raspberry Pi (Model B, Rev2.0 (512MB))
- 特製 GPIO 彩色排線
- 雙頭長排針 ( GPIO 排線用)
- 麵包板連接測試跳線(公對公)
- DHT11 - 溫濕度感測器 (附電阻)
- 英文字型 LCD 螢幕 (附排針與可變電阻, 16x2,藍底白字, LED 背光)
- 麵包板
線路牽線:
將材料依照下面線路圖佈線,或是參考實際接線圖照片
LCD 螢幕與 DHT-11 溫濕度感測器連接線路圖 ( 2013/01/04 更正 Vss 與 Vdd 連接線路 [ 網友 TaKa 提出更正訊息] ) |
注意到上面的樹莓派板子上方的圖片,這圖片是代表板子上 26-pin 的GPIO 在 Model B Rev 2.0 所代表的 IO 號碼與其他功能代碼 (原圖示上面的代碼是 Rev 1.0 的),Rev2.0上的 26-pin GPIO (稱為 P1) 各接腳線都是完全被定義的,沒有 NC (No Connection)。
source: raspberrypi.org, Raspberry Pi Model B Rev2.0 GPIO-P1 |
詳細的電路可以到 "Raspberry Pi (樹莓派) Model B Rev2.0 電路圖" 網頁中找需要的版本別下載電路圖。
依照線路圖實際的佈線,預留GPIO P1 排線位置 |
插上GPIO P1 排線後 |
程式:
要讀取 DHT-11 溫濕度感測器的資料,我們可使用 C 語言來做讀取,因為 DHT-11 需要非常快的時序處理,Python 不適用但可做為將處理後的溫濕度資料顯示在 LCD 上。
進入 Home 目錄再下載所有程式的 tar 檔案,並解開到新建的 DHT_CharLCD 目錄下:
cd mkdir DHT_CharLCD cd DHT_CharLCD wget -O - http://goo.gl/Km0ye | tar xvf -
tar 解開後的四個檔案,如下所示
-rwxr-xr-x 1 pi pi 30400 12月 12 10:37 DHT -rwxr-xr-x 1 pi pi 3124 12月 12 10:37 DHT.c -rwxr-xr-x 1 pi pi 9539 12月 12 10:37 DHT_CharLCD.py -rwxr-xr-x 1 pi pi 146 12月 12 10:37 Makefile
- DHT:DHT.c 編譯之後的執行檔,由 DHT_CharLCD.py 呼叫執行讀取溫濕度感測器所測得的環境溫度
- DHT.c:C 語言程式檔
- DHT_CharLCD.py:負責呼叫外部執行檔 DHT 讀取溫濕度資料定顯示在 16x2 LCD 螢幕上
- Makefile:用在 make 指令;我們會直接使用 gcc 做編譯,不使用 make
測試程式:
DHT 是一個命令列的執行檔,輸入的命令格式為 (詳細請參閱 DHT.c 程式碼)
sudo ./DHT type pin#
依照所接的線路圖,pin# 為 15 (GPIO #15);溫濕度感測器的 type 為 11 (DHT-11)
sudo ./DHT 11 15
DHT 會使用 GPIO #15 與 DHT-11 做通訊並接收 40 個 bit 的資料,如果完全接收就會將資料顯示出來,若少了!就只會輸出所接收到的 bit 數字 (一定小於 40) 以及接收到的 4 個 byte 的資料 (當然也是錯的);成功的話,就會輸出像下面的文字,從 "Using pin #15" 到 "Humidity:"
DHT 輸出訊息 |
完成測試之後就表示上面的 C 程式可以正確的在你的樹莓派執行,下一步就是讓溫濕度的數值顯示在 16x2 LCD 螢幕上。輸下下面指令執行 python 程式
$sudo python DHT_CharLCD.py
指令輸入之後,首先會呼叫 DHT 執行檔取回溫濕度感測器的資料,如果正確的得到的數據 (40-bit) 就會更新資料到 LCD。
LCD 第一行是與溫濕度感測器 DATA接腳連接的樹莓派 GPIO 接腳號碼;第二行顯示的是溫濕度的數值
DHT_CharLCD.py 執行後 LCD 顯示溫濕度數值的樣子 |
DHT.c 編譯:
你可以根據自己的需求修改 DHT.c,但是!DHT_CharLCD.py 會呼叫 DHT 並取得它所輸出的字串 (DHT.c 裡 printf 行),如果有修改或是增加 printf 輸出字串的話,需要另外再確認 DHT_CharLCD.py (下面會提到) 裡字串分析的部分,是否會影響正確的字串截取。
編譯 DHT.c 需要 bcm2835 函式庫,如果系統裡之前沒有的話,請依照下面指令進行安裝
[2013/06/17 更新] 現在最新版本為 1.25,所以下面的 xx 要輸入 25,相關資料請先參閱部落格上的說明。
pi@raspberrypi ~ $ cd pi@raspberrypi ~ $ wget http://www.open.com.au/mikem/bcm2835/bcm2835-1.xx.tar.gz pi@raspberrypi ~ $ tar zxvf bcm2835-1.xx.tar.gz pi@raspberrypi ~ $ cd bcm2835-1.xx/ pi@raspberrypi ~/bcm2835-1.xx $ ./configure pi@raspberrypi ~/bcm2835-1.xx $ make pi@raspberrypi ~/bcm2835-1.xx $ make check pi@raspberrypi ~/bcm2835-1.xx $ sudo make install
安裝好所需的 bcm2835 函式庫後,使用輸入下面指令編譯 DHT.c 為執行檔 DHT
gcc DHT.c -l bcm2835 -std=gnu99 -o DHT
DHT_CharLCD.py 程式說明:
DHT_CharLCD.py 是延用部落格網頁 "驅動 16x2 LCD 螢幕 (英文文字型)" 裡的 CharLCD.py 程式,主要是修改 main 內容,和增加呼叫外部執行檔與字串分析的程式碼,程式碼與說明如下:
DHT_CharLCD.py - GetDHT():DHT 輸出字串分析 |
DHT 系列的溫濕度感測器每 2 秒回應一次,所以如果沒有正確的得到溫濕度資料程式會停 3 秒,之後再重新再取一次溫濕度資料,並回傳 1 表示讀取資料錯誤。
DHT_CharLCD.py:主程式, 江溫濕度資料輸出到 LCD 上顯示 |
以上就是 DHT-11 與 16x2 LCD 相互配合顯示溫濕度的例子,如果需要更準確的量測環境溫濕度,可以選用 DHT-22 或是 AM2302 ,這兩個都具備較小的溫度量測誤差與較大的量測範圍 (但價格就高出很多),可根據自己的量測誤差與範圍再選擇適當的溫濕度感測器。
以學習和一般使用來說的話,DHT-11 就很適用,需要就上賣場去購買吧!
大大 請問一下 我依以上電路連接 使用raspberry sudo ./DHT 11接收到的都是Data (0): 0x0 0x0 0x0 0x0 0x0 單獨測試dht11可以接收到值 請問問題出在哪裡?
回覆刪除是執行 sudo ./DHT 11 15 有問題,還是執行 DHT_CharLCD.py 出現問題 ?
刪除大大 都是回傳同樣的結果><
刪除會發生這問題的原因可能有幾個,但大多是下面這幾個。
刪除1.) 確認程式執行時所使用的參數與接腳名稱都是正確的 ? 不正確會回傳相同的結果!
------
2.) 再檢查一次接線 ! 確認沒問題再用程式測試一遍。
上述兩個是最主要的原因,一般連直都沒取到就是指令或是接線的問題居多 !
*****------
下面這個是有取得值,但是取值錯誤率很高的時候用
3.) 修改 DHT11.c 通訊部分的程式,也就是
// read data ! [line89 - line 109] 中關於時間延遲的部分;當CPU 速度變快時會有一些影響,這需要根據自己的 Pi 做調整。
大大 造成 此錯誤之原因有沒有可能是因為LCD壞掉?
刪除不應該會 ! 因為在 LCD 顯示前惠在命令列輸出取得的 DHT11 的數值 !
刪除好的 謝謝大大 我在檢查一下 不好意思> <
刪除大大 可以跟你要信箱嗎? 我直接將目前皆好的電路圖給大大看
刪除這裡不方便留個人資料! 但可以想辦法找找 !
刪除好的 謝謝大大
刪除大大 我重新接了還是這樣
刪除大大 會不會是因為程式中腳位定義的問題? 大概處理的流程是?
刪除有可能 !
刪除除非接線跟網頁一樣,不然就需要根據自己實際的接線在程式中做修改 !
大大 因為我對程式不擅長 可否請問一下怎麼改嗎? 不好意思道擾你><
刪除網頁裡面可以下載程式 ! 程式中有說明,可以試著自己看一下 !
刪除接腳定義很容易看出來的 !
剛剛已經確認 從WGET抓下來的 DHT 執行檔是無法讀取資料的
刪除原始檔必須重新 COMPILE 一次 就可以抓到資料
可能請原作者重新上傳一下
謝謝
============================
root@PI2:/home/pi/DHT_CharLCD# wget -O - http://goo.gl/Km0ye | tar xvf -
--2016-07-09 17:10:06-- http://goo.gl/Km0ye
正在查找主機 goo.gl (goo.gl)... 2404:6800:4008:c07::8b, 203.66.124.157, 203.66.1 24.168, ...
正在連接 goo.gl (goo.gl)|2404:6800:4008:c07::8b|:80... 連上了。
已送出 HTTP 要求,正在等候回應... 301 Moved Permanently
位置: https://dl.dropbox.com/s/w5cdvowblcy6r51/RPI_DHTwithCharLCD.tar?dl=1 [跟隨 至新的 URL]
--2016-07-09 17:10:06-- https://dl.dropbox.com/s/w5cdvowblcy6r51/RPI_DHTwithCha rLCD.tar?dl=1
正在查找主機 dl.dropbox.com (dl.dropbox.com)... 45.58.69.38
正在連接 dl.dropbox.com (dl.dropbox.com)|45.58.69.38|:443... 連上了。
已送出 HTTP 要求,正在等候回應... 302 FOUND
位置: https://dl.dropboxusercontent.com/s/w5cdvowblcy6r51/RPI_DHTwithCharLCD.tar ?dl=1 [跟隨至新的 URL]
--2016-07-09 17:10:07-- https://dl.dropboxusercontent.com/s/w5cdvowblcy6r51/RPI _DHTwithCharLCD.tar?dl=1
正在查找主機 dl.dropboxusercontent.com (dl.dropboxusercontent.com)... 45.58.69.5
正在連接 dl.dropboxusercontent.com (dl.dropboxusercontent.com)|45.58.69.5|:443.. . 連上了。
已送出 HTTP 要求,正在等候回應... 200 OK
長度: 47616 (46K) [application/x-tar]
Saving to: ‘STDOUT’
- 0%[ ] 0 --.-KB/s D HT
- 100%[=====================>] 46.50K --.-KB/s in 0.1s D HT.c
2016-07-09 17:10:09 (324 KB/s) - written to stdout [47616/47616]
DHT_CharLCD.py
Makefile
root@PI2:/home/pi/DHT_CharLCD# ls
DHT DHT.c DHT_CharLCD.py Makefile
root@PI2:/home/pi/DHT_CharLCD# ./DHT 22 4
Using pin #4
Data (0): 0x0 0x0 0x0 0x0 0x0
root@PI2:/home/pi/DHT_CharLCD# gcc DHT.c -l bcm2835 -std=gnu99 -o DHT
root@PI2:/home/pi/DHT_CharLCD# ./DHT 22 4
Using pin #4
Data (40): 0x0 0xe4 0x1 0x29 0xe
Temp = 29.7 *C, Hum = 22.8 %
反正有原始檔案,而且 Pi 與 BCM 不是每個人用的版本都一樣,所以還是根據自己的設置環境重新編譯才不會出現問題 !
刪除請問大大您說的取值錯誤率高,那CPU的速度的值是看哪去做調整?
回覆刪除以下是我的結果:
pi@raspberrypi ~/DHT_CharLCD $ sudo ./DHT 11 15
Data (40): 0x33 0x0 0x1a 0x0 0x4d
Temp = 26 *C, Hum = 51 %
pi@raspberrypi ~/DHT_CharLCD $ sudo ./DHT 11 15
Data (39): 0x33 0x0 0x1a 0x0 0xd
依大大之前的回答去修改DHT.c裡面的"counter值"是否正確?
Data 數目不足 40 是正常的,但是太多就需要做修正 ! nanosleep(1) 和 count 都可以,但數值大概多少要try 一下!
刪除