【ESP-IDF5.x】 ESP32/ESP8266驱动SHT3x温湿度传感器

2024-08-24 08:04

本文主要是介绍【ESP-IDF5.x】 ESP32/ESP8266驱动SHT3x温湿度传感器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

更多更新的文章详见我的个人博客:【前往】

环境

  • 软件环境
    • VScode
    • ESP-IDF5.x
  • 硬件环境
    • esp32 / esp8266
    • sht3x温湿度传感器

SHT3x周围电路连接如下

下面是SHT3x与ESP32-S3的引脚接线示例,ESP32或者ESP8266根据开发板的I2C引脚进行接线

引脚接线
VDD3.3/5V
ADDRGND
SDA4
SCL5

说明

代码示例见:https://github.com/MGod-monkey/sht3x-esp-idf5x

将上面的代码下载到本地并通过VScode打开,需要先选择自己芯片的平台,然后编译

image-20240823155719287

驱动sht3x的代码封装在components\sht3x\sht3x.h,每个函数的说明如下:

  1. sht3x_init_sensor

    • 初始化一个 SHT3x 传感器。
    • 创建一个描述传感器的数据结构并初始化传感器设备。
    • 参数:
      • bus: 传感器连接的 I2C 总线。
      • addr: 传感器的 I2C 从设备地址。
    • 返回值:指向传感器数据结构的指针,初始化失败时返回 NULL。
  2. sht3x_measure

    • 高级测量函数,执行一次测量。
    • 包含三个步骤:
      1. 以高可靠性启动一次单次测量。
      2. 使用 vTaskDelay 等待测量结果可用。
      3. 返回浮点类型的传感器测量值。
    • 参数:
      • dev: 指向传感器设备数据结构的指针。
      • temperature: 返回的温度值(摄氏度)。
      • humidity: 返回的湿度值(百分比)。
    • 返回值:成功时返回 true,失败时返回 false
  3. sht3x_start_measurement

    • 启动单次测量或周期性测量。
    • 可以选择单次测量模式或周期性测量模式,以及设置测量的重复性。
    • 参数:
      • dev: 指向传感器设备数据结构的指针。
      • mode: 测量模式(单次或周期性),参见 sht3x_mode_t 类型。
      • repeat: 测量的重复性,参见 sht3x_repeat_t 类型。
    • 返回值:成功时返回 true,失败时返回 false
  4. sht3x_get_measurement_duration

    • 获取测量所需的 RTOS tick 数。
    • 返回给定重复性下执行一次测量所需的时间。
    • 用户任务可以直接使用此函数返回的持续时间来等待测量结果。
    • 参数:
      • repeat: 测量的重复性,参见 sht3x_repeat_t 类型。
    • 返回值:测量持续时间,单位为 RTOS ticks。
  5. sht3x_get_raw_data

    • 从传感器读取测量结果并存储为原始数据。
    • 读取温度和压力的测量结果,检查 CRC 校验码并存储在字节数组中。
    • 参数:
      • dev: 指向传感器设备数据结构的指针。
      • raw_data: 存储原始数据的字节数组。
    • 返回值:成功时返回 true,失败时返回 false
  6. sht3x_compute_values

    • 从原始数据计算出传感器的温度和湿度值。
    • 参数:
      • raw_data: 包含原始数据的字节数组。
      • temperature: 返回的温度值(摄氏度)。
      • humidity: 返回的湿度值(百分比)。
    • 返回值:成功时返回 true,失败时返回 false
  7. sht3x_get_results

    • 获取传感器测量结果并返回传感器值。
    • 该函数结合了 sht3x_read_raw_datasht3x_compute_values 函数,读取原始数据并计算出传感器的温度和湿度值。
    • 参数:
      • dev: 指向传感器设备数据结构的指针。
      • temperature: 返回的温度值(摄氏度)。
      • humidity: 返回的湿度值(百分比)。
    • 返回值:成功时返回 true,失败时返回 false

获取SHT3x温湿度传感器的示例代码如下:

  • 测量模式选择:SINGLE_SHOT_HIGH_LEVEL、SINGLE_SHOT_LOW_LEVEL或周期模式

    // #define SINGLE_SHOT_LOW_LEVEL
    // #define SINGLE_SHOT_HIGH_LEVEL#if defined(SINGLE_SHOT_HIGH_LEVEL)
    void user_task (void *pvParameters)
    {float temperature;float humidity;TickType_t last_wakeup = xTaskGetTickCount();while (1) {// perform one measurement and do something with the resultsif (sht3x_measure (sensor, &temperature, &humidity))printf("%.3f SHT3x Sensor: %.2f °C, %.2f %%\n", (double)sdk_system_get_time()*1e-3, temperature, humidity);// wait until 5 seconds are overvTaskDelayUntil(&last_wakeup, 5000 / portTICK_PERIOD_MS);}
    }
    #elif defined(SINGLE_SHOT_LOW_LEVEL)
    void user_task (void *pvParameters)
    {float temperature;float humidity;TickType_t last_wakeup = xTaskGetTickCount();// get the measurement duration for high repeatability;uint8_t duration = sht3x_get_measurement_duration(sht3x_high);while (1) {// Trigger one measurement in single shot mode with high repeatability.sht3x_start_measurement (sensor, sht3x_single_shot, sht3x_high);// Wait until measurement is ready (constant time of at least 30 ms// or the duration returned from *sht3x_get_measurement_duration*).vTaskDelay (duration);// retrieve the values and do something with themif (sht3x_get_results (sensor, &temperature, &humidity))printf("%.3f SHT3x Sensor: %.2f °C, %.2f %%\n", (double)sdk_system_get_time()*1e-3, temperature, humidity);// wait until 5 seconds are overvTaskDelayUntil(&last_wakeup, 5000 / portTICK_PERIOD_MS);}
    }
    #else  // PERIODIC MODE
    void user_task (void *pvParameters)
    {float temperature;float humidity;// Start periodic measurements with 1 measurement per second.sht3x_start_measurement (sensor, sht3x_periodic_1mps, sht3x_high);// Wait until first measurement is ready (constant time of at least 30 ms// or the duration returned from *sht3x_get_measurement_duration*).vTaskDelay (sht3x_get_measurement_duration(sht3x_high));TickType_t last_wakeup = xTaskGetTickCount();while (1) {// Get the values and do something with them.if (sht3x_get_results (sensor, &temperature, &humidity))printf("%.3f SHT3x Sensor: %.2f °C, %.2f %%\n", (double)sdk_system_get_time()*1e-3, temperature, humidity);// Wait until 2 seconds (cycle time) are over.vTaskDelayUntil(&last_wakeup, 2000 / portTICK_PERIOD_MS);}
    }
    #endif
    
    • 单次测量模式

      • 在单次测量模式下,一条测量命令会触发精确采集一个数据对。每个数据对包括 16 位十进制的温度和湿度值。由于测量持续时间长达 15 毫秒,因此测量过程被分成多个步骤,以避免在测量过程中阻塞用户任务:

        1. 使用函数 sht3x_start_measurement 触发传感器,执行一次测量。

        2. 使用函数 vTaskDelay 等待测量持续时间,直到获得测量结果。使用至少 30 毫秒的恒定持续时间或函数 sht3x_get_measurement_duration 返回的以 RTOS ticks 为单位的持续时间进行等待。

        3. 使用函数 sht3x_get_results 或函数 sht3x_get_raw_data 获取浮点传感器值或原始数据。

      • 在单次模式下,每次需要新的传感器值时,用户任务都必须执行所有步骤。

    为方便起见,一个高级函数 sht3x_measure(sht3x_measure)只需一个函数即可完成上述三个步骤的测量。该函数是使用传感器的最简单方法。它最适合不想控制传感器细节的用户。
    这种模式的优点是,传感器可以在连续测量之间切换到睡眠模式,从而更加节能。当测量速率小于每秒1次测量时,这种模式尤其有用。

    • 周期模式

      • 在这种模式下,发出的一条测量命令会产生一个数据对流。每个数据对由 16 位十进制的温度和湿度值组成。测量命令一经发送至传感器,传感器就会自动以每秒 0.5、1、2、4 或 10 次的测量速率定期执行测量。数据对可以以相同或更低的速率获取。与单次测量模式一样,测量过程分为以下几个步骤:

        1. 使用函数 sht3x_start_measurement,以给定的速率触发传感器,开始周期性测量。

        2. 使用函数 vTaskDelay 等待测量持续时间,直到获得第一个结果。使用至少 30 毫秒的恒定持续时间或函数 sht3x_get_measurement_duration 返回的以 RTOS ticks 为单位的持续时间进行等待。

使用函数 sht3x_get_results 或函数 sht3x_get_raw_data 获取浮点传感器值或原始数据。
与单次测量模式不同的是,步骤1和2只需执行一次。一旦开始测量,用户任务只需定期获取数据即可,但传感器在整个过程中一直保持活跃状态,因此能耗较高

注:获取测量结果的速率不得大于传感器的周期性测量速率。为避免因传感器的定时容差造成冲突,应小于该速率。

  • 初试化I2C并读取SHT3x温湿度的值

    注:如果SHT3x的ADDR引脚接的不是GND,而是VCC,则需要将地址改为SHT3x_ADDR_2

    #define I2C_MASTER_SCL_IO           GPIO_NUM_5      /*!< GPIO number used for I2C master clock */
    #define I2C_MASTER_SDA_IO           GPIO_NUM_4      /*!< GPIO number used for I2C master data  */
    #define I2C_MASTER_NUM              0              /*!< I2C master i2c port number, the number of i2c peripheral interfaces available will depend on the chip */
    #define I2C_MASTER_FREQ_HZ          400000           /*!< I2C master clock frequency */
    #define I2C_MASTER_TX_BUF_DISABLE   0                /*!< I2C master doesn't need buffer */
    #define I2C_MASTER_RX_BUF_DISABLE   0                /*!< I2C master doesn't need buffer */
    #define I2C_MASTER_TIMEOUT_MS       1000             /*!< I2C master timeout in milliseconds */void app_main(void)
    {// Set UART Parameter.uart_set_baud(0, 115200);// Give the UART some time to settlevTaskDelay(1);// Init I2C bus interfaces at which SHT3x sensors are connectedint i2c_master_port = I2C_MASTER_NUM;i2c_config_t conf = {.mode = I2C_MODE_MASTER,.sda_io_num = I2C_MASTER_SDA_IO,.scl_io_num = I2C_MASTER_SCL_IO,.sda_pullup_en = GPIO_PULLUP_ENABLE,.scl_pullup_en = GPIO_PULLUP_ENABLE,.master.clk_speed = I2C_MASTER_FREQ_HZ,};i2c_param_config(i2c_master_port, &conf);i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);// Create the sensors, multiple sensors are possible.if ((sensor = sht3x_init_sensor(I2C_MASTER_NUM, SHT3x_ADDR_1))){// Create a user task that uses the sensors.xTaskCreate(user_task, "user_task", TASK_STACK_DEPTH, NULL, 2, 0);}elseprintf("Could not initialize SHT3x sensor\n");
    }
    

如果串口输出的结果为Could not initialize SHT3x sensor,可以通过下面的程序来扫描I2C设备来确保SHT3x是否连接正常

#include "driver/i2c.h"
#include <stdio.h>#define I2C_MASTER_SCL_IO           GPIO_NUM_5      /*!< GPIO number used for I2C master clock */
#define I2C_MASTER_SDA_IO           GPIO_NUM_4      /*!< GPIO number used for I2C master data  */
#define I2C_MASTER_NUM              0                          /*!< I2C master i2c port number, the number of i2c peripheral interfaces available will depend on the chip */
#define I2C_MASTER_FREQ_HZ          400000                     /*!< I2C master clock frequency */
#define I2C_MASTER_TX_BUF_DISABLE   0                          /*!< I2C master doesn't need buffer */
#define I2C_MASTER_RX_BUF_DISABLE   0                          /*!< I2C master doesn't need buffer */
#define I2C_MASTER_TIMEOUT_MS       1000                       /*!< I2C master timeout in milliseconds */void i2c_scanner()
{i2c_config_t conf = {.mode = I2C_MODE_MASTER,.sda_io_num = I2C_MASTER_SDA_IO,.scl_io_num = I2C_MASTER_SCL_IO,.sda_pullup_en = GPIO_PULLUP_ENABLE,.scl_pullup_en = GPIO_PULLUP_ENABLE,.master.clk_speed = I2C_MASTER_FREQ_HZ,};i2c_param_config(I2C_MASTER_NUM, &conf);i2c_driver_install(I2C_MASTER_NUM, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);printf("I2C scanner. Scanning...\n");for (int address = 1; address < 127; 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, 1000 / portTICK_PERIOD_MS);i2c_cmd_link_delete(cmd);if (ret == ESP_OK) {printf("I2C device found at address 0x%02x\n", address);}}printf("Scan completed.\n");
}void app_main(void)
{i2c_scanner();
}

输出结果中I2C地址有0x44或者0x45则说明SHT3x连接正常

请添加图片描述
最终的结果如下:

请添加图片描述

这篇关于【ESP-IDF5.x】 ESP32/ESP8266驱动SHT3x温湿度传感器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101905

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

WIN11 ESP32 IDF + VSCODE 环境搭建[教程向]

前言 目录 前言 安装ESP32-IDF VSCODE插件安装 编译测试 很多时候我们想学习一门新的技能,需要使用全新的开发环境,很多时候我们会在安装环境这个环节卡住很久,这里简单介绍一下ESP32+VSCODE环境搭建。 安装ESP32-IDF https://dl.espressif.cn/dl/esp-idf/?idf=4.4 直接复制上面链接,进入idf下载界面。

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,

windows10 卸载网络驱动以及重新安装

右键桌面此电脑的图标,点击管理,设备管理器—网络适配器,找到下图中的驱动(不同的系统或者显卡会导致网卡驱动名称与下图不一样,多为Realtek开头),右键选择卸载设备,然后重启电脑,系统会自动重新安装驱动 新电脑首次安装驱动: 根据主板厂家,比如华硕,进入华硕官网,点击服务支持,点击下载中心,选择型号,点击右侧驱动程序和工具软件,选择windows版本,下载相应的驱动,下载完之后在对应文件中找

笔记整理—内核!启动!—kernel部分(1)驱动与内核的关系

首先,恭喜完成了uboot部分的内容整理,其次补充一点,uboot第一部分和第二部分的工作不是一定的,在不同的版本中,可能这个初始化早一点,那个的又放在了第二部分,版本不同,造成的工作顺序不同,但终归是要完成基本内容初始化并传参给kernel的。         那么至于驱动与内核的关系,用一张图来说明最适合不过:         驱动位于OS层的中下层与硬件相接。驱动是内

人体红外传感器简介

人体红外传感器的工作原理是利用热释电效应,将人体发出的特定波长的红外线转化为电信号,从而实现对人体的检测和感知。               具体来说,人体红外传感器主要由滤光片、热释电探测元和前置放大器组成。滤光片的作用是使特定波长的红外辐射选择性地通过,到达热释电探测元,而在其截止范围外的红外辐射则不能通过。热释电探测元是传感器的核心元件,当它受到非恒定强度的红外光照射时,会产生