Anzeige

US Police Lights mit Arduino und WS2812-LED-Strip

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

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.

US Police Lights mit Arduino und WS2812-LED-Strip Schaltplan

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.

US Police Lights mit Arduino und WS2812-LED-Strip Schaltplan Externe Spannungsversorgung

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


Jetzt bist du gefragt: Welches Projekt würdest du gern auf dieser Seite finden? *


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

 

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.