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。


參考資料:

35 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
    11. 請問一下這是
      Arduino:1.8.1 (Windows 10), 開發板:"Arduino/Genuino Uno"

      In file included from C:\Users\Use\Desktop\arduino-1.8.1\libraries\DHT-sensor-library-master\DHT_U.cpp:22:0:

      C:\Users\Use\Desktop\arduino-1.8.1\libraries\DHT-sensor-library-master\DHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory

      #include

      ^

      compilation terminated.

      exit status 1
      開發板 Arduino/Genuino Uno 編譯錯誤。

      This report would have more information with
      "Show verbose output during compilation"
      option enabled in File -> Preferences.

      Delete
    12. Adafruit_Sensor.h: No such file or directory

      你沒裝這套程式庫。

      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
  7. 請問可以用一塊arduino接收兩個dht11溫度與溼度嗎

    ReplyDelete
    Replies
    1. 可以,接到不同腳位。

      Delete
    2. 程式碼是這樣打嗎
      #include "DHT.h"
      #define DHTPIN 2
      #define DHTPIN 3
      #define DHTTYPE DHT11

      DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor

      Delete
    3. 不是。

      #define DHTPIN1 2
      #define DHTPIN2 3
      #define DHTTYPE DHT11
      DHT dht1(DHTPIN1, DHTTYPE); // Initialize DHT sensor
      DHT dht2(DHTPIN2, DHTTYPE); // Initialize DHT sensor

      大概是這樣,其他的自行修改。

      Delete
  8. Anonymous23/8/18 00:11

    請問如何將DHT11測量的值 傳到MySQL資料庫中?

    ReplyDelete
  9. 請問同樣的sensor為何在PID控制器可以顯示小數點後的數值(小數點後的數值不是以00顯示),而在arduino上小數點卻都是顯示00

    ReplyDelete