基于 STM32 的 SHT40 温湿度传感器驱动与数据读取

1. 前言

在智能家居、气象监测、农业种植等场景中,温湿度采集是非常基础且重要的功能。
本文将以 Sensirion SHT40 数字温湿度传感器为例,基于 STM32(HAL 库)进行驱动开发,并通过 I2C 总线读取温湿度数据。

SHT40 属于 Sensirion SHT4x 系列,具备以下特点:

  • 高精度:±0.2°C(温度),±1.8%RH(湿度)

  • 低功耗:适用于电池供电设备

  • I2C 接口:通信简单可靠

  • 出厂校准:直接返回补偿后的温湿度值


2. SHT40 硬件接口与通信原理

SHT40 采用 I2C 通信,地址为 0x44(7 位地址模式)。主要引脚:

引脚 功能 说明
VDD 电源 2.4~5.5V
GND 0V
SDA 数据 I2C 数据线
SCL 时钟 I2C 时钟线

通信流程如下:

  1. MCU 通过 I2C 发送测量命令

  2. SHT40 内部采集温湿度

  3. 延时等待测量完成

  4. MCU 读取 6 字节数据(温度 2B + CRC1 + 湿度 2B + CRC2)

  5. 对温湿度数据进行公式转换

常用命令(官方 Datasheet):

命令 功能 响应时间
0xFD 高精度测量 ~9 ms
0xF6 中精度测量 ~4 ms
0xE0 软复位

3. 驱动代码实现

3.1 I2C 初始化

// 在 CubeMX 中开启 I2C1(100kHz 或 400kHz 均可)
I2C_HandleTypeDef hi2c1;

3.2 SHT40 驱动代码

#include "main.h"
#include "i2c.h"
#include "stdio.h"

#define SHT40_ADDR 0x44 << 1  // 7位地址左移1位
#define SHT40_CMD_HIGH_PRECISION 0xFD

uint8_t sht40_read(uint8_t *data)
{
    // 发送高精度测量命令
    if (HAL_I2C_Master_Transmit(&hi2c1, SHT40_ADDR, (uint8_t*)&SHT40_CMD_HIGH_PRECISION, 1, HAL_MAX_DELAY) != HAL_OK)
        return 1;

    HAL_Delay(10); // 等待测量完成(官方建议≥9ms)

    // 读取 6 字节数据
    if (HAL_I2C_Master_Receive(&hi2c1, SHT40_ADDR, data, 6, HAL_MAX_DELAY) != HAL_OK)
        return 2;

    return 0;
}

float sht40_get_temperature(uint16_t rawT)
{
    // 转换公式来自 SHT40 数据手册
    return -45.0f + 175.0f * (rawT / 65535.0f);
}

float sht40_get_humidity(uint16_t rawRH)
{
    return -6.0f + 125.0f * (rawRH / 65535.0f);
}

3.3 主函数调用

uint8_t rxData[6];
uint16_t rawT, rawRH;
float temperature, humidity;

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_I2C1_Init();

    while (1)
    {
        if (sht40_read(rxData) == 0)
        {
            rawT = (rxData[0] << 8) | rxData[1];
            rawRH = (rxData[3] << 8) | rxData[4];

            temperature = sht40_get_temperature(rawT);
            humidity = sht40_get_humidity(rawRH);

            printf("温度: %.2f ℃  湿度: %.2f %%RH\r\n", temperature, humidity);
        }
        else
        {
            printf("SHT40 读取失败\r\n");
        }

        HAL_Delay(1000);
    }
}

4. 运行效果

串口输出示例:

温度: 26.45 ℃  湿度: 58.32 %RH
温度: 26.48 ℃  湿度: 58.40 %RH

此时 SHT40 实时采集的温湿度会每秒刷新一次。


5. CRC 校验(可选)

SHT40 返回的 6 字节数据中,每组温度/湿度值后面都带有 1 个 CRC 校验字节。
如果对数据完整性要求较高,可以增加 CRC 检查功能:

uint8_t sht40_crc8(const uint8_t *data, int len)
{
    uint8_t crc = 0xFF;
    for (int i = 0; i < len; i++)
    {
        crc ^= data[i];
        for (uint8_t b = 0; b < 8; b++)
        {
            crc = (crc & 0x80) ? (crc << 1) ^ 0x31 : (crc << 1);
        }
    }
    return crc;
}

sht40_read() 里调用 CRC 校验,如果不匹配则丢弃数据。


6. 注意事项

  1. I2C 上拉电阻:SHT40 I2C 引脚需要 4.7kΩ 上拉到 VDD

  2. 电源稳定:VDD 建议加 100nF 去耦电容

  3. 延时足够:测量延时低于 9ms 会导致数据错误

  4. CRC 校验:工业级应用建议启用 CRC 校验

  5. 防结露:高湿度环境建议定期加热探头(SHT40 内部支持加热功能)


7. 总结

本文介绍了 SHT40 的基本特性、I2C 通信原理以及 STM32 驱动实现方法。
使用 HAL 库仅需简单几步,即可完成温湿度采集,非常适合嵌入式初学者快速上手。

如果你需要更复杂的功能(如加热、低功耗模式、CRC 校验),可以进一步参考官方 Datasheet 进行扩展。


参考资料

  • Sensirion 官方 SHT40 数据手册

  • STM32 HAL I2C 编程手册

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐