一.概要

SHT30是瑞士Sensirion公司推出的高精度数字温湿度传感器,属于SHT3x系列中的入门型号,采用I2C通信接口,广泛应用于工业控制、智能家居等领域。
SHT30模块如下图所示
在这里插入图片描述
模块上的芯片SHT30如下图所示
在这里插入图片描述

二.SHT30主要性能参数

测量范围‌
温度:-40℃~90℃(精度±0.3℃)
湿度:0~100%RH(精度±3%RH)‌
IIC通讯速率最高达到1MHZ。

模块接口说明:
1.VCC 外接3.3V-5V。
2.GND 外接GND。
3.SDA接单片机IIC接口的SDA。
4.SCL接单片机IIC接口的SCL。

三.SHT30温度传感器内部框图

SHT30内部组成基于CMOS-MEMS技术,内部是由感湿原件,感温元件,14位ADC,‌OTP存储等组成。
在这里插入图片描述

SHT30芯片参考硬件设计如下,ADDR一般接地,IIC通讯地址高7位就是0x44,读数据地址就是0x89,写数据地址就是0x88。
在这里插入图片描述

四.SHT30模块跟单片机板子接线和通讯时序

1.单片机跟SHT30模块连接示意图

在这里插入图片描述

2.单片机跟SHT30模块通讯流程与时序

单片机与SHT30一般操作命令流程如下:
复位操作‌:发送软复位命令(0x30A2)以初始化传感器‌。
工作模式‌设置:设置周期性测量,需通过特定命令(如0x2236)配置‌。
读数据:发送读命令(0xE000)后,接收6字节数据(温度高/低8位+CRC,湿度高/低8位+CRC)‌。
SHT30的CRC校验采用8位循环冗余校验(CRC-8)算法。

单片机与SHT30模块通讯读数据时序如下图所示。
在这里插入图片描述
CRC生成多项式‌:固定为0x31(二进制00110001),对应x⁸+x⁵+x⁴+1‌,仅对温度(2字节)和湿度(2字节)的有效数据进行校验,CRC校验码单独存储于数据帧的第3和第6字节‌。
温度CRC校验:比较计算值与接收到的第3字节(CRC_Temp)。
湿度CRC校验:比较计算值与接收到的第6字节(CRC_Humi)‌。

CRC函数参考C代码:

uint8_t CheckCrc8(uint8_t *data, uint8_t len) {
    uint8_t crc = 0xFF;
    for (uint8_t i = 0; i < len; i++) {
        crc ^= data[i];
        for (uint8_t j = 0; j < 8; j++) {
            if (crc & 0x80) crc = (crc << 1) ^ 0x31;
            else crc = (crc << 1);
        }
    }
    return crc;
}

五.STM32单片机SHT30温度传感器实验

1.硬件准备

STLINK接STM32G474RET6开发板,STLINK接电脑USB口, 把OLED模块插在板子上,用 4 根杜邦线把开发板3.3V与传感器的 VCC,开发板 GND 与传感器的 GND,开发板PC6脚与传感器的SCL,开发板PC7脚与传感器的SDA相连。

在这里插入图片描述

2.创建CubeMX工程

如下图所示,打开STM32CubeMX软件,新建工程。
在这里插入图片描述
如下图所示,Part Number处输入STM32G474RE,再双击就创建新的工程。
在这里插入图片描述

如下图所示,配置下载口引脚,PA13为SWD的SWDIO脚,PA14为SWD的SWCLK脚。
在这里插入图片描述

如下图所示,配置硬件IIC,PC6,PC7引脚为IIC引脚。
在这里插入图片描述

如下图所示,配置系统主频170Mhz,使用外部8MHZ晶振。
在这里插入图片描述

在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式,生成工程。
在这里插入图片描述
在这里插入图片描述

如下图所示,工程中添加oled.c显示驱动,添加温湿度数据读写代码。
在这里插入图片描述

主要代码如下

uint8_t SHT3X_Modecommand_Buffer[2]={0x22,0x36}; //周期测量模式
uint8_t SHT3X_Fetchcommand_Bbuffer[2]={0xE0,0x00};//读取测量结果
uint8_t SHT3X_Data_Buffer[6]; //byte0,1为温度 byte4,5为湿度
float Humidity_S1; //湿度 正数
float Temperature_S1; //温度 可能为负数
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//8M外部晶振,170MHZ系统主频

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C4_Init();//IIC4初始化,PC6:I2C4_SCL,PC7:I2C4_SDA
  /* USER CODE BEGIN 2 */
	OLED_Init();//OLED初始化  
	OLED_Clear();//OLED清屏
  HAL_I2C_Master_Transmit(&hi2c4,0x44<<1,SHT3X_Modecommand_Buffer,2,0x10); //第一步,传感器周期性的进行温湿度转换
	HAL_I2C_Master_Transmit(&hi2c4,0x44<<1,SHT3X_Fetchcommand_Bbuffer,2,0x10); //第二步,随时读取传感器的数据 
	HAL_I2C_Master_Receive(&hi2c4,(0x44<<1)+1,SHT3X_Data_Buffer,6,0x10); //读取数据
  HAL_Delay(1000);//等待1000ms
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_I2C_Master_Transmit(&hi2c4,0x44<<1,SHT3X_Fetchcommand_Bbuffer,2,0x10); //随时读取传感器的数据 
    HAL_I2C_Master_Receive(&hi2c4,(0x44<<1)+1,SHT3X_Data_Buffer,6,0x10); //读取数据
    Temperature_S1=(float)((((SHT3X_Data_Buffer[0]<<8)+SHT3X_Data_Buffer[1])*175)/65535.0f)-45; //得到摄氏度温度 
    Humidity_S1=(((SHT3X_Data_Buffer[3]<<8)+SHT3X_Data_Buffer[4])*100)/65535.0f; //可以得到相对湿度
    HAL_Delay(1000);//等待1000ms
		OLED_Clear();
    OLED_ShowCHinese(26,0,0);//光
		OLED_ShowCHinese(44,0,1);//子
		OLED_ShowCHinese(62,0,2);//物
		OLED_ShowCHinese(80,0,3);//联
		OLED_ShowString(24,3,(u8*)"SHT30 TEST");
		if(Temperature_S1>=0)//判断是否温度大于0	
		{
			OLED_ShowString(0,6,(u8*)"Tem: "); 
			OLED_ShowNum(30,6,Temperature_S1,2,16);//显示温度 
		}else
		{
			OLED_ShowString(0,6,(u8*)"Tem:-"); 
			OLED_ShowNum(38,6,-Temperature_S1,2,16);//显示负温度 
		}
		OLED_ShowString(60,6,(u8*)"Hum: ");  
		OLED_ShowNum(90,6,Humidity_S1,3,16);//显示湿度 
	  OLED_ShowString(120,6,(u8*)"%");  	
  }
  /* USER CODE END 3 */
}

OLED显示的学习可以参考前面的文章,链接如下,因为都是使用GPIO口模拟操作,跟单片机平台相关性就不大了。
https://gzwelink.blog.csdn.net/article/details/142330816?fromshare=blogdetail&sharetype=blogdetail&sharerId=142330816&sharerefer=PC&sharesource=zy2232652&sharefrom=from_link

3.实验结果

结果如下图所示,能读到温度与湿度值,温度Tem是33度,湿度Hum是61%。
在这里插入图片描述

六.小结

在嵌入式开发中,温湿度传感器是一种十分常用的传感器,可以用于天气预报、智能家居、智慧大屏等等,相比DHT11等型号,SHT30在精度(如温度±0.3℃ vs DHT11±2℃)和可靠性上显著提升。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐