今年三月底跟露天賣家盼盼 (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
請問我的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%,使用鍾大的網站也是一樣的結果
回覆刪除您好
回覆刪除我遇到了一些問題
我將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 沒有設好喔
回覆刪除請問可以用一塊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