TechBlog
首页分类标签搜索关于

© 2025 TechBlog. All rights reserved.

温湿度传感器

11/22/2025
未分类#嵌入式硬件#单片机

温湿度传感器

数据手册GY-SHT3X.rar_免费高速下载|百度网盘-分享无限制

模块链接树莓派温湿度传感器模块I2C通讯温度数字型 DIS宽电压SHT30/SHT31-淘宝网

一、数据手册重要数据

1、软件复位机制

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

2、测量命令使能

        在这种模式下,一个发出的测量命令产生数据对流。每个数据对由一个16位 温度值和一个16位湿度值(以 的顺序)组成。
        在周期模式下,可以选择不同的测量命令 。对应的16位命令如表10所示 。它们在 可重复性(低、中、高)和数据采集频率(0.5、1、2、4和10次测量 每秒,mps)方面有所不同。在 模式下不能选择时钟拉伸。
        数据采集频率和可重复性 设置影响测量持续时间和 电流

**Repeatability(重复性):**重复性等级:High 对应测量精度最高但响应时间可能稍长;Medium 为精度与响应的折中;Low 精度最低但响应最快--------------精度

测量频率(mps):表示传感器每秒执行测量的次数,mps 越高,数据更新越频繁,但需注意在最高 mps(如 10)设置下,传感器可能出现自热现象,进而影响测量准确性,需根据实际应用场景(对精度、响应速度的需求)权衡选择------------------速度

3、测量数据传输

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

4、设备地址

        通过适当地连接ADDR引脚,可以选择I2C 地址(参见表8中各自的 地址)。ADDR引脚可以连接到 逻辑高或逻辑低。通过在ADDR引脚上切换 电平,传感器的地址可以在操作过程中 动态更改。唯一的约束是 级别必须从I2C启动 条件开始保持恒定,直到通信完成。这允许 将两个以上的SHT3x-DIS连接到同一总线上。

意思是设备有两个地址,默认是0x44,另一个地址是0x45

3、读写地址

这里我们通过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)//写地址

SHT-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;
}

SHT-1初始化

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;
	}
}