Glücks­rad mit NeoPixel-Ring

Lese­zeit: 7 Minu­ten

Lösung
Seite als PDF
Navi­ga­ti­on

Der NeoPixel-Ring soll als Glücks­rad funk­tio­nie­ren. Wird der Tas­ter gedrückt, beginnt das Glücks­rad zu lau­fen, ein erneu­ter Tas­ter­druck stoppt das Glücksrad.

So sieht es aus:

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ältlich.

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.

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

Bei­spie­le:

Benö­tig­te Bauteile:

  • NeoPixel-Ring 32 LEDs
  • Tas­ter
  • Lei­tungs­dräh­te
  • Laut­spre­cher (optio­nal)

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

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

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

void loop()
{
  // Variable für die Farbe festlegen
  int Farbe;

  // rot 
  Farbe = LEDRing.Color(255, 0, 0);
  LEDRing.fill(Farbe, 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

  // grün
  Farbe = LEDRing.Color(0, 255, 0);
  LEDRing.fill(Farbe, 0, AnzahlLED);
  LEDRing.show();
  delay(1000);

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

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

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

  // Pause
  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 = Adafruit_NeoPixel(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);
    }
  } 
}

Der Tas­ter muss das lau­fen­de Pro­gramm mit ➨attach­In­ter­rupt() unterbrechen. 

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

# include <Adafruit_NeoPixel.h>

// digitaler Pin LED-Ring
# define RING 7

// digitaler Pin des Lautsprechers
# define LAUTSPRECHER 8

// Anzahl der LEDs -> muss an den verwendeten Neopixel-Ring angepasst werden
# define AnzahlLED 32

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

// Status entscheidet, ob das Glücksrad läuft oder gestoppt wird
// false -> Glücksrad läuft beim Start
volatile bool Status = false;

// true -> Lautsprecher ein
// false -> Lautsprecher aus
bool Toene = true;

// true -> zufällige Farbe nach jeder Runde wechseln
// false -> Farbwechsel nach jedem Pixel
bool FarbWechselRunde = false;

// Definition der Farben
int ROT, GRUEN, BLAU;

// Taster am Interrupt-Pin definieren
# define TASTER 3

// Variablen für die mit millis() ermittelte Zeit
// damit nur jeweils ein Tasterdruck erkannt wird
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

// Zeit zwischen den Bewegungen der LED
int WarteZeit = 50;

Der setup-Teil. Beach­te die Kommentare.

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

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

  // Eingangspegel auf HIGH setzen
  pinMode(TASTER, INPUT_PULLUP);

  // Interrupt dem Taster zuordnen und die Funktion LEDSchalten aufrufen
  attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, FALLING);

  // Zufallsgenerator starten
  randomSeed(analogRead(0));
}

Der loop-Teil. Beach­te die Kommentare.

void loop() 
{
  // LED-Ring ausschalten
  LEDRing.clear();

  // zufällige Farbwerte Wechsel nach jeder 360° Drehung
  // -> FarbWechselRunde true
  if (FarbWechselRunde) 
  {
    ROT = ZufallsFarbe();
    GRUEN = ZufallsFarbe();
    BLAU = ZufallsFarbe();
  }

  // wenn Status false -> Glücksrad läuft
  if (!Status) 
  {
    if (Toene) tone(LAUTSPRECHER, 1000, 5);

    // Start der Drehung mit LED 0
    // Ende mit Anzahl der LEDs
    for (int i = 0; i < LEDRing.numPixels(); i ++) 
    {
      // zufällige Farbwerte: Wechsel nach jeder LED
      // -> FarbWechselRunde false
      if (!FarbWechselRunde) 
      {
        ROT = ZufallsFarbe();
        GRUEN = ZufallsFarbe();
        BLAU = ZufallsFarbe();
      }
      // Farbe für die aktuelle LED 
      LEDRing.setPixelColor(i, ROT, GRUEN, BLAU);

      // LEDs einschalten
      LEDRing.show();

      /*
        Taster gedrückt: Status = true -> Glücksrad stoppen
        break -> for-Schleife verlassen
      */
      if (Status) 
      {
        if (Toene) tone(LAUTSPRECHER, 1000, 500);
        break;
      }

      // Wartezeit bis zur nächsten LED
      delay(WarteZeit);

      // aktuell eingeschaltete LEDs ausschalten
      LEDRing.setPixelColor(i, 0);
    }
  }
}

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

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

Jetzt fehlt noch die ➨Funk­ti­on LEDSchalten().

void LEDSchalten() 
{
  // aktuelle Zeit sichern
  Startzeit = millis();

  /*
    bei mehr als 250 Millisekunden Differenz
    zwischen der aktuellen und der gesicherten Zeit
    -> Status umdrehen
    aus false wird true -> Glücksrad stoppen 
    aus true wird false -> Glücksrad starten
  */
  if (Startzeit - GesicherteStartZeit > 250) 
  {
    Status = !Status;
  }

  GesicherteStartZeit = Startzeit;
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 30. Nov 2022 @ 8:53