1.DHT11簡介
DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。他應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性,傳感器包括一個電容式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的溫濕校驗室中進行校正。校準系數以程序的形式存儲在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號的傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選擇。
其精度濕度±5%RH, 溫度±2℃,量程濕度5~95%RH, 溫度-20~+60℃。

2.硬件設計
溫度濕度模塊采用單總線協議,一根數據即可完成溫度和濕度數據采集,占用IO資源少,硬件接口如下:
DHT11_IO 與開發板PA0相連。

3.通信協議簡介
(1). 溫濕度傳感器使用的是單總線接口,一次通訊時間5ms左右,具體格式如說明,當前數據傳輸位40bit,高位先出。
數據格式:接收到40bit數據=16bit濕度數據+16bit溫度數據+8bit校驗和數據。
例:接到40bit數據如下:
0100 0001 0000 0010 0010 0011 0000 0001 0110 0111
濕度數據 溫度數據 校驗和
濕度數據高8bit(整數部分)+濕度數據低8bit(小數部分)+溫度數據高8bit(整數部分)+溫度數據低8位(小數部分)=末8bit=校驗和
例如:0100 0001+0000 0010+0010 0011+0000 0001=0110 0111
濕度=65.2%RH 溫度=35.1℃
(2). 當溫度低于0℃時溫度數據的最高位置1.
例如:-10.1℃表示為1000 1010 0000 0001
3.1 時序圖
用戶主機(MCU)發送一次開始信號后,DHT11 從低功耗模式轉換到高速模式,待主機開始信號結束后,DHT11 發送響應信號,送出 40bit 的數據,并觸發一次信采集。信號發送如圖所示。

注:主機從 DHT11 讀取的溫濕度數據總是前一次的測量值,如兩次測間隔時間很長,請連續讀兩次以第二次獲得的值為實時溫濕度值。
3.2 數據獲取
步驟一:
DHT11上電后(DHT11 上電后要等待 1S 以越過不穩定狀態在此期間不能發送任何指令),測試環境溫濕度數據,并記錄數據,同時 DHT11 的 DATA 數據線由上拉電阻拉高一直保持高電平;此時 DHT11 的DATA 引腳處于輸入狀態,時刻檢測外部信號。
步驟二:(起始信號)
微處理器的 I/O 設置為輸出同時輸出低電平,且低電平保持時間不能小于 18ms(最大不得超過 30ms),然后微處理器的 I/O 設置為輸入狀態,由于上拉電阻,微處理器的 I/O 即 DHT11 的 DATA 數據線也隨之變高,等待DHT11 作出回答信號,發送信號如圖所示:

void DHT11_Rst(void)
{
DHT11_IO_OUT(); //配置為輸出模式
DHT11_DQ_OUT(0); //總線拉低
Delay_Ms(20); //拉低至少18ms
DHT11_DQ_OUT(1); //總線拉高
DelayUs(30); //主機拉高20~40us
}
步驟三:(回響信號)
DHT11 的 DATA 引腳檢測到外部信號有低電平時,等待外部信號低電平結束,延遲后 DHT11 的 DATA引腳處于輸出狀態,輸出 83 微秒的低電平作為應答信號,緊接著輸出 87 微秒的高電平通知外設準備接收數據,微處理器的 I/O 此時處于輸入狀態,檢測到 I/O 有低電平(DHT11 回應信號)后,等待 87 微秒的高電平后的數據接收,發送信號如圖所示:

u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN();//配置為輸入模式
while (!DHT11_DQ_IN&&retry<100)//DHT11會拉低83us左右
{
retry++;
DelayUs(1);
}
if(retry>=100)return 1;
while (DHT11_DQ_IN&&retry<100)//DHT11拉低后會再次拉高87us
{
retry++;
DelayUs(1);
}
if(retry>=100)return 1;
else retry=0;
return 0;
}
步驟四:(讀取一位數據)
由 DHT11 的 DATA 引腳輸出 40 位數據,微處理器根據 I/O 電平的變化接收 40 位數據,位數據“0”的格式為: 54 微秒的低電平和 23-27 微秒的高電平,位數據“1”的格式為: 54 微秒的低電平加 68-74微秒的高電平。位數據“0”、“1”格式信號如圖所示:

u8 DHT11_Read_Bit(void)
{
u8 retry=0;
while(DHT11_DQ_IN&&retry<100)//等待變為低電平
{
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;
}
結束信號
DHT11 的 DATA 引腳輸出 40 位數據后,繼續輸出低電平 54 微秒后轉為輸入狀態,由于上拉電阻隨之變為高電平。但 DHT11 內部重測環境溫濕度數據,并記錄數據,等待外部信號的到來。
3.3 溫濕度傳感器相關函數
(1) DHT11初始化函數(發送信號,檢測模塊是否正常):
u8 DHT11_Init(void)
{
/*1.開時鐘*/
DHT11_DQ_OUT(1);//上拉
DHT11_Rst(); //復位DHT11
return DHT11_Check();//等待DHT11的回應
}
(2)讀取一字節函數
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)獲取一次溫度數據函數(數據格式:40bit數據=16bit濕度數據+16bit溫度數據+8bit校驗和數據)
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)//應答信號
{
for(i=0;i<5;i++)//讀取40位數據
{
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)溫濕度數據轉換
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
+關注
關注
2289文章
11012瀏覽量
362366 -
單總線
+關注
關注
1文章
36瀏覽量
12525 -
DHT11
+關注
關注
19文章
277瀏覽量
58273 -
數字溫濕度傳感器
+關注
關注
0文章
31瀏覽量
11308
發布評論請先 登錄
基于arduino的dht11溫濕度傳感器的使用

評論