/*
程序:按钮演示程序
hold, pressed, releasedsingle, double and triple click公众号:孤独的二进制注意事项:按钮防抖动使用简单粗暴的delay方式实际应用时,可以换成millis的方式
*/
#define BTNPIN 2//按钮连接到数字端口2
#define DEBOUNCE 120 //按钮防止抖动时间
byte btnStatusCurrent = LOW; //当前按钮状态
byte btnStatusPrevious = LOW;//之前按钮状态
void setup() {
Serial.begin(9600);
pinMode(BTNPIN, INPUT); //没按LOW按下去HIGH
}
void loop() {
btnStatusCurrent = digitalRead(BTNPIN); //获取当前按钮
// 按钮被一直按下
// if (btnStatusCurrent == HIGH) {
// Serial.println("Hold");
// }
// 按钮按下去的瞬间
// 当前按钮状态是HIGH,之前按钮状态是LOW
// if ((btnStatusCurrent == HIGH) && (btnStatusPrevious == LOW)) {
// Serial.println("Pressed");
// delay(DEBOUNCE);
// }
// 按钮松手的瞬间
// 当前按钮状态是LOW,之前按钮状态是HIGH
// if((btnStatusCurrent == LOW)&&(btnStatusPrevious== HIGH)){
// Serial.println("Released");
// delay(DEBOUNCE);
// }
//Single Click,Double Click and Triple Click
clickTick();
//此循环结束,"当前按钮状态”将作为下次循环的"之前按钮状态
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(DEBOUNCE);//按钮防抖动
}
//如果周期已经开启,并且过了周期的等待时间
if (((millis() - startTime) > clickMaxPeriod) && isStart) {
isStart = false;//停止周期
switch (pressCount) {
case 1:
singleclick();
break;
case 2:
doubleClick();
break;
case 3:
tripleClick();
break;
default:
break;
}
}
}
void singleclick() {
Serial.println("single click");
}
void doubleClick() {
Serial. println("Double Click");
}
void tripleClick() {
Serial.println("Triple click");
}