单击
// 最好使用millis进行消抖,不要使用delay
#define button 8
#define debounce 100 // 按钮消抖时间
byte btnStatusCurrent = LOW;
byte btnStatusPrevious = LOW;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(button, INPUT);
}
void loop() {
btnStatusCurrent = digitalRead(button);
// 按钮按下
// if (btnStatusCurrent == LOW) {
// Serial.println("按下");
// }
// 单击
if ((btnStatusCurrent == LOW) && (btnStatusPrevious == HIGH)) {
Serial.println("单击");
delay(debounce);
}
btnStatusPrevious = btnStatusCurrent;
}
通过检测一段时间内按钮按动的次数,来实现对应的功能。
void clickTick()
{
static byte pressCount = 0;
static unsigned long clickMaxPeriod = 400; // 在400ms内检测一共按了多少次
static unsigned long startTime = 0;
static bool isStart = false;
// 按下按钮松手后,按下前高电平,按下后低电平
if((btnStatusCurrent == LOW) && (btnStatusPrevious == HIGH)){
if (isStart = false)
{ // 按钮周期第一次开启
pressCount = 1; // 当前按钮次数1
isStart = true; // 设置周期开启
startTime = millis(); // 记录周期开启时间
}
else
pressCount++; //记录按钮次数
delay(120); // 按键消抖
}
// 如果周期已经开启,并且过了周期的等待时间
if (((millis() - startTime) > clickMaxPeriod) && isStart)
{
isStart = false; //停止周期
switch (pressCount)
{
case 1:
singleClick();
break;
case 2:
doubleClick();
break;
case 3:
tripleClick();
break;
default:
break;
}
}
}
使用库函数进行按钮功能开发,根据实际需要,进行按键自定义函数功能的书写。
#include <Arduino.h>
#include "OneButton.h"
// 使用两个按钮
#define BTN1_PIN 2
#define BTN2_PIN A0
#define ACTIVE_LOW true
#define ACTIVE_HIGH false
#define PULLUP_ENABLE true
#define PULLUP_DISABLE false
// 按钮1实例化
OneButton button1(BTN1_PIN, ACTIVE_LOW, PULLUP_ENABLE);
// OneButton button(BTN1_PIN,true,true);
// 第二个参数:true 低有效 false 高有效
// 第三个参数:true 开启内部拉高 false 关闭内部拉高,默认为false
// 按钮2实例化
OneButton button2(BTN2_PIN, ACTIVE_HIGH, PULLUP_DISABLE);
void singleClick1() {}
void doubleClick1() {}
void multiClick1()
{
int n = button1.getNumberClicks();
switch (n)
{
case 3:
Serial.println("Triple Click");
break;
case 4:
Serial.println("4 Click");
break;
default:
break;
}
}
void LongPressStart1()
{
Serial.println("");
}
void LongPressStop1()
{
Serial.println("");
}
void LongPress1()
{
Serial.println("");
}
void setup()
{
Serial.begin(9600);
button1.setDebounceTicks(50); // 按键消抖
// 按键单击,双击,三连击,N连击
button1.setClickTicks(500); // 时间判定 500ms
button1.attachClick(singleClick1); // 单击
button1.attachDoubleClick(doubleClick1); // 双击
button1.attachMultiClick(multiClick1); // 多击
// 按钮长按功能设置
button1.setPressTicks(800); // 长按时间判定,800ms后进入长按功能
button1.attachLongPressStart(LongPressStart1); // 可省略
button1.attachLongPressStop(LongPressStop1); // 可省略
button1.attachDuringLongPress(LongPress1); // 可省略
}
void loop()
{
button1.tick();
button2.tick();
}