esp32 -ESP-idf 读取sht40温湿度

该程序使用ESP32通过I2C总线扫描连接的设备,并对SHT40传感器进行高精度的温湿度测量。首先,它遍历I2C地址空间寻找设备,然后向SHT40发送测量命令并读取6字节数据,解析这些数据以获取温度和湿度值。
摘要由CSDN通过智能技术生成

idf 4.4.4 版本

程序内容:

1先对所有地址扫描 打印出连接设备的地址

2在给i2c发送0xFD(为sht40:以高精度(高重复性)测量T&RH[2*8位T数据的指令)读取6位数据然后解析。

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_err.h"
#include "esp_log.h"
#include "driver/i2c.h"

#define I2C_MASTER_SCL_IO 22      // I2C专用时钟线GPIO
#define I2C_MASTER_SDA_IO 21      // I2C专用数据线GPIO
#define I2C_MASTER_NUM I2C_NUM_0  // I2C总线号
#define I2C_MASTER_FREQ_HZ 100000 // I2C总线频率

static const char *TAG = "I2C scanner";

void i2c_scanner_task(void *arg)
{
    i2c_config_t conf;
    conf.mode = I2C_MODE_MASTER;
    conf.sda_io_num = I2C_MASTER_SDA_IO;
    conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
    conf.scl_io_num = I2C_MASTER_SCL_IO;
    conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
    conf.master.clk_speed = I2C_MASTER_FREQ_HZ;
    i2c_param_config(I2C_MASTER_NUM, &conf);
    i2c_driver_install(I2C_MASTER_NUM, I2C_MODE_MASTER, 0, 0, 0);

    printf("Scanning I2C bus...\n");

    for (int address = 0x03; address <= 0x77; address++)
    {
        i2c_cmd_handle_t cmd = i2c_cmd_link_create();
        i2c_master_start(cmd);
        i2c_master_write_byte(cmd, (address << 1) | I2C_MASTER_WRITE, true);
        i2c_master_stop(cmd);

        esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 100);
        if (ret == ESP_OK)
        {
            printf("Device found at address 0x%02X\n", address);
        }

        i2c_cmd_link_delete(cmd);

        vTaskDelay(10);
    }

    ESP_LOGI(TAG, "I2C Master Initialized");

    uint8_t c=0xFD;
    while (1)
    {
        i2c_cmd_handle_t cmd = i2c_cmd_link_create();
        i2c_master_start(cmd);
        i2c_master_write_byte(cmd, (0x44 << 1) | I2C_MASTER_WRITE, true);
        i2c_master_write(cmd, &c,1, true);
        i2c_master_stop(cmd);
        esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_PERIOD_MS);
        i2c_cmd_link_delete(cmd);

        if (ret != ESP_OK)
        {
            ESP_LOGE(TAG, "%dI2C write failed", ret);
        }
        vTaskDelay(50);
        uint8_t a[6] = {0, 0, 0, 0, 0, 0};
        cmd = i2c_cmd_link_create();
        i2c_master_start(cmd);
        i2c_master_write_byte(cmd, (0x44 << 1) | I2C_MASTER_READ, true);
        for (int i = 0; i < 6; i++)
        {
            i2c_master_read_byte(cmd, &a[i], I2C_MASTER_ACK);
        }
        i2c_master_stop(cmd);
        ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000);
        i2c_cmd_link_delete(cmd);
        if (ret == ESP_OK)
        {
            for (int i = 0; i < 6; i++)
            {
                printf(" %d ", a[i]);
            }
            printf("\n");
            float t_ticks = (uint16_t)a[0] * 256 + (uint16_t)a[1];
            float rh_ticks = (uint16_t)a[3] * 256 + (uint16_t)a[4];
            float temperature = -45 + 175.0 * t_ticks / 65535.0;
            float humidity = -6 + 125.0 * rh_ticks / 65535.0;
            printf("温度:%.2lf \n", temperature);
            printf("湿度:%.2lf \n", humidity);
        }

        vTaskDelay(1000);
    }
    i2c_driver_delete(I2C_MASTER_NUM);
    vTaskDelete(NULL);
}

void app_main()
{
    xTaskCreate(i2c_scanner_task, "i2c_scanner_task", 2048, NULL, 10, NULL);
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是ESP32-idf读取SHT30温湿度传感器的代码示例: ```c #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/i2c.h" #define I2C_MASTER_SCL_IO 22 /*!< GPIO number for I2C master clock */ #define I2C_MASTER_SDA_IO 21 /*!< GPIO number for I2C master data */ #define I2C_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master dev */ #define I2C_MASTER_FREQ_HZ 100000 /*!< I2C master clock frequency */ #define SHT30_ADDRESS 0x44 /*!< I2C address for SHT30 sensor */ static void i2c_master_init() { i2c_config_t conf; conf.mode = I2C_MODE_MASTER; conf.sda_io_num = I2C_MASTER_SDA_IO; conf.sda_pullup_en = GPIO_PULLUP_ENABLE; conf.scl_io_num = I2C_MASTER_SCL_IO; conf.scl_pullup_en = GPIO_PULLUP_ENABLE; conf.master.clk_speed = I2C_MASTER_FREQ_HZ; i2c_param_config(I2C_MASTER_NUM, &conf); i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0); } static esp_err_t i2c_master_sht30_read(uint8_t* data, size_t size) { i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (SHT30_ADDRESS << 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, 0x2C, true); i2c_master_write_byte(cmd, 0x06, true); i2c_master_stop(cmd); esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); if (ret != ESP_OK) { return ret; } vTaskDelay(20 / portTICK_RATE_MS); cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (SHT30_ADDRESS << 1) | I2C_MASTER_READ, true); if (size > 1) { i2c_master_read(cmd, data, size - 1, I2C_MASTER_ACK); } i2c_master_read_byte(cmd, data + size - 1, I2C_MASTER_NACK); i2c_master_stop(cmd); ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); return ret; } void app_main() { i2c_master_init(); uint8_t data[6] = {0}; while (1) { esp_err_t ret = i2c_master_sht30_read(data, sizeof(data)); if (ret != ESP_OK) { printf("SHT30 read failed: %d\n", ret); continue; } uint16_t temp_raw = (data[0] << 8) | data[1]; uint16_t hum_raw = (data[3] << 8) | data[4]; float temperature = -45 + 175 * ((float)temp_raw / 65535); float humidity = 100 * ((float)hum_raw / 65535); printf("Temperature: %.2f°C, Humidity: %.2f%%\n", temperature, humidity); vTaskDelay(1000 / portTICK_RATE_MS); } } ``` 首先需要在 `i2c_master_init()` 函数中初始化I2C总线。然后在 `i2c_master_sht30_read()` 函数中,发送读取SHT30传感器的命令,并读取温湿度数据。最后通过位运算和公式计算得到温度和湿度值。在主函数中循环读取SHT30传感器,并打印温湿度信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值