SHT30温湿度传感器
简介
SHT30是一款高精度、数字输出、电容式温湿度传感器,具有出色的长期稳定性和可靠性。它采用创新的电容式技术,能够提供高精度的温度和湿度测量结果。SHT30传感器具有以下特点:
- 高精度:温度和湿度测量精度可达±0.3℃和±2%RH。
- 数字输出:通过I2C接口进行数据通信,易于集成到各种微控制器系统中。
- 低功耗:在正常工作模式下,功耗仅为1.5μA。
- 范围: -40°C至125°C的温度范围和0%至100%的相对湿度范围。
引脚定义
引脚名称 | 描述 |
---|---|
VDD | 电源正极,接3.3V或5V电源 |
GND | 电源地 |
SDA | I2C数据线,用于与微控制器通信 |
SCL | I2C时钟线,用于与微控制器通信 |
使用方法
使用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;
}