STM32外接DHT11顯示溫濕度

1 DTH11溫濕度傳感器
DHT11數(shù)字溫濕度傳感器是一款含有已校準數(shù)字信號輸出的溫濕度復合傳感器,包括一個電阻式感濕元件和一個NTC測溫元件。

1.1 數(shù)據(jù)讀取協(xié)議
微控制器MCU與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時間4ms左右。
用戶MCU發(fā)送一次開始信號后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主機開始信號結(jié)束后, ,并觸發(fā)一次信號采集,用戶可選擇讀取部分數(shù)據(jù)。
從模式下,DHT11接收到開始信號觸發(fā)一次溫濕度采集,如果沒有接收到主機發(fā)送開始信號,DHT11不會主動進行溫濕度采集。采集數(shù)據(jù)后轉(zhuǎn)換到低速模式。
1.1.1 起始信號
總線空閑狀態(tài)為高電平,MCU把總線拉低等待DHT11響應(yīng),MCU把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。
DHT11接收到主機的開始信號后,等待MCU的開始信號結(jié)束,然后發(fā)送80us低電平響應(yīng)信號。
MCU發(fā)送開始信號結(jié)束后,延時等待20-40us后,讀取DHT11的響應(yīng)信號,MCU發(fā)送開始信號后,可以切換到輸入模式,或者輸出高電平均可,總線由上拉電阻拉高。

1.1.2 數(shù)據(jù)數(shù)字信號
總線為低電平,說明DHT11發(fā)送響應(yīng)信號,DHT11發(fā)送響應(yīng)信號后,再把總線拉高80us,準備發(fā)送數(shù)據(jù),每一bit數(shù)據(jù)都以50us低電平時隙開始,高電平的長短定了數(shù)據(jù)位是0還是1。
數(shù)字0和數(shù)字1的表示,如下面圖示:
數(shù)字0:50us低電平開始后,26-28us的高電平表示0
數(shù)字1:50us低電平開始后,70us的高電平表示1
如果讀取響應(yīng)信號為高電平,則DHT11沒有響應(yīng),需要檢查線路是否連接正常。

當最后一bit數(shù)據(jù)傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態(tài)。
1.1.3 溫濕度數(shù)據(jù)格式
一次完整的數(shù)據(jù)傳輸為40bit,高位先出。數(shù)據(jù)分小數(shù)部分和整數(shù)部分,數(shù)據(jù)格式:
8bit濕度整數(shù)數(shù)據(jù)
8bit濕度小數(shù)數(shù)據(jù)
8bit溫度整數(shù)數(shù)據(jù)
8bit溫度小數(shù)數(shù)據(jù)
8bit校驗和
數(shù)據(jù)傳送正確時校驗和數(shù)據(jù)等于“ 8bit 濕度整數(shù)數(shù)據(jù) +8bit 濕度小數(shù)數(shù)據(jù)+8bit溫度整數(shù)數(shù)據(jù) +8bit 溫度小數(shù)數(shù)據(jù) ”所得結(jié)果的末8位。
1.2 硬件接線
DHT11的數(shù)據(jù)讀取只需要一根線,我使用的是PB8,另外,OLED用來顯示溫濕度的值,使用IIC通信,使用的是PB6和PB7。

2 程序編寫
根據(jù)DHT11的數(shù)據(jù)讀取協(xié)議,編寫對應(yīng)的數(shù)據(jù)讀取函數(shù)。
2.1 DHT11復位和檢測響應(yīng)函數(shù)
首先是MCU向DHT11發(fā)送的起始信號,拉低20ms,再拉高30us。
2.2 數(shù)據(jù)讀取
MCU向DHT11發(fā)送起始信號后,就可以接收DHT11的數(shù)據(jù)返回了,一次讀取濕度和溫度即可。
2.3 初始化
使用DHT11之前,進行引腳的初始化和器件的初始化。
3 測試
在移植過U8g2庫的hello_world例程上進行修改,在屏幕上顯示溫濕度。注意攝氏度單位的小圓圈,不知道怎么直接以符號的形式顯示出來,我這里是單獨畫了一個小空心圓。
測試效果如下:

4 總結(jié)
本篇介紹了如何在STM32上外接溫濕度DHT11實現(xiàn)溫濕度數(shù)據(jù)的讀取,并通過OLED進行數(shù)據(jù)顯示。