DHT11

DHT11

DHT11是一款有已校準數字信號輸出的溫濕度感測器。其精度濕度±5%RH,溫度±2℃,量程濕度5-95%RH,溫度0~+50℃。

簡介


產品概述

DHT11數字溫濕度感測器應用專用的數字模塊採集技術和溫濕度感測技術,確保產品具有極高的可靠性和卓越的長期穩定性。感測器包括一個電阻式感濕元件和一個NTC測溫元件,並與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11感測器都在極為精確的濕度校驗室中進行校準。校準係數以程序的形式存在OTP內存中,感測器內部在檢測信號的處理過程中要調用這些校準係數。單線制串列介面,使系統集成變得簡易快捷。超小的體積、極低的功耗,使其成為該類應用中,在苛刻應用場合的最佳選擇。產品為4針單排引腳封裝,連接方便。

應用領域

暖通空調 測試及檢測設備
汽車 數據記錄器
消費品 自動控制
氣象站 家電
濕度調節器 醫療
除濕器

特性

相對濕度和溫度測量
全部校準,數字輸出
卓越的長期穩定性
無需額外部件
超長的信號傳輸距離
超低能耗
4引腳安裝
完全互換

接線圖

具體示例
DHT11與單片機的接線圖
DHT11與單片機的接線圖

電氣特性

VCC=5V,T = 25℃,除非特殊標註
參數條件mintypmax單位
供電DC355.5V
供電電流測量0.52.5mA
平均0.21mA
待機100150uA
採樣周期1

引腳說明

pin名稱註釋
1VDD供電 3-5.5VDC
2DATA串列數據,單匯流排
3NC空腳,請懸空
4GND接地,電源負極

封裝信息


圖片說明
DHT11
DHT11

詳細參數


參數條件MinTypMax單位
濕度
解析度111%RH
8Bit
重複性±1%RH
精度25℃±4%RH
0-50℃±5%RH
互換性可完全互換
量程範圍0℃3090%RH
25℃2090%RH
50℃2080%RH
響應時間1/e(63%)25℃,1m/s 空氣61015S
遲滯±1%RH
長期穩定性典型值±1%RH/yr
溫度
解析度111
888Bit
重複性±1
精度±1±2
量程範圍50
響應時間1/e(63%)630S

應用信息


工作與貯存條件
超出建議的工作範圍可能導致高達3%RH的臨時性漂移信號。返回正常工作條件后,感測器會緩慢地向校準狀態恢復。要加速恢復進程可參閱“恢復處理”。在非正常工作條件下長時間使用會加速產品的老化過程。
避免將元件長期放在結露和乾燥的環境中以及以下環境。
A、鹽霧;
B、酸性或氧化氣體,例如二氧化硫鹽酸
推薦的存儲環境
溫度:10~40℃ 濕度:60%RH以下。
暴露在化學物質中的影響
電容式濕度感測器的感應層會受到化學蒸汽的干擾,化學物質在感應層中的擴散可能導致測量值漂移和靈敏度下降。在一個純凈的環境中,污染物質會緩慢地釋放出去。下文所述的恢復處理將加速實現這一過程。高濃度的化學污染會導致感測器感應層的徹底損壞。
溫度影響
氣體的相對濕度,在很大程度上依賴於溫度。因此在測量濕度時,應儘可能保證濕度感測器在同一溫度下工作。如果與釋放熱量的電子元件共用一個印刷線路板,在安裝時應儘可能將感測器遠離電子元件,並安裝在熱源下方,同時保持外殼的良好通風。為降低熱傳導,感測器與印刷電路板其它部分的銅鍍層應儘可能最小,並在兩者之間留出一道縫隙。
光線影響
長時間暴露在太陽光下或強烈的紫外線輻射中,會使性能降低。
恢復處理
置於極限工作條件下或化學蒸汽中的感測器,通過如下處理程序,可使其恢復到校準時的狀態。在45℃和<10%RH的濕度條件下保持2小時(烘乾);隨後在20-30℃和>70%RH的濕度條件下保持5小時以上。
配線注意事項
DATA信號線材質量會影響通訊距離和通訊質量,推薦使用高質量屏蔽線
焊接信息
(1)手動焊接,在最高300℃的溫度條件下接觸時間須少於3秒。
(2)禁止過波峰焊
(3)禁止用酒精、洗板水或其他液體清洗。

實常式序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
// DHT11使用範例
//單片機: AT89S52 或 STC89C52RC
// 功能:串口發送溫濕度數據 波特率 9600
//硬體連接: P2.0口為通訊口連接DHT11,DHT11的電源和地連接單片機的電源和地,單片機串口加MAX232連接電腦
#include 
#include 
//
typedef unsigned char U8; 
typedef signed char S8; 
typedef unsigned int U16; 
typedef signed int S16; 
typedef unsigned long U32; 
typedef signed long S32; 
typedef float F32; 
typedef double F64; 
//
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4
//--------------- --------------------//
//----------------IO口定義區--------------------//
//-------------- --------------------------//
sbit P2_0 = P2^0 ;//DATA
sbit P2_1 = P2^1 ;
sbit P2_2 = P2^2 ;
sbit P2_3 = P2^3 ;
//--------- ------------------------------------//
//----------------定義區--------------------//
//--------------------- -----------------------//
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U8 outdata[5]; //定義發送的位元組數
U8 indata[5];
U8 count, count_r=0;
U8 str[5]={"RS232"};
U16 U16temp1,U16temp2;
 
SendData(U8 *a)
{
outdata[0] = a[0];
outdata[1] = a[1];
outdata[2] = a[2];
outdata[3] = a[3];
outdata[4] = a[4];
count = 1;
SBUF=outdata[0];
}
 
void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
 
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
 
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
//----------------------
P2_1=0 ; //T
P2_1=1 ; //T
//----------------------
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
// Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//----------------------
P2_1=0 ; //T
P2_1=1 ; //T
//----------------------
//超時則跳出for循環
if(U8FLAG==1)break;
//判斷數據位是0還是1
// 如果高電平高過預定0高電平值則數據位為 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof
}
 
//------------ --------------------
//-----濕度讀取子程序 ------------
//---------------------- ----------
//----以下變數均為全局變數--------
//----溫度高8位== U8T_data_H------
//----溫度低8位== U8T_data_L------
//----濕度高8位== U8RH_data_H-----
//----濕度低8位== U8RH_data_L-----
//----校驗 8位 == U8checkdata-----
//----調用相關子程序如下----------
//---- Delay();, Delay_10us();COM();
//--------------------- -----------
void RH(void)
{
//主機拉低18ms
P2_0=0;
Delay(180);
P2_0=1;
//匯流排由上拉電阻拉高 主機延時20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主機設為輸入 判斷從機響應信號
P2_0=1;
//判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
if(!P2_0) //T !
{
U8FLAG=2;
//判斷從機是否發出 80us 的低電平響應信號是否結束
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
while((P2_0)&&U8FLAG++);
//數據接收狀態
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
//數據校驗
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
}//fi
}
 
//---------------------------------------
//main()功能描述: AT89C51 11.0592MHz 串口發
//送溫濕度數據,波特率 9600
//----------------------------------------------
void main()
{
U8 i,j;
//uchar str[6]={"RS232"};
TMOD = 0x20; //定時器T1使用工作方式2
TH1 = 253; // 設置初值
TL1 = 253;
TR1 = 1; // 開始計時
SCON = 0x50; //工作方式1,波特率9600bps,允許接收
ES = 1;
EA = 1; // 打開所以中斷
TI = 0;
RI = 0;
SendData(str) ; //發送到串口
Delay(1); //延時100US(12M晶振)
while(1)
{
//------------------------
//調用溫濕度讀取子程序
RH();
//串口顯示程序
//--------------------------
str[0]=U8RH_data_H;
str[1]=U8RH_data_L;
str[2]=U8T_data_H;
str[3]=U8T_data_L;
str[4]=U8checkdata;
SendData(str) ; //發送到串口
//讀取模塊數據周期不易小於 2S
Delay(20000);
}//elihw
}// main
 
void RSINTR() interrupt 4 using 2
{
U8 InPut3;
if(TI==1) //發送中斷
{
TI=0;
if(count!=5) //發送完5位數據
{
SBUF= outdata[count];
count++;
}
}
if(RI==1) //接收中斷
{
InPut3=SBUF;
indata[count_r]=InPut3;
count_r++;
RI=0;
if (count_r==5)//接收完4位數據
{
//數據接收完畢處理。
count_r=0;
str[0]=indata[0];
str[1]=indata[1];
str[2]=indata[2];
str[3]=indata[3];
str[4]=indata[4];
P0=0;
}
}
}