ESP32-Innenleben für die Nachtlicht-Blume

In der Make-Ausgabe 6/17 haben wir den Bau eines Nachtlichts in Form einer Blume aus dem 3D-Drucker beschrieben. Jetzt bekommt die Blume ein per WLAN fernsteuerbares Innenleben auf Basis des ESP32.

vorlesen Druckansicht 5 Kommentare lesen
Lesezeit: 7 Min.
Von
  • Luca Zimmermann
Inhaltsverzeichnis

Die Make-Ausgabe 6/17 zeigte ab Seite 12, wie man mit einem 3D-Drucker ein Nachtlicht in Form einer Blume baut. Ein Servo sorgte dabei für die Auslenkung der Blütenblätter, zwei NeoPixel-LED-Ringe leuchteten in wählbaren Farben. Gesteuert wurde alles von einem Arduino Nano, bedient wurde die Blume durch Drücken und Drehen mit einem Knopf am Sockel.

Mehr Infos

Kurzinfo

Kosten: ca. 35 Euro für ESP32-Board, Servo und Adafruit-Ring

Löten: einfache Lötarbeiten

Programmieren: Grundkenntnisse Arduino

Material:

  • ESP32 mit WLAN
  • Adafruit NeoPixel Ring
  • Servo, beliebiges Modell
  • diverse Kabel

Über eine selbst in Processing programmierte Smartphone-App, deren Entwicklung ausführlich in der Make-Ausgabe 4/18 beschrieben wird, soll allerdings das Öffnen der Blätter und die Wahl der Farbe bequem vom Sofa aus übers WLAN zu steuern sein. Deshalb verwenden wir für das hier beschriebene alternative Innenleben für die Nachtlicht-Blume als Mikrocontroller einen ESP32, der sich in der Arduino-Entwicklungsumgebung programmieren lässt, aber verglichen mit den Arduino-Boards bei einem günstigen Preis bereits WLAN an Bord hat. Der Einfachheit halber beschränken wir uns im Folgenden allerdings auf einen NeoPixel-Ring und damit nur auf eine Farbe – die Original-Blume kombiniert die Farben zweier Ringe.

Seit kurzem kann der ESP32 genau wie der kleine Bruder ESP8266 nach minimalen Eingriffen im Arduino-Editor auftauchen – eine ausführliche Anleitung dazu lesen Sie in unserem Online-Artikel ESP-Boards mit der Arduino-IDE programmieren.

Der Hardware-Aufbau ist denkbar einfach: Die Signalleitung des Servo wird an Pin 19 angeschlossen, die des LED-Rings an Pin 17. Masse und Spannungsversorgung verdrahtet man mit den üblichen Stellen.

Nebem dem Servo steuert der ESP32 einen Ring aus 16 einzeln ansteuerbaren WS2812-LEDs an, die auch unter dem Markennamen NeoPixel von Adafruit angeboten werden. Durch die anderen Timings des ESP32 ist die Ansteuerung der LEDs mit den bekannten Arduino-Bibliotheken NeoPixel oder FastLED aktuell leider nur eingeschränkt möglich – zwischendurch flackern die LEDs immer mal wieder. Doch sind wir nach langem Suchen auf funktionierenden Beispielcode gestoßen, der direkt in unseren Sketch eingeflossen ist und keine externe Bibliothek benötigt – dazu gleich mehr.

Für den Servo bedarf es ebenfalls einer alternativen Bibliothek. Dabei handelt es sich um eine Weiterentwicklung (genauer: einen Fork) einer bei GitHub vorhandenen, aber leider nicht funktionierenden Bibliothek für den ESP32. Laut den Rückmeldungen eines anderen Bearbeiters der Bibliothek soll unsere Version zwar in die Standard-ESP32-Bibliothek einfließen. Bis dahin muss man jedoch den Import manuell vornehmen. Dazu klickt man auf unserer GitHub-Webseite die grüne Schaltfläche ("Clone or download") und wählt "Download ZIP". In der Arduino-Entwicklungsumgebung klickt man dann auf Sketch/Bibliothek einbinden/.ZIP-Bibliothek hinzufügen... und pickt das heruntergeladene Archiv heraus. Wer mag, kann das Archiv vorher aus ästhetischen Gründen in ESP32Servo umbenennen; GitHub hängt automatisch stets noch ein verzichtbares -master an.

Arduino öffnet zusammen mit der .ino-Datei unseres Sketches (als Zip-Archiv zum Download) eine .h- und .cpp-Datei. Letztere sind die Bibliotheksdateien für die LED-Steuerung. Um direkt loslegen zu können, wählt man im Menü der Arduino-IDE unter Werkzeuge/Boards das ESP32-Dev-Modul und den richtigen seriellen Port aus. Je nach verwendetem Servo müssen die in setup() in der .ino-Datei angegebenen Zeiten angepasst werden. Die meisten kleinen Servos nutzen 1500 µs ± 900 µs, während die größeren Exemplare ± 500 µs nutzen. Ausführliche Informationen zu Servos finden sich etwa in Artikeln aus c't Hacks 1/14 (Gratis-PDF) oder aus Make 3/18 (kostenpflichtig).

Die Parameter ssid, passwort und die IP-Adressen am Anfang des Sketches müssen darüber hinaus noch auf das heimische Netzwerk angepasst werden. Wir haben uns für eine statische IP-Adresse entschieden, da man so immer genau weiß, wie man den ESP ansprechen kann.

Dazu muss man zunächst einmal wissen, in welchem Bereich das eigene Netzwerk arbeitet. Am einfachsten guckt man dafür in die Netzwerkeinstellungen des Computers oder Handys nach. Die Gateway wird meist auch unter Router gelistet und das Subnetz auf deutsch als Teilnetzmaske angezeigt. Für die eigene IP kann man dann eine freie Adresse wählen. Zur Abfrage, welche Adressen schon alle aktiv sind, kann man das Netzwerk vorher mit der kostenlosen App Fing zur Sicherheit abscannen. Ist keine statische Adresse gewünscht, so kann der Block um WiFi.config() auskommentiert werden, dann muss man aber vor Benutzung die IP des ESP etwa mit Fing herausfinden.

Für unsere Schnittstelle analysieren wir die HTTP-Nachricht, die später von der selbst programmierten App, zum Testen aber erst mal von unserem Browser gesendet wird. Ihre Form ist in der Grafik oben dargestellt; der Code sieht wie folgt aus:

if (currentLine.startsWith("GET /")) {
int strpos = currentLine.indexOf("/servo/");
String substr;
if (strpos != -1) {
substr = currentLine.substring(strpos + 7);
servopos = abs(atoi(substr.c_str())) % 181;
myservo.write(servopos);
}
...

Beginnt die Zeile mit GET /, so wird uns mitgeteilt, welche Adresse eingegeben wurde, etwa /servo/90. Diese Adresse kann nun nach den jeweiligen Parametern untersucht und ausgewertet werden.

Zunächst muss überprüft werden, ob sich überhaupt der Text /servo/ in der Adresse befindet. Dies ermittelt indexOf("/servo/") – zurückgegeben wir die Startposition des Suchstrings in der Zeichenkette oder -1, sofern nichts gefunden wurde. Um die auf /servo/ folgende Zahl zu extrahieren, beschneiden wir mit substring() unsere Zeichenkette auf alles vor dem Ende unseres Suchbegriffs. Als Parameter muss dabei die Position nach dem Suchbegriff benutzt werden, die sich aus Startposition (strpos) + Länge des Suchbegriffs (7) ergibt.

Die Funktion atoi() kann Zahlen in einem String in Integer-Werte wandeln und bricht automatisch ab, wenn nicht-numerische Zeichen gefunden werden. Nach Bildung des Absolutwertes zur Vermeidung von negativen Zahlen wird noch eine Modulo-Operation mit 181 angewandt, um den Zahlenbereich für den Servo auf Werte zwischen 0 und 180 Grad zu beschränken.

Auswertungen nach diesem Strickmuster wenden wir ebenfalls auf alle weiteren Parameter an, die die Farben codieren. Mit einer einfachen Zeile der folgenden Form, in die Adresszeile des Browsers getippt:

http://<IP-adresse>/servo/110/red/50/green/10/blue/50

stellen wir den Servo auf 110 Grad und die Farbe auf einen leichten Lilaton. Zur Überprüfung sehen wir als Rückgabe sowohl im seriellen Monitor in der Arduino-IDE als auch im Browser die gerade übertragenen und jetzt eingestellten Werte.

  • Wie man sich jetzt in Processing die passende schicke App selbst programmiert, über die man den Servo bequem mit Tasten steuert und die Wunschfarbe wählt, indem man auf ein beliebiges Bild tippt, lesen Sie in der Make-Ausgabe 4/18.

(pek)