上一篇《ESP32系列--第十篇 ADC电阻网络按键》我们讲了ADC电阻网络按键的基本电路与检测逻辑,本篇再此基础上进一步实现按键的功能。
一个常规的按键功能包括:
其中长按时间可配置、长按再次触发可配置、点击次数统计周期可配置,另外以上模式也可以相互组合,例如某个按键既要支持短按又要支持长按,某个按键既要支持短按,又要支持点击次数统计;也就是说某个按键的模式组合是任意的,需要根据具体应用来配置。
定义按键模式
- /*
- * 按键功能模式描述
- * 可以根据需要进行组合
- */
- typedef enum {
- DRV_BUTTON_FLAGS_PRESSED = 1 << 0, //按下
- DRV_BUTTON_FLAGS_UNPRESSED = 1 << 1, //松开
- DRV_BUTTON_FLAGS_SHORT_PRESS = 1 << 2, //短按
- DRV_BUTTON_FLAGS_LONG_PRESS = 1 << 3, //长按
- DRV_BUTTON_FLAGS_LONG_PRESS_REPEAT = 1 << 4, //再次长按
- DRV_BUTTON_FLAGS_PRESSED_TICKS = 1 << 5, //指定周期点击次数
- } drv_button_flags_t;
同时支持长按短按可以如下定义
DRV_BUTTON_FLAGS_SHORT_PRESS | DRV_BUTTON_FLAGS_LONG_PRESS
一个按键从开始按下到松开会经历如下过程(采样周期一般设置为50ms):
第一次检测到被按下,记录这次按下信息,第二次检测到按下,则认为按键真正被按下,即按键触发按下事件;如果继续检测,连续几次还是按下,根据按下的时间判断是否是长按;如果某个时间检测到松开,则认为按键松开,此时需要根据按下和松开的时间差判断是否短按
- #include "drv_button.h"
-
- #include "esp_log.h"
-
- //#include "i2c_bus.h"
- #include "driver/gpio.h"
-
- #define TAG "main"
-
- static const char *button_info[] = {
- "此按键支持按下和松开",
- "此按键仅支持短按",
- "此按键支持按下和短按",
- "此按键支持短按长按和长按再次触发",
- "此按键支持短按和按键次数统计",
- "此按键支持所有模式"
- };
-
- static void drv_button_ev(void *userdata, drv_button_id_t id, drv_button_flags_t flags, void *ev_data) {
- ESP_LOGI(TAG, "%s\n%d %s%s%s%s%s%s",
- button_info[id],
- id,
- (flags & DRV_BUTTON_FLAGS_PRESSED) ? "pressed" : "",
- (flags & DRV_BUTTON_FLAGS_UNPRESSED) ? "unpressed" : "",
- (flags & DRV_BUTTON_FLAGS_SHORT_PRESS) ? "short_press" : "",
- (flags & DRV_BUTTON_FLAGS_LONG_PRESS) ? "long_press" : "",
- (flags & DRV_BUTTON_FLAGS_LONG_PRESS_REPEAT) ? "long_press_repeate" : "",
- (flags & DRV_BUTTON_FLAGS_PRESSED_TICKS) ? "pressed_ticks" : "");
- if (flags & DRV_BUTTON_FLAGS_PRESSED_TICKS) {
- int ticks = (int )ev_data;
- ESP_LOGI(TAG, "click count: %d", ticks);
- }
- }
-
- void app_main(void)
- {
- drv_button_cfg_t cfg = {
- .flags = {
- DRV_BUTTON_FLAGS_PRESSED | DRV_BUTTON_FLAGS_UNPRESSED,
- DRV_BUTTON_FLAGS_SHORT_PRESS,
- DRV_BUTTON_FLAGS_PRESSED | DRV_BUTTON_FLAGS_SHORT_PRESS,
- DRV_BUTTON_FLAGS_SHORT_PRESS | DRV_BUTTON_FLAGS_LONG_PRESS | DRV_BUTTON_FLAGS_LONG_PRESS_REPEAT,
- DRV_BUTTON_FLAGS_SHORT_PRESS | DRV_BUTTON_FLAGS_PRESSED_TICKS,
- DRV_BUTTON_FLAGS_PRESSED | DRV_BUTTON_FLAGS_UNPRESSED | DRV_BUTTON_FLAGS_SHORT_PRESS | DRV_BUTTON_FLAGS_LONG_PRESS | DRV_BUTTON_FLAGS_LONG_PRESS_REPEAT,
- },
- .cb = drv_button_ev,
- };
- drv_button_init(&cfg);
- //i2c_bus_init(100000, GPIO_NUM_17, GPIO_NUM_18);
- }

以上,就是按键驱动介绍,如有代码需要,请联系coder_mark1024@163.com