Inter­rupt Lauflicht

# include "IRremote.h"

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

// Array mit 5 Elementen und den zugehörigen Ports
int LED[5] = {3, 4, 5, 6, 7};

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

// Variable im Flash-Speicher ablegen
volatile bool Status = true;
int Leuchtdauer = 100;

void setup()
{
  // Zufallsgenerator starten
  randomSeed(analogRead(0));
  
  // Empfänger starten
  IrReceiver.begin(InterruptPin);
  
  for (int i = 0; i < LEDMax; i++)
  {
    pinMode(LED[i], OUTPUT);
  }

  // Funktion Schalten() dem Interrupt-Pin zuordnen
  attachInterrupt(digitalPinToInterrupt(InterruptPin), Schalten, FALLING);
}

void loop()
{
  // Daten lesen
  if (IrReceiver.decodedIRData.address == 0)
  {
    if (IrReceiver.decode())
    {
      delay(200);
      Status = true;
      /*
        solange der Status true ist, wird die jeweilige 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
      */
      switch (IrReceiver.decodedIRData.command)
      {
        // Taste 1: Lauflicht vor
        case 22:
          while (Status) LauflichtHin();
          break;
        
        // Taste 2:  LEDs leuchten vor und zurück
        case 25:
          while (Status) LauflichtHinUndHer();
          break;

        // Taste 3: LEDs blinken nacheinander
        case 13:
          while (Status) LauflichtMitBlinken();
          break;
      }
      // nächsten Wert lesen
      IrReceiver.resume();
    }
  }
}

void Schalten()
{
  Status = false;
}

void LEDBlinken(int LEDNummer, int Anzahl)
{
  for (int i = 0; i <= Anzahl; i ++)
  {
    digitalWrite(LEDNummer, HIGH);
    delay(Leuchtdauer);
    digitalWrite(LEDNummer, LOW);
    delay(Leuchtdauer);
  }
}

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);
  }
}

void LauflichtMitBlinken()
{
  for (int i = 0; i < LEDMax; i++)
  {
    int Anzahl = random(1, 5);
    /* aktuelle LED i einschalten
      → Funktion LEDBlinken aufrufen
    */
    LEDBlinken(LED[i], Anzahl);
  }
}


Letzte Aktualisierung: 4. Okt 2023 @ 11:07