首页
/ 基于STM32与DHT20通过I2C接口实现温湿度采集

基于STM32与DHT20通过I2C接口实现温湿度采集

2025-08-20 02:06:48作者:尤辰城Agatha

1. 适用场景

基于STM32与DHT20传感器的温湿度采集方案适用于多种物联网和嵌入式应用场景。该方案特别适合需要精确环境监测的场合,如智能家居系统中的室内环境监控、农业温室大棚的温湿度控制、工业自动化中的环境参数监测、以及医疗设备中的环境条件保障等。

DHT20传感器作为DHT11的升级版本,具有更高的测量精度和更广的测量范围,通过I2C接口与STM32微控制器通信,简化了硬件连接和软件开发流程。这种组合为开发者提供了一个稳定可靠、成本效益高的温湿度监测解决方案。

2. 适配系统与环境配置要求

硬件要求

  • 主控制器:STM32系列微控制器(如STM32F103、STM32F407等)
  • 传感器:DHT20温湿度传感器模块
  • 电源:3.3V-5.5V直流电源
  • 连接线:4线连接(VCC、GND、SDA、SCL)

软件要求

  • 开发环境:STM32CubeIDE或Keil MDK
  • 库文件:STM32 HAL库
  • 通信协议:I2C协议支持

电气特性

  • 工作电压:3.3V-5.5V DC
  • 工作电流:<1mA(测量时)
  • 待机电流:40-50μA
  • I2C地址:0x38(固定不可更改)
  • 通信速率:最高400kHz

3. 资源使用教程

硬件连接

将DHT20传感器与STM32按照以下方式连接:

  • VCC引脚连接到STM32的3.3V电源
  • GND引脚连接到STM32的地线
  • SDA引脚连接到STM32的I2C数据线(如PB7)
  • SCL引脚连接到STM32的I2C时钟线(如PB6)

STM32CubeMX配置

  1. 打开STM32CubeMX并选择目标STM32型号
  2. 在Pinout视图中启用I2C外设
  3. 配置I2C参数:
    • 模式:I2C
    • 时钟速度:100kHz(标准模式)
    • 地址位:7位
  4. 生成初始化代码

软件实现

#include "main.h"
#include "dht20.h"

I2C_HandleTypeDef hi2c1;

void DHT20_Init(void)
{
    uint8_t init_cmd[3] = {0xAC, 0x33, 0x00};
    HAL_I2C_Master_Transmit(&hi2c1, DHT20_ADDRESS << 1, init_cmd, 3, 100);
    HAL_Delay(10);
}

void DHT20_ReadData(float *temperature, float *humidity)
{
    uint8_t data[6];
    uint8_t read_cmd = 0x71;
    
    // 发送读取命令
    HAL_I2C_Master_Transmit(&hi2c1, DHT20_ADDRESS << 1, &read_cmd, 1, 100);
    HAL_Delay(80);
    
    // 读取6字节数据
    HAL_I2C_Master_Receive(&hi2c1, DHT20_ADDRESS << 1, data, 6, 100);
    
    // 数据处理
    uint32_t hum_raw = ((data[1] << 12) | (data[2] << 4) | (data[3] >> 4));
    uint32_t temp_raw = (((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5]);
    
    *humidity = (hum_raw * 100.0) / 1048576.0;
    *temperature = (temp_raw * 200.0) / 1048576.0 - 50.0;
}

主程序调用

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_I2C1_Init();
    
    DHT20_Init();
    
    while (1)
    {
        float temp, hum;
        DHT20_ReadData(&temp, &hum);
        
        printf("Temperature: %.1f°C, Humidity: %.1f%%\r\n", temp, hum);
        HAL_Delay(2000);
    }
}

4. 常见问题及解决办法

问题1:传感器无法初始化

症状:读取数据始终为0或错误值 解决方法

  • 检查电源电压是否在3.3V-5.5V范围内
  • 确认I2C线路连接正确,SDA和SCL线没有接反
  • 检查上拉电阻,DHT20模块通常内置4.7kΩ上拉电阻
  • 确保I2C地址设置为0x38

问题2:数据读取不稳定

症状:温湿度值跳动较大或出现异常值 解决方法

  • 增加读取后的数据校验,检查状态位
  • 在两次读取之间增加适当延时(建议至少2秒)
  • 检查电源稳定性,避免电压波动
  • 确保传感器远离热源和潮湿环境

问题3:I2C通信失败

症状:HAL_I2C函数返回错误 解决方法

  • 检查I2C时钟配置是否正确
  • 确认GPIO引脚模式设置为开漏输出
  • 使用I2C扫描工具检测设备是否在线
  • 检查线路长度,过长可能导致信号衰减

问题4:精度偏差

症状:测量值与实际环境有较大偏差 解决方法

  • 让传感器在测量环境中稳定运行一段时间
  • 避免将传感器放置在通风口或阳光直射位置
  • 定期进行传感器校准(如需高精度应用)

性能优化建议

  • 使用DMA模式进行I2C数据传输以提高效率
  • 实现错误重试机制,提高通信可靠性
  • 添加数据滤波算法,平滑测量结果
  • 采用低功耗模式,延长电池供电设备的使用时间

通过遵循上述指南,开发者可以快速实现基于STM32和DHT20的温湿度采集系统,获得稳定可靠的环境监测数据。