一、前言
在物联网与嵌入式应用中,环境温湿度监测是一项基础且关键的功能。NUCLEO-H7S3L8开发板以其高性能处理能力与丰富外设接口,为传感器数据采集提供了理想平台。本项目利用该开发板,通过单总线(1-Wire)通信协议,实现了对DHT11数字温湿度传感器的高效、稳定数据采集。本报告将系统介绍硬件连接、驱动实现与数据解析的全过程,为同类应用提供可复用的参考方案。
二、简介
硬件介绍
-
NUCLEO-H7S3L8开发板核心特性:
- 主控芯片:STM32H7S3L8H6(Cortex-M7 @ 600MHz)
- 丰富GPIO与定时器资源,支持精确时序控制
- 板载ST-LINK调试器,便于程序烧录与实时调试
-
DHT11温湿度传感器特性:
- 集成数字信号输出,免额外ADC
- 单总线数据传输,仅需一根数据线
- 测量范围:湿度20-90%RH(±5%),温度0-50℃(±2℃)
- 响应快、功耗低、性价比高
功能介绍
本项目实现通过单总线协议与DHT11传感器通信,实时采集环境温湿度数据,并通过以下方式输出:
- 开发板用户LED(LD1)闪烁指示采集状态
- USART1串口(波特率115200)向上位机连续发送数据
- 采集间隔可配置(默认2秒),数据格式清晰可读
三、项目配置
1. 硬件连接
| NUCLEO-H7S3L8引脚 | DHT11引脚 | 说明 |
|---|---|---|
| PA8(GPIO输出) | DATA | 单总线数据线,需接4.7kΩ上拉电阻至3.3V |
| 3.3V | VCC | 电源正极 |
| GND | GND | 电源地 |
2. 软件环境
- 开发工具:STM32CubeIDE v1.19.0
- 固件库:STM32CubeH7 HAL库 v1.12.1
- 关键配置步骤:
- a. 在STM32CubeMX中使能USART1(异步模式,115200-8-N-1)
- b. 配置PA8为GPIO_Output模式,默认推挽上拉
- c. 启用SysTick定时器作为延时基准
- d. 生成工程代码并导入IDE
3. 驱动实现要点
- 单总线时序控制:利用HAL库微秒级延时实现启动、响应、数据位读写时序
- 数据校验:对接收的5字节(湿度整数/小数、温度整数/小数、校验和)进行校验和验证
- 错误处理:加入超时检测与重试机制(最多3次),确保通信鲁棒性
四、功能展示
1. 运行流程
上电初始化 → 发送开始信号 → 等待传感器响应 →
读取40位数据 → 校验数据 → 串口输出 → LED闪烁 → 延时等待下一周期
2. 核心代码逻辑(简化示例)
// 读取DHT11数据
int DHT11_Read_Data(DHT11_Data *data)
{
uint8_t buffer[5] = {0};
uint8_t i, j;
uint32_t timeout;
// 主机发送开始信号
DHT11_Set_Output();
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET);
HAL_Delay(18);
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET);
Delay_us(30);
// 等待DHT11响应
DHT11_Set_Input();
timeout = 1000;
while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET && timeout--);
if(timeout == 0) return -1;
timeout = 1000;
while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET && timeout--);
if(timeout == 0) return -1;
timeout = 1000;
while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET && timeout--);
if(timeout == 0) return -1;
// 读取40位数据
for(i = 0; i < 5; i++) {
for(j = 0; j < 8; j++) {
timeout = 1000;
while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET && timeout--);
if(timeout == 0) return -1;
Delay_us(40);
buffer[i] <<= 1;
if(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET) {
buffer[i] |= 0x01;
}
timeout = 1000;
while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET && timeout--);
if(timeout == 0) return -1;
}
}
// 检查校验和
if(buffer[0] + buffer[1] + buffer[2] + buffer[3] == buffer[4]) {
data->humidity = buffer[0] + buffer[1] / 10.0;
data->temperature = buffer[2] + buffer[3] / 10.0;
return 0;
} else {
return -1;
}
}
3. 输出结果
串口终端持续显示(示例):
[2026-02-01 16:30:28] Temp: 21.8°C, Humi: 53.0% RH
[2026-02-01 16:30:30] Temp: 21.9°C, Humi: 53.1% RH
数据更新间隔稳定为2秒。

五、总结
本项目成功基于NUCLEO-H7S3L8开发板实现了DHT11传感器的温湿度数据采集。单总线协议通过精确的GPIO时序控制得以可靠实现,展现了该开发板在实时控制方面的优势。项目具有以下特点:
主要成果
- 轻量高效的驱动设计:不依赖额外库,仅用HAL基础函数完成通信
- 鲁棒的通信机制:包含超时重试与数据校验,适应不稳定环境
- 即插即用的演示框架:连接简单,代码可快速移植至其他STM32系列
优化建议
- 可结合定时器输入捕获实现更精准的时序测量
- 扩展MicroSD卡或无线模块实现数据本地存储/远程传输
本方案为基于单总线传感器的数据采集提供了完整范例,开发者可参照此框架适配DS18B20等同类传感器,快速构建环境监测节点。

