前言
本項(xiàng)目主要通過使用STM32F103C8T6作為主控MCU,ESP8266作為數(shù)據(jù)透傳模塊,接入機(jī)智云AIoT云平臺(tái),通過在線智能產(chǎn)品,實(shí)現(xiàn)了遠(yuǎn)程聯(lián)網(wǎng)、溫濕度監(jiān)測、APP控制等功能。
在上文中,主要介紹了“創(chuàng)建云端產(chǎn)品,燒錄Gagent”,以便讓設(shè)備能夠聯(lián)網(wǎng),當(dāng)然其中也備注了ESP8266燒寫Gagent固件時(shí)的注意事項(xiàng),說明定義數(shù)據(jù)點(diǎn)的作用。
在本文中,從原理開始講解,闡述DHT11驅(qū)動(dòng)的編寫。
進(jìn)入正文
1、DHT11 簡要介紹
DHT11 器件采用簡化的單總線通信,DATA 引腳用于微處理器與 DHT11 之間的通訊和同步,一次傳送 40 位數(shù)據(jù),高位先出。

舉例:

2、時(shí)序分析(附代碼)
用戶主機(jī)(MCU)發(fā)送一次開始信號(hào)后,DHT11 從低功耗模式轉(zhuǎn)換到高速模式,待主機(jī)開始信號(hào)結(jié)束后,DHT11 發(fā)送響應(yīng)信號(hào),送出 40bit 的數(shù)據(jù),信號(hào)發(fā)送如圖所示。

注意:主機(jī)(MCU)從 DHT11 讀取的溫濕度數(shù)據(jù)總是前一次的測量值。
總線空閑:
DHT11 的 DATA 數(shù)據(jù)線由上拉電阻拉高一直保持高電平,此時(shí) DHT11 的DATA 引腳處于輸入狀態(tài),時(shí)刻檢測外部信號(hào)。
MCU 發(fā)出請(qǐng)求信號(hào):
MCU I/O 設(shè)置為輸出同時(shí)輸出低電平,且低電平保持時(shí)間不能小于 18ms,然后MCU I/O設(shè)置為輸入狀態(tài)。由于上拉電阻,MCU I/O 即 DHT11 的 DATA 數(shù)據(jù)線也隨之變高,之后等待 DHT11 作出回答信號(hào)。
DHT11 發(fā)出應(yīng)答信號(hào):
當(dāng) DHT11 的 DATA 引腳檢測到外部信號(hào)有低電平時(shí),等待外部信號(hào)低電平結(jié)束,延遲后 DHT11 的 DATA引腳處于輸出狀態(tài),輸出 80us的低電平作為應(yīng)答信號(hào),緊接著輸出 80us 的高電平通知 MCU 準(zhǔn)備接收數(shù)據(jù),MCU I/O 此時(shí)處于輸入狀態(tài),檢測到 DHT11 回應(yīng)信號(hào)后,等待 80us 的高電平后的數(shù)據(jù)接收。

MCU 接收 40 位數(shù)據(jù)
由 DHT11 的 DATA 引腳輸出 40 位數(shù)據(jù),MCU 根據(jù) I/O 電平的變化來判斷是 “0” 還是 “1” 。
位數(shù)據(jù) “0” 的格式為:
50us 的低電平和 26-28us的高電平。

位數(shù)據(jù) “1” 的格式為:
50us 的低電平加 70us 的高電平。

DHT11 發(fā)出結(jié)束信號(hào)
DHT11 的 DATA 引腳輸出 40 位數(shù)據(jù)后,繼續(xù)輸出低電平 50us 后轉(zhuǎn)為輸入狀態(tài),由于上拉電阻存在,變?yōu)楦唠娖健?/p>
// 本驅(qū)動(dòng)采用 HAL 庫,us 級(jí)延時(shí)使用通用定時(shí)器實(shí)現(xiàn),對(duì) IO 引腳的狀態(tài)的改變采用位操作以及直接寄存器操作
// 復(fù)位DHT11void DHT11_Rst(void){ DHT11_IO_OUT(); //設(shè)置為輸出 DHT11_DQ_OUT = 0; //拉低 HAL_Delay_ms(20); //拉低至少18ms DHT11_DQ_OUT = 1; //拉高 HAL_Delay_us(30); //主機(jī)拉高20~40us}
//等待DHT11的回應(yīng)//返回1:未檢測到DHT11的存在//返回0:存在uint8_t DHT11_Check(void) { uint8_t retry = 0; DHT11_IO_IN(); //設(shè)置為輸入 while(DHT11_DQ_IN && retry < 100) //DHT11會(huì)拉低40~80us { retry++; HAL_Delay_us(1); } if(retry >= 100)return 1;else retry = 0;
while(!DHT11_DQ_IN && retry < 100) //DHT11拉低后會(huì)再次拉高40~80us { retry++; HAL_Delay_us(1); }if(retry >= 100)return 1; return 0;}
//從DHT11讀取一個(gè)位//返回值:1/0uint8_t DHT11_Read_Bit(void) {uint8_t retry = 0;while(DHT11_DQ_IN && retry < 100)//等待變?yōu)榈碗娖?/code> { 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讀取一個(gè)字節(jié)//返回值:讀到的數(shù)據(jù)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讀取一次數(shù)據(jù)//temp0~50°)//humi20%~90%)//返回值:0,正常;1,讀取失敗;2,校驗(yàn)和錯(cuò)誤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位數(shù)據(jù) { buf[i] = DHT11_Read_Byte(); }if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) { *humi = buf[0]; *temp = buf[2]; }elsereturn 2; // 校驗(yàn)和錯(cuò)誤 }elsereturn 1;return 0; }
//初始化DHT11的 IO口, 同時(shí)檢測DHT11的存在//返回1:不存在//返回0:存在 uint8_t DHT11_Init(void){ DHT11_GPIO_Init();
DHT11_Rst();return DHT11_Check();}
3、使用串口觀察數(shù)據(jù)
將 printf 函數(shù)重定向至與 PC 相連的串口上。由于重定向相關(guān)函數(shù)已經(jīng)包含在機(jī)智云生成的代碼中(gizwits_product.c),我們直接使用 printf 進(jìn)行數(shù)據(jù)打印即可。
#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;}
以下為相關(guān)測試代碼:
state = DHT11_Read_Data(&temperature, &humidity);if(state == 2){printf("the checksum is error\n");}else if(!state){printf("temp = %d , humi = %d\n", temperature, humidity);}else{printf("DHT11 is not answer\n");}
若采集到的數(shù)據(jù)沒有問題,即可將機(jī)智云協(xié)議相關(guān)代碼移植進(jìn)工程中。
本文結(jié)束。
在下篇內(nèi)容中,介紹結(jié)合STM32cubx實(shí)現(xiàn)機(jī)智云代碼工程移植、采集數(shù)據(jù)上發(fā)、控制數(shù)據(jù)下拉、成品測試環(huán)節(jié)。
-
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2943文章
47670瀏覽量
412019 -
監(jiān)測系統(tǒng)
+關(guān)注
關(guān)注
8文章
3055瀏覽量
84428
發(fā)布評(píng)論請(qǐng)先 登錄
冷庫溫濕度監(jiān)控系統(tǒng)物聯(lián)網(wǎng)解決方案
【瑞薩FPB-RA6E2試用】【瑞薩FPB-RA6E2】Zephyr-驅(qū)動(dòng)-DHT11-溫濕度傳感器及設(shè)備樹理解
【瑞薩RA6E2地奇星開發(fā)板試用】串口通信+DHT11測量溫濕度
【瑞薩RA6E2地奇星開發(fā)板試用】DHT11 測量溫濕度
【瑞薩RA6E2地奇星開發(fā)板試用】串口打印DHT11溫濕度數(shù)據(jù)
【上海晶珩睿莓1開發(fā)板試用體驗(yàn)】Home Assistant 物聯(lián)網(wǎng)溫濕度計(jì)
基于物聯(lián)網(wǎng)的溫濕度監(jiān)測系統(tǒng)方案:構(gòu)建全域感知的智能環(huán)境網(wǎng)絡(luò)
遠(yuǎn)程溫濕度測量與報(bào)警系統(tǒng):智能化環(huán)境監(jiān)控的核心解決方案
基于物聯(lián)網(wǎng)的溫濕度監(jiān)測系統(tǒng)
物聯(lián)網(wǎng)溫濕度監(jiān)控系統(tǒng)
常見的溫濕度傳感器類型?
【RA4L1-SENSOR】DHT11測溫濕度OLED顯示
用樹莓派RP2350 DIY 桌面動(dòng)態(tài)溫濕度計(jì)
LoRa無線技術(shù)的溫濕度監(jiān)測預(yù)警系統(tǒng)
基于物聯(lián)網(wǎng)的遠(yuǎn)程溫濕度監(jiān)測系統(tǒng)(2)編寫 DHT11 驅(qū)動(dòng)
評(píng)論