发帖
0 0 0

AI-WB2 增加个按键IO08(长按、单击、双击、弹起)MultiButton

邦邦
论坛元老

5

主题

23

回帖

3906

积分

论坛元老

积分
3906
Ai-WB2系列 36 0 昨天 21:43

直接移植,避免重复造车,这个很赞,用到每多产品中。
https://github.com/0x1abin/MultiButton


简介
MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。

1.main()主函数在直接创建个任务
xTaskCreate(MultiButton_poll_Task, (char*)"MultiButton_poll_Task", 512, NULL, 14, NULL);//任务优先级数值越小,优先级越低

2.任务中定义一个按键struct Button btn1,
3.初始化IO及按键模块
5.创建一个软定时器,5ms扫描一次。
6.注册事件(本例程使用回调方式)(不使用轮询方式)
        
void MultiButton_poll_Task(void *pvParam)
{
        bl_gpio_enable_input(8, 0, 1);//

        button_init(&btn1, read_button_GPIO, 1, btn1_id);
        button_start(&btn1);

        //make the timer invoking the button_ticks() interval 5ms.
        ButtonTimers = xTimerCreate("ButtonTimers",5/portTICK_PERIOD_MS,pdTRUE,( void * ) 0,vButtonTimersCallback);//pvTimerID: 软件定时器 ID,数字形式。该 ID 典型的用法是当一个回调函数分配给一个或者多个软件定时器时,在回调函数里面根据 ID 号来处理不同的软件定时器;可以用来标记定时器,表示自己是什么定时器;可以用来保存参数,给回调函数使用
        xTimerStart(ButtonTimers,portMAX_DELAY);

        button_attach(&btn1, SINGLE_CLICK,     BTN1_SINGLE_CLICK_Handler);               
        button_attach(&btn1, DOUBLE_CLICK,     BTN1_DOUBLE_CLICK_Handler);
        button_attach(&btn1, LONG_PRESS_HOLD, BTN1_LONG_PRESS_HOLD_Handler);
        button_attach(&btn1, PRESS_UP,         BTN1_PRESS_UP_Handler);

        vTaskDelete(NULL);
        while(1)
        {

                }
                vTaskDelay(1000 / portTICK_PERIOD_MS);
        }
}
需要特别注意

                               
登录/注册后可看大图


原理图中NC原来是没焊,晕了一会才发现。
bl_gpio_enable_input(8, 0, 1);//

GPIO8 作为 Bootstrap, 上电瞬间为高电平时,模组进入烧录模式;上电瞬间为低电平时,模组正常启动。

所以要内部拉低,按下按键时拉高
button_init(&btn1, read_button_GPIO, 1, btn1_id);

初始按键模块高电平有效。

回调主打印出,还没做实际用
static TimerHandle_t ButtonTimers;

static void vButtonTimersCallback(TimerHandle_t xTimer)
{
    button_ticks();
}

void BTN1_SINGLE_CLICK_Handler(void* btn)
{
        blog_info_user(MultiButton,"BTN1_SINGLE_CLICK_Handler");
}

void BTN1_DOUBLE_CLICK_Handler(void* btn)
{
        blog_info_user(MultiButton,"BTN1_DOUBLE_CLICK_Handler");
}

void BTN1_LONG_PRESS_HOLD_Handler(void* btn)
{
        blog_info_user(MultiButton,"BTN1_LONG_PRESS_HOLD_Handler");
}

void BTN1_PRESS_UP_Handler(void* btn)
{
        blog_info_user(MultiButton,"BTN1_PRESS_UP_Handler");
}
2025-03-17 21-13-47 的屏幕截图.png



原代码
上传的附件: MultiButton.zip (242.5 KB, 下载次数: 0)






──── 0人觉得很赞 ────

使用道具 举报

您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28099 个
  • 话题数: 39728 篇