Skip to content

ESP-IDF组件的使用方法

查找ESP-IDF组件
在这个网址,可以查找到各种可用的组件。这也是ESP-IDF的重要优势。很多功能都已经帮你写好了,你只需要使用即可。

1. ESP-IDF组件介绍

ESP-IDF组件是ESP32系列芯片的官方开发框架,它提供了丰富的功能和API,方便开发者进行开发。ESP-IDF组件包括了许多库和驱动程序,可以满足不同的需求。

2. ESP-IDF组件的使用方法

参考文档

2.1 搜索组件

ESP-IDF 组件管理器中,搜索你需要的组件,例如 iotbutton。找到后,在右侧找到添加组件的命令.idf.py add-dependency "espressif/button^4.1.1" 将这个添加命令复制下来。

关于button的介绍 关于button在Iot的按键使用方法。

2.2 添加组件依赖

在VScode中的终端中,输入 idf.py add-dependency "espressif/button^4.1.1",然后回车。这样就可以将组件添加到你的项目中。此时 main目录下会多出一个文件idf_component.yml.这个文件就是组件的配置文件。但此时只是添加了对于组件的依赖,还没有将组件添加到项目中。

2.3 添加组件源码

通过执行 idf.py build 命令,会自动将组件添加到项目中。此时,你就可以在项目中使用组件了。

注意 : 如果你的项目在下载使用这个组件之前就编译过了。那么你需要先清理一下编译,再全部重新编译才行。执行 idf.py fullclean 命令,然后再执行 idf.py build 命令。

2.4 使用添加的组件

(1)引入头文件

在你的代码中,引入组件的头文件,例如 iot_button.h

(2)使用组件的API

根据组件的文档,使用组件的API。例如,如果你使用的是 iotbutton 组件,你可以使用 iot_button_init 函数来初始化按钮。 编写回调函数,例如 button_callback,当按钮被按下时,这个函数会被调用。

(3)完整程序示例

c
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"

#include "iot_button.h"
#include "button_types.h"
#include "button_gpio.h"


#define BOOT_BUTTON_NUM 9
#define BUTTON_ACTIVE_LEVEL 0



static void button_event_cb(void *arg, void *data)
{
    iot_button_print_event((button_handle_t)arg);

    if(data != NULL) {
        printf("Button event,%s\n", (const char *)data);
    }
    
}
void button_init(uint32_t button_num)
{
    button_config_t btn_cfg = {0};
    button_gpio_config_t gpio_cfg = {
        .gpio_num = button_num,
        .active_level = BUTTON_ACTIVE_LEVEL,
        .enable_power_save = true,
    };

    button_handle_t btn;
    esp_err_t ret = iot_button_new_gpio_device(&btn_cfg, &gpio_cfg, &btn);
    assert(ret == ESP_OK);

    ret = iot_button_register_cb(btn, BUTTON_PRESS_DOWN, NULL, button_event_cb, "BUTTON_PRESS_DOWN");
    ret |= iot_button_register_cb(btn, BUTTON_PRESS_UP, NULL, button_event_cb, "BUTTON_PRESS_UP");
    ret |= iot_button_register_cb(btn, BUTTON_PRESS_REPEAT, NULL, button_event_cb, "BUTTON_PRESS_REPEAT");
    ret |= iot_button_register_cb(btn, BUTTON_PRESS_REPEAT_DONE, NULL, button_event_cb, "BUTTON_PRESS_REPEAT_DONE");
    ret |= iot_button_register_cb(btn, BUTTON_SINGLE_CLICK, NULL, button_event_cb, "BUTTON_SINGLE_CLICK");
    ret |= iot_button_register_cb(btn, BUTTON_DOUBLE_CLICK, NULL, button_event_cb, "BUTTON_DOUBLE_CLICK");
    ret |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_START, NULL, button_event_cb, "BUTTON_LONG_PRESS_START");
    ret |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_HOLD, NULL, button_event_cb, "BUTTON_LONG_PRESS_HOLD");
    ret |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_UP, NULL, button_event_cb, "BUTTON_LONG_PRESS_UP");
    ret |= iot_button_register_cb(btn, BUTTON_PRESS_END, NULL, button_event_cb, "BUTTON_PRESS_END");

    ESP_ERROR_CHECK(ret);
}

void app_main(void)
{
    printf("Hello world!\n");
    button_init(BOOT_BUTTON_NUM);

}

这是一个完整的示例程序。

3. 如何将示例中的公式组件转移至自己的项目中

在 ESP-IDF 中,有很多示例用的公共组件,这些组件都是示例用的,并不受官方推荐,如果需要,可能在下一个版本中,会有很大的变化。因此,不建议引用这些组件用于产品开发。最好的办法是将这些组件转移至自己的项目中。让它与原来的示例项目无关。

在使用 ESP-IDF 框架时,为了避免框架升级后示例代码变更导致程序无法使用,可以将公共组件(如示例代码中的组件)提取出来,并将其转换为私有组件。以下是具体步骤:

  1. 创建私有组件目录 首先,在你的项目目录中创建一个私有组件目录。例如,创建一个名为 components 的目录:
bash
mkdir -p components

作为一个私有组件目录,需要告诉 ESP-IDF,这个目录是一个组件目录。于是在项目根目录下的 CMakeLists.txt 文件中,添加以下内容:

cmake
set(EXTRA_COMPONENT_DIRS ./components)

这样,ESP-IDF 就会在项目根目录下的 components 目录中查找组件。

  1. 复制公共组件 将 ESP-IDF 示例中的公共组件复制到你的私有组件目录中。例如,假设你想将 ${IDF_PATH}/examples/common_components/ 中的 protocol_examples_common 组件复制为私有组件:
bash
cp -r  ${IDF_PATH}/examples/common_components/protocol_examples_common  ./components

这样,protocol_examples_common 组件就被复制到了你的私有组件目录中。成为私有组件了。

  1. 修改组件名称和配置 但是这个组件的名称,会与公共组件的名称冲突。因此,需要修改组件的名称,方法也很简单,只需要修改组件目录的名称即可。即将 protocol_examples_common 改为 lj_protocol_common:
bash
mv ./components/protocol_examples_common ./components/lj_protocol_common

这样修改完成后,共公用组件就变成了私有组件了。 4. 配置组件依赖 那么如何引用自己的组件呢?只需要在main目录下的CMakeLists.txt文件中,添加以下内容,就可以引用自己的组件了:

cmake
idf_component_register(SRCS "main.c"
                    INCLUDE_DIRS "."
                    REQUIRES lj_protocol_common
                    )
  1. 注意事项

在组件私有化后,如果原来的公有组件的引用还在,就需要将其删除。否则,会出现编译错误冲突。 在 main 目录下的 idf_component.yml 文件中,删除原来的组件引用。

yaml
## IDF Component Manager Manifest File
dependencies:
  espressif/mdns: "^1.0.3"
  ## Required IDF version
  idf:
    version: ">=5.0"
  # protocol_examples_common:
  #   path: ${IDF_PATH}/examples/common_components/protocol_examples_common

这样,编译时,就完全没有 protocol_examples_common什么事了。可以通过命令 idf.py reconfigure 来重新配置项目。通过搜索 protocol_examples_common 看看还能不能找到,如果找不到了,就说明已经删除了。