news 2026/5/6 8:48:18

ESP-IDF 如何使用components和自定义工程目录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ESP-IDF 如何使用components和自定义工程目录

前言

笔者是一个刚开始学习esp32s3的萌新,最近在摸索如何引入esp32官方的组件库,还有就是如何自定义工程文件,加入自己的.c 和 .h文件那些,组成自己的工程模板。

1.如何使用组件 以官方button组件为例

官方文档网站:快速入门 - - — ESP-IoT-Solution latest 文档
组件网站:ESP Component Registry

1.先来到官方的组件网站
espressif/button • v4.1.5 • ESP Component Registry
2.找到button组件,打开命令行窗口,生成idf_component.yml文件

idf.py add-dependency "espressif/button^4.1.5"

3.使用该命令,组件源码会自动下载到 managed_components 目录中(前提是能访问git)

idf.py reconfigure

4.接下来只要include头文件,参照例程使用即可

按键 - - — ESP-IoT-Solution latest 文档

2.如何自定义工程文件夹(包含组件)

1.先创建一个components文件夹,也可以直接右键新建文件夹

mkdir components

2.进入components文件夹 (在命令行操作)

# 进入components目录 cd components
# 创建 sensor 组件 (sensor是自己的文件夹名字) idf.py create-component sensor

3.接着电脑就会创建一个文件夹,包含这些目录,先编辑自己的 .c 和 .h 头文件

4.修改CMakeLists.txt

idf_component_register( SRCS "MyButton.c" INCLUDE_DIRS "include" REQUIRES button )

SRCS → .c 文件名
INCLUDE_DIRS → "." 表示当前根目录 "include"表示对应文件夹
REQUIRES → 对应依赖的组件名字 (这里是 button,如果不依赖组件的话,整行可删去)

下文附上我的文件代码,实测可用,定义三个按钮,分别实现单击,长按,双击识别

MyButton.h

#ifndef MYBUTTON_H #define MYBUTTON_H #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "iot_button.h" #include "button_gpio.h" // 定义按键引脚和有效电平 #define BUTTON_VOICE_UP 15 // 按键连接的 GPIO42 引脚 #define BUTTON_VOICE_DOWN 12 // 按键连接的 GPIO42 引脚 #define BUTTON_POWER 11 // 按键连接的 GPIO42 引脚 #define BUTTON_ACTIVE_LEVEL 0 // 按键按下时的有效电平(0 表示低电平) typedef struct { uint8_t click_count; // 数据1:多击次数(对应 args3.multiple_clicks.clicks) uint8_t btn_id; // 数据2:按键标识(自定义,比如按键3的ID=3,可替换为其他你需要的数据) } MyButtonData_t; extern const char *TAG; extern MyButtonData_t g_Button3_MyData; void Button_Init(void); #endif

MyButton.c

#include "MyButton.h" const char *TAG = "button_test"; MyButtonData_t g_Button3_MyData = {0}; // 定义全局变量存储点击数(生命周期贯穿整个程序)-- g_MyClicks → iot_button_register_cb[ (uint8_t *)usr_data ] → *p_clicktime // uint8_t g_MyClicks = 0; // -------------------------------- 单击事件回调函数 ------------------------------- static void button1_single_click_cb(void *arg, void *usr_data) { ESP_LOGI(TAG, "[voice+]BUTTON_SINGLE_CLICK"); } // -------------------------------- 长按事件回调函数 ------------------------------- static void button_long_press_1_cb(void *arg, void *usr_data) { ESP_LOGI(TAG, "BUTTON_LONG_PRESS_START_1"); } static void button_long_press_2_cb(void *arg, void *usr_data) { ESP_LOGI(TAG, "BUTTON_LONG_PRESS_START_2"); } // -------------------------------- 多次触发事件回调函数 ------------------------------- static void button3_single_click_cb(void *button_handle, void *usr_data) { // 安全校验:避免空指针访问 if (usr_data == NULL) { ESP_LOGE(TAG, "usr_data is NULL, callback exit"); return; } MyButtonData_t *p_custom_data = (MyButtonData_t *)usr_data; // 步骤6:访问结构体的两个字段,获取传递的两个数据(核心:解析多份数据) ESP_LOGI(TAG, "CallBack! Button_ID:%d,Setted Click TImes:%d", p_custom_data->btn_id, // 读取数据2:按键ID p_custom_data->click_count); // 读取数据1:多击次数 } /** * @brief 按键初始化函数 * */ void Button_Init(void) { // ===== 按键 1 ===== 单击 const button_config_t btn1_cfg = {0}; const button_gpio_config_t btn1_gpio_cfg = { .gpio_num = BUTTON_VOICE_UP, .active_level = BUTTON_ACTIVE_LEVEL, }; button_handle_t button1 = NULL; iot_button_new_gpio_device(&btn1_cfg, &btn1_gpio_cfg, &button1); iot_button_register_cb(button1, BUTTON_SINGLE_CLICK, NULL, button1_single_click_cb, NULL); // ===== 按键 2 ===== 长按 const button_config_t btn_cfg = {0}; const button_gpio_config_t btn_gpio_cfg = { .gpio_num = BUTTON_VOICE_DOWN, .active_level = BUTTON_ACTIVE_LEVEL, }; button_handle_t gpio_btn = NULL; iot_button_new_gpio_device(&btn_cfg, &btn_gpio_cfg, &gpio_btn); button_event_args_t args = {0}; args.long_press.press_time = 2000; iot_button_register_cb(gpio_btn, BUTTON_LONG_PRESS_START, &args, button_long_press_1_cb, NULL); args.long_press.press_time = 5000; iot_button_register_cb(gpio_btn, BUTTON_LONG_PRESS_START, &args, button_long_press_2_cb, NULL); // ===== 按键 3 ===== 双击 const button_config_t btn3_cfg = {0}; const button_gpio_config_t btn3_gpio_cfg = { .gpio_num = BUTTON_POWER, .active_level = BUTTON_ACTIVE_LEVEL, }; button_handle_t button3 = NULL; iot_button_new_gpio_device(&btn3_cfg, &btn3_gpio_cfg, &button3); button_event_args_t args3 = {0}; args3.multiple_clicks.clicks = 2; // 双击触发 g_Button3_MyData.click_count = args3.multiple_clicks.clicks; // 数据1:多击次数(2) g_Button3_MyData.btn_id = 3; // 数据2:按键3的ID(自定义,可替换为其他数据) iot_button_register_cb(button3, BUTTON_MULTIPLE_CLICK, &args3, button3_single_click_cb, (void *)&g_Button3_MyData); }

main.c

#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "MyButton.h" /* 这是一个使用 ESP-IDF 框架和 iot_button 组件实现按键功能的示例代码。 实现按键1单击触发,按键2长按触发 学习说明 iot_button_new_gpio_device() 三个参数 分别是 配置时间 配置引脚 返回按键句柄 iot_button_register_cb() 分别是 按键句柄 点击事件类型 NULL(用于多次触发) 按键触发函数 用户数据 最后一个参数是用来给回调函数传数据的,一般用不到就传NULL即可 */ void app_main(void) { Button_Init(); while (1) { ESP_LOGI(TAG, "Button test run!"); vTaskDelay(5000 / portTICK_PERIOD_MS); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 20:29:36

中华人民共和国网络安全法

&#xff08;2016年11月7日第十二届全国人民代表大会常务委员会第二十四次会议通过 根据2025年10月28日第十四届全国人民代表大会常务委员会第十八次会议《关于修改〈中华人民共和国网络安全法〉的决定》修正&#xff09;目  录第一章 总  则第二章 网络安全支持与促进第…

作者头像 李华
网站建设 2026/5/5 9:46:49

项目分享|Open-AutoGLM:让AI真正“上手”你的手机

引言 在智能设备普及的今天&#xff0c;如何让手机更“懂”用户需求&#xff0c;实现自动化任务处理&#xff0c;成为提升效率的重要方向。Open-AutoGLM 作为一款基于 AutoGLM 构建的手机端智能助理框架&#xff0c;通过多模态技术与自动化操作的结合&#xff0c;让用户只需用…

作者头像 李华
网站建设 2026/4/30 23:27:19

Linux系统下最简PyTorch环境搭建:Miniconda-Python3.10实战记录

Linux系统下最简PyTorch环境搭建&#xff1a;Miniconda-Python3.10实战记录 在现代AI开发中&#xff0c;一个常见的场景是&#xff1a;你刚拿到一台新的Linux服务器&#xff0c;准备复现一篇论文的实验结果。可当你运行pip install torch时&#xff0c;却卡在了CUDA版本不兼容的…

作者头像 李华
网站建设 2026/5/1 10:22:27

如何在Miniconda中配置PyTorch GPU版本?Python3.10最佳实践

如何在 Miniconda 中配置 PyTorch GPU 版本&#xff1f;Python 3.10 实战指南 在深度学习项目中&#xff0c;一个稳定、可复现的开发环境往往比模型本身更早成为“拦路虎”。你是否曾遇到这样的场景&#xff1a;代码明明在本地跑得好好的&#xff0c;换到服务器上却报错 torch…

作者头像 李华
网站建设 2026/4/25 8:13:10

Anaconda下载太慢?试试Miniconda+清华镜像极速替代方案

Miniconda 清华镜像&#xff1a;打造极速 Python 开发环境 在数据科学和人工智能项目中&#xff0c;搭建一个稳定、高效的开发环境往往是第一步。然而&#xff0c;许多开发者都曾经历过这样的场景&#xff1a;点击下载 Anaconda 安装包后&#xff0c;进度条以“龟速”爬行&…

作者头像 李华
网站建设 2026/4/28 18:12:27

Miniconda环境下PyTorch GPU版本安装失败常见问题汇总

Miniconda环境下PyTorch GPU版本安装失败常见问题深度解析 在深度学习项目启动阶段&#xff0c;最令人沮丧的莫过于环境配置环节——明明硬件齐全、代码清晰&#xff0c;却卡在 torch.cuda.is_available() 返回 False 上。这种“看得见GPU却用不上”的窘境&#xff0c;在使用Mi…

作者头像 李华