Arduino Lektion 66: WS2812B RGB LED Stripe

Eine WS2812B RGB LED Stripe ist meist eine flexible, Aneinanderreihung von RGB LEDs.
Diese LEDs können einzeln adressiert werden. D.h. jede LED in dieser „Kette“ kann eine definierbare Farbe oder Zustand (AN / AUS) einnehmen.

WS2812B RGB LED Stripe
WS2812B RGB LED Stripe

Des Weiteren kann man zwischen Wasserfest (waterprof) und zwei verschiedenen Platinenfarben (weiß, schwarz) wählen.

Bezug

Die WS2812B RGB LED Stripes, gibt es in diversen Längen zu kaufen. Ich habe mir für dieses Tutorial 1 m bei ebay.de besorgt.

Technische Daten des WS2812B RGB LED Stripe

Die technischen Daten für ein WS2812B RGB LED Stripe unterschiedlich,
denn je nach Länge und somit mit steigender bzw. fallender Anzahl der LEDs steigt auch der Stromverbrauch und die Stromaufnahme.

Folgende Daten gelten für eine 1 m WS2812B RGB LED Stripe mit 30 LEDs:

  • Breite 11 mm
  • LED Typ 5050 SMD
  • Betriebsspannung 5V
  • Betriebstemperatur -20 °C bis +45 °C

Das mir vorliegende Model ist NICHT Wasserfest. Es gibt diese LED Stripes auch in Wasserfest, diese sind dann jedoch deutlich teurer.

Anschluss & Schaltung

Als Erstes wollen wir die Schaltung auf einem Breadboard aufbauen, dieses hat den Vorteil das man schnell zu einem
Ergebnis kommt und noch Änderungen vorgenommen werden können.

Benötigte Bauelemente

Für die nachfolgende Schaltung wird benötigt:

Schaltung - WS2812B am Arduino UNO
Schaltung – WS2812B am Arduino UNO

Quellcode

Hier nun ein kleines, einfaches Beispiel wie man über alle LEDs iteriert und diese in der Farbe Weiß aufleuchten lässt. Man kann theoretisch jede RGB Farbe darstellen.

Möchte man eine LED „ausschalten“ so muss man nur dieser LED die Farbe Schwarz zuordnen.

#include <Adafruit_NeoPixel.h> //Bibliothek für den betrieb des WS2812B RGB Stripe

#define NUM_PIXELS  28 //Anzahl der RGS im Stripe (Zähler beginnt bei 0)
#define PIN         6  //RGB LED Chip auf dem digitalen PIN D6
 
//Einrichten des Objektes
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM_PIXELS, PIN, NEO_GRB + NEO_KHZ800);

//Pause zwischen den wechseln der Pixel
int pause = 125;
 
void setup() {
  //Begin der Kommunikation
  pixels.begin();
 
}
 
void loop() {
  //Schleife über die RGB Pixel des Stripe
  for(int i=0;i<NUM_PIXELS;i++){
   //Setzen der Farbe weiß auf jeden Pixel
   pixels.setPixelColor(i, pixels.Color(255,255,255));
   //RGB Stripe aktualisieren
   pixels.show();
   //kleine Pause
   delay(pause);
   //RGB Pixel wieder ausschalten (Farbe Schwarz setzen)
   pixels.setPixelColor(i, pixels.Color(0,0,0));
  }
}

Video

RGB Stripe am Arduino UNO
Dieses Video ansehen auf YouTube.

Fazit & Ausblick

Den RGB Stripe habe ich günstig über einen Anbieter bei ebay.de gekauft. Und die erste LED war defekt, das hatte etwas Arbeit gemacht es herauszufinden, um dann doch noch den Stripe zu betreiben. Danach hatte jedoch alles reibungslos geklappt.

Als Nächstes werde ich nun ein kleines Projekt mit dem RGB Stripe durchführen. Welches die nächsten Tage auf diesem Blog veröffentlicht wird.

To be contrinue…..

6 Kommentare

  1. Hallo Stefan,
    ich habe einen Arduino Uno und 10 ws2812 geschenkt bekommen. Habe auch schon einige Beispiele ausbropiert und sie funktionieren. Nun habe ich mir überlegt,was mache ich damit. Ich habe drei Solar LED Kugeln im Garten, die aber nicht mehr so richtig funktionieren, die möchte ich damit bestücken. Verdrahtung ist kein Proplem, aber ich habe noch keinen Ansatz für ein Programm gefunden. Sie sollen in drei Farben leuchten und dann in langsamen Schritten die Farben gegenseitig ändern (Rot langsam gegen 0 und langsam hoch in Blau, Grün gegen Rot , Blau gegen Grün im zwei Minuten Takt. Wie müsste das Programm aussehen. Habe schon die diversesten Programme kombieniert, komme aber zu keinem Ergebniss. Bin eben Anfänger.
    Vielen Dank
    Gerald

    1. Hi

      Da die WS2812(b) recht viel Strom fressen, wird die Versorgung mit dem Leuchten-Akku wohl eher keinen langen Spielspaß geben.

      Zum Programm:
      Du kannst ja jedem Pixel sagen, in welcher Farbe Er leuchten soll.
      Du möchtest, daß dieser Ablauf sich endlos wiederholt.
      Das ‚riecht‘ nach Schrittkette/endlicher Automat/state machine. (alle 3 sollten sich finden lassen)

      Unterm Strich hast Du verschiedene Status (ist ebenfalls die Mehrzahl) und wartest eher die ganze Zeit, daß Du zum Nächsten springen darfst:

      //Library für Neopixel einbinden

      void setup() {
      // Neopixel-Setup nach Deren Beispielen
      }

      void loop() {
      static uint32_t lastmillis = 0; //Uhrzeit der letzten Aktion
      static uint16_t status = 0; //aktueller Status
      uint32_t aktmillis = millis(); //die aktuelle ‚Uhrzeit‘
      const uint32_t waitmillis = 200; //Wartezeit zwischen den Status
      if (aktmillis – lastmillis >= waitmillis) {
      //die Wartezeit ist vorbei, also zum nächsten Schritt
      lastmillis = aktmillis; //die Uhrzeit dieser Aktion merken
      bool ledhaschanged = false;
      switch (status) {
      case 0://änder irgendetwas
      ledhaschanged = true;
      break;
      case 1://änder irgendetwas
      ledhaschanged = true;
      break;
      case 2://änder irgendetwas
      ledhaschanged = true;
      break;
      case 3://änder irgendetwas
      ledhaschanged = true;
      status = 0; //wieder zurück zum Anfang
      break;
      default://hier kommen wir normal NIE hin
      status = 0;
      break;
      }
      if (ledhaschanged) {
      //stripe neu anzeigen lassen – was in der Art stripe.show();
      ledhaschanged = false;
      }
      }

      //Hier kannst Du noch weitere Funktionalität einbringen, achte darauf, NICHT blockierend zu programmieren
      //also kein delay() für Wartezeiten, benutze aktmillis.
      //Zum Merken der jeweils letzten Aktion brauchst Du jeweils eine
      //’lastmillis‘-Variable (klar mit anderm Namen) und eine Wartezeit
      //oben ist Das die waitmillis.

      //Dinge, Die sich NIE ändern, als const deklarieren – kann der Kompiler direkt im Code einbinden und braucht keinen teuren Variablen-Speicher
      //Dinge, Die Du auch beim nächsten loop()-Durchlauf noch wissen willst
      //als static declarieren – diese Variablen verbleiben im Speicher, alle Anderen
      //z.B. aktmillis, wird beim Ende von loop() zerstört.

      //Für Arduino-Fragen dürfte aber ein Arduino-Forum besser geeignet sein, als ein Blog
      //Im Forum wird’s gerne gesehen, von wo Du kommst (also Link zum Blog), ob hier ein Link zu Deinem Foren-Thread gerne gesehen wird – ich denke,
      //spricht Nichts dagegen und führt andere Hilfesuchende ebenfalsl zum Ziel.
      //und wenn’s doch nicht gerne gesehen ist, löscht der Blog(g)er den Link halt, fertsch.
      }

      Compiliert bei mir (Arduino-IDE 1.8.8, portable) mit den üblichen Warnungen zum ESP01s (Generic ESP8266 Module) – mit Dem spiele ich gerade 🙂
      Beim Uno sollte keine Warnung ect.pp. auftauchen.

      Der Sketch macht SO noch Nichts – in den verschiedenen Status steht ja Nichts drin, etwas Spielen musst Du damit halt noch selber 😉

  2. Ich bin absoluter Anfänger und habe eine Frage, kann man mit dem Arduino und einem WS2812 Led Streifen 15 Led´s von 1-15 nacheinander anschalten und sterben sollen, solange die Spannung abgeschaltet wird. Ich brauche es für eine Leuchtreklame.
    Für eure Hilfe bin ich sehr Dankbar
    Liebe Grüße Dietmar

    1. Hi,

      das ist recht einfach durch die gegebene Anzahl von 15 LEDs, kommt man damit sogar mit nur einem digitalen Pin aus.
      Ich werde mich dem einfach mal annehmen und einen kleinen Beitrag dazu verfassen.

      Gruß,

      Stefan Draeger

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht.