【DigiKey好物畅享】ST NUCLEO-H7S3L8开发板单总线采集温湿度数据

一、前言

在物联网与嵌入式应用中,环境温湿度监测是一项基础且关键的功能。NUCLEO-H7S3L8开发板以其高性能处理能力与丰富外设接口,为传感器数据采集提供了理想平台。本项目利用该开发板,通过单总线(1-Wire)通信协议,实现了对DHT11数字温湿度传感器的高效、稳定数据采集。本报告将系统介绍硬件连接、驱动实现与数据解析的全过程,为同类应用提供可复用的参考方案。

二、简介

硬件介绍

  1. NUCLEO-H7S3L8开发板核心特性:

    • 主控芯片:STM32H7S3L8H6(Cortex-M7 @ 600MHz)
    • 丰富GPIO与定时器资源,支持精确时序控制
    • 板载ST-LINK调试器,便于程序烧录与实时调试
  2. 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秒。
2026-01-18_19-46-38

五、总结

本项目成功基于NUCLEO-H7S3L8开发板实现了DHT11传感器的温湿度数据采集。单总线协议通过精确的GPIO时序控制得以可靠实现,展现了该开发板在实时控制方面的优势。项目具有以下特点:

主要成果

  • 轻量高效的驱动设计:不依赖额外库,仅用HAL基础函数完成通信
  • 鲁棒的通信机制:包含超时重试与数据校验,适应不稳定环境
  • 即插即用的演示框架:连接简单,代码可快速移植至其他STM32系列

优化建议

  • 可结合定时器输入捕获实现更精准的时序测量
  • 扩展MicroSD卡或无线模块实现数据本地存储/远程传输

本方案为基于单总线传感器的数据采集提供了完整范例,开发者可参照此框架适配DS18B20等同类传感器,快速构建环境监测节点。