【esp32 学习笔记】esp-idf学会调用组件管理——以 button 组件为例
简单不看版——esp-idf组件管理步骤
- 在ESP-IDF 组件管理器网页(https://components.espressif.com/)搜索我们需要的组件,比如【button】,然后 点开相应的组件,比如 espressif/button 组件。
- 【关键步骤】复制相关组件界面上配置组件的命令 ,形如:
idf.py add-dependency "espressif/button^3.2.0"
,并在 esp-idf 终端窗口中输入。 - 生成
idf_component.yml
文件后,使用命令idf.py build
或者插件上面的编译按钮对整个工程进行一次编译,编译完成后,组件就会出现在managed_components
目录下。 managed_components
目录下有组件文件后,组件便添加成功了;接下来可以引用组件内的头文件,在自己的.c文件中编写程序了。
ESP32使用iot-button组件实现按键检测的功能
ESP-IDF 组件管理
IDF 组件管理器工具用于下载 ESP-IDF CMake 项目的依赖项,该下载在 CMake 运行期间自动完成(也就是说,不是事先下载好,而是准备编译的时候下载的)。IDF 组件管理器可以从自动从组件注册表 或 Git 仓库获取组件,具体的使用和介绍,请查看官方文档,需要注意的是 ESP-IDF 管理器是 IDF4.4 以后引入的特性,使用IDF框架时,建议尽量使用最新的 release 版本 IDF 构建自己的项目。
要获取组件列表,请参阅 https://components.espressif.com/
iot-button 组件简介
-
我们从 ESP-IDF 组件管理器网页搜索我们需要的组件【button】,然后 点开 espressif/button 组件
2. button 组件简介
Button按键组件实现了 GPIO 和 ADC 两种按键,并允许同时创建两种不同的按键。下图显示了两种按键的硬件设计:
图 GPIO按键
图 ADC按键
GPIO 按键优点有:每一个按键占用独立的 IO,之间互不影响,稳定性高;缺点有:按键数量多时占用太多 IO 资源。
ADC 按键优点有:可多个按键共用一个 ADC 通道,占用 IO 资源少;缺点有:不能同时按下多按键,当按键因氧化等因素导致闭合电阻增大时,容易误触,稳定性不高。
每个按键拥有下表的 8 个事件:
每个按键可以有 回调 和 轮询 两种使用方式:
- 回调:一个按键的每个事件都可以为其注册一个回调函数,产生事件时回调函数将会被调用。这种方式的效率和实时性高,不会丢失事件。
- 轮询:在程序中周期性调用 :ciot_button_get_event 查询按键当前的事件。
这种方式使用简单,适合任务简单的场合,当然你也可以将以上两种方式组合使用。
注意:回调函数中不能有 TaskDelay 等阻塞的操作
具体功能和使用方法,请查看官方文档
测试button组件
1. 使用 VSCODE 的 ESP-IDF 插件创建一个 helloword 的工程
2. 【关键步骤】复制button组件界面上配置组件的命令 idf.py add-dependency "espressif/button^3.2.0"
在当前 helloworld 工程下增加 button组件
PS:遇到的一些问题及解决方法:
idf.py 的命令无法执行,提示 idf.py : 无法将 “idf.py ”项识别为 cmet、函数、脚本文件或可运行程序的名称。请检査名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 或者只会打开 idf.py 这个文件而不执行这个文件的内容.
解决方法:
指令只能在 ESP-IDF Terminal 中执行,不能在系统自带的 powershell 等工具中执行
生成 idf_component.yml
文件后,使用命令 idf.py build
或者插件上面的编译按钮对整个工程先进行一次编译,编译完成后,组件就会出现在 managed_components
目录下
4. 此处我们测试最简单GPIO控制LED的功能;将\managed_components\espressif__button\examples\button_power_save\main\main.c 文件里面的内容全部复制到 hello_world_main.c 中
并对 hello_world_main.c 的内容进行稍微的修改,因为我们不测试低功耗的相关功能,故删除低功耗测试的相关代码,并且修改 GPIO 及按键按下的有效电平;以下使用IO0作为按键输入,且有效电平为低电平。
/*
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_pm.h"
#include "iot_button.h"
#include "esp_sleep.h"
#include "esp_idf_version.h"
/* Most development boards have "boot" button attached to GPIO0.
* You can also change this to another pin.
*/
//这里设置你要初始化的按键的PIN号
#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C6
#define BOOT_BUTTON_NUM 9
#else
#define BOOT_BUTTON_NUM 0
#endif
#define BUTTON_ACTIVE_LEVEL 0 //这里设置按键按下之后的有效电平
static const char *TAG = "button_test";
const char *button_event_table[] = {
"BUTTON_PRESS_DOWN",
"BUTTON_PRESS_UP",
"BUTTON_PRESS_REPEAT",
"BUTTON_PRESS_REPEAT_DONE",
"BUTTON_SINGLE_CLICK",
"BUTTON_DOUBLE_CLICK",
"BUTTON_MULTIPLE_CLICK",
"BUTTON_LONG_PRESS_START",
"BUTTON_LONG_PRESS_HOLD",
"BUTTON_LONG_PRESS_UP",
};
static void button_event_cb(void *arg, void *data)
{
ESP_LOGI(TAG, "Button event %s", button_event_table[(button_event_t)data]);
#if CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE
esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause();
if (cause != ESP_SLEEP_WAKEUP_UNDEFINED) {
ESP_LOGI(TAG, "Wake up from light sleep, reason %d", cause);
}
#endif
}
void button_init(uint32_t button_num)
{
button_config_t btn_cfg = {
.type = BUTTON_TYPE_GPIO,
.gpio_button_config = {
.gpio_num = button_num,
.active_level = BUTTON_ACTIVE_LEVEL,
#if CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE
.enable_power_save = true,
#endif
},
};
button_handle_t btn = iot_button_create(&btn_cfg);
assert(btn);
esp_err_t err = iot_button_register_cb(btn, BUTTON_PRESS_DOWN, button_event_cb, (void *)BUTTON_PRESS_DOWN);
err |= iot_button_register_cb(btn, BUTTON_PRESS_UP, button_event_cb, (void *)BUTTON_PRESS_UP);
err |= iot_button_register_cb(btn, BUTTON_PRESS_REPEAT, button_event_cb, (void *)BUTTON_PRESS_REPEAT);
err |= iot_button_register_cb(btn, BUTTON_PRESS_REPEAT_DONE, button_event_cb, (void *)BUTTON_PRESS_REPEAT_DONE);
err |= iot_button_register_cb(btn, BUTTON_SINGLE_CLICK, button_event_cb, (void *)BUTTON_SINGLE_CLICK);
err |= iot_button_register_cb(btn, BUTTON_DOUBLE_CLICK, button_event_cb, (void *)BUTTON_DOUBLE_CLICK);
err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_START, button_event_cb, (void *)BUTTON_LONG_PRESS_START);
err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_HOLD, button_event_cb, (void *)BUTTON_LONG_PRESS_HOLD);
err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_UP, button_event_cb, (void *)BUTTON_LONG_PRESS_UP);
ESP_ERROR_CHECK(err);
}
#if CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
void power_save_init(void)
{
esp_pm_config_t pm_config = {
.max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ,
.min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ,
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
.light_sleep_enable = true
#endif
};
ESP_ERROR_CHECK(esp_pm_configure(&pm_config));
}
#else
void power_save_init(void)
{
#if CONFIG_IDF_TARGET_ESP32
esp_pm_config_esp32_t pm_config = {
#elif CONFIG_IDF_TARGET_ESP32S2
esp_pm_config_esp32s2_t pm_config = {
#elif CONFIG_IDF_TARGET_ESP32C3
esp_pm_config_esp32c3_t pm_config = {
#elif CONFIG_IDF_TARGET_ESP32S3
esp_pm_config_esp32s3_t pm_config = {
#elif CONFIG_IDF_TARGET_ESP32C2
esp_pm_config_esp32c2_t pm_config = {
#endif
.max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ,
.min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ,
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
.light_sleep_enable = true
#endif
};
ESP_ERROR_CHECK(esp_pm_configure(&pm_config));
}
#endif
#endif
void app_main(void)
{
#if CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE
power_save_init();
#endif
button_init(BOOT_BUTTON_NUM);
}
对修改完成的功能进行编译,并下载到测试的开发板上,按下接到 IO0 上的按键,就可以通过日志参看按键的事件:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器