
Projekt 1 – Weihnachten bis zum Äußersten
Der Dezember ist da und zur vorweihnachtlichen Stimmung gehört natürlich ein festlich illuminierter Garten. Nun sind die Geschmäcker bekanntlich verschieden und so mag der eine eher eine besinnliche Variante, der andere möchte bei Farbwahl und Helligkeit eher Richtung „Weihnachtsmarkt-Disko“ tendieren. Die Beleuchtung sollte also variabel ansteuerbar sein und das am besten direkt vom Smartphone.
Individuelles Licht -> NeoPixel
Ein kleiner kostengünstiger Webserver? Ein Fall für den ESP32!
Idee und Komponenten
Das System besteht aus einer Lichterkette und einer Steuereinheit. Die Helligkeit und Farbe jedes einzelnen LED-Elements ist individuell programmatisch ansteuerbar, um sowohl kontinuierliche Beleuchtung in dunklem, warmen Licht, als auch knallige Leuchteffekte zu ermöglichen. Hier bieten sich NeoPixel an, die es auf den einschlägigen Plattformen als meterlange Leuchtbänder auch in IP67 Ausführung für den Outdoorbetrieb für kleines Geld gibt.
Als Controller verwende ich einen ESP32, da dieser neben dem Steuerausgang von Haus aus auch WLAN mitbringt. Die ESP-DEV kit 4 Board gibt es für unter 10 Euro und sie bringen, wie wir später sehen werden, noch einen weiteren Vorteil gegenüber einer Lösung auf Arduino-Basis.
Realisierung der Hardware
Die Schaltung ist extrem simple. Der Aufbau ist nicht für die Ewigkeit bestimmt, insofern dient eine einfache Lochrasterplatine als Basis. Darauf werden zwei Buchsenleisten zur Aufnahme des ESP32 verlötet, die Verbindungen werden mit versilbertem Kupferdraht erstellt. Ich empfehle, den ESP32 nie direkt in Platinen zu verlöten. Der gesteckte Controller ist schnell getauscht. Entlöten eines defekten Microcontrollerboards mit 40 Pins ist nahezu unmöglich.

Zu den NeoPixel LED-Streifen findet man reichlich Beschreibungen im Netz. Die NeoPixel sind für erste Programmierspielereien mit dem Arduino oder Raspberry sehr zu empfehlen, weil sofort witzige Resultate zu sehen sind. Jedes einzelne Neopixel-Element verfügt über einen kleinen Microkontroller, der drei LEDs (rot/grün/blau) ansteuert.
Hier mehr dazu: WS2812 „NeoPixel“

Die tolle Idee dabei: Jedes Element hat neben den Vcc und GND Anschlüssen einen Ein- und einen Ausgang. Somit lassen sich diese Elemente auf sehr einfache Weise aneinander reihen und mit nur einem PIN des Microcontrollers ansteuern. Klasse für Leuchtbänder, aber auch für große, helle Displays. Im Falle dieser Weihnachtsbeleuchtung werden 500 NeoPixel angesteuert.
Im Video ein erster Test:
Auf den Strom achten! Da der Controller und die Neopixel mit dem selben Netzteil betrieben werden, könnte der Controller abstürzen, sollte die Versorgungsspannung absinken. Werden alle Pixel gleichzeitig maximal angesteuert benötigt das System fast 8A. Passende Netzteile (in kostengünstig) gibt es ebenfalls bei den bekannten Quellen in Fernost. Um die ärgsten Stromspitzen abzufangen habe ich einen 1000µF Elko parallel an den Spannungsanschluss des LED-Streifens angeschlossen. Und das Oszi sprach: es war gut.
Das ESP32-DEV Board hat auch einen 5V-Eingang. Ein Spannungsregler auf dem Board erzeugt daraus die 3,3V für den Microcontroller. Obwohl die NeoPixel für 5V Steuersignale ausgelegt sind, funktioniert die Schaltung auch mit den 3,3V Signalen des ESP32. Um die NeoPixel insbesondere beim Einschalten zu schützen, wird oft ein Widerstand, z.B. 150 Ohm, zwischen GPIO und Eingang der ersten NeoPixel-LED geschaltet.
Kleines Extra: Temperatursensor
Wenn wir schon einen Microcontroller im Garten betreiben, kann er sich auch nützlich machen. Ich hatte noch Wetterfeste DS18B20 Temperatursensoren. Diese werden über nur einen Pin ausgelesen und akzeptieren sowohl 3,3 als auch 5V. Die Datenleitung wird über 4,7kOhm mit Vcc(Pullup) verbunden. Noch Vcc und GND verbunden und fertig ist die Zusatzfunktion. Der Temperatursensor ist frei zugänglich und kann z.B. auch zur Überprüfung der Glühweintemperatur genutzt werden.

Da das Projekt mal eben, an einem Abend realisiert werden sollte (wurde nachher natürlich doch mehr), musste eine schnelle Gehäuselösung her, die zudem noch wasserdicht ist. Es gab an dem Abend niedersächsisches Hochzeitssuppe und das Glas lachte mich so an… In den Deckel wurde ein Loch gebohrt, die Kabel hindurchgeführt und anschließend alles mit der Heißklebepistole normgerecht wasserdicht verschlossen.

Software
Die Programmierung der NeoPixel gestaltet sich nach Ansicht der Adafruit Beipielprogramme sehr einfach. Für den „Weihnachts-Diskomodus“ wurde weite Teile des Beispielsketches übernommen.
#include <Adafruit_NeoPixel.h>
#define LED_PIN 25
#define LED_COUNT 500
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin(); // Starten
strip.show(); // Alle NeoPixel aus
strip.setBrightness(255); // Helligkeit, max = 255
}
Der Besinnlichkeitsmodus sieht folgendermaßen aus und zeigt gut die Programmierung der Pixel:
void besinnlichmode(){
strip.clear(); // Alle Pixel aus
for (int i=0;i<LED_COUNT;i++){
strip.setPixelColor(i, strip.Color(5, 5, 0));
//das i.te NeoPixel ansteuert rot,grün, blau, je 0-255
}
strip.show();
}
Wie der DS18B20-Temperatursensor zu programmieren ist, erschießt sich ebenfalls sofort aus den verfügbaren Beispielsketches.
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 17
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
sensors.begin();}
void loop() {
//Temperatursensor
float tempc=0.0;
sensors.requestTemperatures(); // Temperaturen anfordern
tempc = sensors.getTempCByIndex(0);
if(tempc != DEVICE_DISCONNECTED_C)
{
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(tempc);
}
else
{
Serial.println("Fehler: keine Temperaturdaten");
}
}
Jetzt wird es spannend: Aus dem ESP32 wird ein WEB-Server aufgesetzt, der Chip logt sich in das vorhandene WLAN ein. Auch dies ist mit kleiner Adaption der vorhandenen Beispielsketches schnell umzusetzen. Der Server stellt eine kleine Website mit Information bzgl. aktuellem Status (Modus=“Besinnlich“ oder Modus=“Krischan“) und der aktuellen Temperatur bereit. Darüber hinaus gibt es einen Button, um den Modus zu wechseln.

Hier der ganze Sketch zum Download:
https://github.com/KrischanForscht/Projekt1-Weihnachtshydrant
Nutzung beider Prozessorkerne
Das funktionierte zwar irgendwie, allerdings war die Bedienung sehr hakelig und immer im „Krischan-Modus“, war der Web-Server lange nicht zu erreichen. Nach einiger Überlegung war klar: Solange die Funktion „Disco“ durchlaufen wurde, gab es keine Abfragen, ob eine neue Anfrage an den Server vorliegt. Erster Lösungsansatz: die Funktion sehr häufig an vielen Stellen in der Funktion „Disco()“ aufrufen. Das hat das Problem aber eher noch verschlimmert. Zweite Lösungs-Idee „mit einer Interrupt Service Routine“ Arbeiten, die in bestimmen Zeitabständen aufgerufen wird (dies wäre meine Lösung auf dem Arduino gewesen). Dies könnte aber dazu führen, dass der Programmablauf bei Übertragungsproblemen länger unterbrochen wird und dann die gar festlichen Lauflichteffekte haken.
Der ESP32 hat ein ganz besonders Feature, dass ich bis dahin noch gar nicht genutzt hatte, er besitzt nämlich zwei Prozessorkerne, die unabhängig voneinander verschiedene Aufgaben ausführen können. Nach kurzer Internet-Recherche fand ich eine recht einfache Möglichkeit, die zwei Kerne auch mit der Arduino IDE einsetzen zu können: https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/.
Und tatsächlich nun läuft die WLAN-Funktionalität auf Kern 2 sehr schön parallel zu der eigentlichen loop() auf Kern 1. Cool.

Das fertige System
Ab in den Garten und den Hydranten geschmückt! Bei uns steht ein (ehemaliger) Überflurhydrant im Garten, er muss bereits als Stehtisch herhalten. Bitte keine „aktiven“ Hydranten dekorieren, es könnte sein, dass diese einmal schnell gebraucht werden.
Und voilaa:

Quelle | Thema |
https://techtutorialsx.com/2017/05/09/esp32-running-code-on-a-specific-core/ | Dual Core ESP32 |
Microcontroller ESP32, Udo Brandes, Rheinwerk 2020 | Webserver |
http://www.netzmafia.de/skripten/hardware/Arduino/Onewire/index.html | D18B20 Temperatursensor |
https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use | NeoPixel |