Was kann es ?

Beim einschalten der Stromversorgung wird Fahrlicht angeschaltet, d.h. vorne Weiß, hinten Rot. Mit 4 Tastern kann man durch entsprechenden Tastendruck (1x = 1 mal drücken) das Unterprogramm auswählen.

Taster 1
1x Lichthupe (1 kurzes, 1 langes Aufleuchten, danach Fahrlicht)
3x Rainbow-Modus (Macht einen kompletten Zyklus durch und geht danach auf Fahrlicht, nicht abschaltbar)

Taster 2
1x Blinker Links (3 Zyklen, danach Fahrlicht)

Taster 3
1x Blinker Rechts (3 Zyklen, danach Fahrlicht)

Taster 4
1x Warnblinklicht (Oranges Blitzen/Blinken Oben/Unten, Ein/Aus durch Tastendruck)
2x Blaulicht (Blaues Blitzen Oben/Unten über kreuz , Ein/Aus durch Tastendruck)

 

Die Zeiten für Blinker, Warnblinklicht und Blaulicht können im Sketch sehr einfach über eine Variable angepasst werden, sollte es einem zu schnell sein, kann man das ohne großen Aufwand ändern.

Was kann es nicht ?

Geräusche machen.

Was braucht man ?

  • nodeMCU 32 (ESP-32)
  • 2 Adafruit NeoPixel Jewel RGBW (für Vorne)
  • 2 Adafruit NeoPixel Jewel RGB (für Hinten)
  • 4 Taster (KEINE Schalter)
  • 4 Stück 3-Polige Steckverbinder (JST)
  • 4 Stück 2-Pole Steckverbinder (JST)
  • Schlüsselschalter
  • Stromversorgung (Entweder eine Powerbank oder eine selbst gebaute Stromversorgung)
    • Li-Ion Akku Lader (Da gibt für unter 5€ Platinen mit USB-Eingang, Ausgang für Akku und Verbraucher)
    • Li-Ion Akku (evtl. noch einen Halter)
    • Step-Up Regler von 3,6V auf 5V
  •  18650 Li-Ion Akku
  •  Akkuhalter mit 5V Ausgang (Powerbank Module Boards) / Battery Shield
  • Kabel, Schrumpfschlauch
  • Werkzeug (Feiner Seitenschneider, Lötkolben, Lötzinn)

Lichthupe

Blinker Links

Blinker Rechts

Warnblinklicht

Blaulicht

Rainbow

Wie geht das ?

Einleitung

So, da die Kurzanleitung nicht allen helfen wird, hier die lange Fassung. Wir wollen also einen Microcontroller (ESP-32) mit ein paar LED-Platinen verbinden und diese mit ein paar Tastern steuern. Damit das Auto auch nach Auto aussieht, wird es einen Blinker-Links Taster, einen Blinker-Rechts Taster, einen Licht-Taster sowie einen Taster für Warnblinklicht und Blaulicht geben.

Was müssen wir also alles machen ?

  1. LED-Platinen mit einem Teil der Steckverbindung verlöten (3-polige Stecker)
  2. Taster mit einem Teil der Steckverbindung verlöten, freie Kontakte mit Schrumpfschlauch isolieren (2-polie Stecker)
  3. Die jeweils anderen Steckerhälften mit den entsprechenden PINs am ESP-32 verbinden (löten)
  4. Sketch aufspielen / anpassen / testen
  5. Stromversorgung einbauen / aufbauen

Das ganze soll ja später IN ein Rutschauto, daher habe ich zwischen LED´s/Tastern und dem ESP-32 auch noch ein paar Stecker verbaut. Macht also später die Montage im Auto einfacher. Bei den LED-Platinen entsprechend 3-polige (JST), bei den Tastern 2-polige (Micro-JST-SH). Die gibts relativ günstig. Man muss also im Auto selbst später nicht löten sondern steckt einfach alles zusammen.

1. LED-Platinen verbinden

Die NEOPIXEL JEWEL haben - wie alle NeoPixel Bauteile von Adafruit die ich kenne - einen Daten-EIN und einen Daten-AUSgang. Wir verbinden also den DatenEINGANG mit einem GPIO Pin des ESP-32. Das ganze braucht natürlich auch Strom, somit müssen GND (Masse) und 5V DC Power auch mit dem Controller verbunden werden. Das ganze natürlich für jede LED-Platine.

Wir löten erst mal nur die eine Hälfte der Steckverbindung an! Die andere Hälfte kommt später an den ESP. Damit man das später auch alles richtig zusammensteckt, habe ich die Kabel beschriftet.

2. Taster verbinden

Bei den Tastern ist es etwas einfacher als bei den LEDs, hier muss man nur 2x löten. Die offenen Lötstellen kann man gut mit Schrumpfschlauch isolieren, dann sind wir schon fertig. Die Taster sind zum einfachereren zusammenbau enbenfalls beschriftet.

3. Steckverbinder am ESP-32 verlöten

Jetzt wird es etwas kompliziert. Wir müssen ja, 8 mal an Masse/GND und 4 mal an 5V. Was ja "mal eben" nicht geht. Bei 5V gibts nur einen Pin. Und es gibt auch keine 8 Masse Pin´s.  Ich habe mir mit einer Lochrasterplatine geholfen. Da passt alles drauf, kann man sich anpassen wie man mag und es sieht später halbwegs ordentlich aus. Man kann dann einen GND Pin für mehrere Kabel benutzen indem man die einfach Loch neben Loch anlötet und dann brückt. Ich hab die Stecker an die Außenkanten angelötet und mit den weißen Kabeln an die entsprechenden Pins am ESP "verlängert". Das ist fricklei, lohnt sich aber. Ungenau wird es von alleine, also sauber arbeiten! Natürlich wäre es schöner, eine richtige Platine zu haben....kostet aber sehr viel Geld. Und für einmal einen Prototyp zu bauen und dafür mal eben 50-70€ zu verbraten ist irgendwie nicht passend.

Somit sind dann nach viel löterei, alle Stecker an der Platine. Die Anschlussleitungen habe ich natürlich auch alle beschriftet!

4. Sketch aufspielen

Sketch heißt auf gut Deutsch = Programm. Der ESP kann ja erst mal nix. Zum "flashen" habe ich Arduino IDE benutzt. Das ist recht einfach und den Download wird wohl jeder mit der Suchmaschine seiner wahl selbst finden. Als "Erweiterung" benötigt man jedoch:

  • ClickButton.h LINK
  • Adafruit_NeoPixel.h LINK

beides zu finden bei GitHUB.  Oder ganz einfach über die Links. Das ganze bindet man dann in Arduino IDE ein und kann dann, wenn man den ESP-32 mit dem Computer über ein Kabel verbunden hat, einfach programmieren.

Hier mal ein bisschen erklärung zum Sketch:

const long intervalwbl = 80;          //Blinkzeit Warnblinklicht, hiermit kann die Blinkzeit des Warnblinklichtes in Millisekunden eingestellt werden,
const long intervalbli = 100;         //Blinkzeit Blinker
long TimeFL = 50;                     //Blitzzeit Blaulicht
long TimeRB = 5;                      //Timer Rainbow, je kürzer die Zeit, umso schneller dreht sich der Regenbogen

Mehr muss man eigentlich nicht sagen. Außer, dass ihr den kompletten Sketch weiter unten findet.

5. Stromversorgung

Also, wer es quick & dirty mag, nimmt einfach eine Powerbank und ist fertig. ACHTUNG! Man benötigt eine Powerbank die sich nicht automatisch abschaltet (Auto Power Off), dass sind allerdings die wenigstens. Dann geht die ganze Geschichte zwar an, aber nach einem Abschalten länger als 30sek. nicht wieder an.

Meine Gedanken bei der Stromversorgung:

  • Kommt ins Bobby Car
  • Kann über ein Kabel von außen geladen werden
  • Preiswert
  • Komponenten austauschbar
  • Programmieren muss weiterhin möglich sein --> Stromversorgung am ESP über USB Port.

So, klingt kompliziert, ist es aber nicht. Wir brauchen zwei kleine Platinen, einen Schlüsselschalter, ein paar Litzen und USB Kabel und natürlich eine Spannungsquelle. Die erste kleine Platine ist ein Li.-Ion Akku Lader. Da gibts für ein paar € welche, die über einen USB Eingang einen Akku aufladen und ein Gerät betreiben können. Gleichzeitig. Und das ganze unterbrechnungsfrei wenn man das Ladekabel abzieht. Die zweite Platine nennt sich Step Up Wandler und macht aus 3,6V, 5V. Wozu braucht man das jetzt ?? Der ESP arbeitet mit 3,3V und kann mit 3,3-5V betrieben werden. Somit wären die 3,6V die aus der Ladeplatine kommen ja ausreichend. Leider brauchen die LED´s aber 4-4,2V, somit läuft zwar der ESP, die LED´s bleiben aber aus. Hier hilft der Step-Up Wandler. Der macht aus 3,6, 5V. Kostet auch nur ein paar €. Damit das ganze von außen zu laden ist, brauchen wir eigentlich nur ein USB Kabel. Am besten wäre, ein Kabel mit 1m Länge und USB auf Micro USB. Das schneiden wir einfach 15cm vor dem Micro USB Stecker durch und haben dann alles, was wir brauchen. Den Teil mit dem USB Stecker führen wir durch das Gehäuse vom Auto und verlöten es am Eingang des Li-Ion Chargers. Das Stück mit dem Micro USB Stecker kommt an den Ausgang vom Step-Up Wandler. Dann verbinden wir noch den Akku und Step Up Wandler mit der Ladeplatine und bauen das ganze ins Auto ein.

Das war der Ursprüngliche Ansatz. Leider ging das nicht. Der ESP ist stürzt sehr schnell ab wenn die Spannungsversorgung nicht stimmt. Heißt, die Li-Ion Zelle war zu klein Dimensioniert und die Elektronik zur Spannungsversorgung unterdimensioniert.  Daher habe ich dann alles nochmal gekauft und eine Platine gefunden, die mehr oder weniger eine Powerbank ist, aber sich nicht abschaltet. Das ganze wird mit einer 18650 Zelle betrieben und funktioniert soweit einwandfrei. So wie gedacht. Man kann also einfach ein USB Kabel zum laden anbringen, mit einem USB Kabel den ESP anschließen und dann ist man fertig. Wer wissen will welche Platine ich genutzt habe schreibt mich bitte an, ich mache nur ungern unbezahlte Werbung.

 

 

Wie kommt das ganze ins Auto ?

So, nachdem der Microcontroller programmiert, die Kabel angelötet, der Sketch aufgespielt und alles einmal getestet wurde, muss das alles nun ins Auto. Bis hier hin habe ich übrigens immer eine Powerbank als Energieversorgung genutzt. Ab hier kommt dann die selbst gebaute Energieversorgung in spiel.

Irgendwie müssen löcher ins Gehäuse. Und da man sowas ja nur einmal machen kann, ohne einen Schweizer Käse zu produzieren, kleben wir erst mal die Stellen ab, wo wir Bohren möchten. Dann kann man da in aller Ruhe drauf rummalen, evtl. noch mal eine Nacht drüber schlafen..... Für die Taster muss jeder mal selbst gucken was er da an Bohrern braucht, bei mir waren es Ø8,7mm. Für die Kabeldurchführungen der LED´s habe ich einfach Ø5mm gebohrt, dann passt der Stecker durch und das Kabel hat leicht spiel. NACHDEM man geschaut hat, ob die LED´s richtig ausgerichtet sind (Stichwort Blinkreihenfolge) habe ich die LED´s mit Silikon angeklebt. Das Gehäuse ist zwar aus PE-HD und angeblich hällt Silikon da nicht drauf, aber für diese Zwecke wird es reichen. Sollten die doch mal abreißen, helfen dann entsprechend kleine Schrauben. Die Platine habe ich ebenfalls mit Silikon einfach im Auto angeklebt.

Der Sketch

#include "ClickButton.h"
#include <Adafruit_NeoPixel.h>

#define PIN_Strip_a 16 //Strip Vorne Links
#define PIN_Strip_b 17 //Strip Vorne Rechts
#define PIN_Strip_c 19 //Strip Hinten Links
#define PIN_Strip_d 18 //Strip Hinten Rechts
#define NUMPIXEL_a 7
#define NUMPIXEL_b 7
#define NUMPIXEL_c 7
#define NUMPIXEL_d 7

unsigned long previousMillis = 0;
const int buttonPin1 = 26; //Lichthupe
const int buttonPin2 = 25; //Blinker Links
const int buttonPin3 = 33; //Blinker Rechts
const int buttonPin4 = 32; //Warnblinklicht
const long intervalwbl = 80; //Blinkzeit Warnblinklicht
const long intervalbli = 100; //Blinkzeit Blinker
long TimeFL = 50; //Blitzzeit Blaulicht
long TimeRB = 5; //Timer Rainbow
int ledState = LOW;
int wblState = LOW; //Warnblinklicht Zähler
int blState = LOW; //Blaulicht Zähler
int rbState = LOW; //Rainbow Zähler
unsigned long ZaehlerBL = 0;
unsigned long ZaehlerWBL = 0;

ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP); //Licht/Lichthupe
ClickButton button2(buttonPin2, LOW, CLICKBTN_PULLUP); //Blinker Links
ClickButton button3(buttonPin3, LOW, CLICKBTN_PULLUP); //Blinker Rechts
ClickButton button4(buttonPin4, LOW, CLICKBTN_PULLUP); //Warnblinklicht

Adafruit_NeoPixel strip_a = Adafruit_NeoPixel(NUMPIXEL_a, PIN_Strip_a, NEO_GRBW + NEO_KHZ800);
Adafruit_NeoPixel strip_b = Adafruit_NeoPixel(NUMPIXEL_b, PIN_Strip_b, NEO_GRBW + NEO_KHZ800);
Adafruit_NeoPixel strip_c = Adafruit_NeoPixel(NUMPIXEL_c, PIN_Strip_c, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip_d = Adafruit_NeoPixel(NUMPIXEL_d, PIN_Strip_d, NEO_GRB + NEO_KHZ800);

//Farben Strips Vorne
uint32_t blue_a = strip_a.Color(0, 0, 255, 0 );
uint32_t orange_a = strip_a.Color(255, 120, 0, 0);
uint32_t white_a = strip_a.Color(0, 0, 0, 255);
uint32_t off_a = strip_a.Color(0, 0, 0, 0);

uint32_t blue_b = strip_b.Color(0, 0, 255, 0 );
uint32_t orange_b = strip_b.Color(255, 120, 0, 0);
uint32_t white_b = strip_b.Color(0, 0, 0, 255);
uint32_t off_b = strip_b.Color(0, 0, 0, 0);

//Farben Strip Hinten
uint32_t blue_c = strip_c.Color(0, 0, 255);
uint32_t red_c = strip_c.Color(255, 0, 0);
uint32_t orange_c = strip_c.Color(255, 120, 0);
uint32_t off_c = strip_c.Color(0, 0, 0);

uint32_t blue_d = strip_d.Color(0, 0, 255);
uint32_t red_d = strip_d.Color(255, 0, 0);
uint32_t orange_d = strip_d.Color(255, 120, 0);
uint32_t off_d = strip_d.Color(0, 0, 0);

void setup()
{

Serial.begin(9600);
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(buttonPin3, INPUT_PULLUP);
pinMode(buttonPin4, INPUT_PULLUP);
strip_a.begin();
strip_b.begin();
strip_c.begin();
strip_d.begin();
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
button1.debounceTime = 100; // Debounce timer in ms
button1.multiclickTime = 250; // Time limit for multi clicks
button1.longClickTime = 2000; // time until "held-down clicks" register
button2.debounceTime = 100; // Debounce timer in ms
button2.multiclickTime = 250; // Time limit for multi clicks
button2.longClickTime = 2000; // time until "held-down clicks" register
button3.debounceTime = 100; // Debounce timer in ms
button3.multiclickTime = 250; // Time limit for multi clicks
button3.longClickTime = 2000; // time until "held-down clicks" register
button4.debounceTime = 100; // Debounce timer in ms
button4.multiclickTime = 250; // Time limit for multi clicks
button4.longClickTime = 2000; // time until "held-down clicks" register
Licht();
}

void loop() {
unsigned long currentMillis = millis();

button1.Update();
if (button1.clicks == 1) {
Serial.println("Taster 1 - 1 mal gedrückt");
Lichthupe();
}
else if (button1.clicks == 2 ) {
Serial.println("Taster 1 - 2 mal gedrückt");
Licht();
}
else if (button1.clicks == 3 ) {
Serial.println("Taster 1 - 3 mal gedrückt");
if (rbState == LOW) {
blState = LOW;
wblState = LOW;
rbState = HIGH;
}
else {
rbState = LOW;
Licht();
}
}

button2.Update();
if (button2.clicks == 1) {
Serial.println("Taster 2 - 1 mal gedrückt");
Licht();
delay(50);
Blinker_Links();
Blinker_Links();
Blinker_Links();
Licht();
}
else if (button2.clicks == 2 ) {
Serial.println("Taster 2 - 2 mal gedrückt");
Licht();
}

button3.Update();
if (button3.clicks == 1) {
Serial.println("Taster 3 - 1 mal gedrückt");
Licht();
delay(50);
Blinker_Rechts();
Blinker_Rechts();
Blinker_Rechts();
Licht();
}
else if (button3.clicks == 2 ) {
Serial.println("Taster 3 - 2 mal gedrückt");
Licht();
}

button4.Update();
if (button4.clicks == 1) {
Serial.println("Taster 4 - 1 mal gedrückt");
if (wblState == LOW) {
blState = LOW;
wblState = HIGH;
}
else {
wblState = LOW;
Licht();
}
}

else if (button4.clicks == 2 ) {
Serial.println("Taster 4 - 2 mal gedrückt");
if (blState == LOW) {
wblState = LOW;
blState = HIGH;
}
else {
blState = LOW;
ZaehlerBL = 0;
Licht();
}

}

//WARNBLINKLICHT
if ((currentMillis - previousMillis >= intervalwbl) && (wblState == HIGH)) {
previousMillis = currentMillis;
strip_a.setBrightness(180);
strip_b.setBrightness(180);
strip_c.setBrightness(180);
strip_d.setBrightness(180);

if (ZaehlerWBL == 0) //Oben AN
{
strip_a.fill(orange_a, 0, 3);
strip_a.fill(orange_a, 6, 1);
strip_b.fill(orange_b, 0, 3);
strip_b.fill(orange_b, 6, 1);
strip_c.fill(orange_c, 0, 3);
strip_c.fill(orange_c, 6, 1);
strip_d.fill(orange_d, 0, 3);
strip_d.fill(orange_d, 6, 1);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 1) //Oben AUS
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 2) //Oben AN
{
strip_a.fill(orange_a, 0, 3);
strip_a.fill(orange_a, 6, 1);
strip_b.fill(orange_b, 0, 3);
strip_b.fill(orange_b, 6, 1);
strip_c.fill(orange_c, 0, 3);
strip_c.fill(orange_c, 6, 1);
strip_d.fill(orange_d, 0, 3);
strip_d.fill(orange_d, 6, 1);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 3) //Oben AUS
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 4) //Oben AN
{
strip_a.fill(orange_a, 0, 3);
strip_a.fill(orange_a, 6, 1);
strip_b.fill(orange_b, 0, 3);
strip_b.fill(orange_b, 6, 1);
strip_c.fill(orange_c, 0, 3);
strip_c.fill(orange_c, 6, 1);
strip_d.fill(orange_d, 0, 3);
strip_d.fill(orange_d, 6, 1);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 5) //Oben AUS
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 6) //Unten AN
{
strip_a.fill(orange_a, 3, 3);
strip_b.fill(orange_b, 3, 3);
strip_c.fill(orange_c, 3, 3);
strip_d.fill(orange_d, 3, 3);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 7) //Unten AUS
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 8) //Unten AN
{
strip_a.fill(orange_a, 3, 3);
strip_b.fill(orange_b, 3, 3);
strip_c.fill(orange_c, 3, 3);
strip_d.fill(orange_d, 3, 3);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 9) //Unten AUS
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 10) //Unten AN
{
strip_a.fill(orange_a, 3, 3);
strip_b.fill(orange_b, 3, 3);
strip_c.fill(orange_c, 3, 3);
strip_d.fill(orange_d, 3, 3);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL++;
}
else if (ZaehlerWBL == 11) //Unten AUS
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerWBL = 0;
}
}

//Blaulicht
if ((currentMillis - previousMillis >= TimeFL) && (blState == HIGH)) {
previousMillis = currentMillis;
strip_a.setBrightness(180);
strip_b.setBrightness(180);
strip_c.setBrightness(180);
strip_d.setBrightness(180);
if (ZaehlerBL == 0)
{
strip_a.fill(blue_a, 0, 3); //A oben
strip_a.fill(blue_a, 6, 1); //A oben
strip_d.fill(blue_d, 0, 3); //D oben
strip_d.fill(blue_d, 6, 1); //D oben
strip_b.fill(blue_b, 3, 3); //B unten
strip_c.fill(blue_c, 3, 3); //B unten
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 1)
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 2)
{
strip_a.fill(blue_a, 0, 3); //A oben
strip_a.fill(blue_a, 6, 1); //A oben
strip_d.fill(blue_d, 0, 3); //D oben
strip_d.fill(blue_d, 6, 1); //D oben
strip_b.fill(blue_b, 3, 3); //B unten
strip_c.fill(blue_c, 3, 3); //B unten
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 3)
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 4)
{
strip_a.fill(blue_a, 0, 3); //A oben
strip_a.fill(blue_a, 6, 1); //A oben
strip_d.fill(blue_d, 0, 3); //D oben
strip_d.fill(blue_d, 6, 1); //D oben
strip_b.fill(blue_b, 3, 3); //B unten
strip_c.fill(blue_c, 3, 3); //B unten
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 5)
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 6)
{
strip_a.fill(blue_a, 3, 3); //A unten
strip_d.fill(blue_d, 3, 3); //D unten
strip_b.fill(blue_b, 0, 3); //B Oben
strip_b.fill(blue_d, 6, 1); //B Oben
strip_c.fill(blue_c, 0, 3); //D Oben
strip_c.fill(blue_c, 6, 1); //D Oben
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 7)
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 8) //Unten AN
{
strip_a.fill(blue_a, 3, 3); //A unten
strip_d.fill(blue_d, 3, 3); //D unten
strip_b.fill(blue_b, 0, 3); //B Oben
strip_b.fill(blue_d, 6, 1); //B Oben
strip_c.fill(blue_c, 0, 3); //D Oben
strip_c.fill(blue_c, 6, 1); //D Oben
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 9) //Unten AUS
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 10) //Unten AN
{
strip_a.fill(blue_a, 3, 3); //A unten
strip_d.fill(blue_d, 3, 3); //D unten
strip_b.fill(blue_b, 0, 3); //B Oben
strip_b.fill(blue_d, 6, 1); //B Oben
strip_c.fill(blue_c, 0, 3); //D Oben
strip_c.fill(blue_c, 6, 1); //D Oben
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL++;
}
else if (ZaehlerBL == 11) //Unten AUS
{
strip_a.fill(off_a, 0, 7);
strip_b.fill(off_b, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_d.fill(off_d, 0, 7);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
ZaehlerBL = 0;
}
}

//Rainbow
if ((currentMillis - previousMillis >= TimeFL) && (rbState == HIGH)) {
previousMillis = currentMillis;
strip_a.setBrightness(180);
strip_b.setBrightness(180);
strip_c.setBrightness(180);
strip_d.setBrightness(180);

for (long firstPixelHue = 0; firstPixelHue < 50 * 65536; firstPixelHue += 256) {
for (int i = 0; i < strip_a.numPixels(); i++) { // For each pixel in strip...
// Offset pixel hue by an amount to make one full revolution of the
// color wheel (range of 65536) along the length of the strip
// (strip.numPixels() steps):

int pixelHue = firstPixelHue + (i * 65536L / strip_a.numPixels());
strip_a.setPixelColor(i, strip_a.gamma32(strip_a.ColorHSV(pixelHue)));
strip_b.setPixelColor(i, strip_b.gamma32(strip_b.ColorHSV(pixelHue)));
strip_c.setPixelColor(i, strip_c.gamma32(strip_c.ColorHSV(pixelHue)));
strip_d.setPixelColor(i, strip_d.gamma32(strip_d.ColorHSV(pixelHue)));

}
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
}
}
// --- ENDE ---
}

//-----------Funktionen-----------

void Blinker_Rechts() {
strip_b.fill(off_a, 0, 7);
strip_d.fill(off_c, 0, 7);
strip_b.show();
strip_d.show();
delay(intervalbli);
strip_b.setBrightness(100);
strip_d.setBrightness(100);
strip_b.fill(orange_b, 0, 1);
strip_d.fill(orange_d, 0, 1);
strip_b.show();
strip_d.show();
delay(intervalbli);
strip_b.fill(orange_b, 1, 1);
strip_d.fill(orange_d, 1, 1);
strip_b.show();
strip_d.show();
delay(intervalbli);
strip_b.fill(orange_b, 6, 1);
strip_d.fill(orange_d, 2, 1);
strip_b.show();
strip_d.show();
delay(intervalbli);
strip_b.fill(orange_b, 5, 1);
strip_d.fill(orange_d, 3, 1);
strip_b.show();
strip_d.show();
delay(intervalbli);
strip_b.fill(orange_b, 4, 1);
strip_d.fill(orange_d, 4, 1);
strip_b.show();
strip_d.show();
delay(intervalbli);
strip_b.fill(orange_b, 3, 1);
strip_d.fill(orange_d, 5, 1);
strip_b.show();
strip_d.show();
delay(intervalbli);
strip_b.fill(orange_b, 2, 1);
strip_d.fill(orange_d, 6, 1);
strip_b.show();
strip_d.show();
delay(intervalbli);
}

void Blinker_Links() {
strip_a.fill(off_a, 0, 7);
strip_c.fill(off_c, 0, 7);
strip_a.show();
strip_c.show();
strip_a.setBrightness(100);
strip_c.setBrightness(100);
delay(intervalbli);
strip_a.fill(orange_a, 0, 1);
strip_c.fill(orange_c, 0, 1);
strip_a.show();
strip_c.show();
delay(intervalbli);
strip_a.fill(orange_a, 1, 1);
strip_c.fill(orange_c, 1, 1);
strip_a.show();
strip_c.show();
delay(intervalbli);
strip_a.fill(orange_a, 2, 1);
strip_c.fill(orange_c, 6, 1);
strip_a.show();
strip_c.show();
delay(intervalbli);
strip_a.fill(orange_a, 3, 1);
strip_c.fill(orange_c, 5, 1);
strip_a.show();
strip_c.show();
delay(intervalbli);
strip_a.fill(orange_a, 4, 1);
strip_c.fill(orange_c, 4, 1);
strip_a.show();
strip_c.show();
delay(intervalbli);
strip_a.fill(orange_a, 5, 1);
strip_c.fill(orange_c, 3, 1);
strip_a.show();
strip_c.show();
delay(intervalbli);
strip_a.fill(orange_a, 6, 1);
strip_c.fill(orange_c, 2, 1);
strip_a.show();
strip_c.show();
delay(intervalbli);
}

void Licht() {
strip_a.fill(white_a, 0, 7);
strip_a.setBrightness(20);
strip_b.fill(white_b, 0, 7);
strip_b.setBrightness(20);
strip_c.fill(red_c, 0, 7);
strip_c.setBrightness(20);
strip_d.fill(red_d, 0, 7);
strip_d.setBrightness(20);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();

}

void Lichthupe() {
strip_a.fill(white_a, 0, 7);
strip_a.setBrightness(255);
strip_b.fill(white_b, 0, 7);
strip_b.setBrightness(255);
strip_c.fill(red_c, 0, 7);
strip_c.setBrightness(20);
strip_d.fill(red_d, 0, 7);
strip_d.setBrightness(20);
strip_a.show();
strip_b.show();
strip_c.show();
strip_d.show();
delay(150);
strip_a.setBrightness(20);
strip_b.setBrightness(20);
strip_a.show();
strip_b.show();
delay(150);
strip_a.setBrightness(255);
strip_b.setBrightness(255);
strip_a.show();
strip_b.show();
delay(450);
Licht();
}

Wer bis hier gescrollt hat: Das ganze nochmal zusammengebaut