2015/05/21

Raspberry Pi:溫濕度感測器DHT11

很快速地嘗試使用溫濕度感測器DHT11,可量測相對濕度20~90%,誤差±5%;溫度0~50℃,誤差±2℃。

電路圖如下:

然後安裝Adafruit寫好的模組與範例程式,有C也有Python,嘿。

先安裝所需套件:
$ sudo apt-get update
$ sudo apt-get install build-essential python-dev

然後下載,進入該目錄:
$ git clone https://github.com/adafruit/Adafruit_Python_DHT.git
$ cd Adafruit_Python_DHT

安裝:
$ sudo python setup.py install

接著就能讀取DHT11了,執行寫好的範例Python程式:
$ cd examples
$ sudo ./AdafruitDHT.py 11 4
Temp=27.0*C  Humidity=81.0%

其中參數11代表DHT11,4代表我把它接到Raspberry Pi的GPIO 4。


參考資料:

26 comments:

  1. 請問一下大師.... 電路圖是不是有點問題...dht11 的ground 接到  VDD了

    ReplyDelete
  2. 不好意思,
    請問一下葉難大大,
    我的溫濕度感測器DHT11
    在測試濕度時,
    原本範圍是在33~34間,
    但偶而會突然跳出22這個值,
    是感測器本身的問題嗎?

    另外,我發現,
    當他接上藍芽模組時,
    值會因藍芽電壓而導致非常不穩的情況,
    (我沒插RX/TX,值就已有改變,所以猜測是電壓導致)
    但藍芽拔掉後,值就會回復正常,
    請問這是正常的嗎?
    不好意思麻煩了...

    ReplyDelete
    Replies
    1. 另附上程式碼:


      #include "DHT.h"
      int DHTPIN = 2;
      #define DHTTYPE DHT11

      DHT dht(DHTPIN, DHTTYPE);

      void setup() {
      Serial.begin(9600);
      dht.begin(); //初始化並啟動
      }

      void loop() {
      delay(2000);
      float h = dht.readHumidity();
      float t = dht.readTemperature();

      Serial.print("Humidity:");
      Serial.print(h);
      Serial.print("%\n");
      Serial.print("Temperature:");
      Serial.print(t);
      Serial.print("*C\n");
      }

      Delete
    2. > 但偶而會突然跳出22這個值,是感測器本身的問題嗎?
      不知道。原因很多吧,我覺得是線路不穩。

      > 值會因藍芽電壓而導致非常不穩的情況,
      你怎麼接藍牙模組?
      藍牙模組耗電雖小,但rpi的5V或3.3V針腳,能供給的電流非常小,所以通常需要從外部供電。

      Delete
    3. This comment has been removed by the author.

      Delete
    4. 對不起,
      我一開始忘記說我是用Arduino了...

      我想我的溫濕度感測器可能壞了,
      他的值漸漸越來越不穩定,
      現在的值已經超過±5在亂跳。

      Delete
    5. DHT11的反應時間,隨各種條件不同而不同,甚至可能長達15秒。
      詳情請看datasheet。

      修改delay(2000);試試看

      Delete
    6. 謝謝大大協助。

      Delete
  3. 大大 請問若結合lcd顯示的話該怎麼做?

    ReplyDelete
    Replies
    1. 參考他人的分享文章
      http://ruten-proteus.blogspot.tw/2012/11/raspberry-pi-lcd-dht-11.html

      Delete
    2. 大大 我有參考了這篇 但是當我最後執行指令sudo python DHT_CharLCD.py 時 ,回傳的值總是data(0) 0x0 0x0 0x0....

      Delete
    3. 請問大大 大概是錯在哪個部分?

      Delete
    4. 根據該文章,你應該先試試
      $ sudo ./DHT 11 15
      那部分的步驟,先搞定DHT11。

      Delete
    5. 嗯,就是DHT.c的部份,無法成功讀取DHT11。
      檢查線路,檢查GPIO腳位對不對。

      Delete
    6. 我依照大大你的程式可以讀到值,但是利用那篇文章$ sudo ./DHT 11 15卻只能讀到data(0) 0x0 0x0 0x0

      Delete
    7. 他的DHT.c需要什麼程式庫bcm2835之類的,
      或許版本有差吧,maybe,不確定。

      請向該文章作者詢問。

      Delete
    8. lcd有驅動 背景光有亮 所以開關應該沒問題 不知道是否內部出問題

      Delete
    9. 恩 抱歉 因為連絡不到作者 所以想請教大大 不好意思><

      Delete
    10. 嗯,不要擠牙膏好嗎。
      既然用我的程式可行,那硬體方面應無問題。
      但$ sudo ./DHT 11 15卻只能讀到data(0) 0x0 0x0 0x0,
      呃,bcm2835程式庫對我來說太低階,沒用過,無法回答。

      或許你可修改他的LCD部分的程式,加上我的程式。

      > lcd有驅動 背景光有亮 所以開關應該沒問題 不知道是否內部出問題
      有電的話,lcd背光就會亮,不代表什麼。

      Delete
  4. 請問大大 如果想要用terminal讀取資料的話 可以用sudo modprobe w1-gpio 這系列的指令嗎? 亦或者需要有哪些指令以及先備知識呢??

    ReplyDelete
    Replies
    1. w1-gpio是給1-Wire用的吧,如DS18B20。

      DHT11是自己的特殊格式訊號。

      Delete
  5. 請問如果是用xd-28的感測器要怎麼寫?

    ReplyDelete
  6. 請問如果是用xd-28的感測器要怎麼寫?

    ReplyDelete
    Replies
    1. 網路上很多分享文。

      Delete