当前位置: 首页 > 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.gsyq.cn/news/182664.html

相关文章:

  • 使用Docker Run运行Miniconda-Python3.10镜像,快速接入AI算力市场
  • 使用Miniconda-Python3.10轻松实现CUDA与PyTorch环境集成
  • 打造高SEO排名内容:用Miniconda-Python3.10生成PyTorch相关技术文章
  • 2025国内最新化妆品ODM企业top6榜单公布!广东、广州等地区行业优质公司专业解析及选择指南,专业定制赋能品牌成长 - 全局中转站
  • Jupyter Lab集成PyTorch指南:基于Miniconda-Python3.10环境配置
  • Linux下PyTorch安装教程GPU加速全流程(基于Miniconda-Python3.10镜像)
  • 基于二阶锥松弛与智能软开关技术的MATLAB含SOP配电网重构策略研究
  • Linux下Miniconda权限问题导致PyTorch安装失败的解决办法
  • 西门子200smart伺服脉冲定位案例自动输送抓料与自动移印机相结合 1、此程序样例为自动输送...
  • Miniconda vs Anaconda:为什么PyTorch开发者更倾向Python3.10轻量镜像?
  • 使用Miniconda-Python3.10镜像提升GPU算力利用率的三个技巧
  • SSH免密登录Miniconda容器进行后台PyTorch任务调度
  • 使用Conda安装PyTorch时报错怎么办?常见错误及解决方案
  • Token生成服务上线:基于Miniconda-Python3.10镜像的高性能推理后端
  • web应用中如何对静态资源加载失败的场景做降级处理
  • %d输出float类型,%f输出int类型
  • 对比zero-shot,few-shot两种提示方式
  • Miniconda-Python3.10镜像如何提升你的深度学习工作效率?
  • C语言syslog()函数(deepseek)
  • 利用Miniconda轻量级优势,构建专属Python AI开发容器
  • 2025年北京靠谱汽车贴膜排行榜,售后完善的汽车窗膜公司与品牌企业推荐 - 工业推荐榜
  • 一键部署PyTorch+GPU环境:Miniconda-Python3.10镜像全面解析
  • 2025北京诚信的隐形车衣公司TOP5权威推荐:甄选有名的隐形车衣品牌 - 工业推荐榜
  • 手把手教你用Miniconda配置PyTorch+TensorFlow双框架环境
  • SSH免密登录Jupyter服务器:提升AI开发效率的关键一步
  • 接口测试--Day1 - R
  • CentOS 8 完整实现 Rsyslog 日志写入 MySQL 数据库
  • 众包地图十年演进(2015–2025)
  • CondaError频繁出现?掌握这几点彻底告别环境激活问题
  • Jupyter Lab远程访问配置:基于Miniconda-Python3.10镜像的安全设置