当前位置: 首页 > news >正文

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); } }
http://www.jsqmd.com/news/167061/

相关文章:

  • AI开发必备:Claude Skills详解,让你的智能体效率起飞(建议收藏)
  • 从零构建AI写作平台:Miniconda-Python3.10 + 大模型Token生成 pipeline
  • 使用Docker Run运行Miniconda-Python3.10镜像,快速接入AI算力市场
  • 使用Miniconda-Python3.10轻松实现CUDA与PyTorch环境集成
  • Conda环境初始化错误终极解决:Miniconda-Python3.10预激活shell
  • Docker Run参数详解:启动Miniconda-Python3.10并挂载GPU设备
  • 打造高SEO排名内容:用Miniconda-Python3.10生成PyTorch相关技术文章
  • 2025国内最新化妆品ODM企业top6榜单公布!广东、广州等地区行业优质公司专业解析及选择指南,专业定制赋能品牌成长 - 全局中转站
  • GitHub Star增长策略:开源Miniconda-Python3.10配置模板吸引流量
  • 国产操作系统全景解析:技术架构、生态建设与实战应用
  • 博文精读:Chrome CSS 2025年回顾
  • Linux下PyTorch安装教程GPU加速全流程(基于Miniconda-Python3.10镜像)
  • Jupyter Lab集成PyTorch指南:基于Miniconda-Python3.10环境配置
  • Jupyter Notebook集成PyTorch:Miniconda-Python3.10实战指南
  • 什么是“深数据”
  • 法大大与亚太国际仲裁院香港仲裁中心达成战略合作
  • AI编程革命:Trae如何重塑前端开发
  • PyTorch安装失败常见原因分析及Miniconda-Python3.10镜像应对策略
  • 安装包管理混乱?Miniconda的Conda环境让你井井有条
  • Jupyter内核配置:为Miniconda-Python3.10添加PyTorch专用Kernel
  • Miniconda vs Anaconda:谁更适合PyTorch深度学习开发?
  • Web测试中如何简单定位Bug
  • 岐金兰AI元人文构想:基于三值九层生成动力学的文明意义操作系统
  • 从本地到云端:Miniconda-Python3.10镜像统一AI开发与生产环境
  • Markdown SEO优化写作:用Miniconda-Python3.10生成关键词丰富文章
  • 为什么越来越多团队选择Miniconda-Python3.10而非Anaconda?
  • 2025年景观雕塑正规厂家推荐:景观雕塑品牌商选择与公园景观雕塑厂家榜单 - 工业推荐榜
  • 从本地到云端:Miniconda镜像助力无缝迁移PyTorch项目
  • 基于二阶锥松弛与智能软开关技术的MATLAB含SOP配电网重构策略研究
  • 数据准度决胜AI时代:数眼智能VS博查搜索API深度测评