ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ESP-IoT-Solution 输入设备方案全解:按键、键盘扫描、旋钮与触摸屏

2026/9/19 2:40:54 拓冰建站 浏览量
ESP-IoT-Solution 输入设备方案全解:按键、键盘扫描、旋钮与触摸屏 ESP-IoT-Solution 输入设备方案全解按键、键盘扫描、旋钮与触摸屏【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solutionESP-IoT-Solution 在 docs/en/input_device/index.rst 中系统性地整理了一整套输入设备组件方案覆盖按钮Button、键盘扫描Keyboard Button、旋钮Knob与触摸屏Touch Panel四大类人机交互入口。本文将以此文档为主线逐模块讲解其硬件设计、事件模型、配置项、代码用法与低功耗策略并结合本仓库的源码实现components/button、components/keyboard_button、components/knob、components/display/lcd_touch进行纵深佐证帮助你在一套 ESP-IDF 工程里同时落地 GPIO/ADC/矩阵按键、全键无冲矩阵键盘、旋转编码器与电容触摸屏并让每个输入设备都能在 Light Sleep 场景下工作。输入设备组件总览docs/en/input_device/index.rst是输入设备章节的入口文档通过 toctree 汇总了四个核心组件页面button基于 GPIO / ADC / 矩阵的按键组件keyboard_button基于行列扫描的键盘扫描组件knob软件 PCNT 实现的旋转编码器组件touch_panel基于esp_lcd_touch抽象层的触摸屏驱动方案。下文按文档顺序逐一展开。四个组件在源码仓库中的对应目录分别为 components/button、components/keyboard_button、components/knob 和 components/display/lcd_touch每个组件均配有 README、测试用例test_apps与idf_component.yml可通过 IDF 组件管理器直接依赖使用。Button 按键组件GPIO 与 ADC 双模式按键组件支持 GPIO 模式与 ADC 模式并且同一时间可以同时创建两种不同类型的按键硬件设计如下图所示GPIO 按键与 ADC 按键的取舍GPIO 按键每个按键占用一个独立 IO互不影响稳定性高缺点是按键数量增多时会占用过多 IO 资源。ADC 按键一个 ADC 通道可通过分压电阻网络共享多个按键占用 IO 资源少缺点是无法同时按下多个按键且按键闭合电阻会因氧化等因素增大导致稳定性下降。使用时有两点必须注意原文档明确要求GPIO 按键需关注芯片内部上拉/下拉电阻问题内部上下拉默认使能但仅支持输入功能的 IO 内部没有该电阻必须外部连接上拉或下拉。ADC 按键的电压不应超过 ADC 量程。按键事件模型按键组件将一次完整的按键动作拆解为多个事件各事件的触发条件如下表继承自原文档事件触发条件BUTTON_PRESS_DOWN按下BUTTON_PRESS_UP释放BUTTON_PRESS_REPEAT按下并释放 ≥ 2 次BUTTON_PRESS_REPEAT_DONE重复按压完成BUTTON_SINGLE_CLICK按下并释放一次BUTTON_DOUBLE_CLICK按下并释放两次BUTTON_MULTIPLE_CLICK按下并释放 N 次N 可指定达到指定次数时触发BUTTON_LONG_PRESS_START按住达到阈值时长的那一刻触发BUTTON_LONG_PRESS_HOLD长按期间持续触发BUTTON_LONG_PRESS_UP长按后释放BUTTON_PRESS_END表示按键已完成当前检测周期在源码中事件枚举定义于 components/button/include/iot_button.hBUTTON_PRESS_DOWN为枚举首值其后依次排列PRESS_UP、长按相关事件等与文档表格一一对应long_press结构体成员则服务于BUTTON_LONG_PRESS_START与BUTTON_LONG_PRESS_UP两个事件的时长参数配置。每个按键支持**回调Call-back与轮询Polling**两种使用方式且二者可组合使用回调为每个事件注册回调函数事件产生时被调用效率高、实时性好、事件不丢失。轮询在程序中周期性调用iot_button_get_event查询当前事件使用简单适合任务简单的场景但并非所有按压事件都能及时捕获存在丢失事件的风险。注意回调函数中不允许出现 TaskDelay 等阻塞操作。关键配置项配置项含义BUTTON_PERIOD_TIME_MS扫描周期BUTTON_DEBOUNCE_TICKS去抖时间BUTTON_SHORT_PRESS_TIME_MS短按生效时间BUTTON_LONG_PRESS_TIME_MS长按生效时间ADC_BUTTON_MAX_CHANNELADC 最大通道数ADC_BUTTON_MAX_BUTTON_PER_CHANNEL每个 ADC 通道的最大按键数ADC_BUTTON_SAMPLE_TIMES每次 ADC 扫描的采样次数BUTTON_LONG_PRESS_HOLD_SERIAL_TIME_MS长按期间回调触发的间隔时间这些宏通过组件内的 Kconfig 暴露位于 components/button/Kconfig可在工程menuconfig中调整。创建按键创建 GPIO 按键// create gpio button const button_config_t btn_cfg {0}; const button_gpio_config_t btn_gpio_cfg { .gpio_num 0, .active_level 0, }; button_handle_t gpio_btn NULL; esp_err_t ret iot_button_new_gpio_device(btn_cfg, btn_gpio_cfg, gpio_btn); if(NULL gpio_btn) { ESP_LOGE(TAG, Button create failed); }创建 ADC 按键// create adc button const button_config_t btn_cfg {0}; button_adc_config_t btn_adc_cfg { .unit_id ADC_UNIT_1, .adc_channel 0, .button_index 0, .min 100, .max 400, }; button_handle_t adc_btn NULL; esp_err_t ret iot_button_new_adc_device(btn_cfg, btn_adc_cfg, adc_btn); if(NULL adc_btn) { ESP_LOGE(TAG, Button create failed); }min/max为该按键在 ADC 采样值上的电压区间多个按键按不同分压区间分布在同一条 ADC 通道上即一个 ADC 通道共享多个按键的原理所在。创建矩阵按键// create matrix keypad button const button_config_t btn_cfg {0}; const button_matrix_config_t matrix_cfg { .row_gpios (int32_t[]){4, 5, 6, 7}, .col_gpios (int32_t[]){3, 8, 16, 15}, .row_gpio_num 4, .col_gpio_num 4, }; button_handle_t matrix_button NULL; esp_err_t ret iot_button_new_matrix_device(btn_cfg, matrix_cfg, btns, matrix_button); if(NULL matrix_button) { ESP_LOGE(TAG, Button create failed); }与项目共享 ADC1 时的处理当工程其他模块已在使用 ADC1 时应将已有的adc_oneshot句柄传入避免组件重复初始化 ADC1adc_oneshot_unit_handle_t adc1_handle; adc_oneshot_unit_init_cfg_t init_config1 { .unit_id ADC_UNIT_1, }; //-------------ADC1 Init---------------// adc_oneshot_new_unit(init_config1, adc1_handle); const button_config_t btn_cfg {0}; button_adc_config_t btn_adc_cfg { .adc_handle adc1_handle, .unit_id ADC_UNIT_1, .adc_channel 0, .button_index 0, .min 100, .max 400, }; button_handle_t adc_btn NULL; esp_err_t ret iot_button_new_adc_device(btn_cfg, btn_adc_cfg, adc_btn); if(NULL adc_btn) { ESP_LOGE(TAG, Button create failed); }注册回调函数组件支持为多个事件各自注册回调函数。简单示例static void button_single_click_cb(void *arg,void *usr_data) { ESP_LOGI(TAG, BUTTON_SINGLE_CLICK); } iot_button_register_cb(gpio_btn, BUTTON_SINGLE_CLICK, NULL, button_single_click_cb, NULL);多事件注册示例BUTTON_LONG_PRESS_START与BUTTON_LONG_PRESS_UP事件支持指定各自的长按时间BUTTON_MULTIPLE_CLICK事件支持指定连续按压次数。注册时通过button_event_args_t携带事件参数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); } button_event_args_t args { .long_press.press_time 2000, }; iot_button_register_cb(gpio_btn, BUTTON_LONG_PRESS_START, args, button_auto_check_cb_1, NULL); args.long_press.press_time 5000; iot_button_register_cb(gpio_btn, BUTTON_LONG_PRESS_START, args, button_long_press_2_cb, NULL);即同一个事件可以挂多个回调并通过args区分不同长按时长如上例 2 秒与 5 秒分别触发不同回调。动态修改默认参数运行期可通过iot_button_set_param动态调整按键参数iot_button_set_param(btn, BUTTON_LONG_PRESS_TIME_MS, 5000);查询事件轮询模式button_event_t event; event iot_button_get_event(button_handle);低功耗模式在 Light Sleep 模式下esp_timer会周期性唤醒 CPU导致整体功耗居高不下。为此按键组件提供了低功耗模式前置要求所有创建的按键都必须是 GPIO 类型且开启enable_power_save存在其他类型按键时低功耗模式可能失效。说明该特性只保证按键组件仅在按键被使用时才唤醒 CPU并不保证 CPU 一定会进入低功耗模式。低功耗模式下通过 GPIO 电平唤醒 CPU仅支持电平触发因此单次按压期间的平均电流会高于未开启低功耗时取决于按压时长但在更长的运行周期内整体更省电。开启方式如下button_config_t btn_cfg {0}; button_gpio_config_t gpio_cfg { .gpio_num button_num, .active_level BUTTON_ACTIVE_LEVEL, .enable_power_save true, }; button_handle_t btn; iot_button_new_gpio_device(btn_cfg, gpio_cfg, btn);进入 Light Sleep 有两种时机自动低功耗按键关闭esp_timer后设备自动进入 Light Sleep用户控制当enter_power_save_cb被调用时设备进入 Light Sleepvoid btn_enter_power_save(void *usr_data) { ESP_LOGI(TAG, Can enter power save now); } button_power_save_config_t config { .enter_power_save_cb btn_enter_power_save, }; iot_button_register_power_save_cb(config);开启 CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP 后的使用方式当使能CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP宏时GPIO 模块会掉电。此时必须使用 RTC/LP GPIO 并将唤醒源改为 EXT 1按键才能正常工作GPIO 类型CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP 是否使能唤醒源数字引脚否GPIO 电平触发数字引脚是无RTC/LP 引脚否GPIO 电平触发 / EXT 1RTC/LP 引脚是EXT 1注意ESP32-C5 与 ESP32-C6 的 LP GPIO 同时支持 GPIO 电平唤醒与 EXT 1 唤醒且还需使能gpio_hold_en。停止与恢复组件支持任意时刻开关// stop button iot_button_stop(); // resume button iot_button_resume();源码与测试佐证除头文件 components/button/include/iot_button.h 外GPIO / ADC / 矩阵三种实现分别位于 button_gpio.c、button_adc.c、button_matrix.c对应配置结构体定义于 components/button/include/button_gpio.h、components/button/include/button_adc.h、[components/button/include/button_matrix.h)组件还提供了iot_button_new_rtc_device见 components/button/include/button_rtc.h以支持 RTC 引脚场景。功能测试用例位于 components/button/test_apps其中 pytest_button.py 通过 pytest 框架自动验证事件与回调行为。低功耗相关示例可参考 examples/get-started/button_power_save。Keyboard Button 键盘扫描组件全键无冲矩阵键盘键盘扫描组件实现了快速高效的键盘扫描支持按键去抖、按键释放/按下事件上报以及组合键功能。它采用矩阵行-列扫描通过特殊电路设计实现**全键无冲Full-key Rollover**检测硬件电路如下在该电路中行Row依次输出高电平检测列Column是否有高电平信号若检测到则说明该键被按下。注意由于该组件的逻辑不涉及行列扫描互换不适用于传统行列扫描电路仅适用于全键无冲键盘电路。组件事件KBD_EVENT_PRESSED按键状态发生变化时上报数据携带字段key_pressed_num按下的按键数量key_release_num释放的按键数量key_change_num相比上一状态发生变化的按键数量大于 0表示按下按键增加小于 0表示减少key_data当前按下按键的信息含位置 x, y按按下先后顺序索引索引越小按得越早key_release_data相比上一状态被释放的按键信息含位置 x, y。KBD_EVENT_COMBINATION组合键事件组合键按下时触发携带字段key_num组合中按键的数量key_data组合键的位置信息。例如设置组合键 (1,1) 和 (2,2) 时必须先按下 (1,1) 再按下 (2,2) 才会触发组合键事件组合键只在按键递增组合时触发。事件枚举定义于 components/keyboard_button/include/keyboard_button.hKBD_EVENT_PRESSED与KBD_EVENT_COMBINATION之外还保留了KBD_EVENT_MAX作为边界标记。初始化键盘扫描keyboard_btn_config_t cfg { .output_gpios (int[]) { 40, 39, 38, 45, 48, 47 }, .output_gpio_num 6, .input_gpios (int[]) { 21, 14, 13, 12, 11, 10, 9, 4, 5, 6, 7, 15, 16, 17, 18 }, .input_gpio_num 15, .active_level 1, .debounce_ticks 2, .ticks_interval 500, // us .enable_power_save false, // enable power save }; keyboard_btn_handle_t kbd_handle NULL; keyboard_button_create(cfg, kbd_handle);其中output_gpios对应行输出、input_gpios对应列输入ticks_interval为扫描间隔微秒debounce_ticks为去抖计数active_level为有效电平。注册回调函数注册KBD_EVENT_PRESSED事件keyboard_btn_cb_config_t cb_cfg { .event KBD_EVENT_PRESSED, .callback keyboard_cb, }; keyboard_button_register_cb(kbd_handle, cb_cfg, NULL);注册KBD_EVENT_COMBINATION事件时需要通过combination成员传入组合键信息keyboard_btn_cb_config_t cb_cfg { .event KBD_EVENT_COMBINATION, .callback keyboard_combination_cb1, .event_data.combination.key_num 2, .event_data.combination.key_data (keyboard_btn_data_t[]) { {5, 1}, {1, 1}, }, }; keyboard_button_register_cb(kbd_handle, cb_cfg, NULL);每个事件可以注册多个回调。注册多个回调时建议保存返回的keyboard_btn_cb_handle_t *rtn_cb_hdl便于之后解绑特定回调。扫描效率在 ESP32-S3 上扫描 5×16 矩阵键盘时最大扫描速率可达 20K次/秒足以支撑高速录入场景。可参考键盘示例工程 examples/keyboard 查看完整用法。低功耗支持初始化时将enable_power_save置为 true 即可激活低功耗模式无按键变化时暂停键盘扫描允许 CPU 进入睡眠按键按下时唤醒 CPU。该特性只保证不占用 CPU并不保证 CPU 必然进入低功耗目前仅支持 Light Sleep。Knob 旋钮组件软件 PCNT 实现旋转编码器Knob 是提供**软件 PCNT脉冲计数**的组件可用于不具备 PCNT 硬件能力的芯片如 esp32c2、esp32c3从而快速使用物理编码器如 EC11。硬件参考设计如下图所示适用场景适合低速旋转计数场景脉冲率小于 30 脉冲/秒例如 EC11 编码器也适合对脉冲计数 100% 精确度没有要求的场景。若需要精确或高速脉冲计数请改用硬件 PCNT 功能ESP32、ESP32-C6、ESP32-H2、ESP32-S2、ESP32-S3 芯片支持硬件 PCNT。旋钮事件每个旋钮有 5 个事件事件触发条件KNOB_LEFT向左旋转KNOB_RIGHT向右旋转KNOB_H_LIM计数值达到上限KNOB_L_LIM计数值达到下限KNOB_ZERO计数值回到 0源码中枚举定义于 components/knob/include/iot_knob.h。每个旋钮事件均可注册回调函数回调方式高效实时、事件不丢失回调中同样不允许 TaskDelay 等阻塞操作。配置项配置项含义KNOB_PERIOD_TIME_MS扫描周期KNOB_DEBOUNCE_TICKS去抖次数KNOB_HIGH_LIMIT旋钮可计数的最高值KNOB_LOW_LIMIT旋钮可计数的最低值创建旋钮// create knob knob_config_t cfg { .default_direction 0, .gpio_encoder_a GPIO_KNOB_A, .gpio_encoder_b GPIO_KNOB_B, }; s_knob iot_knob_create(cfg); if(NULL s_knob) { ESP_LOGE(TAG, knob create failed); }注册回调函数static void _knob_left_cb(void *arg, void *data) { ESP_LOGI(TAG, KNOB: KNOB_LEFT,count_value:%PRId32, iot_knob_get_count_value((button_handle_t)arg)); } iot_knob_register_cb(s_knob, KNOB_LEFT, _knob_left_cb, NULL);在回调中通过iot_knob_get_count_value读取当前计数值可用于音量调节、菜单选择、亮度控制等典型场景。更多示例可参考 examples/get-started/knob_power_save 与 examples/motor/foc_knob_example。低功耗支持与按键组件同理Light Sleep 模式下esp_timer会周期性唤醒 CPU 造成高功耗Knob 组件通过 GPIO 电平唤醒提供低功耗方案。只需在knob_config_t中使能enable_power_save选项即可。低功耗模式下旋钮依然响应灵敏且整体功耗更低。启用与禁用// Stop knob iot_knob_stop(); // Resume knob iot_knob_resume();Touch Panel 触摸屏基于 esp_lcd_touch 的驱动方案触摸屏已是显示类应用的标配组件。ESP-IoT-Solution 基于 ESP-BSP 的esp_lcd_touch组件提供了常见触摸屏控制器的驱动。支持的触摸控制器ESP-IoT-Solution 目前内置以下触摸控制器驱动均位于 components/display/lcd_touch触摸控制器通信接口组件名称ILI2118I2Cesp_lcd_touch_ili2118SPD2010I2Cesp_lcd_touch_spd2010ST7123I2Cesp_lcd_touch_st7123此外ESP-IDF / ESP-BSP 生态中常见的触摸控制器还包括GT911 / GT1151电容式触摸控制器FT5x06 系列FT5216、FT5316、FT5436、FT6336电容式触摸控制器本仓库提供了 esp_lcd_touch_ft6336u 驱动及其 测试用例CST816S电容式触摸控制器TT21100电容式触摸控制器。架构优势esp_lcd_touch为不同触摸控制器提供了统一抽象层带来以下能力统一 API所有触摸控制器使用同一套接口易于集成可与 LVGL 等 GUI 库无缝对接硬件抽象更换触摸控制器无需修改应用代码I2C 通信基于高效的 I2C 与触摸控制器通信。触摸屏特性电容式触摸屏支持多点触控取决于控制器无需校准控制器内部已完成校准高精度与高响应速度支持手势滑动、缩放、旋转取决于控制器。配置选项坐标镜像X/Y 轴坐标交换交换 X 与 Y中断引脚支持复位引脚支持。基础初始化示例以 GT911 为例先初始化 I2C 总线再创建触摸 IO 与触摸控制器#include esp_lcd_touch.h #include esp_lcd_touch_gt911.h // Example with GT911 #include driver/i2c_master.h // Initialize I2C bus i2c_master_bus_config_t i2c_bus_conf { .clk_source I2C_CLK_SRC_DEFAULT, .sda_io_num GPIO_NUM_8, .scl_io_num GPIO_NUM_18, .i2c_port I2C_NUM_0, .flags.enable_internal_pullup true, }; i2c_master_bus_handle_t i2c_bus; ESP_ERROR_CHECK(i2c_new_master_bus(i2c_bus_conf, i2c_bus)); // Initialize touch IO (I2C) esp_lcd_panel_io_handle_t io_handle NULL; esp_lcd_panel_io_i2c_config_t io_config ESP_LCD_TOUCH_IO_I2C_GT911_CONFIG(); ESP_ERROR_CHECK(esp_lcd_new_panel_io_i2c(i2c_bus, io_config, io_handle)); // Configure touch panel esp_lcd_touch_config_t tp_cfg { .x_max 800, // Screen width .y_max 480, // Screen height .rst_gpio_num GPIO_NUM_NC, // Reset pin (or GPIO_NUM_NC) .int_gpio_num GPIO_NUM_3, // Interrupt pin (or GPIO_NUM_NC) .levels { .reset 0, .interrupt 0, }, .flags { .swap_xy 0, .mirror_x 0, .mirror_y 0, }, }; // Initialize touch controller esp_lcd_touch_handle_t touch_handle NULL; ESP_ERROR_CHECK(esp_lcd_touch_new_i2c_gt911(io_handle, tp_cfg, touch_handle));其中x_max/y_max必须与 LCD 实际分辨率一致rst_gpio_num/int_gpio_num不使用时置为GPIO_NUM_NC。读取触摸数据触摸数据读取分为两步先周期性调用esp_lcd_touch_read_data刷新数据再通过esp_lcd_touch_get_coordinates获取坐标// Read touch data (call this periodically) esp_lcd_touch_read_data(touch_handle); // Get touch coordinates uint16_t touch_x[1]; uint16_t touch_y[1]; uint16_t touch_strength[1]; uint8_t touch_cnt 0; bool pressed esp_lcd_touch_get_coordinates(touch_handle, touch_x, touch_y, touch_strength, touch_cnt, 1); if (pressed touch_cnt 0) { printf(Touch at: X%d, Y%d, Strength%d\n, touch_x[0], touch_y[0], touch_strength[0]); }与 LVGL 集成ESP-IoT-Solution 的 esp_lvgl_adapter 组件提供了与 LVGL 的便捷集成创建touch_handle后注册为 LVGL 的输入设备即可#include esp_lv_adapter.h // After creating touch_handle as shown above esp_lv_adapter_touch_config_t touch_cfg ESP_LV_ADAPTER_TOUCH_DEFAULT_CONFIG(disp, touch_handle); lv_indev_t *indev esp_lv_adapter_register_touch(touch_cfg);使用 ESP-IoT-Solution 触摸驱动方法一通过组件管理器添加依赖# For SPD2010 idf.py add-dependency espressif/esp_lcd_touch_spd2010 # For ILI2118 idf.py add-dependency espressif/esp_lcd_touch_ili2118 # For ST7123 idf.py add-dependency espressif/esp_lcd_touch_st7123方法二在idf_component.yml中声明依赖dependencies: espressif/esp_lcd_touch_spd2010: *SPD2010 示例#include esp_lcd_touch_spd2010.h esp_lcd_panel_io_i2c_config_t io_config ESP_LCD_TOUCH_IO_I2C_SPD2010_CONFIG(); esp_lcd_touch_config_t tp_cfg { .x_max 320, .y_max 320, .rst_gpio_num GPIO_NUM_NC, .int_gpio_num GPIO_NUM_NC, .levels { .reset 0, .interrupt 0, }, .flags { .swap_xy 0, .mirror_x 0, .mirror_y 0, }, }; esp_lcd_touch_handle_t tp; ESP_ERROR_CHECK(esp_lcd_touch_new_i2c_spd2010(io_handle, tp_cfg, tp));触摸旋转与镜像触摸坐标需要与 LCD 方向匹配交换 XY 坐标当触摸面板相对 LCD 旋转 90° 或 270° 时使用tp_cfg.flags.swap_xy 1; // Swap X and Y coordinates镜像坐标沿 X 或 Y 轴翻转tp_cfg.flags.mirror_x 1; // Mirror X axis tp_cfg.flags.mirror_y 1; // Mirror Y axis设置分辨率始终将x_max/y_max设为实际 LCD 分辨率tp_cfg.x_max 800; // LCD width tp_cfg.y_max 480; // LCD height仓库内置的触摸驱动位于 components/display/lcd_touch每个驱动目录均包含 README、头文件与测试用例带触摸的 GUI 示例可参考 examples/display/gui其中集成了 LVGL 与触摸屏的完整初始化流程。总结如何按场景选型对照四类输入设备可按交互需求快速选型少量独立按键电源、功能键→ Button GPIO 模式每个按键独占 IO稳定可靠按键数量多且 IO 紧张→ Button ADC 模式单通道共享多键或矩阵按键全键盘录入与组合键→ Keyboard Button 组件支持全键无冲与组合键事件旋钮调节音量、菜单→ Knob 组件esp32c2/esp32c3 等无 PCNT 硬件时可直接使用图形界面触控→ Touch Panel 方案基于esp_lcd_touch统一抽象可搭配 esp_lvgl_adapter 快速接入 LVGL。若产品需要低功耗Button、Keyboard Button、Knob 三组件均提供enable_power_save低功耗模式配合 Light Sleep 使用触摸屏则需结合中断引脚int_gpio_num实现按需唤醒。四个组件的 API 参考、Kconfig 配置与测试用例均可在仓库对应components/目录下继续深入查阅。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考