本文介紹基于STM32F103實現(xiàn)的DHT11溫濕度傳感器數(shù)據(jù)采集及顯示,完整代碼見文末鏈接
一、DHT11傳感器簡介
DHT11數(shù)字溫濕度傳感器是一款含有已校準數(shù)字信號輸出的溫濕度復合傳感器。它應用專用的數(shù)字模塊采集技術和溫濕度傳感技術,確保產(chǎn)品具有極高的可靠性與卓越的長期穩(wěn)定性。
傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應、抗干擾能力強、性價比極高等優(yōu)點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數(shù)以程序的形式儲存在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡易快捷,超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則,數(shù)字量輸出,適用于簡單的溫濕度測量場景。
傳感器測量精度
傳感器的測量精度如下圖表所示,其精度比較有限,測量分辨率分別為 8bit(溫度)、8bit(濕度) 。
傳感器原理圖
模塊電路圖如下所示,其中Data管腳使用4.7K上拉電阻,當實際傳輸距離大于20米時需要根據(jù)實際情況來選用合適的上拉電阻。
各引腳說明
DHT11各引腳說明如下
電氣特性
單線雙向串行接口
DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說明。當前小數(shù)部分用于以后擴展,現(xiàn)讀出為零。
操作流程如下:
一次完整的數(shù)據(jù)傳輸為40bit,高位先出。
數(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ù) ”所得結果的末8位。
用戶MCU發(fā)送一次開始信號后,DHT11從低功耗模式轉換到高速模式,等待主機開始信號結束后,DHT11發(fā)送響應信號,送出40bit的數(shù)據(jù),并觸發(fā)一次信號采集,用戶可選擇讀取部分數(shù)據(jù)。從模式下,DHT11接收到開始信號觸發(fā)一次溫濕度采集,如果沒有接收到主機發(fā)送開始信號,DHT11不會主動進行溫濕度采集,采集數(shù)據(jù)后轉換到低速模式。
通訊過程如下圖所示
總線空閑狀態(tài)為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發(fā)送80us低電平響應信號。主機發(fā)送開始信號結束后,延時等待20-40us后, 讀取DHT11的響應信號,主機發(fā)送開始信號后,可以切換到輸入模式或者輸出高電平均可,總線由上拉電阻拉高。
總線為低電平說明DHT11發(fā)送響應信號,DHT11發(fā)送響應信號后,再把總線拉高80us,準備發(fā)送數(shù)據(jù),每一bit數(shù)據(jù)都以50us低電平時隙開始,高電平的長短定了數(shù)據(jù)位是0還是1。如果讀取響應信號為高電平,則DHT11沒有響應,請檢查線路是否連接正常。當最后一bit數(shù)據(jù)傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態(tài)。
其他信息
(1)手動焊接,在最高260 ℃ 的溫度條件下接觸時間須少于10秒。
(2)避免結露情況下使用。
(3)長期保存條件:溫度10-40 ℃ ,濕度60%以下。
(4)DATA信號線材質(zhì)量會影響通訊距離和通訊質(zhì)量,推薦使用高質(zhì)量屏蔽線
二、接線方式
本文主要基于STM32F103C8T6實現(xiàn)DHT11溫濕度傳感器數(shù)據(jù)采集并顯示在0.96寸OLED液晶屏幕上,具體接線方式如下
DHT11接線方式
STM32F103C8T6 | DHT11 |
---|---|
3V3 | VCC |
GND | GND |
A8 | IO |
OLED液晶接線方式
STM32F103C8T6 | OLED |
---|---|
3V3 | VCC |
GND | GND |
B8 | SCL |
B9 | SDA |
三、程序例程及注釋(完整見文末鏈接)
主函數(shù)如下:
int main (void)
{
delay_init(); //延時函數(shù)初始化
OLED_Init(); //初始化OLED
OLED_Clear(0); //清除屏幕
OLED_ShowString(2, 0, "Temp:",16);
OLED_ShowString(2, 2, "Hum:",16);
while (1)
{
//不能保證你每次發(fā)出去的數(shù)據(jù)傳感器都能正確響應(可能傳感器解析時時間不對等原因),所以要多發(fā)幾次,有響應回來就行
if(dht11_read_data(buf)==0){
hum = buf[0] + buf[1] / 10.0;
temp = buf[2] + buf[3] / 10.0;
OLED_ShowNum(52, 0, temp, 4, 16); //顯示溫度信息
OLED_ShowString(85, 0, ".C",16);
OLED_ShowNum(52, 2, hum, 4, 16); //顯示濕度信息
OLED_ShowString(85, 2, "%H",16);
}
delay_ms(2000);
}
}
DHT11讀取函數(shù)
u16 dht11_read_data(u8 buffer[5])
{
u16 i = 0;
u8 checksum;
dht11_reset();//發(fā)送起始信號
if (dht11_scan() == RESET)
{
//等待響應信號結束
while (dht11_scan() == RESET);
while (dht11_scan() == SET);
for (i = 0; i < 5; i++)
{
buffer[i] = dht11_read_byte();
}
while (dht11_scan() == RESET);//接收結束,拉高片選
dht11_gpio_output();
DHT11_OUT_H;
checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];//校驗數(shù)據(jù)
if (checksum != buffer[4])
{
// checksum error
return 1;
}
}
return 0;
}
四、實物調(diào)試
搭建的實物如下圖所示,接線就是按照上述接線圖來的,OLED液晶顯示的溫濕度數(shù)據(jù)如下,溫濕度數(shù)據(jù)獲取成功文章來源:http://www.zghlxwxcb.cn/news/detail-578833.html
附:完整資源獲取鏈接
百度網(wǎng)盤鏈接:https://pan.baidu.com/s/1Q_j6gZO69nUe2NOB8FF45w
提取碼:ssn2文章來源地址http://www.zghlxwxcb.cn/news/detail-578833.html
到了這里,關于STM32--DHT11溫濕度傳感器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!