熊爸的学习时间

玩转 ESP32 + Arduino(二十六) 按键控制库 On

2020-09-23  本文已影响0人  熊爸天下_56c7

非常简单的一个库, 也非常好玩

安装:

一. 用法

  1. 首先引入头文件
#include "OneButton.h"
  1. 实例化一个OneButton对象
OneButton button(PIN_INPUT, true);

里面可以传三个参数:

  1. 愉快的使用
    为对象绑定单击/双击/长按事件的回调, 单击/双击/长按等操作会触发这些回调

二. 相关API

1. 关联单击事件 button.attachClick

void OneButton::attachClick(callbackFunction newFunction)

2. 关联双击事件 button.attachDoubleClick

void OneButton::attachDoubleClick(callbackFunction newFunction)

3. 关联长按开始事件 button.attachLongPressStart

void OneButton::attachLongPressStart(callbackFunction newFunction)

4. 关联长按结束事件 button.attachLongPressStop

void OneButton::attachLongPressStop(callbackFunction newFunction)

5. 关联长按期间事件 button.attachDuringLongPress

void OneButton::attachDuringLongPress(callbackFunction newFunction)

6. 注意按键就触发,不管单击双击还上长按 button.attachPressStart

而且是按下持续触发

void OneButton::attachPressStart(callbackFunction newFunction)

7. 获取按键时长 button.getPressedTicks

int OneButton::getPressedTicks()

8. 获取按键现在是否被长按 button.isLongPressed

bool OneButton::isLongPressed()

9. 清空按钮状态机 button.reset

void OneButton::reset()

10. 设置单击时长 button.setClickTicks

单位毫秒

void OneButton::setClickTicks(int ticks)

11. 设置消抖时长 button.setDebounceTicks

单位毫秒

void OneButton::setDebounceTicks(int ticks)

12. 设置长按最短时长 button.setPressTicks

如果不够时长,会被认为是单击

void OneButton::setPressTicks(int ticks)

13. 按键扫描

void OneButton::tick()

三. 测试触发程序

由于我的板子按键接了0脚, 当下载程序时, 会把0脚拉低, 所以每次下完程序, 这个测试程序一直在触发长按, 其实是硬件0脚下程序时拉低引起的. 接别的脚没这个问题, 如果遇到这个问题, 下载完程序后把单片机断电再通电就可以了

#include <Arduino.h>
#include "OneButton.h"

#define PIN_INPUT 0

OneButton button(PIN_INPUT, true);

void doubleclick()
{
  Serial.println("doubleclick");
}
void click()
{
  Serial.println("click");
}
void longPressStart()
{
  Serial.println("longPressStart");
}
void duringLongPress()
{
  if (button.isLongPressed())
  {
    Serial.print("duringLongPress:");
    Serial.println(button.getPressedTicks());
    delay(50);
  }
}
void longPressStop()
{
  Serial.println("longPressStop");
}
void attachPressStart()
{
  Serial.println("attachPressStart");
  Serial.println(digitalRead(PIN_INPUT));
}
void setup()
{
  Serial.begin(115200);
  button.reset();//清除一下按钮状态机的状态
  button.attachClick(click);
  button.attachDoubleClick(doubleclick);
  button.attachLongPressStart(longPressStart);
  button.attachDuringLongPress(duringLongPress);
  button.attachLongPressStop(longPressStop);
  button.attachPressStart(attachPressStart);//按下键就会持续触发
}
void loop()
{
  button.tick();
  delay(10);
}

四. 案例

#include <Arduino.h>
#include "OneButton.h"

#define PIN_INPUT 0
#define PIN_LED 2

OneButton button(PIN_INPUT, true);

void doubleclick()
{
  for (size_t i = 0; i < 4; i++)
  {
    digitalWrite(PIN_LED, !digitalRead(PIN_LED));
    delay(300);
  }
}
void click()
{
  Serial.println("click");
  for (size_t i = 0; i < 2; i++)
  {
    digitalWrite(PIN_LED, !digitalRead(PIN_LED));
    delay(100);
  }
}
void longclick()
{
  Serial.println("longclick");
  digitalWrite(PIN_LED, !digitalRead(PIN_LED));
  if (digitalRead(PIN_LED))
    Serial.println("start");
  else
    Serial.println("end");
}

void setup()
{
  Serial.begin(115200);
  pinMode(PIN_LED, OUTPUT);
  button.attachClick(click);
  button.attachDoubleClick(doubleclick);
  button.attachLongPressStart(longclick);
}
void loop()
{
  button.tick();
  delay(10);
}
上一篇 下一篇

猜你喜欢

热点阅读