Inter­rupt Neopixel

# include "Adafruit_NeoPixel.h"

# define RING 7

// Anzahl der LEDs -> muss angepasst werden
# define AnzahlLED 32

// Variable für den gedrückten Taster
volatile bool Links = false;
volatile bool Rechts = false;

// Minimum/Maximum für die Farbwerte festlegen
# define Minimum 0
# define Maximum 255

// Leuchtdauer der LEDs
# define Wartezeit 50

// LED-Ring -> Name des LED-Rings
Adafruit_NeoPixel LEDRing = Adafruit_NeoPixel(AnzahlLED, RING, NEO_GRB + NEO_KHZ800);

// Taster definieren
# define TASTERLINKS 2
# define TASTERRECHTS 3

void setup()
{
  // Zufallsgenerator starten
  randomSeed(analogRead(A0));

  // NeoPixel Bibliothek initialisieren
  LEDRing.begin();

  // setBrightness(0..255)
  LEDRing.setBrightness(200);

  LEDRing.clear();
  LEDRing.show();
  
  pinMode(TASTERLINKS, INPUT_PULLUP);
  pinMode(TASTERRECHTS, INPUT_PULLUP);

  // Funktion für das Auslösen des Interrupts definieren
  // Taster links
  attachInterrupt(digitalPinToInterrupt(TASTERLINKS), LEDSchaltenLinks, CHANGE);

  // Taster rechts
  attachInterrupt(digitalPinToInterrupt(TASTERRECHTS), LEDSchaltenRechts, CHANGE);
}

void loop()
{
  // linke Taste gedrückt
  if (Links)
  {
    // zufällige Farbwerte
    int ROT = ZufallsFarbe();
    int GRUEN = ZufallsFarbe();
    int BLAU = ZufallsFarbe();

    /*
     feste Farbwerte:
     ROT:
     int ROT = 255; 
     int GRUEN = 0;
     int BLAU = 0;
     ----------------
     GRUEN     
     int ROT = 0;
     int GRUEN = 255;
     int BLAU = 0;
     -----------------
     BLAU     
     int ROT = 0;
     int GRUEN = 0;
     int BLAU = 255;
     -----------------
     GELB     
     int ROT = 255;
     int GRUEN = 255;
     int BLAU = 0;
    */

    for (int LEDNummer = 0; LEDNummer <= LEDRing.numPixels() ; LEDNummer++)
    {
      LEDRing.setPixelColor(LEDNummer, LEDRing.Color(ROT, GRUEN, BLAU));
      LEDRing.show();

      // Unterbrechung wenn der rechte Taster gedrückt wurde
      if (Rechts) break;

      delay(Wartezeit);
    }

    // zurück LEDs ausschalten
    for (int LEDNummer = LEDRing.numPixels(); LEDNummer >= 0 ; LEDNummer--)
    {
      LEDRing.setPixelColor(LEDNummer, 0);
      LEDRing.show();

      // Unterbrechung wenn der rechte Taster gedrückt wurde
      if (Rechts) break;
      delay(Wartezeit);
    }

    /*
      wenn der Streifen nach einem Durchlauf nicht stoppen soll:
     // Links = false;
    */
    Links = false;
    LEDRing.clear();
    LEDRing.show();
  }

  // rechte Taste gedrückt
  if (Rechts)
  {
    int ROT = ZufallsFarbe();
    int BLAU = ZufallsFarbe();
    int GRUEN = ZufallsFarbe();

    for (int LEDNummer = LEDRing.numPixels(); LEDNummer >= 0 ; LEDNummer--)
    {
      LEDRing.setPixelColor(LEDNummer, LEDRing.Color(ROT, BLAU, GRUEN));
      LEDRing.show();
      // Unterbrechung wenn der rechte Taster gedrückt wurde
      if (Links) break;
      delay(Wartezeit);
    }

    // LEDs ausschalten
    for (int LEDNummer = LEDRing.numPixels(); LEDNummer >= 0 ; LEDNummer--)
    {
      LEDRing.setPixelColor(LEDNummer, 0);
      LEDRing.show();

      // Unterbrechung wenn der linke Taster gedrückt wurde
      if (Links) break;
      delay(Wartezeit);
    }

    /*
      wenn der Ring nach einem Durchlauf nicht stoppen soll:
      // Rechts = false;
    */
    Rechts = false;
    LEDRing.clear();
    LEDRing.show();
  }
}

void LEDSchaltenRechts()
{
  Rechts = true;
  Links = false;
}

void LEDSchaltenLinks()
{
  Links = true;
  Rechts = false;
}

int ZufallsFarbe() 
{ 
  int Farbe =  random(0, 255);  
  return Farbe; 
}

Letzte Aktualisierung: 24. Jul 2023 @ 8:44