DHT11數字溫濕度傳感器驅動開發全解析(下) | 零基礎入門STM32第八十八步

主題內容教學目的/擴展視頻
DHT11芯片電路連接,手冊分析。驅動程序,讀出數據。能讀出溫濕度值即可。

師從洋桃電子,杜洋老師


📑文章目錄

    • 一、硬件接口與通信原理
      • 1.1 硬件連接拓撲
      • 1.2 單總線通信時序
    • 二、驅動代碼深度解析(dht11.c)
      • 2.1 GPIO模式切換
      • 2.2 起始信號生成
      • 2.3 單bit數據讀取
      • 2.4 單字節數據讀取
      • 2.5 完整數據讀取流程
    • 三、關鍵優化策略
      • 3.1 時序精度提升
      • 3.2 錯誤重試機制
      • 3.3 數據濾波處理
    • 四、典型應用場景
    • 五、開發注意事項
    • 六、相關資源


▲ 回顧上期🔍DHT11數字溫濕度傳感器驅動開發全解析(上) | 零基礎入門STM32第八十六步

▲ 回顧上期🔍DHT11數字溫濕度傳感器驅動開發全解析(中) | 零基礎入門STM32第八十七步


一、硬件接口與通信原理

1.1 硬件連接拓撲

引腳連接目標說明
VDD3.3V電源供電范圍3-5.5V DC
DATAPA15單總線雙向通信引腳
GND系統GND電源參考地

1.2 單總線通信時序

MCU DHT11 拉低總線≥18ms(起始信號) 80μs低電平響應 發送40bit數據包 數據格式:濕度整數(8b)+濕度小數(8b)+溫度整數(8b)+溫度小數(8b)+校驗和(8b) 數據校驗與解析 MCU DHT11

二、驅動代碼深度解析(dht11.c)

2.1 GPIO模式切換

// 設置為推挽輸出模式
void DHT11_IO_OUT(void) {GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = DHT11_IO;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽輸出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 高速模式GPIO_Init(DHT11PORT, &GPIO_InitStruct);
}// 設置為上拉輸入模式
void DHT11_IO_IN(void) {GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = DHT11_IO;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;     // 上拉輸入GPIO_Init(DHT11PORT, &GPIO_InitStruct);
}

設計要點

  • 輸出模式用于主機控制總線電平
  • 輸入模式配合上拉電阻保證總線穩定
  • 50MHz速度滿足單總線時序要求

2.2 起始信號生成

void DHT11_RST(void) {DHT11_IO_OUT();                 // 切換輸出模式GPIO_ResetBits(DHT11PORT, DHT11_IO); // 拉低總線delay_ms(20);                   // 保持低電平20ms(手冊要求≥18ms)GPIO_SetBits(DHT11PORT, DHT11_IO);   // 釋放總線delay_us(30);                   // 等待20-40us
}

時序控制

  • 20ms低電平:確保滿足最小18ms要求
  • 30us高電平:預留足夠響應時間

2.3 單bit數據讀取

u8 Dht11_ReadBit(void) {u8 retry = 0;// 等待50us低電平起始信號while(GPIO_ReadInputDataBit(DHT11PORT,DHT11_IO) && retry<100) {retry++;delay_us(1);}retry = 0;// 等待高電平到來while(!GPIO_ReadInputDataBit(DHT11PORT,DHT11_IO) && retry<100) {retry++;delay_us(1);}delay_us(40); // 關鍵采樣點return GPIO_ReadInputDataBit(DHT11PORT,DHT11_IO) ? 1 : 0;
}

解碼原理

  • 26-28μs高電平:數據0
  • 70μs高電平:數據1
  • 40μs延遲采樣:準確區分高低電平

2.4 單字節數據讀取

u8 Dht11_ReadByte(void) {u8 i, dat = 0;for(i=0; i<8; i++) {dat <<= 1;        // 高位先出dat |= Dht11_ReadBit();}return dat;
}

位操作邏輯

  1. 左移操作保留高位
  2. 按位或操作累積數據位
  3. 循環8次組成完整字節

2.5 完整數據讀取流程

u8 DHT11_ReadData(u8 *h) {u8 buf[5];DHT11_RST(); // 發送起始信號if(Dht11_Check() == 0) {        // 檢測傳感器響應for(int i=0; i<5; i++) {    // 讀取5字節數據buf[i] = Dht11_ReadByte();}// 校驗和驗證if((buf[0]+buf[1]+buf[2]+buf[3]) == buf[4]) {h[0] = buf[0]; // 濕度整數部分h[1] = buf[2]; // 溫度整數部分return 0;      // 成功標志}}return 1; // 失敗標志
}

數據格式解析

字節數據內容數值范圍
0濕度整數20-90%RH
1濕度小數固定為0
2溫度整數0-50℃
3溫度小數固定為0
4校驗和前四字節和

三、關鍵優化策略

3.1 時序精度提升

// 使用硬件定時器替代delay_us
void Delay_us(uint16_t us) {TIM2->CNT = 0;while(TIM2->CNT < us);
}

3.2 錯誤重試機制

u8 DHT11_ReadData(u8 *h) {u8 retry = 3;while(retry--) {// ...讀取邏輯...if(校驗成功) return 0;delay_ms(100); // 重試間隔}return 1;
}

3.3 數據濾波處理

#define FILTER_SIZE 5
u8 filter_buf[FILTER_SIZE][2];void DHT11_Filter(u8 *h) {static u8 index = 0;// 存儲當前值filter_buf[index][0] = h[0];filter_buf[index][1] = h[1];index = (index+1) % FILTER_SIZE;// 排序取中值// ...實現排序算法...
}

四、典型應用場景

上電初始化
OLED顯示標題
DHT11初始化成功?
顯示溫濕度模板
顯示錯誤信息
循環讀取數據
讀取成功?
更新顯示數據
顯示讀取錯誤

五、開發注意事項

  1. 電源穩定性:建議并聯100nF陶瓷電容
  2. 信號線長度:超過20米需增加屏蔽措施
  3. 采樣間隔:嚴格≥1秒(手冊要求)
  4. 環境適應
    • 避免冷凝環境
    • 遠離發熱元件
    • 防止化學污染

六、相關資源

[1] 洋桃電子B站課程-STM32入門100步
[2] STM32官方文檔手冊
[3] STM32F103固件函數庫用戶手冊(中文)
[4] DHT11說明書(中文)
[5] DHT11溫濕度顯示程序


💬 技術討論(請在評論區留言~)

📌 下期預告:下一期將探討加速度傳感器,歡迎持續關注!

點擊查閱🔍往期【STM32專欄】文章

版權聲明:本文采用[CC BY-NC-SA 4.0]協議,轉載請注明來源
實測開發版:洋桃1號開發版(基于STM32F103C8T6)
更新日志

  • v1.0 初始版本(2025-03-30)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76439.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

24、網絡編程基礎概念

網絡編程基礎概念 網絡結構模式MAC地址IP地址子網掩碼端口網絡模型協議網絡通信的過程&#xff08;封裝與解封裝&#xff09; 網絡結構模式 C/S結構&#xff0c;由客戶機和服務器兩部分組成&#xff0c;如QQ、英雄聯盟 B/S結構&#xff0c;通過瀏覽器與服務器進程交互&#xf…

【超詳細】講解Ubuntu上如何配置分區方案

Ubuntu 的分區方案 一、通用分區方案&#xff08;200G為例&#xff09; EFI系統分區&#xff08;僅UEFI啟動模式需要&#xff0c;&#xff09; 大小&#xff1a;512MB–1GB類型&#xff1a;主分區&#xff08;FAT32格式&#xff09;掛載點&#xff1a;/boot/efi說明&#xff1…

函數的局部變量和全局變量的區分,Kimi的回答

這段代碼的目的是通過計算 2**i 和 5**i 的首位數字&#xff0c;并將這兩個首位數字的乘積添加到一個集合中&#xff0c;最終返回這些乘積的總和。下面是具體的解釋和問題的分析。 sum_t的角色&#xff1a; sum_t 是一個累加器&#xff0c;用來存儲所有獨特的&#xff08;不重復…

RNN模型及NLP應用(5/9)——多層RNN、雙向RNN、預訓練

聲明&#xff1a; 本文基于嗶站博主【Shusenwang】的視頻課程【RNN模型及NLP應用】&#xff0c;結合自身的理解所作&#xff0c;旨在幫助大家了解學習NLP自然語言處理基礎知識。配合著視頻課程學習效果更佳。 材料來源&#xff1a;【Shusenwang】的視頻課程【RNN模型及NLP應用…

【3.軟件工程】3.4 原型及相關模型

軟件開發模型進化論&#xff1a;從原型驅動到混合模型的完整指南 &#x1f504; 一、模型進化關系全景圖 #mermaid-svg-GcOFjt54gUs4oPeu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GcOFjt54gUs4oPeu .error-i…

硬件與軟件的邊界-從單片機到linux的問答詳解

硬件與軟件的邊界——從單片機到 Linux 設備驅動的問答詳解 在嵌入式開發和操作系統領域&#xff0c;經常會有人問&#xff1a; “如果一個設備里沒有任何代碼&#xff0c;硬件是不是依然會工作&#xff1f;例如&#xff0c;數據收發、寄存器數據存儲、甚至中斷觸發&#xff…

瑪卡巴卡的k8s知識點問答題(七)

25. 說明 Job 與 CronJob 的功能 Job 功能&#xff1a; 用于運行一次性任務&#xff08;批處理任務&#xff09;&#xff0c;確保一個或多個 Pod 成功完成任務后退出。 適用于數據處理、備份、測試等場景&#xff0c;任務完成后 Pod 不會自動重啟。 特點&#xff1a; 任務…

【NLP 51、一些LLM模型結構上的變化】

目錄 一、multi-head 共享 二、attention結構 1.傳統的Tranformer結構 2.GPTJ —— 平行放置的Transformer結構 三、歸一化層位置的選擇 1.Post LN&#xff1a; 2.Pre-LN【目前主流】&#xff1a; 3.Sandwich-LN&#xff1a; 四、歸一化函數選擇 1.傳統的歸一化函數 LayerNorm …

VS+Qt配置QtXlsx庫實現execl文件導入導出(全教程)

一、配置QtXlsx 1.1 下載解壓QtXlsxWriter&#xff08;在github下載即可&#xff09; 網址&#xff1a;https://github.com/dbzhang800/QtXlsxWriter 1.2 使用qt運行 點擊qtxlsx.pro運行QtXlsxWriter 選擇DesktopQt51211MSVC201564bit編譯器&#xff08;選擇自己本地電腦qt…

Golang的文件處理優化策略

Golang的文件處理優化策略 一、Golang的文件處理優化策略概述 是一門效率高、易于編程的編程語言&#xff0c;它的文件處理能力也非常強大。 在實際開發中&#xff0c;需要注意一些優化策略&#xff0c;以提高文件處理的效率和性能。 本文將介紹Golang中的文件處理優化策略&…

自學-C語言-基礎-數組、函數、指針、結構體和共同體、文件

這里寫自定義目錄標題 代碼環境&#xff1a;&#xff1f;問題思考&#xff1a;一、數組二、函數三、指針四、結構體和共同體五、文件問題答案&#xff1a; 代碼環境&#xff1a; Dev C &#xff1f;問題思考&#xff1a; 把上門的字母與下面相同的字母相連&#xff0c;線不能…

VMware+Ubuntu+VScode+ROS一站式教學+常見問題解決

目錄 一.VMware的安裝 二.Ubuntu下載 1.前言 2.Ubuntu版本選擇 三.VMware中Ubuntu的安裝 四.Ubuntu系統基本設置 1.中文更改 2.中文輸入法更改 3. 輔助工具 vmware tools 五.VScode的安裝ros基本插件 1.安裝 2.ros輔助插件下載 六.ROS安裝 1.安裝ros 2.配置ROS…

PostgreSQL pg_repack 重新組織表并釋放表空間

pg_repack pg_repack是 PostgreSQL 的一個擴展&#xff0c;它允許您從表和索引中刪除膨脹&#xff0c;并可選擇恢復聚集索引的物理順序。與CLUSTER和VACUUM FULL不同&#xff0c;它可以在線工作&#xff0c;在處理過程中無需對已處理的表保持獨占鎖定。pg_repack 啟動效率高&a…

5G_WiFi_CE_射頻輸出功率、發射功率控制(TPC)和功率密度測試

目錄 一、規范要求 1、法規目錄&#xff1a; &#xff08;1&#xff09;RF Output Power (2)Transmit Power Control (TPC) &#xff08;3&#xff09;Power Density 2、限值&#xff1a; 二、EIRP測試方法 &#xff08;1&#xff09;測試條件 &#xff08;2&#xff…

掃描線離散化線段樹解決矩形面積并-洛谷P5490

https://www.luogu.com.cn/problem/P5490 題目描述 求 n n n 個四邊平行于坐標軸的矩形的面積并。 輸入格式 第一行一個正整數 n n n。 接下來 n n n 行每行四個非負整數 x 1 , y 1 , x 2 , y 2 x_1, y_1, x_2, y_2 x1?,y1?,x2?,y2?&#xff0c;表示一個矩形的四個…

Java項目之基于ssm的簡易版營業廳寬帶系統(源碼+文檔)

項目簡介 簡易版營業廳寬帶系統實現了以下功能&#xff1a; 此營業廳寬帶系統利用當下成熟完善的SSM框架&#xff0c;使用跨平臺的可開發大型商業網站的Java語言&#xff0c;以及最受歡迎的RDBMS應用軟件之一的Mysql數據庫進行程序開發。實現了營業廳寬帶系統基礎數據的管理&…

從入門到入土,SQLServer 2022慢查詢問題總結

列為,由于公司原因,作者接觸了一個SQLServer 2022作為數據存儲到項目,可能是上一任的哥們兒離開的時候帶有情緒,所以現在項目的主要問題就是,所有功能都實現了,但是就是慢,列表頁3s打底,客戶很生氣,經過幾周摸爬滾打,作以下總結,作為自己的成長記錄。 一、索引問題…

PDF處理控件Aspose.PDF教程:在Python、Java 和 C# 中旋轉 PDF 文檔

您是否希望快速輕松地在線旋轉PDF文檔&#xff1f;無論您需要修復文檔的方向還是只想重新排列頁面&#xff0c;本指南都能滿足您的需求。有簡單的方法可以解決此問題 - 無論您喜歡在線工具還是編程解決方案。 在本指南中&#xff0c;我們將向您展示如何免費在線旋轉 PDF&#…

編譯原理:first集和follow

一、First 集&#xff08;首符號集&#xff09; 定義&#xff1a; 對于符號&#xff08;非終結符或終結符&#xff09;或符號串&#xff0c;First 集是該符號串能夠推導出的所有可能開頭的終結符的集合。若符號串可以推導出空串&#xff08;ε&#xff09;&#xff0c;則 ε 也…

python實現簡單fast-cgi服務,對接到nginx

python代碼 import socket import struct import threading# FastCGI 頭格式&#xff08;8 字節&#xff09; FCGI_HEADER_FORMAT "!BBHHBx" FCGI_VERSION 1 FCGI_TYPE_BEGIN_REQUEST 1 FCGI_TYPE_PARAMS 4 FCGI_TYPE_STDIN 5 FCGI_TYPE_STDOUT 6 FCGI_TYPE_E…