• ESP32系列--第十一篇 按键驱动


    一、目的

     

            上一篇《ESP32系列--第十篇 ADC电阻网络按键》我们讲了ADC电阻网络按键的基本电路与检测逻辑,本篇再此基础上进一步实现按键的功能。

            一个常规的按键功能包括:

    • 按下
    • 松开
    • 短按
    • 长按
    • 长按再次触发
    • 指定周期内的点击次数(实现双击、三连击等)    

            其中长按时间可配置、长按再次触发可配置、点击次数统计周期可配置,另外以上模式也可以相互组合,例如某个按键既要支持短按又要支持长按,某个按键既要支持短按,又要支持点击次数统计;也就是说某个按键的模式组合是任意的,需要根据具体应用来配置。

    二、介绍

            定义按键模式        

    1. /*
    2. * 按键功能模式描述
    3. * 可以根据需要进行组合
    4. */
    5. typedef enum {
    6. DRV_BUTTON_FLAGS_PRESSED = 1 << 0, //按下
    7. DRV_BUTTON_FLAGS_UNPRESSED = 1 << 1, //松开
    8. DRV_BUTTON_FLAGS_SHORT_PRESS = 1 << 2, //短按
    9. DRV_BUTTON_FLAGS_LONG_PRESS = 1 << 3, //长按
    10. DRV_BUTTON_FLAGS_LONG_PRESS_REPEAT = 1 << 4, //再次长按
    11. DRV_BUTTON_FLAGS_PRESSED_TICKS = 1 << 5, //指定周期点击次数
    12. } drv_button_flags_t;

            同时支持长按短按可以如下定义

            DRV_BUTTON_FLAGS_SHORT_PRESS | DRV_BUTTON_FLAGS_LONG_PRESS        

             一个按键从开始按下到松开会经历如下过程(采样周期一般设置为50ms):

            第一次检测到被按下,记录这次按下信息,第二次检测到按下,则认为按键真正被按下,即按键触发按下事件;如果继续检测,连续几次还是按下,根据按下的时间判断是否是长按;如果某个时间检测到松开,则认为按键松开,此时需要根据按下和松开的时间差判断是否短按

    三、实战

    1. #include "drv_button.h"
    2. #include "esp_log.h"
    3. //#include "i2c_bus.h"
    4. #include "driver/gpio.h"
    5. #define TAG "main"
    6. static const char *button_info[] = {
    7. "此按键支持按下和松开",
    8. "此按键仅支持短按",
    9. "此按键支持按下和短按",
    10. "此按键支持短按长按和长按再次触发",
    11. "此按键支持短按和按键次数统计",
    12. "此按键支持所有模式"
    13. };
    14. static void drv_button_ev(void *userdata, drv_button_id_t id, drv_button_flags_t flags, void *ev_data) {
    15. ESP_LOGI(TAG, "%s\n%d %s%s%s%s%s%s",
    16. button_info[id],
    17. id,
    18. (flags & DRV_BUTTON_FLAGS_PRESSED) ? "pressed" : "",
    19. (flags & DRV_BUTTON_FLAGS_UNPRESSED) ? "unpressed" : "",
    20. (flags & DRV_BUTTON_FLAGS_SHORT_PRESS) ? "short_press" : "",
    21. (flags & DRV_BUTTON_FLAGS_LONG_PRESS) ? "long_press" : "",
    22. (flags & DRV_BUTTON_FLAGS_LONG_PRESS_REPEAT) ? "long_press_repeate" : "",
    23. (flags & DRV_BUTTON_FLAGS_PRESSED_TICKS) ? "pressed_ticks" : "");
    24. if (flags & DRV_BUTTON_FLAGS_PRESSED_TICKS) {
    25. int ticks = (int )ev_data;
    26. ESP_LOGI(TAG, "click count: %d", ticks);
    27. }
    28. }
    29. void app_main(void)
    30. {
    31. drv_button_cfg_t cfg = {
    32. .flags = {
    33. DRV_BUTTON_FLAGS_PRESSED | DRV_BUTTON_FLAGS_UNPRESSED,
    34. DRV_BUTTON_FLAGS_SHORT_PRESS,
    35. DRV_BUTTON_FLAGS_PRESSED | DRV_BUTTON_FLAGS_SHORT_PRESS,
    36. DRV_BUTTON_FLAGS_SHORT_PRESS | DRV_BUTTON_FLAGS_LONG_PRESS | DRV_BUTTON_FLAGS_LONG_PRESS_REPEAT,
    37. DRV_BUTTON_FLAGS_SHORT_PRESS | DRV_BUTTON_FLAGS_PRESSED_TICKS,
    38. DRV_BUTTON_FLAGS_PRESSED | DRV_BUTTON_FLAGS_UNPRESSED | DRV_BUTTON_FLAGS_SHORT_PRESS | DRV_BUTTON_FLAGS_LONG_PRESS | DRV_BUTTON_FLAGS_LONG_PRESS_REPEAT,
    39. },
    40. .cb = drv_button_ev,
    41. };
    42. drv_button_init(&cfg);
    43. //i2c_bus_init(100000, GPIO_NUM_17, GPIO_NUM_18);
    44. }

            

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

  • 相关阅读:
    Vue {{}}里面不同内容
    做视频素材资源(free视频,音频,图片)
    PostgreSQL10安装postgis插件
    [Vue 配置] Vite + Vue3 项目配置 Tailwind CSS
    DBus笔记
    Linxu epoll开发服务端
    KingBase服务器参数配置(Kylin)
    更新 | 持续开源迅为RK3568驱动指南第十二篇-GPIO子系统
    【数据结构】二叉树的构建与基本操作实现
    Tmux 使用教程
  • 原文地址:https://blog.csdn.net/tianizimark/article/details/125596916