Menu
CoddyTech

Ein Tastendruck, den die Schleife verpasst

Teil des Abschnitts Timing ohne Delay der Arduino-Journey von Coddy. Lektion 12 von 18.

Ein Sketch ist manchmal mit einer langsamen Aufgabe oder einem langen delay() beschäftigt. Eine Schleife, die den Taster nur zwischen Aufgaben abfragt, verpasst einen Tastendruck, der innerhalb einer Aufgabe beginnt und endet.

Ein Interrupt behebt das: Wenn sich ein Pin ändert, hält das Board an, was es gerade tut, führt eine von dir gewählte Funktion aus und macht dann weiter. Der Chip überwacht den Pin selbst während delay().

void onPress() {
  digitalWrite(ledPin, HIGH);
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}

attachInterrupt() benötigt drei Angaben: den Interrupt für den Pin (digitalPinToInterrupt(buttonPin) findet ihn), die auszuführende Funktion und den Zeitpunkt. FALLING ist der Moment, in dem der Pin von HIGH zu LOW wechselt: mit einem Pull-up-Widerstand der Moment, in dem der Taster gedrückt wird.

Die Funktion wird Interrupt Service Routine oder ISR genannt. Halte sie kurz: kein delay() und kein Serial.

challenge icon

Aufgabe

Einfach

Dieser Alarm überprüft seinen Knopf nur alle 2 Sekunden, daher wird ein kurzer Druck verpasst. Sorge dafür, dass ein Druck die LED sofort einschaltet:

  • schreibe eine ISR, onPress(), die die LED einschaltet
  • füge sie in setup() mit FALLING dem Knopf-Pin hinzu

Lass den langsamen Vorgang in loop(). Die LED bleibt nach einem Druck eingeschaltet, wie bei einem Alarm. Drücke auf Run, betätige den Knopf und dann Check.

Probier es selbst

const int ledPin = 13;
const int buttonPin = 2;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  // Hier den Interrupt einrichten
}

void loop() {
  // die langsame Aufgabe: so lassen, wie sie ist
  Serial.println("working");
  delay(2000);

  // hier wird der Taster nur alle 2 Sekunden abgefragt,
  // sodass ein kurzer Tastendruck übersehen wird
  if (digitalRead(buttonPin) == LOW) {
    digitalWrite(ledPin, HIGH);
  }
}
quiz iconTeste dich selbst

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

Übe selbstständig: Arduino-Playground