DHT11和DHT22使用區別(基於STM32)
介紹
溫溼度模組DHT11和DHT22小專案用得比較多,雖然二者均是1-wire協議,但是細節部分還是有所差異。1-wire協議我就不多介紹了,網上很詳細。這裡著重介紹二者使用的區別。
DHT11
DHT22
DHT系列區別
DHT11和DHT22
晶片手冊
提取:hgew
起始訊號
DHT11
DHT22
顯然DHT11拉低要>18ms,而DHT22拉低只要>1ms就足夠。
程式碼實現
/*
* 一次完整的資料傳輸為40bit,高位先出
* 8bit 溼度整數 + 8bit 溼度小數 + 8bit 溫度整數 + 8bit 溫度小數 + 8bit 校驗和
*/
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{
/*輸出模式*/
DHT11_Mode_Out_PP();
/*主機拉低*/
DHT11_Dout_0;
/*延時18ms*/
DHT11_DELAY_MS(18); //dht11
//DHT11_DELAY_MS(2); //dht22
/*匯流排拉高 主機延時30us*/
DHT11_Dout_1;
DHT11_DELAY_US(30); //延時30us
/*主機設為輸入 判斷從機響應訊號*/
DHT11_Mode_IPU();
/*判斷從機是否有低電平響應訊號 如不響應則跳出,響應則向下執行*/
if(DHT11_Dout_IN()==Bit_RESET)
{
/*輪詢直到從機發出 的80us 低電平 響應訊號結束*/
while(DHT11_Dout_IN()==Bit_RESET);
/*輪詢直到從機發出的 80us 高電平 標置訊號結束*/
while(DHT11_Dout_IN()==Bit_SET);
/*開始接收資料*/
DHT11_Data->humi_int= DHT11_ReadByte();
DHT11_Data->humi_deci= DHT11_ReadByte();
DHT11_Data->temp_int= DHT11_ReadByte();
DHT11_Data->temp_deci= DHT11_ReadByte();
DHT11_Data->check_sum= DHT11_ReadByte();
/*讀取結束,引腳改為輸出模式*/
DHT11_Mode_Out_PP();
/*主機拉高*/
DHT11_Dout_1;
/*檢查讀取的資料是否正確*/
if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
return SUCCESS;
else
return ERROR;
}
else
return ERROR;
}
13行
DHT11_DELAY_MS(18);
14行DHT11_DELAY_MS(2);
//DHT11時,延時18ms;DHT22時,延時1ms(建議2ms,經測試1ms有可能讀取失敗)
資料處理
DHT11
DHT22
程式碼實現
/*
* 一次完整的資料傳輸為40bit,高位先出
* 8bit 溼度整數 + 8bit 溼度小數 + 8bit 溫度整數 + 8bit 溫度小數 + 8bit 校驗和
*/
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{
uint32_t humi=0;
uint32_t temp =0;
/*輸出模式*/
DHT11_Mode_Out_PP();
/*主機拉低*/
DHT11_Dout_0;
/*延時2ms*/
DHT11_DELAY_MS(2);
/*匯流排拉高 主機延時30us*/
DHT11_Dout_1;
DHT11_DELAY_US(30); //延時30us
/*主機設為輸入 判斷從機響應訊號*/
DHT11_Mode_IPU();
/*判斷從機是否有低電平響應訊號 如不響應則跳出,響應則向下執行*/
if(DHT11_Dout_IN()==Bit_RESET)
{
/*輪詢直到從機發出 的80us 低電平 響應訊號結束*/
while(DHT11_Dout_IN()==Bit_RESET);
/*輪詢直到從機發出的 80us 高電平 標置訊號結束*/
while(DHT11_Dout_IN()==Bit_SET);
/*開始接收資料,需要修改的計算方式跟dht11不同*/
DHT11_Data->humi_int= DHT11_ReadByte();
DHT11_Data->humi_deci= DHT11_ReadByte();
DHT11_Data->temp_int= DHT11_ReadByte();
DHT11_Data->temp_deci= DHT11_ReadByte();
DHT11_Data->check_sum= DHT11_ReadByte();
/*讀取結束,引腳改為輸出模式*/
DHT11_Mode_Out_PP();
/*主機拉高*/
DHT11_Dout_1;
/*檢查讀取的資料是否正確*/
if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
{ /*----------------------------------資料處理-----------------------*/
/*----------------DHT22溫溼度16bit精度,故需要分高低位元組計算,且需要uint32_t變數裝載---------------------*/
/*-----------------------------溼度和溫度的高八位需要乘以256再加上低八位---------------------------------*/
humi = DHT11_Data->humi_int *256 + DHT11_Data->humi_deci;
temp = DHT11_Data->temp_int *256 + DHT11_Data->temp_deci;
DHT11_Data->humi_int = (uint8_t)(humi*0.1);
DHT11_Data->humi_deci = humi%10;
DHT11_Data->temp_int = (uint8_t)(temp*0.1);
DHT11_Data->humi_deci = temp%10;
return SUCCESS;
}
else
return ERROR;
}
else
return ERROR;
}
此處並沒有錯,我的程式通過
改變巨集定義
即可切換dht11或dht22測量。所以函式名稱沒改回來。
除錯問題
DHT22讀取失敗
1.主機拉低傳送起始訊號延時1ms時會讀取失敗,但延時2ms能完美解決問題。
2.兩次資料讀取時間過短,建議大於2s。
實現程式碼
相關文章
- 基於arduino uno的DHT11溫溼度感測器的使用UI
- know和know about的區別 基於coca corpus
- 關於Ajax和websocket的區別以及使用場景!Web
- 使用jquery和使用框架的區別jQuery框架
- CDB和PDB關於使用者建立和使用者許可權區別
- Cortex-A8與STM32的區別
- Java基礎- ==和equals和hashCode的區別Java
- union 和union all 使用區別
- npm 和 yarn 的使用區別NPMYarn
- ReentrantLock基於AQS的公平鎖和非公平鎖的實現區別ReentrantLockAQS
- 關於gcc、make和CMake的區別GC
- 使用樹莓派3b+和DHT11監控溫溼度。樹莓派
- new 和 malloc 的區別 及使用
- vue watch 和 computed 區別與使用Vue
- 2020 blur()和onblur的使用區別
- BeautifulSoup和etree的區別和使用場景
- 終於懂了TCP和UDP協議區別TCPUDP協議
- 關於stable_sort()和sort()的區別:
- 基於PCA和SVM的人臉識別PCA
- 基礎才是重中之重~lock和monitor的區別
- Linux和Windows有啥區別?Linux基礎LinuxWindows
- STM32 ADC詳細篇(基於HAL庫)
- STM32 GPIO詳細篇(基於HAL庫)
- localStorage,sessionStorage和cookie的區別及使用SessionCookie
- YII 的 with 與 joinwith 的區別和使用
- apply 、call 以及 bind 的使用和區別APP
- 和區別
- 關於java的引用和c++的區別JavaC++
- 關於PHP this 和 self 呼叫類方法的區別PHP
- [java基礎]StringBuilder和StringBuffer的3個區別JavaUI
- Kafka基礎:表和流的區別 - Edward LoveallKafka
- C++基礎(八)struct和class的區別C++Struct
- Vue 基礎自查——watch、computed和methods的區別Vue
- STM32系統時鐘RCC(基於HAL庫)
- ../和./和/的區別
- rem與em的使用和區別詳解REM
- HTTP協議中PUT和POST使用區別HTTP協議
- 使用者態和核心態的區別