STM32 驱动 SHT31 温湿度传感器
基于STM32 HAL库和硬件I2C的代码,包含了初始化和读取温湿度的基本函数。
硬件连接
首先,确保你的SHT31传感器与STM32开发板正确连接:
| SHT31 引脚 | STM32 引脚 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | I2C数据线 (如PB9) |
| SCL | I2C时钟线 (如PB8) |
SHT31的I2C地址通常是0x44(ADD引脚接GND)或0x45(ADD引脚接VCC)。
软件编程
1. 宏定义和变量声明
#include "main.h"
#include "i2c.h" // 你的I2C头文件
#include <stdio.h>
#define SHT31_ADDR 0x44 << 1 // HAL库地址需要左移一位
#define SHT31_MEAS_HIGHREP 0x2400 // 高重复性测量命令
I2C_HandleTypeDef hi2c1; // 你的I2C句柄
float temperature, humidity;
2. 初始化函数
void SHT31_Init(void) {
// 通常不需要特殊的初始化序列
// 但可以发送一个软复位命令(可选)
uint8_t reset_cmd[] = {0x30, 0xA2};
HAL_I2C_Master_Transmit(&hi2c1, SHT31_ADDR, reset_cmd, 2, HAL_MAX_DELAY);
HAL_Delay(10);
}
3. 读取温湿度函数
uint8_t SHT31_ReadTempHumid(void) {
uint8_t data[6];
uint8_t cmd[2] = {SHT31_MEAS_HIGHREP >> 8, SHT31_MEAS_HIGHREP & 0xFF};
// 发送测量命令
if (HAL_I2C_Master_Transmit(&hi2c1, SHT31_ADDR, cmd, 2, HAL_MAX_DELAY) != HAL_OK) {
return 0; // 传输失败
}
// 等待测量完成(高精度模式最大需要15ms)
HAL_Delay(20);
// 读取数据
if (HAL_I2C_Master_Receive(&hi2c1, SHT31_ADDR, data, 6, HAL_MAX_DELAY) != HAL_OK) {
return 0; // 接收失败
}
// 校验数据CRC(可选但推荐)
// 这里省略CRC校验代码,可参考
// 转换数据
uint16_t temp_raw = (data[0] << 8) | data[1];
uint16_t humid_raw = (data[3] << 8) | data[4];
// 转换为实际值
temperature = -45 + 175 * ((float)temp_raw / 65535.0);
humidity = 100 * ((float)humid_raw / 65535.0);
return 1; // 读取成功
}
4. 主循环中的使用示例
int main(void) {
HAL_Init();
SystemClock_Config();
MX_I2C1_Init(); // 初始化I2C
MX_USART1_UART_Init(); // 初始化串口用于调试输出
SHT31_Init();
while (1) {
if (SHT31_ReadTempHumid()) {
printf("Temperature: %.2f C, Humidity: %.2f %%\r\n", temperature, humidity);
} else {
printf("Failed to read from SHT31\r\n");
}
HAL_Delay(2000); // 每2秒读取一次
}
}
配置点
- I2C配置:在STM32CubeMX中配置I2C为标准模式(100kHz)或快速模式(400kHz)。SHT31支持最高400kHz的通信速度。
- CRC校验:为了数据的可靠性,建议实现CRC校验。SHT31使用多项式0x31的CRC-8校验。
- 时序控制:高重复性测量模式需要最多15ms的测量时间,确保在发送测量命令后等待足够时间再读取数据。
- 错误处理:在实际应用中,应添加重试机制和更完善的错误处理。
参考代码 STM32+SHT31温湿度传感器程序 www.youwenfan.com/contentcsh/56446.html
常见问题解决
- 读取失败:检查I2C地址是否正确、线路连接是否可靠,尝试降低I2C速度。
- 数据异常:实现CRC校验排除数据错误,确保供电稳定。
- 精度问题:避免传感器靠近发热源,注意SHT31的精度范围(湿度±2%,温度±0.2℃)。
进一步学习
想要更深入了解和获取完整工程示例,你可以:
- 查阅数据手册:搜索并阅读SHT31的官方数据手册,了解所有功能和命令。
- 参考现有库:GitHub上有开源的SHT31驱动库(如"SHT31" library by SparkFun、Adafruit等)。
- 调试工具:使用逻辑分析仪或示波器观察I2C波形,有助于排查通信问题。