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 則留言 :

匿名 提到...

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

謝謝

小狐狸事務所 提到...

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

阿偉 提到...

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

鍾志均 提到...

請問,我測試出來的結果

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

數據非常奇怪。

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

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

小狐狸事務所 提到...

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

鍾志均 提到...

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

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

小狐狸事務所 提到...

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

鍾志均 提到...

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

匿名 提到...

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

Unknown 提到...

您好
我遇到了一些問題
我將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

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

小狐狸事務所 提到...

好像是 Library 問題, 要看您的 code 怎麼寫.

匿名 提到...

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

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


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

望請指教!

匿名 提到...


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

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

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


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

望請指教!

小狐狸事務所 提到...

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

匿名 提到...

你好,我在 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.

小狐狸事務所 提到...

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

匿名 提到...








請問我要怎麼解決謝謝


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

小狐狸事務所 提到...

應該是函式庫 DHT 沒有設好喔

Unknown 提到...

請問可以用一塊arduino接收兩個dht11溫度與溼度嗎

小狐狸事務所 提到...

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

匿名 提到...

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

小狐狸事務所 提到...

沒錯喔!

匿名 提到...

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

小狐狸事務所 提到...

建議先檢查接線有無接錯

匿名 提到...

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

匿名 提到...

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 編譯錯誤。

是甚麼問題 幫求解

小狐狸事務所 提到...

"No such file or directory" 應該是函式庫沒放到 libraries 目錄下喔!

匿名 提到...

請問這個能改成溫控風扇嗎

小狐狸事務所 提到...

您好! 可以設計簡單程式碼控制電扇喔

匿名 提到...

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

小狐狸事務所 提到...

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