Schuld ist nicht das Programm, sondern der Taster selbst. Der Vorgang heißt Prellen (englisch bouncing): Der mechanische Kontakt öffnet und schließt kurzzeitig mehrfach, bevor er endgültig anliegt.
Zuerst trifft beim Drücken eine federnde Kontaktfeder mit Schwung auf die Gegenfläche. Die Kontaktfedern im Taster sind federnd, dadurch schließt der Kontakt sicher. Der Schwung lässt die Flächen aber nicht sofort ruhig liegenbleiben.
Dann schwingen die Kontaktflächen für einige Millisekunden. In dieser Phase berühren sie sich, trennen sich kurz und berühren sich wieder. Elektrisch sieht das wie ein schneller Wechsel zwischen gedrückt und losgelassen aus.
Danach liest der Mikrocontroller seinen Eingang und sieht jedes dieser kurzen Kontakte. Er prüft den Pin so schnell, dass er jedes der kurzen Kontakte als eigenen Tastendruck erkennt. Ein Interrupt-gesteuerter Zähler ohne Entprellung zählt deshalb pro Druck mehrere Flanken.
Zuletzt fängt das Programm das Prellen ab. Die Sperrzeit ignoriert den Eingang nach einer erkannten Flanke, also einem Pegelwechsel, für wenige Millisekunden. Für die Zeitmessung eignet sich millis() (liefert die Millisekunden seit dem Start) besser als delay(), weil delay() die gesamte Hauptschleife anhält. Beim Nachfrage-Verfahren wird der Pegel erst gewertet, wenn er über mehrere Abtastungen stabil bleibt. In einer Interrupt-Service-Routine gehört nur eine kurze Aktion hinein, etwa ein Flag setzen.
Ein Tastendruck ist elektrisch erst fertig, wenn er still ist. Entprellen heißt nicht warten um jeden Preis, sondern gezielt die ersten Millisekunden ignorieren.
📌 Prellen · Sperrzeit · millis()
📚 IoT von Grund auf · Tag 3 von 30
#embedded #Mikrocontroller #Arduino