Sebastian hat gefragt, ob ich ihm helfen könnte, den Code für das Leuchten eines Zero Point Moduls aus Stargate zu programmieren. Da ich die Serie sehr gern mag, bin ich gern behilflich. Auf Thingiverse gibt es ein Modell zum 3D-Drucken von SO3D, von dem auch das Titelbild ist (CC BY-NC 4.0). In diesem Projekt ist ebenfalls ein LED-Streifen eingesetzt. Hier gibt es sogar ein Video dazu:
Bauteile
- 1x
- 1x Widerstand ca. 470 Ohm
- 1x WS2812 LED-Strip* im Beispiel reichen 8 LEDs
- 1x Kondensator 1000µF*
Schaltplan

Sehen wir uns die Schaltung an. Dabei handelt es sich um ein Arduino UNO, dessen GND und 5V+ an den Anschlüssen des WS2812 Moduls anliegen. Der digitale Pin 3 ist über einen Widerstand (300 – 500 Ohm) mit dem Data-IN Pin des WS2812 Strips verbunden. Zwischen GND und 5V+ ist noch ein Elektrolyt-Kondensator (500 – 1000 uF, 16V) angeschlossen.
Programmtext
Ich habe zwei Programme geschrieben. Das erste Programm lässt einzelne LEDs in unterschiedlicher Geschwindigkeit aufblinken. Dabei kann die Anzahl der maximal gleichzeitig leuchtender LEDs und die Animationsgeschwindigkeit eingestellt werden.
#include <Adafruit_NeoPixel.h> // Bibliothek für die Neopixel LEDs (WS2812)
#define PIN 6 // Pin, an dem die LEDs angeschlossen sind
#define NUMPIXELS 9 // Anzahl der LEDs
int maxBrightness = 200; // maximale Helligkeit der LEDs
int animationSpeed = 40; // setzte die Animationsgeschwindigkeit (je höher, desto langsamer)
/* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */
int theValue[NUMPIXELS]; // speichert den Leuchtwert
int theSpeed[NUMPIXELS]; // speichert die Geschwindigkeit pro LED
int theDirection[NUMPIXELS]; // speichert die Animationsrichtung (hell zu dunkel oder andersherum)
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // erzeugt ein Neopixel-Objekt für den LED-Leuchtstreifen
void setup() {
pixels.begin(); // initialisiere die Neopixel-LEDs (WS2812)
randomSeed(analogRead(5)); // started den Zufalls-Nummerngenerator
for (int i = 0; i < NUMPIXELS; i++) { // für alle LEDs
theDirection[i] = 1; // setze die Dimm-Richtung auf 1 (von dunkel zu hell)
theSpeed[i] = random(5); // erzeuge zufällige Geschwindigkeit für jede LED
}
}
void loop() {
for (int i = 0; i < NUMPIXELS; i++) { // für jeden Pixel
theValue[i] += theSpeed[i] * theDirection[i]; // kalkuliere den Lichtwert
if (theValue[i] >= maxBrightness) { // falls die maximale Helligkeit überschritten wird
theValue[i] == maxBrightness; // setze die Helligkeit auf den Maximalwert
theDirection[i] = -1; // setze die Dimm-Richtung auf -1 (von hell zu dunkel)
} else if (theValue[i] <= 0) { // falls die minimale Helligkeit unterschritten wird
theValue[i] == 0; // setze die Helligkeit auf 0
theDirection[i] = 1; // setze die Dimm-Richtung auf 1 (von dunkel zu hell)
theSpeed[i] = random(10); // erzeuge eine neue zufällige Geschwindigkeit
}
pixels.setPixelColor(i, pixels.Color(theValue[i], theValue[i], 0)); // weise den Lichtwert den LEDs im roten und grünen Kanal zu
}
pixels.show(); // übertrage die Daten an die LEDs
delay(animationSpeed); // warte in der Animationsgeschwindigkeit
}
Das zweite Programm lässt alle LEDs unterschiedlich schnell aufleuchten:
#include <Adafruit_NeoPixel.h> // Bibliothek für die Neopixel LEDs (WS2812)
#define PIN 3 // Pin, an dem die LEDs angeschlossen sind
#define NUMLIGHTS 6 // Anzahl maximal gleichzeitig leuchtender LEDs
#define NUMPIXELS 9 // Anzahl der LEDs des LED-Strips
int maxBrightness = 200; // maximale Helligkeit der LEDs
int animationSpeed = 40; // setzte die Animationsgeschwindigkeit (je höher, desto langsamer)
/* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */
int theValue[NUMPIXELS]; // speichert den Leuchtwert
int theSpeed[NUMPIXELS]; // speichert die Geschwindigkeit pro LED
int theDirection[NUMPIXELS]; // speichert die Animationsrichtung (hell zu dunkel oder andersherum)
int theLights[NUMLIGHTS];
int thePixel[NUMLIGHTS];
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // erzeugt ein Neopixel-Objekt für den LED-Leuchtstreifen
void setup() {
pixels.begin(); // initialisiere die Neopixel-LEDs (WS2812)
randomSeed(analogRead(5)); // started den Zufalls-Nummerngenerator
for (int i = 0; i < NUMLIGHTS; i++) { //
theDirection[i] = 1; // setze die Dimm-Richtung auf 1 (von dunkel zu hell)
theSpeed[i] = random(5); // erzeuge zufällige Geschwindigkeit für jede LED
thePixel[i] = random(NUMPIXELS); // suche eine LED aus
}
}
void loop() {
for (int i = 0; i < NUMLIGHTS; i++) {
theValue[i] += theSpeed[i] * theDirection[i]; // kalkuliere den Lichtwert
if (theValue[i] >= maxBrightness) { // falls die maximale Helligkeit überschritten wird
theValue[i] == maxBrightness; // setze die Helligkeit auf den Maximalwert
theDirection[i] = -1; // setze die Dimm-Richtung auf -1 (von hell zu dunkel)
} else if (theValue[i] <= 0) { // falls die minimale Helligkeit unterschritten wird
theValue[i] == 0; // setze die Helligkeit auf 0
theDirection[i] = 1; // setze die Dimm-Richtung auf 1 (von dunkel zu hell)
theSpeed[i] = random(10); // erzeuge eine neue zufällige Geschwindigkeit
pixels.setPixelColor(thePixel[i], pixels.Color(0, 0, 0));
pixels.show();
thePixel[i] = random(NUMPIXELS);
}
pixels.setPixelColor(thePixel[i], pixels.Color(theValue[i], theValue[i], 0)); // weise den Lichtwert den LEDs im roten und grünen Kanal zu
}
pixels.show(); // übertrage die Daten an die LEDs
delay(animationSpeed); // warte in der Animationsgeschwindigkeit
}
Und zu guter Letzt noch eine Version, in der alle LEDs eine minimale Helligkeit beibehalten. Diese lässt sich über minBrightness einstellen.
#include <Adafruit_NeoPixel.h> // Bibliothek für die Neopixel LEDs (WS2812)
#define PIN 3 // Pin, an dem die LEDs angeschlossen sind
#define NUMLIGHTS 3 // Anzahl maximal gleichzeitig leuchtender LEDs
#define NUMPIXELS 9 // Anzahl der LEDs des LED-Strips
int maxBrightness = 200; // maximale Helligkeit der LEDs
int minBrightness = 20; // minimale Helligkeit der LEDs
int animationSpeed = 40; // setzte die Animationsgeschwindigkeit (je höher, desto langsamer)
/* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */
int theValue[NUMPIXELS]; // speichert den Leuchtwert
int theSpeed[NUMPIXELS]; // speichert die Geschwindigkeit pro LED
int theDirection[NUMPIXELS]; // speichert die Animationsrichtung (hell zu dunkel oder andersherum)
int theLights[NUMLIGHTS];
int thePixel[NUMLIGHTS];
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // erzeugt ein Neopixel-Objekt für den LED-Leuchtstreifen
void setup() {
pixels.begin(); // initialisiere die Neopixel-LEDs (WS2812)
randomSeed(analogRead(5)); // started den Zufalls-Nummerngenerator
for (int i = 0; i < NUMLIGHTS; i++) { //
theDirection[i] = 1; // setze die Dimm-Richtung auf 1 (von dunkel zu hell)
theSpeed[i] = random(5); // erzeuge zufällige Geschwindigkeit für jede LED
thePixel[i] = random(NUMPIXELS); // suche eine LED aus
}
}
void loop() {
for (int i = 0; i < NUMLIGHTS; i++) {
theValue[i] += theSpeed[i] * theDirection[i]; // kalkuliere den Lichtwert
if (theValue[i] >= maxBrightness) { // falls die maximale Helligkeit überschritten wird
theValue[i] == maxBrightness; // setze die Helligkeit auf den Maximalwert
theDirection[i] = -1; // setze die Dimm-Richtung auf -1 (von hell zu dunkel)
} else if (theValue[i] <= minBrightness) { // falls die minimale Helligkeit unterschritten wird
theValue[i] == minBrightness; // setze die Helligkeit auf minBrightness
theDirection[i] = 1; // setze die Dimm-Richtung auf 1 (von dunkel zu hell)
theSpeed[i] = random(10); // erzeuge eine neue zufällige Geschwindigkeit
pixels.setPixelColor(thePixel[i], pixels.Color(minBrightness, minBrightness, 0));
pixels.show();
thePixel[i] = random(NUMPIXELS);
}
pixels.setPixelColor(thePixel[i], pixels.Color(theValue[i], theValue[i], 0)); // weise den Lichtwert den LEDs im roten und grünen Kanal zu
}
pixels.show(); // übertrage die Daten an die LEDs
delay(animationSpeed); // warte in der Animationsgeschwindigkeit
}
Hiermit sollten sich wohl einige Zero Point Module bauen lassen :-)
Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book an!
Darin findest du die beliebtesten Arduino-Projekte von StartHardware. Jedes Projekt umfasst Schaltplan, Bauteile, Beschreibung und Code. Für Einsteiger gibt es ein Arduino-Schnellstart-Kapitel und einen kompakten Programmierkurs. Zusätzlich findest du Zwischenkapitel mit Expertenwissen zu den Komponenten, die verwendet werden. Alle Code-Beispiele gibt es natürlich als Download.
Weitere Informationen findest du auf der Produktseite. Klicke jetzt auf den Button, um Details anzusehen.