// Helperfunctie om indrukknoppen te debouncen.
// Goede uitleg te vinden op https://www.youtube.com/watch?v=v8KXa5uRavg
// Deze functie past de state van een button pas aan naar INGEDRUKT
// wanneer er een voldoende stabiel signaal is voor de duur van
// de vooraf ingestelde tijd.
// Set states voor debouncen van de knoppen
#define BTN_SETUP 0 // mogelijks dingen instellen
#define BTN_READ 1 // we lezen de waarde van de pinbutton
#define BTN_START_TIMER 2 // we starten een timer
#define BTN_WACHT 3 // bij slecht signaal (onstabiel) gaan we terug naar SETUP -
// bij goed signaal (stabiel LOW voor de intervaltijd) gaan we naar INGEDRUKT
#define BTN_INGEDRUKT 4 // Zoalang signaal LOW blijft gebeurt er niets
// wordt het HIGH dan gaan we naar LOSGELATEN
#define BTN_LOSGELATEN 5 // We gaan terug naar SETUP
#define INTERVAL 10 // aantal millis nodig om de bounce weg te werken
#define PIN_LED 2
#define PIN_BUTTON 3
byte oldBtnState = 0;
typedef struct {
byte State;
byte pin;
unsigned long timer;
bool toggle;
} button;
// Maak een variable myButton van het type Button
// analoog: "byte pinNummer;" maak een variabele pinNummer van het type byte.
// Alleen is het type Button een beetje speciaal
button myButton = {BTN_SETUP, PIN_BUTTON, 0, HIGH};
void setup() {
Serial.begin(115200);
pinMode(PIN_BUTTON, INPUT);
pinMode(PIN_LED, OUTPUT);
Serial.println("---- In setup -----------");
Serial.print("ButtonState = ");
Serial.println(myButton.State);
Serial.print("ButtonPin = ");
Serial.println(myButton.pin);
Serial.print("ButtonTimer = ");
Serial.println(myButton.timer);
Serial.print("ButtonToggle = ");
Serial.println(myButton.toggle);
Serial.println("---- Uit setup -----------");
}
void loop() {
// --------------------------------------
// ACTIES AFHANKELIJK VAN STATE VD BUTTON
// --------------------------------------
if (myButton.State != oldBtnState) {
Serial.print("button.state = ");
Serial.println(myButton.State);
if (myButton.State == BTN_INGEDRUKT) {
Serial.println("ingedrukt");
digitalWrite(PIN_LED,myButton.toggle);
}
if (myButton.State == BTN_LOSGELATEN) {
Serial.println("Losgelaten");
}
oldBtnState = myButton.State;
}
// ------------------------------------------------------------------
// STATE VD BUTTON AANPASSEN AAN DE ACTUELE TOESTAND of VOLGENS LOGICA
// ------------------------------------------------------------------
switch (myButton.State) {
case BTN_SETUP: // 0
myButton.State = BTN_READ;
break;
case BTN_READ: // 1
if (digitalRead(PIN_BUTTON) == LOW) {
myButton.State = BTN_START_TIMER;
}
break;
case BTN_START_TIMER: // 2
myButton.timer = millis();
myButton.State = BTN_WACHT;
break;
case BTN_WACHT: // 3
if (digitalRead(PIN_BUTTON) == HIGH) {
myButton.State = BTN_SETUP;
}
if (millis() - myButton.timer < INTERVAL) {
myButton.State = BTN_INGEDRUKT;
}
break;
case BTN_INGEDRUKT: // 4
if (digitalRead(PIN_BUTTON) == HIGH) {
myButton.State = BTN_LOSGELATEN;
myButton.toggle = !myButton.toggle;
}
break;
case BTN_LOSGELATEN: // 5
myButton.State = BTN_SETUP;
break;
default:
Serial.println(" button messd up, or coder");
}
}