STM32 驱动 SHT31 温湿度传感器

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秒读取一次
    }
}

配置点

  1. I2C配置:在STM32CubeMX中配置I2C为标准模式(100kHz)或快速模式(400kHz)。SHT31支持最高400kHz的通信速度。
  2. CRC校验:为了数据的可靠性,建议实现CRC校验。SHT31使用多项式0x31的CRC-8校验。
  3. 时序控制:高重复性测量模式需要最多15ms的测量时间,确保在发送测量命令后等待足够时间再读取数据。
  4. 错误处理:在实际应用中,应添加重试机制和更完善的错误处理。

参考代码 STM32+SHT31温湿度传感器程序 www.youwenfan.com/contentcsh/56446.html

常见问题解决

进一步学习

想要更深入了解和获取完整工程示例,你可以:

 

专注于matlab/simulink,电子电路,编程