發布日期:2022-10-09 點擊率:352
溫濕度傳感器:Arduino Uno 實驗13——DHT11溫濕度傳感器 第1張" title="arduino 溫濕度傳感器:Arduino Uno 實驗13——DHT11溫濕度傳感器 第1張-傳感器知識網"/>
DHT11溫濕度傳感器模塊簡介
DHT11概述
數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。
傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。
單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。產品為 4 針單排引腳封裝。連接方便,特殊封裝形式可根據用戶需求而提供。
注意:
(1)避免結露情況下使用。
(2)長期保存條件:溫度10—40℃,濕度60%以下。
技術參數
供電電壓: 3.3~5.5V DC 輸 出: 單總線數字信號?互 換 性: 可完全互換
測量范圍: 濕度20-90%RH, 溫度0~50℃ ?測量精度: 濕度±5%RH, 溫度±2℃
分 辨 率: 濕度1%RH, 溫度1℃ ?長期穩定性: 《±1%RH/年
測量時的供電電流為1.0mA, ?待機時的供電電流為0.06mA
應用電路
引腳說明
溫濕度采集范圍
濕度采集范圍5%~ 95%,在環境溫度為25℃時,濕度采集精度是±5%。溫度采集范圍是-20℃~60℃,在環境溫度為25℃時,溫度采集精度是±2℃。
應用信息
7.1工作與貯存條件
超出建議的工作范圍可能導致高達3%RH的臨時性漂移信號。返回正常工作條后,傳感器會緩慢地向校準狀態恢復。要加速恢復進程/可參閱7.3小節的“恢復處理”。在非正常工作條件下長時間使用會加速產品的老化過程。
7.2暴露在化學物質中
電阻式濕度傳感器的感應層會受到化學蒸汽的干擾,化學物質在感應層中的擴散可能導致測量值漂移和靈敏度下降。在一個純凈的環境中,污染物質會緩慢地釋放出去。下文所述的恢復處理將加速實現這一過程。高濃度的化學污染會導致傳感器感應層的徹底損壞。
7.3恢復處理
置于極限工作條件下或化學蒸汽中的傳感器,通過如下處理程序,可使其恢復到校準時的狀態。在50-60℃和
DHT11溫濕度傳感器模塊的使用
串行接口(單線雙向)
DATA用于微處理器與 DHT11之間的通訊和同步,采用單總線數據格式,一次通訊時間4ms左右,數據分小數部分和整數部分,具體格式在下面說明,當前小數部分用于以后擴展,現讀出為零.操作流程如下:
一次完整的數據傳輸為40bit,高位先出。
數據格式:8bit濕度整數數據+8bit濕度小數數據
+8bi溫度整數數據+8bit溫度小數數據+8bit校驗和
數據傳送正確時校驗和數據等于“8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據”所得結果的末8位。
用戶MCU發送一次開始信號后, DHT11從低功耗模式轉換到高速模式,等待主機開始信號結束后, DHT11發送響應信號,送出40bit的數據,并觸發一次信號采集,用戶可選擇讀取部分數據.從模式下, DHT11接收到開始信號觸發一次溫濕度采集如果沒有接收到主機發送開始信號, DHT11不會主動進行溫濕度采集.采集數據后轉換到低速模式。
通訊過程時序圖:
時序圖解析:
總線空閑狀態為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號.主機發送開始信號結束后,延時等待20-40us后,讀取DHT11的響應信號,主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可,總線由上拉電阻拉高。(跟程序中是對應的,看程序就懂)
總線為低電平,說明DHT11發送響應信號, DHT11發送響應信號后,再把總線拉高80us,準備發送數據,每一bit數據都以50us低電平時隙開始,高電平的長短定了數據位是0還是1.格式見下面圖示.如果讀取響應信號為高電平,則DHT11沒有響應,請檢查線路是否連接正常.當最后一bit數據傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態。
數字0信號表示方法如下圖所示:
數字1信號表示方法如下圖所示:
實驗一:溫濕度讀取
項目要求:
根據時序圖直接測得溫濕度。
電路搭建
參考程序
實驗結果
原理圖
Arduino語言注解Arduino語言是建立在C/C++基礎上的,其實也就是基礎的C語言,Arduino語言只不過把AVR單片機(微控制器)相關的一些參數設置都函數化,不用我們去了解他的底層,讓我們不了解AVR單片機(微控制器)的朋友也能輕松上手。
相比Arduino,也許我們更熟悉“集成電路”這一概念。集成電路是為了實現某種特定功能的計算而設計的微小芯片。對于普通人來說,傳統的集成電路應用比較繁瑣,一般需要具有一定電子知識基礎,并懂得如何進行相關的程序設計的工程師才能熟練使用。但是Arduino的出現讓曾經只有專業人士才能使用的集成電路變為平易近人的電子設計工具,即使沒有程序設計基礎,也可以通過簡單的學習,掌握使用Arduino的方法。為了實現這一目標,Arduino從兩方面進行了努力與改進。首先,在硬件方面,Arduino本身是一款非常容易使用的印刷電路板。電路板上裝有專用集成電路,并將集成電路的功能引腳引出方便我們外接使用。同時,電路板還設計有USB接口方便與電腦連接。其次,在軟件方面,Arduino提供了專門的程序開發環境Arduino IDE。其界面設計簡潔,對于沒有接觸過程序設計的“小白”也可以輕松上手。
Arduino--UNO主板
Arduino--IDE
實驗一 Hello world
目標效果:打印“Hello world” 字體
硬件準備:Arduino UNO 主板
軟件準備:Arduino--IDE
電路連接:Arduino主板——電腦
代碼:
void setup() {
// put your setup code here, to run once:
Serial.begin();
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("Hello world !");
delay(1000);
}
實驗二 動態顯示屏實驗
目標效果:顯示屏顯示打印的文字
硬件準備:
Arduino UNO一塊
IIC1602顯示模塊一個
Arduino UNO底板一塊
杜邦線若干
軟件準備:Arduino--IDE
電路連接:
GND——GND
VCC——5V
SDA——A4
SCL——A5
代碼:
#include
void setup() {
pinMode(DHT11PIN,OUTPUT);
lcd.begin (16,2); // for 16 x 2 LCD module 初始橫16列、豎2行
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
}
void loop() {
// 讀取溫濕度傳感器的數據
int chk=DHT11.read(DHT11PIN);
// LCD 顯示采集的溫濕度數據
lcd.setCursor(0, 0);
lcd.print("Tep: ");
lcd.print((float)DHT11.temperature, 2);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print((float)DHT11.humidity, 2);
lcd.print("%");
delay(200);
}
延伸--圖形編程軟件:Scratch、mBlock
Scratch是一款由麻省理工學院(MIT) 設計開發的一款面向少年的簡易編程工具,scratch已經是少兒編程行業的基礎軟件。
mBlock 是一款面向 STEAM 教育領域的圖形化編程學習軟件,基于 Scratch 3.0 開發。它不僅能讓用戶創作有趣的故事、游戲、動畫等作品,并且支持 Makeblock 主板和其他 Arduino 硬件的編程。
語法常用參數:
1、pinMode(接口名稱,OUTPUT或INPUT)將——接口定義為輸入或輸出接口,用在setup()函數里。
2、digitalWrite(接口名稱, HIGH或LOW)——將數字接口值至高或低。
3、digitalRead(接口名稱)——讀出數字接口的值。
4、analogWrite(接口名稱, 數值)——給一個接口寫入模擬值(PWM波)。對于 ATmega168芯片的Arduino(包括Mini或BT),該函數可以工作于 3, 5, 6, 9, 10和 11號接口。老的 ATmega8芯片的USB和 serial Arduino僅僅支持 9, 10和1 1號接口。
5、analogRead(接口名稱)——從指定的模擬接口讀取值,Arduino對該模擬值進行10-bit的數字轉換,這個方法將輸入的0-5電壓值轉換為 0到1023間的整數值。
6、delay()——延時一段時間,delay(1000)為一秒。
7、Serial.begin(波特率)——設置串行每秒傳輸數據的速率(波特率)。在同計算機通訊時,使用下面這些值:300, 1200, 2400, 4800, 9600, , , , , 或 。你也可以在任何時候使用其它的值,比如,與0號或1號插口通信就要求特殊的波特率。用在setup()函數里
8、Serial.read()——讀取持續輸入的數據。
溫濕度傳感器評測
DS18B20 數字溫度防水傳感器
防水,長距離,廉價。
TMP100溫度傳感器(Gadegeteer兼容)
中端價格,優秀性能,適合多種場合,IIC數字輸出
MLX9061紅外線溫度計評估板
昂貴,大量程,曲線光滑,非接觸測溫
高精度DHT22溫濕度傳感器
中端價格,溫濕度傳感器,長距離,性價比高,應用范圍廣
水分傳感器(Water Sensor)
簡單易用的水分檢測工具
土壤濕度傳感器(Arduino兼容)
簡單的土壤水分傳感器,可插入土壤
紅外非接觸測溫傳感器
性價比高,高靈敏,長距離,方便嵌入硬件,非接觸
SHT1x溫濕度傳感器(Arduino兼容)
高端溫濕度傳感器,快速響應,極高可靠性和長期穩定性,自動休眠,低功耗
DHT11溫濕度傳感器(Arduino兼容)
價格低廉,適用低要求場景
模擬LM35線性溫度傳感器(Arduino兼容)
價格低廉,適用低要求場景,模擬溫度傳感器
DS18B20數字溫度傳感器
價格低廉,性能優秀,數字溫度傳感器
注:其中*項由于應用范圍明確,就偷懶不比較了。(第一個和最后一個的用的傳感器不是一樣的嘛!之后會告訴大家這個傳感器有多么適合屌絲)
第一部分:基本參數
這部分列出使用時需要的接口,傳感器尺寸,工作電壓和是否需要焊接,以及預算。
目的:如果已設計好其他元器件,可從剩余物理空間和接口以及剩余的預算中做出最初篩選。
至于那些完全不知道要做什么的人……恭喜你,和我現在站在了同一起跑線上了。
注:焊接指的是在接口處焊接排針。不推薦用熱熔膠和雙面膠……
第二部分:量程精度
假如你要和我一樣把你的傳感器放在火上烤的話……一定鮮嫩多汁。所以請工作在官方提示的工作范圍內。
首先要確定測量范圍,接著測量精度,精度是指在某一指定溫度下的值,分段的精度不同,具體參照Datasheet,
若使用場合難以恒溫,提出過高測量精度也不合適的,因為會隨著溫度變化產生濕度或溫度漂移。
第三部分:響應時間比較
這部分比較的是MCU發出請求后收到不同傳感器的溫度的時間,網絡中就是RTT。這個數值和寫的程序(比如delay)以及通訊方式有很大關系。
最快的是輸出電壓與溫度成正比的LM35,總線通訊的與通訊協議有關,1-Wire相較IIC耗時久一些,同時由于單總線由多個功能部件共用,只能時分復用,可能導致很大的時間延遲,因此不推薦多個設備掛在同一條單總線上。
第四部分:性能(對溫度的追蹤能力)
基本上是采用一個很不科學的方法,拿到室外等穩定后再取回室內。以此觀察在溫度驟變的情況下多久達到穩定。
如果有條件的話,可以嘗試下開個空調到25°然后拿個冰水混合物,把傳感器溫柔的帶著套的浸入冰水中再取出到室溫。
首先是怎么看都高大上的兩款紅外測溫傳感器,由于測試時間不在同一時間,大家感受下走向和溫度變化的速度就好了。紅外測溫分辨率很高,又由于與被測對象互不接觸,可用于測量運動物體、小目標和熱容量小或溫度變化迅速(瞬變)對象的表面溫度,也可用于測量溫度場的溫度分布。
總體看,兩款紅外溫度傳感器對溫度都很敏感,都可以在短時間升高到環境溫度。相比較MLX的溫度曲線更平穩,抖動更少。
MLX紅外線溫度傳感器
推薦度:★★☆☆☆
優點:
溫度曲線平緩,測量溫度和工作溫度范圍大。
有節能模式,可非接觸測溫。
IIC連接,溫度返回快,一條總線可掛多個溫度傳感器。
缺點:
價格太高。
庫很難找,因為是Arduino代理的產品,雖然內置Arduino引導程序可以使用Arduino環境,但是IIC協議不支持用Arduino內置的Wire庫所以很蛋疼!
很難用,要自己焊接。
關于這個產品的相關網頁
這個產品的原生網頁
關于如何在arduino環境下用MLX的教程 含庫文件
應用范圍:
醫療器具比如體溫測量,運動測量,打印機掃描儀等辦公設備的溫度控制。
數據傳輸20米以上。而且測量溫度比較極限的地方。(注意工作溫度和測量溫度有差別)
紅外非接觸測溫傳感器
推薦度:★★★★☆
優點:
價格合適。
而且瘦長的外觀相比剛剛的平板身材更適合做溫度測試筆。
溫度曲線也不錯,靈敏度很高,內含溫度補償。
可以選擇分辨率,最高可達1/16°C,精度比較高。
還不要庫。
數字量,衰減小。
缺點:
需要自己焊接下排針。
測量范圍不是特別高。
需要3個數字口。
應用范圍:同上。
接下來有三款傳感器都是可以同時返回溫度濕度的,放一起比較了。
可以看出來溫度有所變化后
SHT1x比較敏感,較早的達到穩定。
DHT11——實在不忍直視這濕度誤差。
SHT1x傳感器由1個電容式聚合體測濕元件和1個能隙式測溫元件組成,同樣,DHT22也是電容感濕原件,測溫元件采用NTC測溫元件,而DHT11是電阻式感濕元件盒NTC測溫元件組成的。(NTC為熱敏電阻)
DHT11溫濕度傳感器
推薦度:★★☆☆☆
優點:
不需要焊接,價格在三者中是最便宜的。
達到穩定值也比較快。(畢竟電阻元件)。
數據可傳輸20米以上,抗干擾強。
缺點:
需要下載庫!雖然這個庫DHT22也可以共用。曲線和誤差也不能忍吧。
不能選擇精度。溫度誤差+/-2°C,濕度誤差+/-5%RH。測量范圍也比較小。溫度0-50°C。
應用范圍:農業園藝類,有地理位置的分布,但對濕度溫度感應精度要求不需要太高的場景(但假如冬天溫度到零下了,還是算了)。
DHT22溫濕度傳感器
推薦度:★★★★☆
優點:
不需要焊接,和DHT22相差不了多少錢。
曲線平滑。濕度和濕度誤差為三個傳感器中最小的。濕度誤差很小。
工作溫度濕度范圍最大。
信號傳輸距離也可達到20米以上。
抗干擾能力強。
缺點:
不夠敏感,對溫度追蹤反應慢。
需要下載庫。
應用范圍:對環境溫度與濕度測量精度要求較高的情況。比如環境監測。
SHT1x溫濕度傳感器(Arduino兼容)
推薦度:★★★★☆
優點:
不需要焊接,曲線平滑。
溫度誤差很小。
反應迅速。較快達到穩定。
超低功耗,自動休眠,出色的長期穩定性。
缺點:
需要兩個數字口。
濕度誤差比較大。
測量范圍和DHT11一樣。
也需要下載庫。
應用范圍:對跟蹤溫度濕度的反應要求較高的場景,精度也能保證。適合長期工作。
接下來是比較三款比較低端(但是有內涵)的溫度傳感器
由于DS18B20分辨率默認為12,所以看上去那么光滑。而TMP100由于默認為9,所以劣勢就看上去比較明顯。所以,調整分辨率結果會有不同
從這張圖可以看出來。
模擬LM0035線性溫度傳感器
推薦度:★★★☆☆
優點:
使用簡單,一條模擬線就搞定。
不需要外加庫。
由于采用半導體測溫芯片,輸出電壓與溫度成正比所以速度感應和處理很快。
溫度測量范圍比較大。
價格非常低廉。
缺點:
沒分辨率可調,精確度不高,誤差看上去大了點,毛刺多了點。
應用范圍:精度要求不高的一般場景都可以用。17元你買不了上當買不了吃虧。
另外比較了下我認為比較高性能的溫度傳感器。分別有看上去特別好的DS18B20,被迫害的TMP100,和在溫濕度測試中表現出色的SHT1x和DHT22。
TMP100溫度傳感器(Gadegeteer兼容)
推薦度:★★★★☆
優點:
可選分辨率,9~12bit。
IIC協議(可用系統自帶庫),可在總線上同時連接多個(最多8個)傳感器(不過要用跳線設置地址),支持IDC10接口。
第一張圖分辨率是默認的9,第二張我設置為10,可以看出平滑了很多。
相比其他傳感器較快達到穩定值,是神器。
缺點:
需要焊接。
需要手動設置跳線。
要注意改程序里的地址代碼,這個要特別注意的。
官方給出的誤差很大。
需要下載庫。
應用范圍:供電溫度檢測,計算機相關熱防護,熱力控制系統等。
DS18B20數字溫度傳感器
推薦度:★★★★★
優點:
價格低廉。
分辨率可選擇,同樣也是9-12bit,默認就為12bit。
不需要焊接,連接容易。
測量范圍很大。
缺點:
需要庫。
案例代碼中沒有修改分辨率的語句。
單總線連接,影響效率。
達到最后穩定需要時間比較久。
應用范圍:應用范圍比較廣,如家用電器,汽車電子,測量儀器,醫療器具,工業生產。
本文整理于DFRobot wiki By 毫無愧疚感的小白
double Fahrenheit(double celsius)
{
return 1.8 * celsius + 32;
}
double Kelvin(double celsius)
{
return celsius + 273.15;
}
double dewPoint(double celsius, double humidity)
{
double A0=373.15/(273.15 + celsius);
double SUM=-7. * (A0-1);
SUM +=5. * log10(A0);
SUM +=-1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
SUM +=8.1328e-3 * (pow(10,(-3.*(A0-1)))-1) ;
SUM +=log10(1013.246);
double VP=pow(10, SUM-3) * humidity;
double T=log(VP/0.); // temp var
return (241.88 * T) / (17.558-T);
}
double dewPointFast(double celsius, double humidity)
{
double a=17.271;
double b=237.7;
double temp=(a * celsius) / (b + celsius) + log(humidity/ 100);
double Td=(b * temp) / (a - temp);
return Td;
}
#include
下一篇: PLC、DCS、FCS三大控
上一篇: 電氣控制線路圖控制原