// https://forum.arduino.cc/t/1-button-press-1-pulse-output-no-long-press-w-multiple-in-out/1397967?_gl=1*1cfw10o*_up*MQ..*_ga*MTgxNzM5MTMxMi4xNzUzNTc0NDkx*_ga_NEXN8H46L5*czE3NTM1NzQ0OTEkbzEkZzAkdDE3NTM1NzQ0OTEkajYwJGwwJGgxNDc0MDMwNDcy$0
// State-Machine for controlling a single button/led
struct Controller {
int btn;
int led;
int state;
unsigned long start;
void setup() {
pinMode(btn, INPUT_PULLUP);
pinMode(led, OUTPUT);
}
void loop() {
switch (state) {
case 0:
// Wait for buttion pressed
if (digitalRead(btn) == LOW) {
// If pressed, turn led on and remember start time
digitalWrite(led, HIGH);
state = 1;
start = millis();
}
break;
case 1:
// Keep led on for 200 ms
if (millis() - start > 200) {
// Time expired, so turn off led
digitalWrite(led, LOW);
state = 2;
}
break;
case 2:
// Wait for button to be unpressed
if (digitalRead(btn) == HIGH) {
// Start debouncing by noting start time
state = 3;
start = millis();
}
break;
case 3:
// Wait for bounce time to be over
if (millis() - start > 20) {
// Start over
state = 0;
}
break;
}
}
};
// Definition of all controllers
Controller controllers[] = {
{PB1, PB0, 0, 0},
{PB3, PB4, 0, 0}
};
void setup() {
for (auto& controller : controllers) {
controller.setup();
}
}
void loop() {
for (auto& controller : controllers) {
controller.loop();
}
}