基于 STM32F103C8T6 的 SHT40 温湿度传感器驱动与数据读取
本文介绍了基于STM32微控制器(采用HAL库)驱动SHT40温湿度传感器的实现方法。SHT40是一款高精度数字温湿度传感器,具有±0.2℃温度精度和±1.8%RH湿度精度,采用I2C通信接口。文章详细说明了硬件连接、通信协议(7位地址0x44)、测量命令及数据读取流程,并提供了完整的驱动代码实现,包括I2C初始化、数据读取函数、温湿度转换公式等。同时指出实际应用中需注意上拉电阻、电源稳定性、测量
基于 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 时钟线 |
通信流程如下:
-
MCU 通过 I2C 发送测量命令
-
SHT40 内部采集温湿度
-
延时等待测量完成
-
MCU 读取 6 字节数据(温度 2B + CRC1 + 湿度 2B + CRC2)
-
对温湿度数据进行公式转换
常用命令(官方 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. 注意事项
-
I2C 上拉电阻:SHT40 I2C 引脚需要 4.7kΩ 上拉到 VDD
-
电源稳定:VDD 建议加 100nF 去耦电容
-
延时足够:测量延时低于 9ms 会导致数据错误
-
CRC 校验:工业级应用建议启用 CRC 校验
-
防结露:高湿度环境建议定期加热探头(SHT40 内部支持加热功能)
7. 总结
本文介绍了 SHT40 的基本特性、I2C 通信原理以及 STM32 驱动实现方法。
使用 HAL 库仅需简单几步,即可完成温湿度采集,非常适合嵌入式初学者快速上手。
如果你需要更复杂的功能(如加热、低功耗模式、CRC 校验),可以进一步参考官方 Datasheet 进行扩展。
参考资料:
-
Sensirion 官方 SHT40 数据手册
-
STM32 HAL I2C 编程手册
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)