Lauf­licht mit Inter­rupt und Taster

// Bibliothek Bounce einbinden
# include "Bounce2.h"

// Bounce starten
// Namen des Objekts Bounce (TasterGedrueckt) festlegen
Bounce TasterGedrueckt = Bounce();

// Pin für den Auslöser des Interrupts
int TASTER = 2;

// Array mit 5 Elementen und den zugehörigen Pins
// wenn LEDs hinzugefügt werden -> Größe des Arrays in [...] anpassen
int LED[5] = { 3, 4, 5, 6, 7 };

// Anzahl der LEDs feststellen
int LEDMax = sizeof(LED) / sizeof(LED[0]);

// Leuchtdauer der LEDs
int Leuchtdauer = 100;

// Variable im Flash-Speicher ablegen
volatile bool LEDStatus = true;

void setup() 
{
  // pinMode Taster INPUT_PULLUP -> Vorwiderstand einschalten
  pinMode(TASTER, INPUT_PULLUP);

  // pinMode LEDs
  for (int i = 0; i < LEDMax; i++) {
    pinMode(LED[i], OUTPUT);
  }
  // Funktion Schalten() dem Interrupt-Pin zuordnen
  attachInterrupt(digitalPinToInterrupt(TASTER), Schalten, FALLING);
  TasterGedrueckt.attach(TASTER, INPUT_PULLUP);
}

void loop() 
{
  // Taster abfragen
  /*
    solange der Status true ist, wird die while-Schleife
    ausgeführt, ein weiterer Druck auf eine Taste der Fernbedienung löst
    den Interrupt aus
    -> Status wird zu false, die while-Schleife wird nicht erneut ausgeführt
    allerdings wird der aktuelle Durchlauf erst beendet
  */
  if (TasterGedrueckt.update()) 
  {
    // Taster wurde gedrückt, das Signal ist gefallen
    if (TasterGedrueckt.fell()) 
    {
      LEDStatus = true;

      /*
        solange der Status true ist, wird die while-Schleife
        ausgeführt, ein weiterer Druck auf eine Taste der Fernbedienung löst
        den Interrupt aus
        -> Status wird zu false, die while-Schleife wird nicht erneut ausgeführt
        allerdings wird der aktuelle Durchlauf erst beendet
      */
      while (LEDStatus) LauflichtHinUndHer();
    }
  }
}

// der Interrupt durch den Taster setzt den LEDStatus auf false
void Schalten() 
{
  LEDStatus = false;
}

void LauflichtHin() 
{
  for (int i = 0; i < LEDMax; i++) 
  {
    digitalWrite(LED[i], HIGH);
    delay(Leuchtdauer);
    digitalWrite(LED[i], LOW);
  }
}

void LauflichtHinUndHer() 
{
  for (int i = 0; i < LEDMax; i++) 
  {
    digitalWrite(LED[i], HIGH);
    delay(Leuchtdauer);
    digitalWrite(LED[i], LOW);
  }

  // und wieder zurück
  for (int i = LEDMax - 1; i >= 0; i--) 
  {
    digitalWrite(LED[i], HIGH);
    delay(Leuchtdauer);
    digitalWrite(LED[i], LOW);
  }
}

Letzte Aktualisierung: 25. Jul 2023 @ 18:59