1.DHT11簡介
DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器。他應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長期穩(wěn)定性,傳感器包括一個(gè)電容式感濕元件和一個(gè)NTC測溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比極高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的溫濕校驗(yàn)室中進(jìn)行校正。校準(zhǔn)系數(shù)以程序的形式存儲在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡易快捷。超小的體積、極低的功耗,信號的傳輸距離可達(dá)20米以上,使其成為各類應(yīng)用甚至最為苛刻的應(yīng)用場合的最佳選擇。
其精度濕度±5%RH, 溫度±2℃,量程濕度5~95%RH, 溫度-20~+60℃。
2.硬件設(shè)計(jì)
溫度濕度模塊采用單總線協(xié)議,一根數(shù)據(jù)即可完成溫度和濕度數(shù)據(jù)采集,占用IO資源少,硬件接口如下:
DHT11_IO 與開發(fā)板PA0相連。
3.通信協(xié)議簡介
(1). 溫濕度傳感器使用的是單總線接口,一次通訊時(shí)間5ms左右,具體格式如說明,當(dāng)前數(shù)據(jù)傳輸位40bit,高位先出。
數(shù)據(jù)格式:接收到40bit數(shù)據(jù)=16bit濕度數(shù)據(jù)+16bit溫度數(shù)據(jù)+8bit校驗(yàn)和數(shù)據(jù)。
例:接到40bit數(shù)據(jù)如下:
0100 0001 0000 0010 0010 0011 0000 0001 0110 0111
濕度數(shù)據(jù) 溫度數(shù)據(jù) 校驗(yàn)和
濕度數(shù)據(jù)高8bit(整數(shù)部分)+濕度數(shù)據(jù)低8bit(小數(shù)部分)+溫度數(shù)據(jù)高8bit(整數(shù)部分)+溫度數(shù)據(jù)低8位(小數(shù)部分)=末8bit=校驗(yàn)和
例如:0100 0001+0000 0010+0010 0011+0000 0001=0110 0111
濕度=65.2%RH 溫度=35.1℃
(2). 當(dāng)溫度低于0℃時(shí)溫度數(shù)據(jù)的最高位置1.
例如:-10.1℃表示為1000 1010 0000 0001
3.1 時(shí)序圖
用戶主機(jī)(MCU)發(fā)送一次開始信號后,DHT11 從低功耗模式轉(zhuǎn)換到高速模式,待主機(jī)開始信號結(jié)束后,DHT11 發(fā)送響應(yīng)信號,送出 40bit 的數(shù)據(jù),并觸發(fā)一次信采集。信號發(fā)送如圖所示。
注:主機(jī)從 DHT11 讀取的溫濕度數(shù)據(jù)總是前一次的測量值,如兩次測間隔時(shí)間很長,請連續(xù)讀兩次以第二次獲得的值為實(shí)時(shí)溫濕度值。
3.2 數(shù)據(jù)獲取
步驟一:
DHT11上電后(DHT11 上電后要等待 1S 以越過不穩(wěn)定狀態(tài)在此期間不能發(fā)送任何指令),測試環(huán)境溫濕度數(shù)據(jù),并記錄數(shù)據(jù),同時(shí) DHT11 的 DATA 數(shù)據(jù)線由上拉電阻拉高一直保持高電平;此時(shí) DHT11 的DATA 引腳處于輸入狀態(tài),時(shí)刻檢測外部信號。
步驟二:(起始信號)
微處理器的 I/O 設(shè)置為輸出同時(shí)輸出低電平,且低電平保持時(shí)間不能小于 18ms(最大不得超過 30ms),然后微處理器的 I/O 設(shè)置為輸入狀態(tài),由于上拉電阻,微處理器的 I/O 即 DHT11 的 DATA 數(shù)據(jù)線也隨之變高,等待DHT11 作出回答信號,發(fā)送信號如圖所示:
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //配置為輸出模式
DHT11_DQ_OUT(0); //總線拉低
Delay_Ms(20); //拉低至少18ms
DHT11_DQ_OUT(1); //總線拉高
DelayUs(30); //主機(jī)拉高20~40us
}
步驟三:(回響信號)
DHT11 的 DATA 引腳檢測到外部信號有低電平時(shí),等待外部信號低電平結(jié)束,延遲后 DHT11 的 DATA引腳處于輸出狀態(tài),輸出 83 微秒的低電平作為應(yīng)答信號,緊接著輸出 87 微秒的高電平通知外設(shè)準(zhǔn)備接收數(shù)據(jù),微處理器的 I/O 此時(shí)處于輸入狀態(tài),檢測到 I/O 有低電平(DHT11 回應(yīng)信號)后,等待 87 微秒的高電平后的數(shù)據(jù)接收,發(fā)送信號如圖所示:
u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN();//配置為輸入模式
while (!DHT11_DQ_IN&&retry<100)//DHT11會(huì)拉低83us左右
{
retry++;
DelayUs(1);
}
if(retry>=100)return 1;
while (DHT11_DQ_IN&&retry<100)//DHT11拉低后會(huì)再次拉高87us
{
retry++;
DelayUs(1);
}
if(retry>=100)return 1;
else retry=0;
return 0;
}
步驟四:(讀取一位數(shù)據(jù))
由 DHT11 的 DATA 引腳輸出 40 位數(shù)據(jù),微處理器根據(jù) I/O 電平的變化接收 40 位數(shù)據(jù),位數(shù)據(jù)“0”的格式為: 54 微秒的低電平和 23-27 微秒的高電平,位數(shù)據(jù)“1”的格式為: 54 微秒的低電平加 68-74微秒的高電平。位數(shù)據(jù)“0”、“1”格式信號如圖所示:
u8 DHT11_Read_Bit(void)
{
u8 retry=0;
while(DHT11_DQ_IN&&retry<100)//等待變?yōu)榈碗娖? {
retry++;
DelayUs(1);
}
retry=0;
while(!DHT11_DQ_IN&&retry<100)//等待變高電平
{
retry++;
DelayUs(1);
}
DelayUs(40);//等待40us
if(DHT11_DQ_IN)return 1;
else return 0;
}
結(jié)束信號
DHT11 的 DATA 引腳輸出 40 位數(shù)據(jù)后,繼續(xù)輸出低電平 54 微秒后轉(zhuǎn)為輸入狀態(tài),由于上拉電阻隨之變?yōu)楦唠娖?。?DHT11 內(nèi)部重測環(huán)境溫濕度數(shù)據(jù),并記錄數(shù)據(jù),等待外部信號的到來。
3.3 溫濕度傳感器相關(guān)函數(shù)
(1) DHT11初始化函數(shù)(發(fā)送信號,檢測模塊是否正常):
u8 DHT11_Init(void)
{
/*1.開時(shí)鐘*/
DHT11_DQ_OUT(1);//上拉
DHT11_Rst(); //復(fù)位DHT11
return DHT11_Check();//等待DHT11的回應(yīng)
}
(2)讀取一字節(jié)函數(shù)
u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
(3)獲取一次溫度數(shù)據(jù)函數(shù)(數(shù)據(jù)格式:40bit數(shù)據(jù)=16bit濕度數(shù)據(jù)+16bit溫度數(shù)據(jù)+8bit校驗(yàn)和數(shù)據(jù))
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 stat=0xff;
u8 buf[5]={0};
u8 i;
DHT11_Rst();//起始信號
stat=DHT11_Check();
if(stat==0)//應(yīng)答信號
{
for(i=0;i<5;i++)//讀取40位數(shù)據(jù)
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi++=buf[0];
*humi=buf[1];
*temp++=buf[2];
*temp=buf[3];
}
}else return stat;
return 0;
}
(4)溫濕度數(shù)據(jù)轉(zhuǎn)換
Delay_Ms(1);
time++;
if(time>=100)
{
time=0;
stat=DHT11_Read_Data(temperature,humidity); //讀取溫濕度值
if(!stat)
{
printf("溫度:%d.%d℃ 濕度:%d.%d\r\n",
temperature[0],temperature[1],humidity[0],temperature[1]);
sprintf((char *)buff,"%d.%1d",temperature[0],temperature[1]);
OLED_Display_str(60,0,8,16,buff);
sprintf((char *)buff,"%d.%1d",humidity[0],temperature[1]);
OLED_Display_str(60,2,8,16,buff);
}
}
-
STM32
+關(guān)注
關(guān)注
2264文章
10858瀏覽量
354391 -
單總線
+關(guān)注
關(guān)注
1文章
36瀏覽量
12390 -
DHT11
+關(guān)注
關(guān)注
19文章
277瀏覽量
57523 -
數(shù)字溫濕度傳感器
+關(guān)注
關(guān)注
0文章
31瀏覽量
11137
發(fā)布評論請先 登錄
相關(guān)推薦
評論