<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

DHT11驅動的編寫

9GxC_IoTMaker ? 來源:機智云開發者 ? 作者:機智云開發者 ? 2022-04-25 14:40 ? 次閱讀

前言

本項目主要通過使用STM32F103C8T6作為主控MCU,ESP8266作為數據透傳模塊,接入機智云AIoT云平臺,通過在線智能產品,實現了遠程聯網、溫濕度監測、APP控制等功能。

在上文中,主要介紹了“創建云端產品,燒錄Gagent”,以便讓設備能夠聯網,當然其中也備注了ESP8266燒寫Gagent固件時的注意事項,說明定義數據點的作用。

在本文中,從原理開始講解,闡述DHT11驅動的編寫。

進入正文

1、DHT11 簡要介紹

DHT11 器件采用簡化的單總線通信,DATA 引腳用于微處理器與 DHT11 之間的通訊和同步,一次傳送 40 位數據,高位先出。

833bcd1a-c44c-11ec-bce3-dac502259ad0.png

舉例:

8357a026-c44c-11ec-bce3-dac502259ad0.png

2、時序分析(附代碼)

用戶主機(MCU)發送一次開始信號后,DHT11 從低功耗模式轉換到高速模式,待主機開始信號結束后,DHT11 發送響應信號,送出 40bit 的數據,信號發送如圖所示。

836d13ca-c44c-11ec-bce3-dac502259ad0.png

注意:主機(MCU)從 DHT11 讀取的溫濕度數據總是前一次的測量值。

總線空閑:

DHT11 的 DATA 數據線由上拉電阻拉高一直保持高電平,此時 DHT11 的DATA 引腳處于輸入狀態,時刻檢測外部信號。

MCU 發出請求信號:

MCU I/O 設置為輸出同時輸出低電平,且低電平保持時間不能小于 18ms,然后MCU I/O設置為輸入狀態。由于上拉電阻,MCU I/O 即 DHT11 的 DATA 數據線也隨之變高,之后等待 DHT11 作出回答信號。

DHT11 發出應答信號:

當 DHT11 的 DATA 引腳檢測到外部信號有低電平時,等待外部信號低電平結束,延遲后 DHT11 的 DATA引腳處于輸出狀態,輸出 80us的低電平作為應答信號,緊接著輸出 80us 的高電平通知 MCU 準備接收數據,MCU I/O 此時處于輸入狀態,檢測到 DHT11 回應信號后,等待 80us 的高電平后的數據接收。

838da5ea-c44c-11ec-bce3-dac502259ad0.png

MCU 接收 40 位數據

由 DHT11 的 DATA 引腳輸出 40 位數據,MCU 根據 I/O 電平的變化來判斷是 “0” 還是 “1” 。

位數據 “0” 的格式為:

50us 的低電平和 26-28us的高電平。

83c1a412-c44c-11ec-bce3-dac502259ad0.png

位數據 “1” 的格式為:

50us 的低電平加 70us 的高電平。

83df9896-c44c-11ec-bce3-dac502259ad0.png

DHT11 發出結束信號

DHT11 的 DATA 引腳輸出 40 位數據后,繼續輸出低電平 50us 后轉為輸入狀態,由于上拉電阻存在,變為高電平。

// 本驅動采用 HAL 庫,us 級延時使用通用定時器實現,對 IO 引腳的狀態的改變采用位操作以及直接寄存器操作

// 復位DHT11void DHT11_Rst(void){

                     
DHT11_IO_OUT();   

//設置為輸出  DHT11_DQ_OUT = 0;   

//拉低  HAL_Delay_ms(20);   

//拉低至少18ms  DHT11_DQ_OUT = 1;   

//拉高   HAL_Delay_us(30);  

 //主機拉高20~40us}

//等待DHT11的回應//返回1:未檢測到DHT11的存在//返回0:存在uint8_t DHT11_Check(void)      

{   

uint8_t retry = 0;  DHT11_IO_IN();      

//設置為輸入   

while(DHT11_DQ_IN && retry < 100)  

//DHT11會拉低40~80us  

{    

retry++;   

 HAL_Delay_us(1);  

}   

if(retry >= 100)return 1;else    

retry = 0;

while(!DHT11_DQ_IN && retry < 100)  

//DHT11拉低后會再次拉高40~80us  

{    

retry++;    

HAL_Delay_us(1);  

}if(retry >= 100)return 1;      

return 0;}

//從DHT11讀取一個位//返回值:1/0uint8_t DHT11_Read_Bit(void)        

{uint8_t retry = 0;while(DHT11_DQ_IN && retry < 100)//等待變為低電平  

{    

retry++;    

HAL_Delay_us(1);  

}  

retry = 0;while(!DHT11_DQ_IN && retry < 100)//等待變高電平  

{    

retry++;    

HAL_Delay_us(1);  

}  

delay_us(40);//等待40usif(DHT11_DQ_IN)return 1;elsereturn 0;       

}


//從DHT11讀取一個字節//返回值:讀到的數據uint8_t DHT11_Read_Byte(void)    

{        

uint8_t i,dat;  dat = 0;for (i=0;i<8;i++)   

{      

dat <<= 1;       

dat |= DHT11_Read_Bit();  

}                

return dat;}


//從DHT11讀取一次數據//temp:溫度值(范圍:0~50°)//humi:濕度值(范圍:20%~90%)//返回值:0,正常;1,讀取失敗;2,校驗和錯誤uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi)    

{        

uint8_t buf[5];uint8_t i;  

DHT11_Rst();if(DHT11_Check() == 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];        

*temp = buf[2];    

}elsereturn 2;  

// 校驗和錯誤  

}elsereturn 1;return 0;      

}
//初始化DHT11的 IO口, 同時檢測DHT11的存在//返回1:不存在//返回0:存在        

uint8_t DHT11_Init(void){  DHT11_GPIO_Init();


  DHT11_Rst();return DHT11_Check();}

3、使用串口觀察數據

將 printf 函數重定向至與 PC 相連的串口上。由于重定向相關函數已經包含在機智云生成的代碼中(gizwits_product.c),我們直接使用 printf 進行數據打印即可。

#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf     

set to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif /* __GNUC__ *//**  

* @brief  

Retargets the C library printf function to the USART.  

* @param  None  

* @retval None  

*/PUTCHAR_PROTOTYPE{/* Place your implementation of fputc here *//* e.g. write a character to the USART1 and Loop until the end of transmission */  

HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);


return ch;}

以下為相關測試代碼:

state = DHT11_Read_Data(&temperature, &humidity);if(state == 2){printf("the checksum is error


");}else if(!state){printf("temp = %d , humi = %d


", temperature, humidity);}else{printf("DHT11 is not answer


");}


若采集到的數據沒有問題,即可將機智云協議相關代碼移植進工程中。

本文結束。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    16100

    瀏覽量

    344529
  • 微處理器
    +關注

    關注

    11

    文章

    2149

    瀏覽量

    81611
  • DHT11
    +關注

    關注

    19

    文章

    264

    瀏覽量

    57258

原文標題:基于物聯網的遠程溫濕度監測系統(2)編寫 DHT11 驅動

文章出處:【微信號:IoTMaker,微信公眾號:機智云開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    STM8L152 DHT11測試數據一直是零是怎么回事?

    用stm8l做溫度檢測,輸出至串口,都出來的數據全是零。同樣的程序在stm8s208板子上順利運行,研究了好幾天了,大神們來看看{:4:} main函數部分是初始化時鐘分頻為1 DHT11初始化
    發表于 04-30 08:22

    【先楫HPM5361EVK開發板試用體驗】溫濕度傳感器DHT11實踐

    開發環境: IDE:RT-Thread Studio 2.2.7 開發板:HPM5300EVK 1 理論分析 1.1 DHT11介紹 DHT11 數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度
    發表于 01-03 23:46

    【LuckFox Pico 開發板免費試用】6.使能 DHT11 Driver

    除了我在上一篇文章里寫的,自己寫內核驅動,我們可以發現 LuckFox Pico 內核中默認是包含 DHT11 驅動的。今天給大家介紹直接使用默認 DHT11
    發表于 11-07 19:04

    【LuckFox Pico 開發板免費試用】5.內核驅動溫濕度傳感器 DHT11

    因為 DHT11 驅動時要求的時序很難直接在 shell 或者 c 語言編程下實現驅動。經網友的提醒,可以自己寫驅動來實現。最開始就是在網上到處搜集資料,LuckFox Pico 算是
    發表于 11-06 15:43

    DHT11為啥返回不了低電平?

    DHT11為啥返回不了低電平(程序沒問題)
    發表于 11-06 08:07

    DHT11程序里flag++是什么作用?

    DHT11程序里flag++是什么作用
    發表于 10-16 08:08

    基于STM32大棚DHT11溫濕度監測protues仿真設計

    基于?STM32大棚DHT11溫濕度監測protues仿真設計
    的頭像 發表于 08-31 14:51 ?1227次閱讀
    基于STM32大棚<b class='flag-5'>DHT11</b>溫濕度監測protues仿真設計

    使用NUC240 GPIO(PA.0)和TIMER0來讀DHT11濕度和溫度數據

    應用:本代碼使用NUC240 GPIO(PA.0)和TIMER0來讀DHT11濕度和溫度數據。 BSP 版本: NUC230/240系列 BSP CMSIS V3.01.001 硬件
    發表于 08-30 06:37

    如何使用GPIO(PA.0)和TIMER0來讀DHT11濕度和溫度數據

    應用:本代碼使用NUC240 GPIO(PA.0)和TIMER0來讀DHT11濕度和溫度數據。 BSP 版本: NUC230/240系列 BSP CMSIS V3.01.001 硬件
    發表于 08-22 06:21

    DHT11/DHT22溫度傳感器開源分享

    電子發燒友網站提供《DHT11/DHT22溫度傳感器開源分享.zip》資料免費下載
    發表于 06-29 14:42 ?1次下載
    <b class='flag-5'>DHT11</b>/<b class='flag-5'>DHT</b>22溫度傳感器開源分享

    DHT11和I2C 20x4 LCD的溫度監控器

    電子發燒友網站提供《帶DHT11和I2C 20x4 LCD的溫度監控器.zip》資料免費下載
    發表于 06-28 14:36 ?0次下載
    帶<b class='flag-5'>DHT11</b>和I2C 20x4 LCD的溫度監控器

    Proteus教程:DHT11讀取和顯示

    Proteus教程:DHT11讀取和顯示
    的頭像 發表于 06-14 11:37 ?2872次閱讀
    Proteus教程:<b class='flag-5'>DHT11</b>讀取和顯示

    DHT11驅動通過串口打印采集到的環境溫濕度數據

    DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度綜合傳感器,常用于暖通空調、汽車、除濕器、自動控制等領域。
    發表于 06-13 15:25 ?971次閱讀
    <b class='flag-5'>DHT11</b><b class='flag-5'>驅動</b>通過串口打印采集到的環境溫濕度數據

    如何使用ESP8266從DHT11傳感器檢索溫度和濕度?

    我嘗試使用 ESP8266 從 DHT11 傳感器檢索溫度和濕度。但我一直收到類似“ ”的錯誤 如果可能的話,任何人都可以指出這段代碼中的其他潛在錯誤嗎?我的代碼如下所示: 代碼:全選pin
    發表于 06-05 07:42

    【CW32飯盒派開發板試用體驗】DHT11溫濕度檢測

    最近溫度比較高,好多人都開啟了空調模式,今天使用手頭上的DHT11模塊來實時測試一下當前室內的溫度。CW32飯盒派提供了許多傳感器的擴展接口,這里使用到H2電子秤的接口,因為這樣的接口能夠
    發表于 06-04 23:07
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>