news 2026/4/18 7:25:30

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/18 8:46:41

GitHub Actions自动化测试Miniconda-Python3.10+PyTorch环境

GitHub Actions自动化测试Miniconda-Python3.10PyTorch环境 在现代AI项目开发中&#xff0c;一个常见的痛点是&#xff1a;“代码在我本地能跑&#xff0c;为什么CI挂了&#xff1f;” 更进一步的问题是&#xff1a;即使依赖看似安装成功&#xff0c;模型训练却因底层库版本不…

作者头像 李华
网站建设 2026/4/17 21:03:44

Miniconda-Python3.10镜像如何提升你的深度学习工作效率?

Miniconda-Python3.10镜像如何提升你的深度学习工作效率&#xff1f; 在当今深度学习项目日益复杂、团队协作愈发频繁的背景下&#xff0c;一个常见却令人头疼的问题浮出水面&#xff1a;为什么别人的代码在我机器上跑不起来&#xff1f;明明安装了同样的库&#xff0c;却总是报…

作者头像 李华
网站建设 2026/4/14 17:28:08

requestlIdleCallback api

requestIdleCallback 是浏览器提供的一个 Web API&#xff0c;允许开发者在主线程空闲时执行低优先级的后台任务&#xff0c;以避免阻塞关键操作&#xff08;如动画、用户输入响应&#xff09;和页面渲染&#xff0c;从而提升页面性能和用户体验。 核心功能与特点 空闲时间调度…

作者头像 李华
网站建设 2026/4/16 21:21:20

Linux日志系统:syslog、rsyslog、journald的关系(deepseek)

syslog 是一种协议和标准&#xff0c;rsyslog 是其一个高性能的实现&#xff0c;而 journald 是一个全新的、独立的日志系统&#xff0c;但三者可以协同工作。 下面我们来详细解析它们的关系和区别。 1. syslog - 鼻祖&#xff08;协议和标准&#xff09; 身份&#xff1a; 最初…

作者头像 李华
网站建设 2026/4/15 16:38:48

C语言syslog()函数(deepseek)

C语言syslog()函数&#xff1a;从原理到实践的完整指南 1. syslog()函数概述 syslog()是Unix/Linux系统中最常用的日志记录API之一&#xff0c;它提供了一个标准化的方式将应用程序日志发送到系统日志服务。 基本函数原型 #include <syslog.h>void syslog(int priority, …

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

书签篮:一款基于云端的个人书签管理工具 - 技术实现与优势分析

一、 产品介绍&#xff1a;告别书签杂乱&#xff0c;实现高效知识管理 官方网站&#xff1a;https://shuqianlan.com 书签篮 是一个专为现代互联网用户设计的云端个人书签管理中心。其核心目标是解决传统浏览器书签的以下痛点&#xff1a; 无法跨设备同步&#xff1a;在家收…

作者头像 李华