Inter­rupt: Far­ben­spiel mit einem NeoPixel-Ring

Lese­zeit: 8 Minu­ten
Navi­ga­ti­on

Der NeoPixel-Ring besteht aus meh­re­ren mit­ein­an­der ver­bun­de­nen RGB-LEDs. Jede besitzt einen eige­nen Con­trol­ler und kann ein­zeln ange­steu­ert wer­den. Er benö­tigt nur einen digi­ta­len Ein­gang. Der NeoPixel-Ring ist in ver­schie­de­nen Bau­for­men zwi­schen 12 und 60 LEDs erhält­lich.

Die Pro­gram­mie­rung unter­schei­det sich nicht.

RGB ist eine Mischung der Far­ben Rot, Grün und Blau. Jede Far­be kann von 0 bis 255 gesetzt wer­den, die Wer­te wer­den durch Kom­ma­ta getrennt.

 ➨Wei­te­re Infor­ma­tio­nen (exter­ner Link)

Bei­spie­le:

Benö­tig­te Bau­tei­le:

  • NeoPixel-Ring
  • 2 Tas­ter
  • Lei­tungs­dräh­te

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Ach­te auf die Polung. Sie kann bei den NeoPixel-Ringen ver­schie­de­ner Her­stel­ler unter­schied­lich sein.

Jede LED kann ein­zeln ange­spro­chen wer­den.

Die Zäh­lung beginnt mit 0!

Benö­tig­te Biblio­thek:
Sketch → Biblio­thek ein­bin­den → Biblio­the­ken ver­wal­ten

Metho­den der Biblio­thek Adafruit_NeoPixel (Aus­wahl)

Metho­de Funk­ti­on
begin()LED-Ring star­ten
num­Pi­xels()Anzahl der LEDs lesen
show()LED-Ring ein­schal­ten
clear()LED-Ring aus­schal­ten
setPixelColor(LED-Nummer, rot, grün, blau)Far­be einer LED set­zen
LED-Nummer
rot -> 0 - 255
grün -> 0 - 255
blau -> 0 - 255
set­Bright­ness()Hel­lig­keit set­zen (0−255)
Color(rot, grün, blau)Far­be für alle LEDs set­zen
rot -> 0 - 255
grün -> 0 - 255

oder:
Wert „für gepack­tes RGB“ ermit­teln
long Far­be = LEDStreifen.Color(0, 0, 255);
blau -> 0 - 255
fill(gepacktes_RGB, Start, Ende)Far­be für die mit Start und Ende bezeich­ne­ten Pixel set­zen

Die Berech­nung für „gepack­tes RGB“:
Far­be = 65536 * Rot + 265 * Grün + Blau
Der Varia­blen­typ muss auf long gesetzt wer­den!

Pro­bie­re die fol­gen­den Bei­spie­le:

Farb­wech­sel

# include <Adafruit_NeoPixel.h>

# define RING 7

// Anzahl der LEDs → muss angepasst werden
# define AnzahlLED 32

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

void setup()
{
  // setBrightness(0..255)
  LEDRing.setBrightness(200);

  // NeoPixel Bibliothek initialisieren
  LEDRing.begin();
}

void loop()
{
  // NeoPixel Bibliothek initialisieren
  LEDRing.begin();

  // Variable für "gepacktes RGB"
  long Farbe;

  // rot -> Wert für "gepacktes RGB" ermitteln
  Farbe = LEDRing.Color(255, 0, 0);
  LEDRing.fill(Farbe, 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

  // grün -> Wert für "gepacktes RGB" ermitteln
  Farbe = LEDRing.Color(0, 255, 0);
  LEDRing.fill(Farbe, 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

  // blau -> Wert für "gepacktes RGB" ermitteln
  Farbe = LEDRing.Color(0, 0, 255);
  LEDRing.fill(Farbe, 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

  // gelb -> Wert für "gepacktes RGB" ermitteln
  Farbe = LEDRing.Color(255, 255, 0);
  LEDRing.fill(Farbe, 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

  // pink -> Wert für "gepacktes RGB" ermitteln
  Farbe = LEDRing.Color(255, 20, 147);
  LEDRing.fill(Farbe, 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

  // Pause
  LEDRing.clear();
  LEDRing.show();
  delay(2000);
}

Lauf­licht:

# include <Adafruit_NeoPixel.h>

int RING = 7;

// Anzahl der LEDs -> muss angepasst werden
int AnzahlLED = 32;

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

void setup()
{
  // NeoPixel Bibliothek initialisieren
  LEDRing.begin();

  // setBrightness(0..255)
  LEDRing.setBrightness(200);
}
void loop()
{
  // vorwärts mit blau
  for (int LEDNummer = 0; LEDNummer < LEDRing.numPixels(); LEDNummer++)
  {
    LEDRing.setPixelColor(LEDNummer, LEDRing.Color(0, 0, 255));
    LEDRing.show();
    delay(100);
    LEDRing.setPixelColor(LEDNummer, LEDRing.Color(0, 0, 0));
    LEDRing.show();
  }

  // rückwärts mit gelb
  for (int LEDNummer = LEDRing.numPixels(); LEDNummer >= 0 ; LEDNummer--)
  {
    LEDRing.setPixelColor(LEDNummer, LEDRing.Color(255, 255, 0));
    LEDRing.show();
    delay(100);
    LEDRing.setPixelColor(LEDNummer, LEDRing.Color(0, 0, 0));
    LEDRing.show();
  }
}

Jeder Tas­ter soll eine Fol­ge von leuch­ten­den LEDs in ver­schie­de­nen Far­ben aus­lö­sen. Dabei soll der jeweils ande­re Tas­ter den Pro­gramm­ab­lauf unter­bre­chen und „sei­ne“ Fol­ge leuch­ten­der LEDs star­ten.

Ein Pro­gramm­ab­lauf kann nur unter­bro­chen wer­den, wenn jedem Tas­ter ein Inter­rupt zuge­ord­net wird.

attach­In­ter­rupt()

Defi­nie­re die Varia­blen und bin­de die benö­tig­te Biblio­thek ein. Beach­te die Kom­men­ta­re.

# 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

Der setup-Teil. Beach­te die Kom­men­ta­re.

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

  // NeoPixel Bibliothek initialisieren
  LEDRing.begin();

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

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

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

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

Der loop-Teil. Beach­te die Kom­men­ta­re.

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

Jetzt feh­len noch die Metho­den LED­Schal­ten­Rechts() und LED­Schal­ten­Links(). Sie tun nichts ande­res als den Zustand der Tas­ter mit true/false zu mar­kie­ren.

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

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


Ver­wand­te Auf­ga­ben:


Letzte Aktualisierung: 25. Aug 2020 @ 19:52