news 2026/4/15 4:16: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/15 4:12:59

JupyterLab配置指南:在Miniconda-Python3.10中运行PyTorch代码

JupyterLab 配置实战&#xff1a;Miniconda Python 3.10 环境下高效运行 PyTorch 在现代 AI 开发中&#xff0c;一个稳定、可复现且交互性强的开发环境几乎是每位数据科学家和深度学习工程师的刚需。你是否曾遇到过这样的场景&#xff1a;本地训练好的模型换一台机器就跑不起来…

作者头像 李华
网站建设 2026/4/13 17:36:30

Anaconda配置PyTorch环境太慢?试试轻量级Miniconda-Python3.10镜像

Miniconda-Python3.10 镜像&#xff1a;轻量高效构建 PyTorch 开发环境的新选择 在深度学习项目开发中&#xff0c;你是否经历过这样的场景&#xff1a;刚拿到一台新的云服务器&#xff0c;迫不及待想跑通模型代码&#xff0c;结果第一步“配置环境”就卡了半小时——Anaconda …

作者头像 李华
网站建设 2026/4/14 3:49:52

使用Miniconda-Python3.10镜像降低GPU服务器运维成本

使用Miniconda-Python3.10镜像降低GPU服务器运维成本 在AI研发团队中&#xff0c;你是否经历过这样的场景&#xff1a;刚接手一个项目&#xff0c;满怀信心地准备复现实验结果&#xff0c;却发现环境依赖错综复杂——PyTorch版本不匹配、CUDA驱动冲突、某个关键包在同事电脑上能…

作者头像 李华
网站建设 2026/4/10 20:22:23

CUDA驱动兼容性问题终结者:Miniconda-Python3.10镜像自动匹配PyTorch版本

CUDA驱动兼容性问题终结者&#xff1a;Miniconda-Python3.10镜像自动匹配PyTorch版本 在深度学习项目开发中&#xff0c;最让人头疼的往往不是模型设计本身&#xff0c;而是环境配置——尤其是当你的代码写完准备跑实验时&#xff0c;却发现 torch.cuda.is_available() 返回了 …

作者头像 李华
网站建设 2026/4/12 12:06:04

iOS开发者自带弱网测试工具界面说明

弱网测试的思路弱网功能测试&#xff1a;2G/3G/4G、高延时、高丢包。无网状态测试&#xff1a;断网功能测试、本地数据存储。用户体验关注&#xff1a;响应时间、页面呈现、超时文案、超时重连、安全及大流量风险。网络切换测试&#xff1a;WIFI → 4G/3G/2G → 网多状态切换。…

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

Web测试中如何简单定位Bug

定位bug之前要确定自己对用例的理解是否有问题。&#xff08;在工作中,很多测试结果错误都是因为自己对用例的理解没有到位&#xff0c;以致于操作错误导致结果不符合预期&#xff09; 一般来说bug分为前端bug和后端bug&#xff0c;前端bug为请求数据错误&#xff0c;后端bug为…

作者头像 李华