DHT11:
測量范圍:20-90% RH 0-50℃
測濕精度:±5% RH
測溫精度:±2℃
分辨力:1
DHT11引腳說明(正面觀看,左邊的為1腳):
DHT21(AM2301):
測量范圍:0-99.9% RH -40~+80℃
測濕精度:±3% RH
測溫精度:±0.5℃
分辨力:0.1%RH/0.1℃
典型應用電路:
說明:
注意:
DHT11總線驅動過程:
注意:
40bit數(shù)據(jù)(5字節(jié)數(shù)據(jù))數(shù)據(jù)包:
DHT11
數(shù)據(jù)格式: 40bit數(shù)據(jù)=8位濕度整數(shù)+8位濕度小數(shù)+8位溫度整數(shù)+8位溫度小數(shù)+8位校驗
DHT21
數(shù)據(jù)格式: 40bit數(shù)據(jù)=16bit濕度數(shù)據(jù)+16bit溫度數(shù)據(jù)+8bit校驗和
例子: 接收40bit數(shù)據(jù)如下:
0000 0010 1000 1100 0000 0001 0101 1111 1110 1110
濕度數(shù)據(jù) 溫度數(shù)據(jù) 校驗和
濕度高8位+濕度低8位+溫度高8位+溫度低8位=和的低8位=校驗和
例如:0000 0010+1000 1100+0000 0001+0101 1111=1110 1110
濕度=65.2%RH
溫度=35.1℃
當溫度低于0℃時溫度數(shù)據(jù)的最高位置1。
例如:-10.1℃表示為1000 0000 0110 0101
注意:DHT21溫濕度數(shù)據(jù)為16位,DHT11數(shù)據(jù)為8位,所以盡管兩者時序相同,卻不能用同樣的數(shù)據(jù)類型計算。
/*** @brief 讀取40bit數(shù)據(jù)* @param none.* @retval 1 讀取成功,0讀取失敗.*/int DHT11_ReadData(void){unsigned int cout = 1;unsigned int T_H, T_L, H_H, H_L, Check;//設置IO為輸出模式DHT_Set_Output();//1、MCU發(fā)送開始起始信號DHT_ResetBit();delay_ms(25); //拉低至少18msDHT_SetBit();delay_us(20); //拉高20~40us//設置IO口為輸入模式DHT_Set_Input();//2、讀取DHT11響應if(DHT_ReadBit() == Bit_RESET){//等待80us的低電平cout = 1;while(!DHT_ReadBit() && cout++);//等待80us的高電平cout = 1;while(DHT_ReadBit() && cout++);//3、DHT11送出40bit數(shù)據(jù)//讀取8bit的濕度整數(shù)數(shù)據(jù)H_H = DH21_ReadByte();//讀取8bit的濕度小數(shù)數(shù)據(jù)H_L = DH21_ReadByte();//讀取8bit的溫度整數(shù)數(shù)據(jù)T_H = DH21_ReadByte();//讀取8bit的溫度小數(shù)數(shù)據(jù)T_L = DH21_ReadByte();//讀取8位的校驗和Check = DH21_ReadByte();//校驗數(shù)據(jù)是否合法,合法的話將數(shù)據(jù)保存到全局結構體變量中備用if(Check == (H_H + H_L + T_H + T_L)){DHT11.Hum_H = H_H;DHT11.Hum_L = H_L;DHT11.Tem_H = T_H;DHT11.Tem_L = T_L;return 1;}else{return 0;}}return 0;}
數(shù)據(jù)'0'還是'1'判定規(guī)則:
位數(shù)據(jù)“0”判定圖
位數(shù)據(jù)“1”判定圖
該函數(shù)的具體實現(xiàn)如下:
/*** @brief 讀取8bit 數(shù)據(jù)* @param none.* @retval none.*/int DH21_ReadByte(void){int data=0;char i;char cout;for(i=0; i<8; i++){//1、等待50us低電平結束cout=1;while(!DHT_ReadBit() && cout++);//2、數(shù)據(jù)拉高后,判斷30us后數(shù)據(jù)總線電平的高低//延時30us之后讀取IO口的狀態(tài)delay_us(30);//先把上次的數(shù)據(jù)移位,再保存本次的數(shù)據(jù)位。data = data << 1;if(DHT_ReadBit() == Bit_SET){data |= 1;}//等待輸入的是低電平(高電平結束),進入下一位數(shù)據(jù)接收cout=1;while(DHT_ReadBit() && cout++);}return data;}
對40bit數(shù)據(jù)處理,得到溫濕度數(shù)據(jù):
/*** @brief 獲取溫度* @param none.* @retval Temp, 溫度值*/int DHT11_GetTem(void){//return (DHT11.Tem_H << 8 | DHT11.Tem_L); //DHT21return (DHT11.Tem_H*10 + DHT11.Tem_L); //DHT11}/*** @brief 獲取濕度* @param none.* @retval Hum,濕度值*/int DHT11_GetHum(void){//return (DHT11.Hum_H << 8 | DHT11.Hum_L); //DHT21return (DHT11.Hum_H*10 + DHT11.Hum_L); //DHT11}
注意:
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!





