
传感器手册地址来源于半导小芯Sensirion-SHT30A-DIS-B.pdf部分内容参考自博主辰哥单片机设计引脚引脚对应接线SDA数据信号ADDRAD连接到高电平或低电平不可以悬空ALERTAL报警引脚不用必须悬空SCL时钟信号AD置0 i2c地址为 0x44AD置1 i2c地址为 0x45传感器特性SHT系列型号的传感器都是单次指令式测量都没有寄存器所以在手册上查不到寄存器表不同的是STH3x系列是2字节指令SHT2x和SHT4x是单字节指令以SHT30为例读取温湿度并进行CRC校验的指令参数Repeatability从高到低对应精度从高到低0x2C,0x06精度最高测量时间约 15ms0x2C,0x0D中精度测量时间约 6.5ms0x2C,0x10低精度测量时间约4.5ms功耗低Clock stretching时钟拉伸: 从机在正在进行的传输中可主动拉低 SCL 强制主机暂停但从机不能主动发起一次新的传输START 条件只能由主机产生。不常用只有处理较长时间数据时才用到其他指令例如软复位0x30,0xA2读取序列号0x36,0x82中断清除0x30,0x93字节顺序官方时序图高字节在前读出的数据格式为T MSB | T LSB | CRC_T | RH MSB | RH LSB | CRC_RH数据解算公式公式代码raw_temp和raw_hum是读取到的未结算的数据T(℃) -45 175 * ((float)raw_temp / 65535.0f); RH(%) 100 * ((float)raw_hum / 65535.0f);代码部分HAL库SHT30.h#ifndef SHT30_H #define SHT30_H #include main.h #include usart.h #include i2c.h #include cmsis_os.h #include freertos.h #define SHT30_ADDR (0x44 1) #define SHT_SCL_GPIO_Port GPIOB #define SHT_SCL_Pin GPIO_PIN_6 #define SHT_SDA_GPIO_Port GPIOB #define SHT_SDA_Pin GPIO_PIN_7 void SHT30_ReadData(float *temperature, float *humidity); #endif // SHT30_HSHT30.c#include sht30.h // 读取温湿度数据 uint8_t cmd[2] {0x2C, 0x06}; /** * brief 读取并解算温湿度数据 * * param temperature * param humidity */ void SHT30_ReadData(float *temperature, float *humidity) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); // 写指令(并检测是否写成功) if (HAL_I2C_Master_Transmit(hi2c1, SHT30_ADDR, cmd, 2, 100) ! HAL_OK) { *temperature -999.0f; *humidity -999.0f; return; } osDelay(15); // 读数据并检测是否读取成功 uint8_t data[6]; if (HAL_I2C_Master_Receive(hi2c1, SHT30_ADDR, data, 6, 100) ! HAL_OK) { *temperature -999.0f; *humidity -999.0f; return; } // 读回的字节顺序T MSB | T LSB | CRC_T | RH MSB | RH LSB | CRC_RH // 解析数据(第2位和第4位是CRC校验) uint16_t temp_raw data[0] 8 | data[1]; uint16_t hum_raw data[3] 8 | data[4]; *temperature -45.0f 175.0f * (float)temp_raw / 65535.0f; *humidity 100.0f * (float)hum_raw / 65535.0f; }