Die Signalleuchten von amerikanischen Polizeiautos sind nicht mit denen europäischer Einsatzfahrzeuge zu vergleichen. Was da auf dem Dach für eine Party abgeht, wenn der Sheriff auf den Knopf drückt :-D
Das lässt sich mit WS2812-LED-Strip und Arduino natürlich nachbauen. Hier zeige ich dir, wie das geht:
Bauteile
- 1 x
- 1 x Widerstand ca. 470 Ohm
- 1 x WS2812 LED-Strip im Beispiel reichen 8 LEDs
- 1 x Kondensator 1000µF
Schaltung
Die Schaltung besteht aus einem Arduino UNO. Der digitale Pin 6 ist über einen 470 Ohm Widerstand mit dem DI-Pin (Data In) des LED-Strips verbunden. Der GND des Strips ist mit dem GND des Arduinos verbunden. Im Beispiel werden nur 8 LEDs verwendet. Deshalb kann der 5V+ vom LED-Strip ebenfalls direkt mit dem 5V+ des Arduino-Boards verbunden werden.
Optional lässt sich eine externe Spannungsquelle, z. B. eine Batterie, eine Powerbank oder ein Netzteil, verwenden. Besonders bei vielen LEDs des WS2812-Strips ist dies zu empfehlen.
Programmtext
Das Arduino-Programm benötigt die Adafruit-Nanopixel-Bibliothek. Die muss in der Arduino-Software installiert werden. Öffne dafür in der Arduino IDE (Software) das Menü Sketch>Bibliotheken einbinden>Bibliotheken verwalten … und suche im Suchfeld nach NeoPixel. Installiere die Adafruit NeoPixel-Library von Adafruit in der aktuellen Version.
Das Programm verwendet für die Darstellung der Animation – das Blinken der LEDs ist ja nichts anderes, als eine Animation auf 8 Pixeln – das mehrdimensionales Array frame. Es speichert für jede Animationsphase die drei Farbwerte (RGB) für 8 Pixel.
frame[Animationsphase][LED-Nummer][Farbe]
Die Animation im Beispiel hat 19 Animationsphasen. Zu jeder Animationsphase gehört auch eine Animationsdauer, also einen Wert, der bestimmt, wie lange eine Animationsphase gezeigt werden soll. Das ist wichtig, da z. B. das weiße Aufblitzen der LEDs nur sehr kurz geschehen soll, während ein abwechselndes Rot-Blau-Blinken länger dauert.
Ich habe so lange an den Animationsphasen und Animationsdauern getestet, bis ich zufrieden war.
Zurück zum Code. Im Loop wird zuerst die Methode police1 aufgerufen. Sie zeigt die aktuelle Animationsphase auf den LEDs an und wartet die Animationsdauer ab. Danach wird im Loop der Animationszähler frameCurrent um 1 erhöht (++). Nun wird noch getestet, ob der Animationszähler größer als die maximale Animationsphase (frameMax) ist. Falls das der Fall ist, wird der Animationszähler auf 0 gesetzt und die Animation beginnt von vorne.
#include <Adafruit_NeoPixel.h> #define LED_PIN 6 #define LED_COUNT 8 Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); const int frameMax = 19; int frames[frameMax][8][3] = { {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }}, {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }}, {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}, {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}, {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }}, {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}, {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}, {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }}, {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 255, 255}, {255, 255, 255}, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}, {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}, {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 255, 255}, {255, 255, 255}, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}, {{0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}, {{0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}, {{0, 0, 0 }, {255, 0, 0 }, {255, 0, 0}, {0, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }}, {{0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {255, 0, 0 }}, {{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255}}, {{0, 0, 255 }, {0, 0, 255 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }}, {{0, 0, 0 },{0, 0, 0 },{255, 255, 255},{255, 255, 255},{255, 255, 255},{255, 255, 255},{0, 0, 0 },{0, 0, 0 }}, {{0, 0, 0}, {0, 0, 0 }, {255, 0, 0}, {255, 0, 0 }, {255, 0, 0 }, {255, 0, 0 }, {0, 0, 0 }, {0, 0, 0 }} }; int durations[frameMax] = {1000, 100, 100, 50, 50, 10, 50, 50, 50,40,50,40,100,100,100,20,40,20,100}; int frameCurrent = 0; void setup() { strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED) strip.show(); // Turn OFF all pixels ASAP strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255) } void loop() { police1(strip.Color(255, 0, 0), durations[frameCurrent]); frameCurrent++; if (frameCurrent >= frameMax) frameCurrent = 0; } void police1(uint32_t color, int wait) { for (int i = 0; i < 8; i++) { // For each pixel in strip... strip.setPixelColor(i, strip.Color(frames[frameCurrent][i][0],frames[frameCurrent][i][1],frames[frameCurrent][i][2])); // Set pixel's color (in RAM) strip.show(); // Update strip to match } delay(wait); // Pause for a moment }
Du kannst die Animation natürlich anpassen, erweitern oder verkürzen. Dazu musst du nur weitere Animationsphasen in das Array frames einfügen, weitere Wartezeiten in das Array durations hinzufügen und die Variable frameMax anpassen.
Viel Spaß dabei und viel Erfolg. Ach ja, wenn du noch ein bisschen mehr über die WS2812 LEDs erfahren willst, guck dir doch mal den Beitrag an: WS2812 – Der einfachste Weg, viele LEDs mit Arduino steuern.
Und dieses Video zeigt die Animationen eines kommerziellen Polizeilichts aus den USA. Vielleicht hast du ja Lust, die originalen Animationen zu programmieren.
Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!
- Die beliebtesten Arduino-Projekte von StartHardware
- Inklusive Schaltplan, Beschreibung und Code
- Arduino-Schnellstart-Kapitel
- Kompakter Programmierkurs
Hallo, was genau muss ich tun um 18 LEDs zum leuchten zu bringen und ohne Pause zu blinken?
Mfg