Skip to content

SHT30温湿度传感器

简介

SHT30是一款高精度、数字输出、电容式温湿度传感器,具有出色的长期稳定性和可靠性。它采用创新的电容式技术,能够提供高精度的温度和湿度测量结果。SHT30传感器具有以下特点:

  • 高精度:温度和湿度测量精度可达±0.3℃和±2%RH。
  • 数字输出:通过I2C接口进行数据通信,易于集成到各种微控制器系统中。
  • 低功耗:在正常工作模式下,功耗仅为1.5μA。
  • 范围: -40°C至125°C的温度范围和0%至100%的相对湿度范围。

引脚定义

引脚名称描述
VDD电源正极,接3.3V或5V电源
GND电源地
SDAI2C数据线,用于与微控制器通信
SCLI2C时钟线,用于与微控制器通信

使用方法

使用esp-idf开发,使用 ESP32-C3 芯片

c
#include <stdio.h>
#include <string.h> // 添加这一行
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "driver/i2c_master.h"
#include "time.h"
#include <sys/time.h> // 添加这个头文件

#define I2C_MASTER_NUM I2C_NUM_0

#define SHT30_ADDR 0x44           // SHT30的I2C地址(7位)
#define I2C_MASTER_SCL_IO 4        // 根据ESP32-C3的引脚定义,默认SCL为GPIO4
#define I2C_MASTER_SDA_IO 5        // 默认SDA为GPIO5
#define I2C_MASTER_FREQ_HZ 100000  // I2C时钟频率100kHz
#define I2C_MASTER_TIMEOUT_MS 1000 // I2C操作超时时间,单位为毫秒


#define SHT30_ADDR_LEN I2C_ADDR_BIT_LEN_7

esp_err_t sht30_read_data(i2c_master_dev_handle_t *dev_handle,float *temperature, float *humidity) {


    uint8_t cmd[2] = {0x2C, 0x06}; // 高精度测量命令(Clock stretching启用)
    uint8_t data[6] = {0};


    // i2c_master_transmit_receive(*dev_handle, cmd, 1, data, 6, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    i2c_master_transmit(*dev_handle, cmd, 2, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    vTaskDelay(pdMS_TO_TICKS(200)); // 等待200ms测量完成
    i2c_master_receive(*dev_handle, data, 6, I2C_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    // 解析数据
    uint16_t raw_temp = (data[0] << 8) | data[1];
    uint16_t raw_humi = (data[3] << 8) | data[4];
    *temperature = (float)raw_temp * 175.0 / 65535.0 - 45.0;  // 温度(℃)
    *humidity = (float)raw_humi * 100.0 / 65535.0;         // 湿度(%RH)


    return ESP_OK;
}

void app_main(void)
{

    i2c_master_bus_config_t i2c_mst_config = {
        .clk_source = I2C_CLK_SRC_DEFAULT,
        .i2c_port = I2C_MASTER_NUM,
        .scl_io_num = I2C_MASTER_SCL_IO,
        .sda_io_num = I2C_MASTER_SDA_IO,
        .glitch_ignore_cnt = 7,
        .flags.enable_internal_pullup = true,
    };

    i2c_master_bus_handle_t bus_handle;
    ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_config, &bus_handle));

    i2c_device_config_t dev_cfg = {
        .dev_addr_length = SHT30_ADDR_LEN,
        .device_address = SHT30_ADDR,
        .scl_speed_hz = I2C_MASTER_FREQ_HZ,
    };

    i2c_master_dev_handle_t dev_handle;
    ESP_ERROR_CHECK(i2c_master_bus_add_device(bus_handle, &dev_cfg, &dev_handle));



    while (1)
    {
        float temp, humi;
        if (sht30_read_data(&dev_handle, &temp, &humi) == ESP_OK)
        {
            printf("温度: %.2f C, 湿度: %.2f %%\n", temp, humi);
        }

        vTaskDelay(pdMS_TO_TICKS(1000)); // 等待1秒

    }
}

在上述代码中,我们首先定义了I2C的参数,包括I2C的时钟频率、I2C的SCL和SDA引脚的编号等。然后,我们创建了一个I2C总线,并使用这个总线来创建一个I2C设备。最后,我们使用这个设备来读取SHT30的温湿度数据。

使用Stc8g1k08a开发. 使用I2C模块

在使用以下代码之前,需要先引用 i2c的头文件. 转至stc8g I2C模块

c
#include "stc8g.h"
#include "i2c.h"


#define SHT30_ADDR 0x44  // SHT30的I2C地址

static void DelayMs(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++) {
        for(j = 0; j < 1000; j++) {
            _nop_();
        }
    }
}

void SHT30_Init(void)
{
	I2C_Init();
}



// SHT30读取温湿度
bit SHT30_Read(float *temperature, float *humidity) {
    unsigned char buf[6];
    unsigned short temp_raw, humi_raw;
    
    I2C_Start();
    if(!I2C_WriteByte(SHT30_ADDR << 1)) { // SHT30地址 + 写模式
        I2C_Stop();
        return 0;
    }
    if(!I2C_WriteByte(0x2C)) {      // 测量命令高字节
        I2C_Stop();
        return 0;
    }
    if(!I2C_WriteByte(0x06)) {      // 测量命令低字节
        I2C_Stop();
        return 0;
    }
    I2C_Stop();
    
    DelayMs(100); // 等待测量完成
    
    I2C_Start();
    if(!I2C_WriteByte(SHT30_ADDR << 1 | 0x01)) { // SHT30地址 + 读模式
        I2C_Stop();
        return 0;
    }
    buf[0] = I2C_ReadByte(1); // 温度高字节
    buf[1] = I2C_ReadByte(1); // 温度低字节
    buf[2] = I2C_ReadByte(1); // CRC校验(可忽略)
    buf[3] = I2C_ReadByte(1); // 湿度高字节
    buf[4] = I2C_ReadByte(1); // 湿度低字节
    buf[5] = I2C_ReadByte(0); // CRC校验(可忽略)
    I2C_Stop();
    
    temp_raw = (buf[0] << 8) | buf[1];
    humi_raw = (buf[3] << 8) | buf[4];
    
    *temperature = -45 + 175 * (float)temp_raw / 65535;
    *humidity = 100 * (float)humi_raw / 65535;
    return 1;
}