数据手册GY-SHT3X.rar_免费高速下载|百度网盘-分享无限制
模块链接树莓派温湿度传感器模块I2C通讯温度数字型 DIS宽电压SHT30/SHT31-淘宝网

SHT3x-DIS提供软复位机制, 强制系统进入定义良好的状态,而无需移除电源。当系统处于空闲 状态时,可以向SHT3xDIS发送软复位命令。这触发传感器重置其系统 控制器并从存储器重新加载校准数据。为了启动软复位过程,应该发送如表14所示的命令。
值得注意的是,默认情况下,传感器在每次测量之前都会重新加载校准数据 。

在这种模式下,一个发出的测量命令产生数据对流。每个数据对由一个16位 温度值和一个16位湿度值(以 的顺序)组成。
在周期模式下,可以选择不同的测量命令 。对应的16位命令如表10所示 。它们在 可重复性(低、中、高)和数据采集频率(0.5、1、2、4和10次测量 每秒,mps)方面有所不同。在 模式下不能选择时钟拉伸。
数据采集频率和可重复性 设置影响测量持续时间和 电流
**Repeatability(重复性):**重复性等级:High 对应测量精度最高但响应时间可能稍长;Medium 为精度与响应的折中;Low 精度最低但响应最快--------------精度
测量频率(mps):表示传感器每秒执行测量的次数,mps 越高,数据更新越频繁,但需注意在最高 mps(如 10)设置下,传感器可能出现自热现象,进而影响测量准确性,需根据实际应用场景(对精度、响应速度的需求)权衡选择------------------速度

通过表11所示的fetch data命令,可以启动测量数据的传输 。如果没有测量数据,则I2C读报头 用NACK(表11中的第9位)响应,并且通信停止。在发出读取命令获取 数据后,数据内存被清除,即没有测量数据。


通过适当地连接ADDR引脚,可以选择I2C 地址(参见表8中各自的 地址)。ADDR引脚可以连接到 逻辑高或逻辑低。通过在ADDR引脚上切换 电平,传感器的地址可以在操作过程中 动态更改。唯一的约束是 级别必须从I2C启动 条件开始保持恒定,直到通信完成。这允许 将两个以上的SHT3x-DIS连接到同一总线上。
意思是设备有两个地址,默认是0x44,另一个地址是0x45
这里我们通过I2c定义写地址和读地址(0写1读)
I2C协议可以转最详细的I2C通信协议-CSDN博客
每个从设备都有一个唯一的 7 位地址(部分设备支持 10 位地址,较少见),用于被主设备识别。
#define SHT31_SLAVE_READ_ADDR ((SHT31_SLAVE_ADDR << 1) | 0x1)//读地址
#define SHT31_SLAVE_WRITE_ADDR (SHT31_SLAVE_ADDR << 1)//写地址
int16_t sht31_send_cmd(uint16_t cmd)
{
//通过数组分两次发送命令
uint8_t tx[2];
tx[0] = cmd >> 8; // MSB
tx[1] = cmd & 0xff; // LSB
HAL_StatusTypeDef ret;
ret = HAL_I2C_Master_Transmit(&hi2c1, SHT31_SLAVE_WRITE_ADDR, tx, 2, HAL_MAX_DELAY);//最大延时时间
//判断返回值是否正确
if(ret != HAL_OK)
{
printf("HAL_I2C_Master_Transmit failure, ret=%d\r\n", ret);
return -1;
}
return 0;
}
int16_t sht31_init()
{
#if 0
// 软件复位
int16_t ok = sht31_send_cmd(SHT31_SOFT_RESET_CMD);
HAL_Delay(500);
if(ok < 0)
{
return -1;
}
#endif
// Measurement Commands for Periodic Data Acquisition Mode
//向设备发送复位命令
int16_t ok = sht31_send_cmd(SHT31_MEASUREMENT_CMD);
HAL_Delay(500);
if(ok < 0)
{
return -2;
}
return 0;
}
//采集温度
int16_t sht31_sample_temperature(uint16_t* p_temperature)
{
//先进行初始化
int16_t ok = sht31_init();
if(ok < 0)
{
return -1;
}
// 采集数据并由设备发送结果
ok = sht31_send_cmd(SHT31_MEASUREMENT_RESULT_CMD);
//判断返回值是否正确
if(ok < 0)
{
return -2;
}
//创建数组接受设备发送的数据
uint8_t rx[6];
HAL_StatusTypeDef ret;
ret = HAL_I2C_Master_Receive(&hi2c1, SHT31_SLAVE_READ_ADDR, rx, 6, HAL_MAX_DELAY);
//判断返回值并打印,如果失败
if(ret != HAL_OK)
{
printf("HAL_I2C_Master_Transmit failure, ret=%d\r\n", ret);
return -1;
}
//如果成功
else
{
//用变量的地址接受,防止丢失
*p_temperature = (rx[0] << 8) | rx[1];
//公式计算温度值
float converted_temperature = -45 + 175.0 * (*p_temperature) / 65535;
printf("temperature:%.2f\r\n", converted_temperature);
//返回计算出来的温度值
return *p_temperature;
}
}
(注释大体同上)
//采集湿度
int16_t sht31_sample_humidity(uint16_t* p_humidity)
{
int16_t ok = sht31_init();
if(ok < 0)
{
return -1;
}
// Readout of Measurement Results for Periodic Mode
ok = sht31_send_cmd(SHT31_MEASUREMENT_RESULT_CMD);
if(ok < 0)
{
return -1;
}
uint8_t rx[6];
HAL_StatusTypeDef ret;
ret = HAL_I2C_Master_Receive(&hi2c1, SHT31_SLAVE_READ_ADDR, rx, 6, HAL_MAX_DELAY);
if(ret != HAL_OK)
{
printf("HAL_I2C_Master_Transmit failure, ret=%d\r\n", ret);
return -1;
}
else
{
*p_humidity = (rx[3] << 8) | rx[4];
#ifdef SENSOR_DEBUG
float converted_humidity = 100.0 * (*p_humidity) / 65535;
printf("humidity:%.2f\r\n", converted_humidity);
#endif
return *p_humidity;
}
}