
1. 项目概述与环境搭建在嵌入式开发领域环境监测是最基础也最实用的应用场景之一。作为STM32系列开发者的入门必修课温湿度监测项目能帮助我们掌握单总线通信、精确时序控制等核心技能。DHT11作为经典的数字温湿度传感器虽然精度不算顶尖温度±2℃湿度±5%RH但其简单的三线制接口和低廉的价格使其成为学习单总线协议的理想选择。1.1 硬件选型与连接DHT11模块通常有3pin和4pin两种封装我们以常见的3pin模块为例VCC接3.3V-5.5V电源STM32开发板通常提供3.3VDATA接GPIO引脚如PA1GND接地特别注意市面上DHT11模块的引脚顺序可能不同务必确认丝印标识。我曾遇到过VCC和GND反接导致传感器发烫的情况接反超过5秒就可能永久损坏传感器。1.2 CubeMX基础配置使用STM32CubeMX创建工程时关键配置步骤如下时钟树配置选择HSE外部高速时钟作为时钟源确保系统主频达到72MHzF103系列典型值调试接口SYS-Debug选择Serial WireSWD模式这是后续烧录和调试的基础GPIO设置将PA1设置为GPIO_Output模式初始电平设为High上拉标签命名为DHT11便于代码识别2. DHT11通信协议深度解析2.1 单总线协议工作原理DHT11采用单总线(1-Wire)协议这种协议的特点是仅使用一根数据线实现双向通信依靠精确的时序来区分0和1采用主从式通信MCU作为主机控制整个流程通信过程可分为三个阶段主机发送起始信号拉低≥18ms传感器响应信号拉低80us后拉高80us数据传输阶段40bit数据高位在前2.2 数据格式详解DHT11传输的40位数据包含湿度整数8bit湿度小数8bitDHT11固定为0温度整数8bit温度小数8bitDHT11固定为0校验和8bit前四个字节之和的低8位例如收到数据0x45 0x00 0x2C 0x00 0x71 解析过程湿度 0x45 69%RH温度 0x2C 44℃校验 0x450x000x2C0x00 0x71校验正确3. 关键代码实现与优化3.1 微秒级延时实现HAL库默认的HAL_Delay()最小单位是1ms而DHT11需要μs级延时。我们使用TIM2实现精确延时void delay_us(uint16_t us) { __HAL_TIM_SET_COUNTER(htim2, 0); HAL_TIM_Base_Start(htim2); while(__HAL_TIM_GET_COUNTER(htim2) us); HAL_TIM_Base_Stop(htim2); }定时器配置要点时钟源内部时钟72MHz预分频(PSC)7172分频后1MHz计数周期(ARR)6553516位最大值3.2 数据读取核心算法uint8_t DHT11_Read_Byte(void) { uint8_t data 0; for(int i0; i8; i){ while(!HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin)); //等待高电平 delay_us(40); //关键判断点 if(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin)){ data | (1(7-i)); while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin)); //等待结束 } } return data; }这个函数的核心在于40μs的延时判断高电平持续26-28μs表示0高电平持续70μs表示140μs正好是区分两者的最佳阈值4. 常见问题与调试技巧4.1 数据校验失败分析现象校验和不匹配返回错误数据 可能原因及解决方案现象可能原因解决方案固定返回0电源供电不足检查VCC电压建议加0.1uF去耦电容随机错误数据时序不精确改用定时器延时避免循环延时偶尔校验失败信号干扰DATA线加1kΩ上拉电阻缩短连线长度4.2 硬件连接检查清单电压测量VCC与GND之间应为3.3V-5V空闲时DATA线电压应≈VCC信号质量检查用示波器观察起始信号是否≥18ms检查传感器响应信号是否完整80us低80us高上拉电阻模块内置上拉可省略裸芯片必须外接4.7kΩ-10kΩ上拉5. 进阶优化与扩展5.1 低功耗模式适配对于电池供电设备可优化为采集间隔调至2-3秒DHT11最小采样周期1s采集后进入STOP模式通过RTC定时唤醒// 进入低功耗模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后需要重新初始化时钟 SystemClock_Config();5.2 多传感器组网方案单总线支持多个设备并联实现方法每个DHT11的DATA线并联通过不同的GPIO控制电源分时上电并读取数据注意这种方案会增加功耗建议采用SHT30等I2C传感器替代多DHT11方案。6. 替代方案对比当需要更高精度时可考虑以下传感器型号接口精度价格特点DHT111-Wire±2℃/±5%低简单易用SHT30I2C±0.2℃/±2%中工业级AHT20I2C±0.3℃/±2%中国产替代BME280I2C/SPI±0.5℃/±3%高集成气压对于需要长期稳定监测的场景建议选择SHT30或AHT20它们的温度漂移更小0.1℃/年。7. 项目经验总结在实际部署中我总结了以下经验要点防静电处理DHT11对ESD敏感焊接时需使用防静电烙铁防水措施湿度传感器忌结露可加装防水透气膜安装位置远离热源和通风口距被测表面2-5cm最佳数据滤波连续读取3次取中间值提高稳定性一个典型的滤波实现uint8_t DHT11_Get_Average(uint8_t *temp, uint8_t *humi) { uint8_t buf[3][2]; for(int i0; i3; i){ DHT11_Read_Data(buf[i][0], buf[i][1]); HAL_Delay(100); } // 排序取中值 Bubble_Sort(buf[0][0], buf[1][0], buf[2][0]); *temp buf[1][0]; Bubble_Sort(buf[0][1], buf[1][1], buf[2][1]); *humi buf[1][1]; }通过这个项目我们不仅掌握了单总线设备的驱动方法更重要的是理解了嵌入式开发中时序控制的精髓。这种精确控制硬件时序的能力在后续开发SPI、I2C等接口时同样适用。