STM32HAL库传感器篇之SHT30温湿度

传感器介绍

SHT30是瑞士Sensirion公司推出的一款高精度数字温湿度传感器。以下是根据手册对其的重点介绍:

  • 主要特性
    • 高精度测量:温度测量范围为-40℃125℃,在0℃65℃区间内精度可达±0.2℃;湿度测量范围为0%RH100%RH,在20%RH80%RH区间内精度可达±2%RH。
    • 数字输出接口:采用I²C总线接口,支持标准模式(100kHz)和快速模式(400kHz),可直接与微控制器通信,简化硬件设计。
    • 低功耗设计:支持单次测量模式和周期性测量模式,单次测量后可自动进入休眠模式,休眠电流仅0.1μA,周期性测量时平均电流最低可至0.5μA。
    • 稳定性与可靠性:采用CMOSens®技术,集成了温度补偿功能,有效降低环境温度对湿度测量的影响,同时具备抗干扰能力,使用寿命可达10年以上。
    • 小巧封装:提供DFN封装(2.5mm×2.5mm×0.9mm)和TO-92封装,适合空间受限的场景。
  • 工作原理
    • 湿度测量原理:湿度感应元件采用高分子聚合物电容结构,当环境湿度变化时,聚合物薄膜吸收或释放水分子,导致其介电常数发生改变,进而使电容器的容量产生对应变化,信号处理电路将电容容量变化转换为数字信号。
    • 温度测量原理:温度感应元件采用高精度铂电阻或NTC热敏电阻,传感器内部向其施加恒定微小电流,随着环境温度变化,铂电阻的电阻值发生线性变化,根据欧姆定律,电阻两端的电压也会随之变化,电压信号经过处理后转换为数字信号。
  • 工作模式
    • 单次测量模式:发送测量命令后执行单次测量,支持不同重复性等级,如高重复性(0x2C06/0x2400)、中重复性(0x2C0D/0x240B)、低重复性(0x2C10/0x2416)。
    • 周期测量模式:可配置测量频率,如0.5mps(0.5次/秒)、1mps(1次/秒)、2mps(2次/秒)、4mps(4次/秒)、10mps(10次/秒)。
  • 其他特点
    • 宽电源电压范围:工作电压范围为2.4V~5.5V,适合各类应用。
    • 两个独特和用户可选I2C地址:方便在同一I2C总线上连接多个传感器。
    • 报警模式:具有可编程温湿度极限的报警模式,可用于特定场景的监控。

手册下载:
SHT30-DIS-B2.5KS -PDF数据手册-参考资料-立创商城

代码配置演示

#include "SHT30.h"

/**
 * @brief  SHT30 初始化(软件复位)
 * @param  hi2c:IIC句柄指针
 * @retval 0:初始化成功 1:初始化失败
 */
uint8_t SHT30_Init(I2C_HandleTypeDef *hi2c)
{
    // 软件复位,确保传感器处于初始状态
    if (SHT30_SoftReset(hi2c) != 0)
    {
        return 1;
    }
    HAL_Delay(10);  // 复位后等待稳定
    return 0;
}

/**
 * @brief  SHT30 软件复位
 * @param  hi2c:IIC句柄指针
 * @retval 0:复位成功 1:复位失败
 */
uint8_t SHT30_SoftReset(I2C_HandleTypeDef *hi2c)
{
    uint8_t ucCmd[2] = {0};
    ucCmd[0] = (SHT30_CMD_SOFT_RESET >> 8) & 0xFF;  // 命令高位字节
    ucCmd[1] = SHT30_CMD_SOFT_RESET & 0xFF;         // 命令低位字节

    // 发送复位命令
    if (HAL_I2C_Master_Transmit(hi2c, SHT30_ADDR, ucCmd, 2, 100) != HAL_OK)
    {
        return 1;
    }
    return 0;
}

/**
 * @brief  SHT30 CRC8 校验(官方标准算法)
 * @param  pucData:待校验数据指针
 * @param  ucLen:待校验数据长度
 * @retval 计算得到的CRC值
 */
static uint8_t SHT30_CRC8(uint8_t *pucData, uint8_t ucLen)
{
    const uint8_t ucPolynomial = 0x31;  // CRC多项式
    uint8_t ucCrc = 0xFF;               // 初始值

    for (uint8_t i = 0; i < ucLen; i++)
    {
        ucCrc ^= pucData[i];
        for (uint8_t j = 0; j < 8; j++)
        {
            ucCrc = (ucCrc & 0x80) ? (ucCrc << 1) ^ ucPolynomial : (ucCrc << 1);
        }
    }
    return ucCrc;
}

/**
 * @brief  SHT30 读取温湿度(带CRC校验)
 * @param  hi2c:IIC句柄指针
 * @param  pfTemp:温度存储指针
 * @param  pfHumi:湿度存储指针
 * @retval 0:读取成功 1:读取失败 2:CRC校验失败
 */
uint8_t SHT30_ReadTempHumi(I2C_HandleTypeDef *hi2c, float *pfTemp, float *pfHumi)
{
    uint8_t ucCmd[2] = {0};
    uint8_t ucData[6] = {0};  // 存储:温度高位、温度低位、温度CRC、湿度高位、湿度低位、湿度CRC
    uint16_t usTemp = 0, usHumi = 0;

    // 1. 发送高重复性测量命令
    ucCmd[0] = (SHT30_CMD_MEAS_HIGH_REP >> 8) & 0xFF;
    ucCmd[1] = SHT30_CMD_MEAS_HIGH_REP & 0xFF;
    if (HAL_I2C_Master_Transmit(hi2c, SHT30_ADDR, ucCmd, 2, 100) != HAL_OK)
    {
        return 1;
    }
    HAL_Delay(20);  // 等待测量完成(高重复性测量最大耗时15ms)

    // 2. 读取6字节数据(温湿度+CRC)
    if (HAL_I2C_Master_Receive(hi2c, SHT30_ADDR, ucData, 6, 100) != HAL_OK)
    {
        return 1;
    }

    // 3. CRC校验(分别校验温度和湿度数据)
    if (SHT30_CRC8(&ucData[0], 2) != ucData[2] || SHT30_CRC8(&ucData[3], 2) != ucData[5])
    {
        return 2;  // 校验失败
    }

    // 4. 计算温湿度(按官方公式转换)
    usTemp = (ucData[0] << 8) | ucData[1];
    usHumi = (ucData[3] << 8) | ucData[4];
    *pfTemp = -45.0f + (175.0f * usTemp) / 65535.0f;  // 温度范围:-45~125℃
    *pfHumi = (100.0f * usHumi) / 65535.0f;            // 湿度范围:0~100%RH

    return 0;
}
#ifndef __SHT30_H
#define __SHT30_H

#include "stm32f1xx_hal.h"
#include <stdio.h>

// SHT30 设备地址(根据硬件接线选择,ADDR接GND为0x44,接VCC为0x45)
#define SHT30_ADDR 0x44 << 1  // IIC地址左移1位,兼容HAL库IIC函数格式

// SHT30 命令定义
#define SHT30_CMD_MEAS_HIGH_REP 0x2400  // 高重复性测量
#define SHT30_CMD_MEAS_MID_REP  0x240B  // 中重复性测量
#define SHT30_CMD_MEAS_LOW_REP  0x2416  // 低重复性测量
#define SHT30_CMD_SOFT_RESET    0x30A2  // 软件复位

// 函数声明
uint8_t SHT30_Init(I2C_HandleTypeDef *hi2c);
uint8_t SHT30_SoftReset(I2C_HandleTypeDef *hi2c);
uint8_t SHT30_ReadTempHumi(I2C_HandleTypeDef *hi2c, float *pfTemp, float *pfHumi);
static uint8_t SHT30_CRC8(uint8_t *pucData, uint8_t ucLen);

#endif

//初始化
//需要在Cubemx软件中配置IIC1
        ucRet = SHT30_Init(&hi2c1);
        if (ucRet == 0)
        {
        printf("SHT30初始化成功\r\n");
        }
        else
        {
        printf("SHT30初始化失败,错误码:%d\r\n", ucRet);
        }

//死循环
  while (1)
  {
    ucRet = SHT30_ReadTempHumi(&hi2c1, &fShtTemp, &fShtHumi);
    if (ucRet == 0)
    {
        printf("温度:%.2f℃,湿度:%.2f%%RH\r\n", fShtTemp, fShtHumi);
    }
    else if (ucRet == 2)
    {
        printf("SHT30数据CRC校验失败\r\n");
    }
    else
    {
        printf("SHT30数据读取失败\r\n");
    }
    

    HAL_Delay(1000); // 每隔1秒读取一次
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

测试结果

上位机测试结果

结语

主要是给学弟提供一个参考的跑的通的模板程序,仅供参考学习!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容