基于STM32与SHT30的温湿度传感器模块设计
一、核心结论
基于STM32与SHT30的温湿度传感器模块是低成本、高精度、易集成的环境监测解决方案,适用于智能家居、工业控制、农业大棚等场景。SHT30作为新一代数字温湿度传感器,采用I2C接口(支持标准/快速模式),具备±0.2℃温度精度和±2%RH湿度精度,配合STM32的低功耗特性(如STM32L0系列)和丰富外设(I2C、ADC、定时器),可实现实时温湿度监测、数据记录、超限报警等功能。
关键优势:
-
高精度:温度±0.2℃(0-60℃),湿度±2%RH(20-80%RH);
-
低功耗:SHT30待机电流0.2μA,STM32休眠模式电流<1μA;
-
易扩展:I2C接口支持多设备并联(最多112个从机),可集成其他I2C传感器(如光照、气压)。
二、硬件设计
1. SHT30传感器模块介绍
-
核心参数:
-
测量范围:温度-40125℃,湿度0100%RH;
-
接口:I2C(地址0x44/0x45,默认0x44,ADDR引脚接VCC时0x45);
-
供电:2.4~5.5V DC(推荐3.3V);
-
封装:DFN-8(2.5×2.5×0.9mm),适合紧凑设计。
-
-
工作原理:采用CMOSens®技术,集成电容式湿度传感器和带隙温度传感器,通过I2C输出数字信号(含CRC校验)。
2. 电路连接(STM32与SHT30)
(1)硬件清单
-
STM32微控制器(如STM32F103C8T6、STM32L051C8T6);
-
SHT30模块(如Adafruit SHT31-D Breakout);
-
电源:3.3V DC(STM32与SHT30共电源);
-
上拉电阻:I2C总线需4.7kΩ上拉电阻(SDA、SCL引脚);
-
杜邦线、面包板(原型验证)或PCB(量产)。
(2)接线示意图
| SHT30引脚 | 功能 | STM32引脚 | 说明 |
|---|---|---|---|
| VCC | 电源正极 | 3.3V | 供电范围2.4~5.5V |
| GND | 电源负极 | GND | 共地 |
| SDA | I2C数据线 | PB7(I2C1_SDA) | 需4.7kΩ上拉电阻 |
| SCL | I2C时钟线 | PB6(I2C1_SCL) | 需4.7kΩ上拉电阻 |
| ADDR | 地址选择 | 悬空(默认0x44) | 接VCC时地址0x45 |
(3)电路原理图
+3.3V ────┬───── VCC (SHT30)
│
├─ 4.7kΩ ─── SDA (SHT30) ─── PB7 (STM32)
│
├─ 4.7kΩ ─── SCL (SHT30) ─── PB6 (STM32)
│
GND ─────┴───── GND (SHT30)
三、软件实现(基于STM32 HAL库)
1. 开发环境
-
IDE:STM32CubeIDE(免费,集成HAL库);
-
固件库:STM32CubeMX(配置外设)、HAL库(I2C、GPIO驱动);
-
调试工具:ST-Link V2(程序下载与调试)。
2. 核心代码实现
(1)I2C初始化(STM32CubeMX配置)
-
打开STM32CubeMX,选择目标芯片(如STM32F103C8T6);
-
配置I2C1:模式为“I2C”,速度“标准模式(100kHz)”;
-
配置GPIO:PB6(SCL)、PB7(SDA)为“Alternate Function Open Drain”,上拉使能;
-
生成代码(MDK-ARM或STM32CubeIDE工程)。
(2)SHT30驱动代码(HAL库)
#include "stm32f1xx_hal.h"
// SHT30 I2C地址(默认0x44,ADDR接GND)
#define SHT30_ADDR 0x44 << 1 // I2C地址需左移1位(7位地址+1位读写位)
// SHT30命令码(单次测量,高精度模式,时钟拉伸关闭)
#define SHT30_MEAS_CMD 0x2C06
I2C_HandleTypeDef hi2c1; // I2C句柄(由CubeMX生成)
// SHT30初始化
void SHT30_Init(I2C_HandleTypeDef *hi2c) {
// 检查设备是否存在(发送空读)
uint8_t dummy;
HAL_I2C_Master_Transmit(hi2c, SHT30_ADDR, &dummy, 0, 100);
if (HAL_I2C_GetError(hi2c) != HAL_I2C_ERROR_NONE) {
Error_Handler(); // 设备未响应,进入错误处理
}
}
// 读取温湿度数据(返回0成功,-1失败)
int SHT30_ReadData(I2C_HandleTypeDef *hi2c, float *temp, float *humi) {
uint8_t cmd[2] = {0x2C, 0x06}; // 单次测量命令(高重复率,时钟拉伸关闭)
uint8_t data[6]; // 接收数据:温度(2)+CRC(1) + 湿度(2)+CRC(1)
uint16_t raw_temp, raw_humi;
uint8_t crc_temp, crc_humi;
// 发送测量命令
if (HAL_I2C_Master_Transmit(hi2c, SHT30_ADDR, cmd, 2, 100) != HAL_OK) {
return -1; // 发送失败
}
// 等待测量完成(高精度模式约15ms)
HAL_Delay(15);
// 读取6字节数据
if (HAL_I2C_Master_Receive(hi2c, SHT30_ADDR, data, 6, 100) != HAL_OK) {
return -1; // 接收失败
}
// 解析数据(大端模式)
raw_temp = (data[0] << 8) | data[1];
crc_temp = data[2];
raw_humi = (data[3] << 8) | data[4];
crc_humi = data[5];
// CRC校验(多项式0x31,初始值0xFF)
if (CRC8_Check(raw_temp, crc_temp) != 0 || CRC8_Check(raw_humi, crc_humi) != 0) {
return -1; // CRC校验失败
}
// 转换为实际值(公式见SHT30 datasheet)
*temp = -45 + 175 * (raw_temp / 65535.0f); // 温度:-45~130℃
*humi = 100 * (raw_humi / 65535.0f); // 湿度:0~100%RH
return 0;
}
// CRC8校验函数(多项式0x31,初始值0xFF)
uint8_t CRC8_Check(uint16_t data, uint8_t crc_expected) {
uint8_t crc = 0xFF;
uint8_t data_arr[2] = {(uint8_t)(data >> 8), (uint8_t)data};
for (int i = 0; i < 2; i++) {
crc ^= data_arr[i];
for (int j = 0; j < 8; j++) {
if (crc & 0x80) crc = (crc << 1) ^ 0x31;
else crc <<= 1;
}
}
return (crc == crc_expected) ? 0 : 1;
}
(3)主函数(数据读取与显示)
int main(void) {
HAL_Init();
SystemClock_Config(); // 系统时钟配置(由CubeMX生成)
MX_I2C1_Init(); // I2C1初始化(由CubeMX生成)
SHT30_Init(&hi2c1); // 初始化SHT30
float temp, humi;
while (1) {
if (SHT30_ReadData(&hi2c1, &temp, &humi) == 0) {
// 打印数据(通过串口或LCD)
printf("Temp: %.2f℃, Humi: %.2f%%RH\r\n", temp, humi);
// 超限报警(示例:温度>30℃或湿度>70%RH)
if (temp > 30 || humi > 70) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // 点亮报警LED
} else {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}
} else {
printf("SHT30 Read Failed!\r\n");
}
HAL_Delay(1000); // 1秒读取一次
}
}
参考代码 基于STM32&SHT30 温湿度传感器模块(原理图+PCB源文件+程序源码) www.youwenfan.com/contentcns/160774.html
四、数据处理与优化
1. 数据转换公式
SHT30返回的16位原始数据需转换为实际温湿度:
-
温度(℃):\(T=−45+175×\frac{S_T}{2^{16}−1}\)
-
湿度(%RH):\(RH=100×\frac{S_RH}{2^{16}−1}\)
(\(S_T\)、\(S_RH\)为原始数据,范围0~65535)
2. CRC校验
SHT30的每个数据包(温度/湿度)后附带1字节CRC校验码,多项式为0x31(x⁸+x⁵+x⁴+1),初始值0xFF。代码中需实现CRC8校验函数(如上例),确保数据正确性。
3. 低功耗优化
-
STM32休眠模式:读取间隔设为10秒(而非1秒),其余时间进入Stop模式(电流<1μA);
-
SHT30周期测量:发送周期测量命令(如0x2236,每秒测量1次),STM32仅在测量完成后唤醒读取数据;
-
关闭未用外设:禁用ADC、定时器等未用模块,降低功耗。
五、应用案例
1. 智能家居环境监测
-
场景:客厅温湿度监测,联动空调/加湿器;
-
实现:STM32读取SHT30数据,通过Wi-Fi模块(如ESP8266)上传至云平台(如阿里云),手机APP实时显示并设置阈值(如温度26℃自动开空调)。
2. 农业大棚精准调控
-
场景:大棚温湿度监测,控制风机/喷淋系统;
-
实现:STM32读取数据后,通过LoRa模块(如SX1278)发送至网关,网关根据阈值(如湿度<60%启动喷淋)控制执行器。
3. 工业设备状态监控
-
场景:机房温湿度监测,防止设备过热/受潮;
-
实现:STM32将数据存入EEPROM(掉电保存),异常时通过短信模块(如SIM800L)发送报警短信至管理员。
六、常见问题与解决
-
I2C通信失败:
-
检查接线(SDA/SCL是否接反)、上拉电阻(是否焊接);
-
确认SHT30地址(ADDR引脚电平是否正确);
-
降低I2C速率(尝试100kHz或10kHz)。
-
-
数据跳变:
-
远离热源/冷源(如阳光直射、空调出风口);
-
增加软件滤波(如滑动平均滤波:
filtered_temp = 0.8*prev_temp + 0.2*curr_temp)。
-
-
CRC校验错误:
-
检查CRC函数实现(多项式、初始值是否正确);
-
缩短I2C线长(<50cm),减少电磁干扰。
-
七、总结
基于STM32与SHT30的温湿度传感器模块通过I2C接口实现高精度环境监测,硬件设计简单(仅需4根线),软件实现基于HAL库(易上手),适用于多种场景。通过优化功耗(休眠模式、周期测量)和数据校验(CRC),可进一步提升系统稳定性和续航能力。
浙公网安备 33010602011771号