#define BOUNCE 60
#define LONG_PRESS 650
class Yubtn {
private:
uint8_t _pin;
uint8_t presspin;
bool button;
bool click;
bool shortCl;
bool longCl;
bool allCl;
bool push = false;
uint32_t pressTime;
public:
void begin(uint8_t pin) {
_pin = pin;
pinMode(_pin, INPUT_PULLUP);
}
void tick() {
button = digitalRead(_pin);
presspin = 0;
shortCl = false;
longCl = false;
allCl = false;
if (!button && !push) {
pressTime = millis();
push = true;
}
if (push && millis() - pressTime >= LONG_PRESS) {
pressTime = millis();
//регистрация двойного нажатия
presspin = PIND;
presspin = presspin >> 2; //выталкиваем RX TX
presspin ^= (presspin >> 4) ^ (presspin >> 2) ^ (presspin >> 1);
presspin &= 1; //фильтр одиночного нажатия
//для трех кнопок
if (presspin) {
allCl = true;
}
click = true;
longCl = true; //флаги длинного нажатия
}
if (button && push) { //отпускаем кнопку
if (!click && millis() - pressTime >= BOUNCE) {
shortCl = true; //флаг короткого нажатия
}
pressTime = millis();
push = false;
click = false;
}
}
bool shortClick() {
if (!allCl && shortCl)
return true;
else
return false;
}
bool longClick() {
if (!allCl && longCl)
return true;
else
return false;
}
bool allClick() {
if (allCl)
return true;
else
return false;
}
};
////
Yubtn Btn1;
Yubtn Btn2;
Yubtn Btn3;
bool led;
void setup() {
Serial.begin(9600);//убрал чтоб взвесить
Btn1.begin(2);
Btn2.begin(3);
Btn3.begin(4);
}
void loop() {
bool nextLine = false;
Btn1.tick();
Btn2.tick();
Btn3.tick();
if (Btn1.longClick()) led = !led, Serial.print("long1;"), nextLine = true;
if (Btn1.shortClick()) led = !led, Serial.print("short1;"), nextLine = true;
if (Btn2.longClick())led = !led, Serial.print("long2;"), nextLine = true;;
if (Btn2.shortClick()) led = !led, Serial.print("short2;"), nextLine = true;
if (Btn3.longClick()) led = !led, Serial.print("long3;"), nextLine = true;
if (Btn3.shortClick()) led = !led, Serial.print("short3;"), nextLine = true;
if (Btn1.allClick()) led = !led, Serial.print("all1;"), nextLine = true;
if (Btn2.allClick()) led = !led, Serial.print("all2;"), nextLine = true;
if(nextLine)
Serial.println("");
//else Serial.println("-");
}