2015年8月4日 星期二

Arduino 溫濕度感測器 DHT11 測試

今年三月底跟露天賣家盼盼 (ccdogccdogkimo) 採購了一批模組零件, 其中包含了一顆 DHT11 溫溼度模組, 最近為了測試 ESP8266 重看了 Proteus 的大作 :

# 初遇 IoT ( Internet of Thing, 物聯網 ) - 使用 Arduino 控制 ESP8266 無線模組上傳資料到 IoT Server ( ThingSpeak )

於是找出這個模組來測試一翻, 主要目的是要觀察 ESP8266 與開源物聯網伺服器 ThingSpeak 的互動.

市面上溫度感測器有多款, 像 "Prototyping Lab (Make 出版, p145)" 與 "Arduino Cookbook (Arduino 錦囊妙計 6.8 節)" 使用的都是 LM35, 外觀長得像電晶體, 約 30 元左右 :

# LM35DZ Temperature Sensor TO92 溫度感測器 傳感器 /Arduino/8051 $30
# 全新現貨 LM35DZ 這才是真的 TO92 溫度感測器 溫度傳感器 $32

LM35 是壓變式類比溫度感測器, 其電壓輸出與溫度呈線性關係, 攝氏 0 度時輸出 0mV, 每增加一度輸出增加 10mV, 準確度為攝氏正負 0.25度, 感測範圍攝氏 -55~150 度, 參考 :

# 溫度感測器LM35介紹
# TI LM35 溫度感測 IC 規格 (PDF)

第二個是 DS18B20 溫度感測晶片, 感測範圍 -55~125 度, 此款是數位型感測器, 可並聯實現多點測量, 價位也是 30 元左右 :

# DS18B20溫度感測器 DS18B20 18B20 單片機 18b20溫度採集 $23
# blkbox.me嚴選 DALLAS DS18B20 TO92 數位高精度溫度感測器 $26
# 原廠 Dallas DS18B20 溫度感測器 $30
# DS18B20 數位溫度器感測器 TO-92 全新原裝 $46
# 1米 不鏽鋼封裝防水型 DS18B20 溫度感測器 溫度傳感器 /8051/Arduino $60

而 "Arduino 互動設計入門 (旗標, 趙英傑)" 這本則介紹最常見的 DHT11 溫溼度感測模組 (9-2 節), 它也是數位式輸出, 溫度量測範圍 0~50 度, 精確度正負 2 度, 而濕度範圍 20~80%, 精確度正負 5%, 此款約 30 元左右 :

# DHT11 溫度 濕度 傳感器奧松 AOSONG DHT-11 溫濕度環境監控模組Arduino專用 $27

DHT11 結合溫度與濕度晶片於一體, 其正面有網孔讓感測 IC 能測量溫溼度. 四個接腳中第二腳是資料輸出 (接 Arduino 數位接腳), 第三腳用不到, 第一腳與第四腳是 VCC 與 GND, 要注意, 接反可能會燒毀模組. "Arduino 互動設計入門 (旗標, 趙英傑)" 這本書上建議在 VCC 與 Data 腳之間跨接一個 10K 電阻 (顏色是棕黑橙); VCC 腳接一個 0.1uF (104) 電容到 GND.
Importing parts?DHT11 Humitidy and Temperature Sensor.fzpz

首先到 Adafruit 網站下載 DHT11 的函式庫, 按網頁右下角的 "Download ZIP" 即可下載 :

http://github.com/adafruit/DHT-sensor-library

解開壓縮檔後將整個 DHT-sensor-library-master 資料夾放到 Arduino IDE 的 library 目錄下, 例如 :

D:\arduino-1.6.1\libraries\DHT-sensor-library-master

打開 Arduino IDE, 在 "檔案/範例" 下就可以看到 DHT Sensor library 了 :


我載入 DHTtester 這個範例, 加以修改刪除不需要的程式碼後如下 :

#include "DHT.h"
#define DHTPIN 2   
#define DHTTYPE DHT11  

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

void setup() {
  Serial.begin(9600);
  Serial.println("DHT11 test!");
  dht.begin();
  }

void loop() {
  delay(2000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
    }
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print("%\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print("*C\t");
  Serial.print(f);
  Serial.print("*F\n");
  }

此處我是將 DHT 的 Data 腳接到 Arduino ProMini 的腳 2, 編譯上傳後, 開啟序列埠監控視窗, 即可看到 DHT 輸出的溫溼度 :

Humidity: 64.00%    Temperature: 29.00*C    84.20*F
Humidity: 65.00%    Temperature: 30.00*C    86.00*F
Humidity: 64.00%    Temperature: 29.00*C    84.20*F
Humidity: 64.00%    Temperature: 29.00*C    84.20*F
Humidity: 65.00%    Temperature: 29.00*C    84.20*F
Humidity: 64.00%    Temperature: 29.00*C    84.20*F
Humidity: 64.00%    Temperature: 29.00*C    84.20*F
Humidity: 64.00%    Temperature: 29.00*C    84.20*F
Humidity: 64.00%    Temperature: 29.00*C    84.20*F
Humidity: 67.00%    Temperature: 30.00*C    86.00*F
Humidity: 67.00%    Temperature: 29.00*C    84.20*F
Humidity: 69.00%    Temperature: 29.00*C    84.20*F
Humidity: 71.00%    Temperature: 30.00*C    86.00*F
Humidity: 70.00%    Temperature: 30.00*C    86.00*F
Humidity: 69.00%    Temperature: 29.00*C    84.20*F
Humidity: 68.00%    Temperature: 30.00*C    86.00*F
Humidity: 67.00%    Temperature: 29.00*C    84.20*F
Humidity: 67.00%    Temperature: 29.00*C    84.20*F
Humidity: 66.00%    Temperature: 30.00*C    86.00*F
Humidity: 66.00%    Temperature: 29.00*C    84.20*F
Humidity: 66.00%    Temperature: 29.00*C    84.20*F
Humidity: 66.00%    Temperature: 29.00*C    84.20*F
Humidity: 65.00%    Temperature: 29.00*C    84.20*F
Humidity: 65.00%    Temperature: 30.00*C    86.00*F
Humidity: 65.00%    Temperature: 29.00*C    84.20*F

所以看起來 DHT11 的準確度似乎不是很高, 擺動是 1 度與 1% (中間起伏較大是因為我對著 DHT11 吹氣的緣故). 其實 Adfruit 還有精確度較高的溫溼度模組 DHT22 與 AM2320, 但價格較高 :

DHT22 AM2302 電容式 數位溫濕度感測器 高精度穩定可靠 取代SHT11 SHT15 $165
# 《iCshop1》AM2320 高精度數字溫濕度傳感器 $95

參考 :

http://ruten-proteus.blogspot.tw/2014/11/internet-of-thing-arduino-esp8266.html
Using an Arduino + Ethernet Shield to Update a ThingSpeak Channel


31 則留言:

  1. 請問我的DHT11一直沒有輸出信號,data腳只量到5V的電壓,這是故障了嗎 ?

    謝謝

    回覆刪除
  2. DHT11 若 VCC 與 GND 接反確實有可能燒壞. 但 DHT11 的 data 輸出是脈波, 三用電表量的話平均是高電壓, 在 4.1 到 4.6 間變動, 要用示波器就能看到信號. 上傳程式都沒問題的話, 應該可以監視串列埠視窗看到輸出.

    回覆刪除
  3. 您好,我發現我傳回來的溼值都在89~90% (也就是最高數值)
    是感測器壞掉了嗎...?

    回覆刪除
  4. 請問,我測試出來的結果

    Humidity: 2227.20 % Temperature: 742.40 *C 1368.32 *F

    數據非常奇怪。

    參考的代碼是http://github.com/adafruit/DHT-sensor-library

    請問原因有可能是出在DHT11的問題嗎?

    回覆刪除
  5. 您好, 這數據明顯是有問題, 我也是用此 library 跑上面的程式沒問題, 確定是 DHT11 嗎? 數值都固定不變嗎? 注意腳位有無接錯, VCC 與 GND 接反會燒壞唷!

    回覆刪除
  6. 我參考了http://ming-shian.blogspot.tw/2014/05/arduino19dht11.html所提供的library
    跑出來的數據正常.

    都是open source
    我研究一下差異在哪
    再來回報

    回覆刪除
  7. 嗯, 那就奇怪了, 我用相同的 library 就 ok, 這幾天有空的話我找找零件重做實驗看看.

    回覆刪除
  8. 沒事,不好意思麻煩,我確認好代碼的差異,再來回報。

    回覆刪除
  9. 你好我也遇到一樣的問題,我的濕度也是一直顯示90%,使用鍾大的網站也是一樣的結果

    回覆刪除
  10. 您好
    我遇到了一些問題
    我將code燒錄到nano板上後
    但IDE顯示了下面這些錯誤
    In file included from C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\DHT_U.cpp:22:
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\/DHT_U.h:35: error: expected class-name before '{' token
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\/DHT_U.h:38: error: 'sensors_event_t' has not been declared
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\/DHT_U.h:39: error: 'sensor_t' has not been declared
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\/DHT_U.h:47: error: expected class-name before '{' token
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\/DHT_U.h:50: error: 'sensors_event_t' has not been declared
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\/DHT_U.h:51: error: 'sensor_t' has not been declared
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\/DHT_U.h:73: error: 'sensor_t' has not been declared
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\/DHT_U.h:74: error: 'sensor_t' has not been declared
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\DHT_U.cpp:35: error: variable or field 'setName' declared void
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\DHT_U.cpp:35: error: 'sensor_t' was not declared in this scope
    C:\Program Files (x86)\Arduino\libraries\DHT-sensor-library-master\DHT_U.cpp:35: error: 'sensor' was not declared in this scope

    想請問是哪邊出了問題?
    謝謝~~

    回覆刪除
  11. 好像是 Library 問題, 要看您的 code 怎麼寫.

    回覆刪除
  12. 不好意思,近幾日學習Arduino溫濕度計,將CODE編譯後卻發生這樣的問題:

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


    請問這會是什麼問題呢?我已經確定我沒有選Port跟板型了,指示還是不清楚這是哪方面的問題。

    望請指教!

    回覆刪除

  13. * 我是樓上,打太多錯字,重發一次。

    不好意思,近幾日學習Arduino溫濕度計,將CODE編譯後卻發生這樣的問題:

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


    請問這會是什麼問題呢?我已經確定我沒有選錯Port跟板型,只是還是不清楚這是哪方面的問題。

    望請指教!

    回覆刪除
  14. 編譯錯誤是程式問題, 應該會列出程式哪裡錯才對.

    回覆刪除
  15. 你好,我在 IDE 1.8.3 成功安裝好 DHT 的 Library 後,程式編譯錯誤,看來是有些檔案找不到,不知可否解決?


    Arduino: 1.8.3 (Windows 8), Board: "Arduino/Genuino Uno"

    In file included from C:\Users\Norman\Documents\Arduino\libraries\DHT-sensor-library-master\DHT_U.cpp:22:0:

    C:\Users\Norman\Documents\Arduino\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
    Error compiling for board Arduino/Genuino Uno.

    回覆刪除
  16. 這是找不到函式庫路徑, 您可以改放到 C:\Users\Norman\Documents\Arduino\libraries\ 下試試看.

    回覆刪除







  17. 請問我要怎麼解決謝謝


    DHTtester.cpp:4:17: error: DHT.h: No such file or directory
    DHTtester:23: error: 'DHT' does not name a type
    DHTtester.cpp: In function 'void setup()':
    DHTtester:29: error: 'dht' was not declared in this scope
    DHTtester.cpp: In function 'void loop()':
    DHTtester:38: error: 'dht' was not declared in this scope

    回覆刪除
  18. 請問可以用一塊arduino接收兩個dht11溫度與溼度嗎

    回覆刪除
  19. 應該可以喔! 只要建立兩個 DHT 物件即可 :
    DHT dht1(...);
    DHT dht1(...);
    我只有一個 DHT11 沒辦法試, 您可以試試看.

    回覆刪除
  20. 剛解壓縮完的library資料夾,好像都會多一層,把裡面的那個資料夾移到Arduino的library
    應該就能找得到

    回覆刪除
  21. 無法從DHT模組讀取資料!
    一直顯示這個資料庫也更新過了 會是燒掉嗎?

    回覆刪除
  22. 學習Arduino中, 發現此套件如需使用 Adafruit DHT github 庫前需要先安裝另一個套件庫才能正常運行否則會編譯失敗
    依賴套件如下
    https://github.com/adafruit/Adafruit_Sensor

    回覆刪除
  23. In file included from C:\Users\user\Desktop\arduino-1.8.9\libraries\DHT-sensor-library-master\DHT_U.cpp:15:0:

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

    compilation terminated.

    exit status 1
    開發板 Arduino/Genuino Mega or Mega 2560 編譯錯誤。

    是甚麼問題 幫求解

    回覆刪除
  24. "No such file or directory" 應該是函式庫沒放到 libraries 目錄下喔!

    回覆刪除
  25. 請問這個能改成溫控風扇嗎

    回覆刪除
  26. 您好! 可以設計簡單程式碼控制電扇喔

    回覆刪除
  27. 你好.如果我要用ARDUINO UNO傳數據到Blynk,但是我是用別種感測器去代替dht,上面的程式是也有通用的嗎?因為我怎麼試都沒成功,不知道是不是arduino跟esp32的線沒接好.

    回覆刪除
  28. hI, 用 blynk 的話要使用 blynk 函式庫, 參考 :
    https://yhhuang1966.blogspot.com/2016/08/blynk_16.html
    https://yhhuang1966.blogspot.com/2016/08/blynk.html

    回覆刪除