STM32G474单片机开发入门(二十二)SHT30温湿度传感器模块实战
文章目录
- 一.概要
- 二.SHT30主要性能参数
- 三.SHT30温度传感器内部框图
- 四.SHT30模块跟单片机板子接线和通讯时序
- 1.单片机跟SHT30模块连接示意图
- 2.单片机跟SHT30模块通讯流程与时序
- 五.STM32单片机SHT30温度传感器实验
- 1.硬件准备
- 2.创建CubeMX工程
- 3.实验结果
- 六.小结
一.概要
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);//等待1000msOLED_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℃)和可靠性上显著提升。
