news 2026/4/21 16:25:51

用STM32CubeMX和HAL库,5分钟搞定DHT11温湿度传感器(附OLED显示项目)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用STM32CubeMX和HAL库,5分钟搞定DHT11温湿度传感器(附OLED显示项目)

STM32CubeMX与HAL库实战:5分钟构建DHT11温湿度监测系统(OLED显示版)

1. 项目概述与环境搭建

在物联网和智能硬件开发领域,温湿度监测是最基础却最实用的功能之一。使用STM32CubeMX配合HAL库,我们可以快速搭建一个完整的温湿度监测系统。这个项目将使用DHT11传感器采集环境数据,并通过OLED屏幕实时显示,整个过程仅需5分钟配置即可完成核心框架。

硬件准备清单

  • STM32F103C8T6开发板(Blue Pill)
  • DHT11温湿度传感器
  • 0.96寸OLED显示屏(I2C接口)
  • 杜邦线若干
  • USB转TTL模块(可选,用于调试)

提示:DHT11采用单总线协议,仅需一个GPIO引脚;OLED通常使用I2C接口,需连接SCL和SDA两条线。

2. STM32CubeMX工程配置

2.1 时钟与系统配置

  1. 打开STM32CubeMX,新建工程选择对应型号
  2. 在RCC配置中启用外部高速时钟(HSE)
  3. 在SYS中配置调试接口为Serial Wire
// 自动生成的时钟配置代码(部分) SystemClock_Config(); HAL_Init();

2.2 GPIO与通信接口配置

外设配置项参数
DHT11GPIO模式开漏输出
I2C1速度模式标准模式(100kHz)
OLEDI2C地址0x78(默认)

关键配置步骤

  1. 为DHT11选择一个GPIO(如PB5),配置为输出模式
  2. 启用I2C1外设,保持默认参数
  3. 生成工程时勾选"Generate peripheral initialization as a pair of .c/.h files"

3. DHT11驱动实现

3.1 单总线协议解析

DHT11的通信时序包含三个关键阶段:

  1. 主机启动信号(至少18ms低电平)
  2. 传感器响应信号(80us低电平+80us高电平)
  3. 数据传输阶段(每个bit以50us低电平开始)
// DHT11读取函数示例 uint8_t DHT11_Read(void) { uint8_t data = 0; DHT11_GPIO_Init(OUTPUT); HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_RESET); HAL_Delay(20); // 保持低电平至少18ms HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_SET); DHT11_GPIO_Init(INPUT); // 等待传感器响应 while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET); while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET); while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET); // 读取40位数据 for(int i=0; i<8; i++) { while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET); 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) == GPIO_PIN_SET); } } return data; }

3.2 数据校验与处理

DHT11传输的5字节数据格式:

  1. 湿度整数部分
  2. 湿度小数部分(DHT11固定为0)
  3. 温度整数部分
  4. 温度小数部分(DHT11固定为0)
  5. 校验和(前4字节和)

注意:实际项目中建议添加超时机制,防止程序卡死在等待状态。

4. OLED显示驱动

4.1 I2C通信基础

OLED显示通常采用SSD1306驱动芯片,通过I2C接口通信。HAL库提供了简洁的API:

// OLED写命令函数 void OLED_WriteCmd(uint8_t cmd) { HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 100); } // OLED写数据函数 void OLED_WriteData(uint8_t data) { HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT, &data, 1, 100); }

4.2 显示优化技巧

  • 页面寻址模式:将屏幕分为8页,每页8行像素
  • 双缓冲技术:先写入内存再整体刷新,避免闪烁
  • 自定义字体:使用取模软件生成特定大小的字体
// 显示字符串函数示例 void OLED_ShowString(uint8_t x, uint8_t y, char *str) { while(*str) { OLED_ShowChar(x, y, *str++); x += 8; if(x > 120) { x = 0; y += 2; } } }

5. 系统集成与优化

5.1 主程序逻辑设计

graph TD A[系统初始化] --> B[OLED初始化] B --> C[DHT11初始化] C --> D[读取温湿度] D --> E[数据格式化] E --> F[OLED显示] F --> D

5.2 性能优化建议

  1. 低功耗模式:在两次采集间隔进入STOP模式
  2. 数据滤波:采用滑动平均算法处理传感器数据
  3. 异常处理:添加传感器断线检测机制
// 主循环示例 while(1) { if(DHT11_ReadData(&temp, &humi) == DHT11_OK) { sprintf(buffer, "Temp:%dC", temp); OLED_ShowString(0, 0, buffer); sprintf(buffer, "Humi:%d%%", humi); OLED_ShowString(0, 2, buffer); } HAL_Delay(2000); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); }

6. 常见问题解决

问题1:DHT11无响应

  • 检查接线是否正确(VCC、DATA、GND)
  • 确认上拉电阻(4.7KΩ)已连接
  • 测量电源电压(3.3V-5V)

问题2:OLED显示异常

  • 确认I2C地址(0x78或0x7A)
  • 检查I2C线序(SCL、SDA)
  • 尝试降低I2C时钟速度

问题3:数据跳动严重

  • 增加软件滤波算法
  • 检查电源稳定性
  • 避免传感器附近有强烈气流

实际调试中发现,DHT11对时序要求严格,微秒级延时误差可能导致读取失败。建议使用定时器实现精确延时,而非简单的循环延时。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 16:24:18

FModel终极指南:快速掌握虚幻引擎游戏资源提取与管理

FModel终极指南&#xff1a;快速掌握虚幻引擎游戏资源提取与管理 【免费下载链接】FModel Unreal Engine Archives Explorer 项目地址: https://gitcode.com/gh_mirrors/fm/FModel FModel是一款专为虚幻引擎游戏设计的专业资源浏览器&#xff0c;让你能够直接访问、预览…

作者头像 李华
网站建设 2026/4/21 16:24:10

ARM裸机开发与UART驱动实现详解

1. ARM裸机开发与UART驱动基础在嵌入式系统开发领域&#xff0c;裸机编程(Bare-metal Programming)是指不依赖任何操作系统&#xff0c;直接操作硬件寄存器的开发方式。这种方式常见于bootloader、实时控制系统和资源受限的嵌入式设备中。UART(Universal Asynchronous Receiver…

作者头像 李华
网站建设 2026/4/21 16:18:34

从 16 亿营收的 Momcozy 看:AI Agent 怎么做海外电商战略分析

【AI Agent 电商 Ep.01】附完整 Prompt 包 5 道调研题 以 Momcozy 为例 可复用 SOP— 01 一个反常识的开场 先问你一个问题。 如果我告诉你&#xff0c;在你眼皮底下&#xff0c;有一家深圳公司——2017 年才成立、A 轮融资、深圳普通写字楼里、500 人团队——去年干出了…

作者头像 李华
网站建设 2026/4/21 16:16:59

**柔性电子驱动下的嵌入式编程新范式:基于Python的可拉伸传感器数据采集系统设计与实现**在柔性电子技术快速发展的今天,传统刚性

柔性电子驱动下的嵌入式编程新范式&#xff1a;基于Python的可拉伸传感器数据采集系统设计与实现 在柔性电子技术快速发展的今天&#xff0c;传统刚性电路已无法满足穿戴设备、智能医疗和人机交互等新兴场景的需求。如何将柔性传感模块与嵌入式开发深度融合&#xff1f;本文以一…

作者头像 李华