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

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF

Die bei­den Tas­ter sol­len je 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 starten.

Der Neo­Pi­xel-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 Neo­Pi­xel-Ring ist in ver­schie­de­nen Bau­for­men zwi­schen 12 und 60 LEDs erhältlich.

Die Pro­gram­mie­rung unter­schei­det sich nicht. Es muss nur die Anzahl der LEDs ange­passt wer­den.

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.

 🔗RGB-Codes (exter­ner Link abge­ru­fen am 06.03.23)

Bei­spie­le:

Benö­tig­te Bauteile:

  • Neo­Pi­xel-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 Neo­Pi­xel-Rin­gen ver­schie­de­ner Her­stel­ler unter­schied­lich sein.

Jede LED kann ein­zeln ange­spro­chen werden.

Die Zäh­lung beginnt mit 0!

Benö­tig­te Bibliothek:

Sketch → Biblio­thek ein­bin­den → Biblio­the­ken verwalten

Funk­tio­nen der Biblio­thek Adafruit_NeoPixel (Aus­wahl)

Schlüs­sel­wortAkti­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 setzen
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 setzen
rot -> 0 - 255
grün -> 0 - 255
blau -> 0 - 255

Bei­spiel rot:
int Far­be = LEDStreifen.Color(255, 0, 0);

Bei­spiel grün:
int Far­be = LEDStreifen.Color(0, 255, 0);

Bei­spiel blau:
int Far­be = LEDStreifen.Color(0, 0, 255);
fill(Farbe, Start, Ende)Far­be für die mit Start und Ende bezeich­ne­ten Pixel setzen

Pro­bie­re die fol­gen­den Beispiele:

Farb­wech­sel

# include "Adafruit_NeoPixel.h"
# define RING 7

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

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

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

  // NeoPixel Bibliothek initialisieren
  LEDRing.begin();
}
void loop()
{ 
  // rot
  LEDRing.fill(LEDRing.Color(255, 0, 0), 0, AnzahlLED);
  LEDRing.show();
  delay(1000);
  
  // grün
  LEDRing.fill(LEDRing.Color(0, 255, 0), 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

  // blau
  LEDRing.fill(LEDRing.Color(0, 0, 255), 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

  // gelb
  LEDRing.fill(LEDRing.Color(255, 255, 0), 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

  // pink
  LEDRing.fill(LEDRing.Color(255, 20, 147), 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

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

"Jagd­ef­fekt":

# 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(AnzahlLED, RING, NEO_GRB + NEO_KHZ800);

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

  // setBrightness(0..255)
  LEDRing.setBrightness(200);
}
void loop()
{
  int WarteZeit = 100;

  for (int ii = 0; ii < 3; ii ++)
  {
    for (int i = 0; i < LEDRing.numPixels(); i += 3)
    {
      // jede dritte LED einschalten
      // 0, 0, 255 -> blau RGB-Farbcode

      LEDRing.setPixelColor(i + ii, 0, 0, 255);
    }
    LEDRing.show();
    delay(WarteZeit);
    for (int i = 0; i < LEDRing.numPixels(); i += 3)
    {
      // jede dritte LED ausschalten
      LEDRing.setPixelColor(i + ii, 0);
    }
  } 
}

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 Kommentare.

# 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(AnzahlLED, RING, NEO_GRB + NEO_KHZ800);

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

Der set­up-Teil. Beach­te die Kommentare.

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

  // Funktion 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 Kommentare.

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

Die Funk­ti­on Zufalls­Far­be() ermit­telt zufäl­li­ge Farbwerte.

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

Jetzt feh­len noch die Funk­tio­nen LED­Schal­ten­Rechts() und LED­Schal­ten­Links(). Sie tun nichts ande­res als den Zustand der Tas­ter mit true/false zu markieren.

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

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

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 7. Okt 2023 @ 11:37