Arduino Nano – Taster mit Interrupt

In diesem neuen Beitrag möchte ich dir zeigen, wie du ein Interrupt von einem Taster am Arduino Nano abfragen / abfangen kannst.

Arduino Nano - Taster mit Interrupt
Arduino Nano – Taster mit Interrupt

Dieser Beitrag soll den Code aus dem Beitrag Franzis Adventskalender für Arduino – Tag 10 ergänzen.

Was ist ein Interrupt?

Ein Interrupt dient dazu, um die Ausführung eines Codes kurzfristig zu unterbrechen, um eine andere Aktion auszuführen.

Wir können also mit dieser Funktion einen laufenden Code unterbrechen und etwas anderes machen. Das ist bei Mikrocontroller wie dem Arduino sehr nützlich, denn dieser hat ja nur einen Kern und kann somit nur eine Aktion gleichzeitig laufen lassen.

Das Thema Interrupt wurde im nachfolgend verlinkten Wikipedia Artikel ausführlich besprochen.

Seite „Interrupt“. In: Wikipedia – Die freie Enzyklopädie. Bearbeitungsstand: 5. Juli 2022, 14:57 UTC. URL: https://de.wikipedia.org/w/index.php?title=Interrupt&oldid=224255302 (Abgerufen: 17. November 2022, 16:46 UTC)

Interrupt-Pins

Der Arduino Nano (sowie auch der UNO) haben zwei Interrupt-Pins jeweils an D2 (INT0) und D3 (INT1).

Schaltung – Lauflicht mit LEDs & Taster

Im nachfolgenden Beispiel möchte ich einen Taster in eine LED Lauflichtschaltung integrieren und mit diesem die Geschwindigkeit erhöhen.

Programmieren

Wie man einen Taster am Arduino programmiert, habe ich dir bereits in nachfolgenden Beiträgen gezeigt:

In der obigen Schaltung habe ich den Taster mit einem PullDown Widerstand angeschlossen.

dfgsdgs

// Taster am digitalen Pin D7 angeschlossen
#define taster 2

// rote LED am digitalen Pin D3 angeschlossen
#define ledRot 3

// gelbe LED am digitalen Pin D6 angeschlossen
#define ledGelb 6

// gruene LED am digitalen Pin D8 angeschlossen
#define ledGruen 8

// ein Array mit den LED Pins
int leds[] = { ledRot, ledGelb, ledGruen };

// Array mit den möglichen Geschwindigkeiten,
// hier kannst du beliebig viele Schritte
// zusaetzlich hinzufuegen
int geschwindigkeiten[] = { 750, 500, 250, 125, 75, 50 };

int pause = geschwindigkeiten[0];

// Variable um den Index ausserhalb der Loop zu speichern
int index = 0;

// Funktion welche ausgeführt werden soll wenn der Taster betätigt wird.
void changeSpeed() {
  // Wenn der Index gleich 5 ist, also der maximale Index vom Array
  // mit den Geschwindigkeiten, dann...
  if (index == 5) {
    // setzen des Indexes auf -1
    index = -1;
  }

  // den Index um eins erhoehen
  index = index + 1;
  // entnehmen der nächsten Geschwindigkeit aus dem Array
  // mit dem aktuellen Index
  pause = geschwindigkeiten[index];
}

void setup() {
  // definieren das der Pin des Tasters als Eingang dient
  pinMode(taster, INPUT);

  // definieren das die Pins der LEDs als Ausgang dienen
  pinMode(ledRot, OUTPUT);
  pinMode(ledGelb, OUTPUT);
  pinMode(ledGruen, OUTPUT);

  // hinzufuegen eines Interrupts an den digitalen Pin D2
  // die Funktion "changeSpeed" soll ausgeführt werden wenn
  // der Taster betätigt wird.
  attachInterrupt(digitalPinToInterrupt(taster), changeSpeed, RISING);
}

void loop() {
  // eine Schleife von 0 bis 3 um über die LED Pins im Array zu iterieren
  for (int i = 0; i <= 3; i++) {
    // Wenn die Laufvariable i gleich 0 ist dann gibt es keine vorherige LED,
    // welche deaktiviert werden könnte
    if (i > 0) {
      // deaktivieren der vorherigen LED
      digitalWrite(leds[i - 1], LOW);
    }

    // aktivieren der nächsten LED
    digitalWrite(leds[i], HIGH);
    // eine Pause einlegen
    delay(pause);
  }
}

Wenn du den obigen Code auf den Mikrocontroller speicherst, dann beginnt das Lauflicht sofort mit einer Pause von 750ms. zwischen den einzelnen LEDs. Du musst also lediglich den Taster betätigen und es wird dann eine neue Zeit für die Pause aus dem Array mit einem neuen Index geladen.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert