非常简单的一个库, 也非常好玩
安装:
一. 用法
- 首先引入头文件
#include "OneButton.h"
- 实例化一个OneButton对象
OneButton button(PIN_INPUT, true);
里面可以传三个参数:
- pin : 按钮的pin角
- activeLow : true:按下为低电平 false : 按下为高电平
- pullupActive : 如果有上拉电阻就激活上拉电阻
- 愉快的使用
为对象绑定单击/双击/长按事件的回调, 单击/双击/长按等操作会触发这些回调
二. 相关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);
}