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)完整程序示例
#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 框架时,为了避免框架升级后示例代码变更导致程序无法使用,可以将公共组件(如示例代码中的组件)提取出来,并将其转换为私有组件。以下是具体步骤:
- 创建私有组件目录 首先,在你的项目目录中创建一个私有组件目录。例如,创建一个名为 components 的目录:
mkdir -p components
作为一个私有组件目录,需要告诉 ESP-IDF,这个目录是一个组件目录。于是在项目根目录下的 CMakeLists.txt 文件中,添加以下内容:
set(EXTRA_COMPONENT_DIRS ./components)
这样,ESP-IDF 就会在项目根目录下的 components 目录中查找组件。
- 复制公共组件 将 ESP-IDF 示例中的公共组件复制到你的私有组件目录中。例如,假设你想将 ${IDF_PATH}/examples/common_components/ 中的 protocol_examples_common 组件复制为私有组件:
cp -r ${IDF_PATH}/examples/common_components/protocol_examples_common ./components
这样,protocol_examples_common 组件就被复制到了你的私有组件目录中。成为私有组件了。
- 修改组件名称和配置 但是这个组件的名称,会与公共组件的名称冲突。因此,需要修改组件的名称,方法也很简单,只需要修改组件目录的名称即可。即将 protocol_examples_common 改为 lj_protocol_common:
mv ./components/protocol_examples_common ./components/lj_protocol_common
这样修改完成后,共公用组件就变成了私有组件了。 4. 配置组件依赖 那么如何引用自己的组件呢?只需要在main
目录下的CMakeLists.txt
文件中,添加以下内容,就可以引用自己的组件了:
idf_component_register(SRCS "main.c"
INCLUDE_DIRS "."
REQUIRES lj_protocol_common
)
- 注意事项
在组件私有化后,如果原来的公有组件的引用还在,就需要将其删除。否则,会出现编译错误冲突。 在 main
目录下的 idf_component.yml
文件中,删除原来的组件引用。
## 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
看看还能不能找到,如果找不到了,就说明已经删除了。