2014年5月10日 星期六

Arduino範例19:利用DHT11抓取溫度和濕度

前一陣子買了許多Sensor,趁最近有個空檔,把其中幾個Sensor接起來玩玩。
這一篇要練習的就是溫濕度計DHT 11。
先介紹Sensor
DHT-11 是一個結合濕度計和測溫元件量測週遭空氣環境,並與一個高性能8位元單晶片相連接,將所量測到的溫、濕度資料拆解成為數位訊號,再由 data pin腳將資料送出。使用上很簡單,但是抓取資料時必須要特別注意時間的掌控,而且每筆資料的抓取時間間隔要1~2秒鐘,不能太快。與 DHT-22 比較,DHT-11 較不精密與準確且溫濕度量測範圍不大,雖然如此,但對於學習與熟悉溫、濕度感測卻是綽綽有餘,傳輸的距離又可長達20m以上,而且比 DHT-22 較小且便宜許多,是十分方便的簡易測試元件。

其規格如下:
1、濕度測量範圍:20~90%RH;
2、濕度測量精度:±5%RH;
3、溫度測量範圍:0~50℃
4、溫度測量精度:±2℃
5、電源供應範圍: 3~5V
6、頻率不可超過:0.5Hz (每2秒一次)

接線的方法十分簡單,"+"接5V,"-"接GND,data pin接上要輸入的Pin腳。有人說因為數位訊號要接高data電位,所以把data pin外接4.7歐姆電阻至Vcc。不過我曾嘗試不接那4.7k 歐姆,試出來的效果看起來沒有太大的差別。


Code方面,先下載 library ,丟到Arduino的libraries裡面,然後再開Arduino IDE,去叫<dht.h>
通訊鮑率一般都使用9600 baud,然後把(DHT.humidity)和(DHT.temperature)用Serial.print出來。

  1. #include <dht.h>   
  2.   
  3. #define dht_dpin 2 //定義訊號要從Pin A0 進來  
  4.   
  5. dht DHT;   
  6.   
  7. void setup(){   
  8. Serial.begin(9600);   
  9. delay(300);             //Let system settle   
  10. Serial.println("Humidity and temperature\n\n");   
  11. delay(700);             //Wait rest of 1000ms recommended delay before   
  12.                         //accessing sensor   
  13. }
  14.   
  15. void loop(){   
  16. DHT.read11(dht_dpin);   //去library裡面找DHT.read11  
  17. Serial.print("Humidity = ");   
  18. Serial.print(DHT.humidity);   
  19. Serial.print("% ");   
  20. Serial.print("temperature = ");   
  21. Serial.print(DHT.temperature);   
  22. Serial.println("C ");   
  23. delay(1000);            //每1000ms更新一次   
  24. }  

最後可以看到的樣子就像下面這個樣子了,對照氣象局的 (溼度70%,溫度28度)
看來溼度差了一些些,不知是不是房間裡比較乾…


44 則留言:

  1. 你好我想要請問一下
    如果今天我想要用手機去接收所偵測到的資料,這是有辦法的嗎?
    不要使用網頁的,是要直接寫APP去接收的

    回覆刪除
    回覆
    1. 應該可以,不過要找一下資料才知道要怎麼做!

      刪除
    2. 好的謝謝您~我會持續再找找看有沒有相關資料!

      刪除
    3. 我也覺得好看

      刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 您好,請問該怎麼用Arduino IDE,去叫 Arduino IDE是要另外安裝嗎?

    回覆刪除
    回覆
    1. 是啊,網路上有一堆arduino的資料,可以查一下,學來用。

      刪除
  4. 請問library資料 \arduino-1.5.8\libraries\DHT\2個檔案 是這樣子放的嗎?
    試了幾次都讀取不到溫濕度,不知道是不是感測器有問題,請問有什麼方可以測試感測器嗎?
    謝謝

    回覆刪除
    回覆
    1. 要土炮的測試感測器,除了示波器之外,我還真的不知道有什麼方法,我再問問看別的高手看看。

      刪除
    2. 了解,謝謝您的回覆^^

      刪除
  5. 作者已經移除這則留言。

    回覆刪除
  6. Humidity = 255.00% temperature = 255.00C
    Humidity = 255.00% temperature = 255.00C
    Humidity = 255.00% temperature = 255.00C
    Humidity = 255.00% temperature = 255.00C
    Humidity = 255.00% temperature = 255.00C
    Humidity = 255.00% temperature = 255.00C
    Humidity = 255.00% temperature = 255.00C
    為何我出來的會是這種數字啊?

    回覆刪除
  7. code裡面的 "請問 #define dht_dpin 2 //定義訊號要從Pin A0 進來 " 這個註釋有沒有出錯?

    回覆刪除
  8. 若是我用單顆的七段顯示器4顆(不是四合一)
    那是要個別寫入單顆?
    如何寫入?

    回覆刪除
    回覆
    1. 可參考
      http://www.circuitstoday.com/arduino-and-7-segment-display
      單顆七段顯示器有8支LED接腳 A,B,C,D,E,F,G,. 及1支共陽極或共陰極
      把4顆七段顯示器的8支LED接腳 A,B,C,D,E,F,G,. 並接
      即 4 支 A 接再一起 ,4 支 B 接再一起 ,4 支 C 接再一起 ,......
      接起來後總共8隻腳,
      4顆總共有4支共陽極或共陰極
      經過這樣連接後,8+4=12隻腳,
      和 (四合一) 完全一樣,
      程式碼的寫法也一樣。
      也可以用 (四合一) 的程式庫。

      刪除
  9. PO主的程式碼有個小小問題

    #define dht_dpin 2
    是從Pin 2進來
    但註釋是寫從A0進來
    要改成
    #define dht_dpin A0

    回覆刪除
    回覆
    1. 多謝! 我更改後就正常了!

      刪除
  10. 這顆溫濕度SENSOR有很多版本
    同樣是3PIN的 腳位定義也不太一樣
    要注意看順序
    像是我自己的正面由左而右是S+-
    所以我的資料線(接A0的)要接在S
    +接5V
    -接地
    這樣資訊才會正確

    回覆刪除
  11. 請問我的DHT11一直沒輸出信號,只量到 data 腳都是5v 輸出,有沒有接 4.7k 電阻都是如此,
    用示波器也看不到有任何信號輸出,請問這是故障了嗎 ?

    謝謝

    回覆刪除
    回覆
    1. 感應器接腳在下方來看的話,最左邊是訊號端,中間5V,右邊GND。

      因為我把左邊中間接相反,資料都是顯示"0"。

      刪除
  12. 請問為何小數點後都是00呢?是感測器本身的問題嗎

    回覆刪除
  13. 請問為何小數點後都是00呢?是感測器本身的問題嗎

    回覆刪除
  14. 如果運用無線的方式.程式要如何更改

    回覆刪除
    回覆
    1. 1. 先要購買有 wifi 或 藍芽 功能的 Arduino 套件
      2. 安裝該套件所屬的程式庫 Library
      3. 參考該套件的範例或說明

      刪除
  15. 請問如何把DH11 利用buzzer出聲提示? 例如 40度 發出警報...

    回覆刪除
    回覆
    1. 這個goggle一下buzzer的用法,發揮點想像力把動作連結一下就可以啦!
      應該是滿基本的喔.........(路人)

      刪除
  16. 想請問sensor接上,code也照版主寫好,編譯也無錯誤,但資訊卻沒run出來,有可能是哪邊出問題嗎?

    回覆刪除
  17. 如何把溫度 濕度 顯示在lcd??


    回覆刪除
    回覆
    1. 可參考這裡
      https://learn.adafruit.com/trinket-temperature-humidity-lcd-display?view=all

      刪除
  18. 版主您好 我是剛學習 Arduino新手 想了解一下 "下載 library" 這個壓縮檔是怎麼來的?
    (DHT.humidity)和(DHT.temperature) 這是自己定義寫出來的?還是一樣網路抓呢??謝謝

    回覆刪除
  19. 您寫的文章寫非常詳細和實用,
    對學習Arduino新手幫助很大.....讚
    謝謝

    回覆刪除
  20. 請問一下,第五行的
    dht DHT;
    這行是做了什麼動作呢

    回覆刪除
    回覆
    1. 定義dht(偵測溫溼度感測器)(像int) 是DHT
      應該是把DHT當一種變數來用

      刪除
    2. 就像我們宣告一個變數
      int i ; 是宣告一個名叫 i 的變數,它的 data type 為 int
      dht DHT;是宣告一個名叫 DHT 的類別,它的 類別 為 dht
      dht 類別就定義在 dht Library 裡面
      類別的定義包括了:
      類別的屬性和類別的方法
      例如:本程式碼中的 DHT.read11(dht_dpin);
      就是類別的方法

      刪除
  21. 請問,能多點偵測嗎?也就是說多個DHT11偵測區域內的不同位置感測溫濕度

    回覆刪除
    回覆
    1. 讀取 DHT11 需要1支類比(Analog)接腳,
      Arduino UNO 的板子上有 A0-A5 6支類比接腳,
      所以可以偵測 6 點 , 如果要偵測更多點,
      就要用更高階的電路板。

      刪除
  22. 版主您好 我是剛學習 Arduino新手 想了解一下
    這只能監控溫溼度,有辦法控制加溫跟製冷的負載嗎?
    如果還想加入步進馬達可以在同一塊板子上達成嗎?
    麻煩前輩幫忙回答~
    感謝~

    回覆刪除
    回覆
    1. Arduino 的輸出功率很小,
      無法勝任加溫跟製冷的負載
      如果要控制加溫跟製冷,要加裝繼電器,
      由Arduino 控制繼電器 ,
      再由繼電器控制 電熱線.電燈.或風扇。

      刪除
  23. 請問他感測器所傳回的數值為NAN,請問該如何解決?剛開始感測器都會傳送數值過來,但是過了幾天後他就開始傳送nan了。

    回覆刪除
  24. 文件库已经被删了,请问是哪里的库,还有补档吗

    回覆刪除