传感器介绍
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 */
}
测试结果

上位机测试结果
结语
主要是给学弟提供一个参考的跑的通的模板程序,仅供参考学习!