Tastendrücke per Interrupt zählen
Teil des Abschnitts Timing ohne Delay der Arduino-Journey von Coddy. Lektion 15 von 18.
Wie du im Abschnitt „Eingaben“ gesehen hast, prellen Taster: Etwa eine Millisekunde lang berühren sich die Kontakte, trennen sich und berühren sich erneut – beim Drücken und beim Loslassen. Ein Interrupt erfasst jede Berührung, daher zählt eine FALLING-ISR, die 1 addiert, einen Klick mehrmals.
Eine ISR kann nicht mit delay() entprellen: delay() benötigt den eigenen Interrupt der Uhr, und Interrupts sind pausiert, während eine ISR ausgeführt wird. Verwende stattdessen die Uhr. Merke dir, wann der letzte gezählte Tastendruck stattfand, und ignoriere jeden Fall, der zu kurz danach auftritt:
unsigned long lastPress = 0;
void onPress() {
unsigned long now = millis();
if (now - lastPress >= 200) {
presses = presses + 1;
lastPress = now;
}
}millis() in einer ISR aufzurufen, ist in Ordnung: Die Funktion liefert den Zeitpunkt, zu dem die ISR gestartet ist. Wähle ein Zeitfenster, das länger als ein Klick ist, damit das Prellen beim Loslassen hineinfällt, und kürzer als der Abstand zwischen zwei schnellen Klicks. 200 ms funktionieren für Menschen gut.
Aufgabe
MittelDieser Zähler zählt jeden Klick mehrmals. Entprelle ihn innerhalb von onPress():
- füge eine Variable
unsigned long lastPresshinzu - zähle eine fallende Flanke nur, wenn seit
lastPressmindestens 200 ms vergangen sind, und speichere dann die Zeit inlastPress
Drücke Run, klicke ein paar Mal auf die Schaltfläche und beobachte den Zähler, dann Check.
Probier es selbst
const int buttonPin = 2;
volatile int presses = 0;
int shown = 0;
void onPress() {
// Jede fallende Flanke am Pin zählt, auch durch Prellen: Entprellung hier vornehmen
presses = presses + 1;
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}
void loop() {
// Den Zählerstand ausgeben, sobald er sich ändert
if (presses != shown) {
shown = presses;
Serial.println(shown);
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Timing ohne Delay
3Interrupts
Ein Tastendruck, den die Schleife verpasstFALLING, RISING und CHANGEDaten teilen mit volatileTastendrücke per Interrupt zählenÜbe selbstständig: Arduino-Playground