2013年6月18日 星期二

使用 Raspberry Pi 驅動 LCD 顯示 DHT-11 所測得的環境溫濕度

需要 DHT-11 (溫濕度感測器) 的話請到露天賣場訂購:DHT11 - 溫濕度感測器

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 的意思


材料列表:

線路牽線:

將材料依照下面線路圖佈線,或是參考實際接線圖照片

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 就很適用,需要就上賣場去購買吧!

19 則留言:

  1. 大大 請問一下 我依以上電路連接 使用raspberry sudo ./DHT 11接收到的都是Data (0): 0x0 0x0 0x0 0x0 0x0 單獨測試dht11可以接收到值 請問問題出在哪裡?

    回覆刪除
    回覆
    1. 是執行 sudo ./DHT 11 15 有問題,還是執行 DHT_CharLCD.py 出現問題 ?

      刪除
    2. 大大 都是回傳同樣的結果><

      刪除
    3. 會發生這問題的原因可能有幾個,但大多是下面這幾個。

      1.) 確認程式執行時所使用的參數與接腳名稱都是正確的 ? 不正確會回傳相同的結果!
      ------
      2.) 再檢查一次接線 ! 確認沒問題再用程式測試一遍。
      上述兩個是最主要的原因,一般連直都沒取到就是指令或是接線的問題居多 !

      *****------
      下面這個是有取得值,但是取值錯誤率很高的時候用
      3.) 修改 DHT11.c 通訊部分的程式,也就是
      // read data ! [line89 - line 109] 中關於時間延遲的部分;當CPU 速度變快時會有一些影響,這需要根據自己的 Pi 做調整。

      刪除
    4. 大大 造成 此錯誤之原因有沒有可能是因為LCD壞掉?

      刪除
    5. 不應該會 ! 因為在 LCD 顯示前惠在命令列輸出取得的 DHT11 的數值 !

      刪除
    6. 好的 謝謝大大 我在檢查一下 不好意思> <

      刪除
    7. 大大 可以跟你要信箱嗎? 我直接將目前皆好的電路圖給大大看

      刪除
    8. 這裡不方便留個人資料! 但可以想辦法找找 !

      刪除
    9. 大大 我重新接了還是這樣

      刪除
    10. 大大 會不會是因為程式中腳位定義的問題? 大概處理的流程是?

      刪除
    11. 有可能 !
      除非接線跟網頁一樣,不然就需要根據自己實際的接線在程式中做修改 !

      刪除
    12. 大大 因為我對程式不擅長 可否請問一下怎麼改嗎? 不好意思道擾你><

      刪除
    13. 網頁裡面可以下載程式 ! 程式中有說明,可以試著自己看一下 !
      接腳定義很容易看出來的 !

      刪除
    14. 剛剛已經確認 從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 %

      刪除
    15. 反正有原始檔案,而且 Pi 與 BCM 不是每個人用的版本都一樣,所以還是根據自己的設置環境重新編譯才不會出現問題 !

      刪除
  2. 請問大大您說的取值錯誤率高,那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值"是否正確?

    回覆刪除
    回覆
    1. Data 數目不足 40 是正常的,但是太多就需要做修正 ! nanosleep(1) 和 count 都可以,但數值大概多少要try 一下!

      刪除