Entprellung eines Tasters mit den Zeitoptionen Mindeste Druckzeit, Entprellzeit, Abtastrate (indirekte Entprellung).
int pin = 6; int laststate = HIGH; int state = HIGH; boolean debouncing = false; //Entprellt? boolean minimpuls = true; //Minimale Impulslänge für Aktion unsigned long lastintervallmillis = millis(); unsigned long changestate = millis(); unsigned long lastdebounce = millis(); unsigned long lastminpulse = millis(); void setup() { Serial.begin(115200); } //Konfiguration: int Abtastrate = 5; int entprellzeit = 100; int minpuls = 50; //Minimale Pulslänge void loop() { long tempmillis = millis(); if ((tempmillis - lastintervallmillis) >= Abtastrate ) //Frühestens nach Abtastrate überprüfen, reicht manchmal schon als kleine Entprellung { lastintervallmillis = tempmillis; //Letzte Abtastung speichern int tempstate = digitalRead(pin); //Pin einlesen if (tempstate != laststate) //Pin hat sich geändert, hier ist egal in welche Richtung, im Prinzip Low und High Entprellung. { debouncing = true; //Entprellung aktivieren minimpuls=true; laststate = tempstate; //Buffer für temporären Pinstatus changestate = tempmillis; //Änderungszeitpunkt } if (debouncing) { if ((tempmillis - changestate) >= entprellzeit && debouncing) { debouncing = false; } } if (tempmillis - changestate >= (entprellzeit + minpuls) && !debouncing ) { minimpuls=false; } if(!debouncing && !minimpuls) state = laststate; debouncing = true; minimpuls = true; if (state == HIGH) { Serial.println("Alles erfüllt!"); } } } }