2018
|
Ergänzung zum Buch Messen Steuern Regeln mit Smartphone und Tablet
WLAN Rheinturmuhr mit 40 Zeilen ESP8266BASIC
NeoPixel/WS2812-Uhr: Ansteuerung und Synchonisation auf die bequeme Art
|
Abbildung (Foto): Testlauf der Neopixel-Demo damals noch mit Windowstablet und C/C++ Programmierung des Mini-Pro. |
Das Projekt "Rheinturmuhr mit Arduino und RGB-LED" benutzte einen Arduino-Mini-Pro und ein Bluetooth-Modul zur Synchronisation. Mit Hilfe des ESP8266 und dem im Buch benutzen ESPBasic reduziert sich der Aufwand dramatisch.
Für eine Hand voll Dollar - etwas über 10 Euro - bekommt man 60 LED pro Meter. Dabei besteht jede Leuchte aus drei LED mit den Farben Rot/Grün/Blau, sowie einem eigenen Mikrocontroller WS2812...
Details zu Prinzip und Stromaufnahme ist bei der Arduino-Variante niedergeschrieben.
Die Besonderheiten dieser hier beschriebenen Lösung mit dem ESP8266F seien hier kurz aufgezählt:
- Kein Arduino und keine Arduino-IDE erforderlich
- Keine Programmierung in C/C++
- Eingebaute Synchronisation über das Internet ohne eigenes Zutun
- Programm änderbar über WiFi und in jedem Browser
Zum Nachbau dieser Uhr kann nach folgenden Schritten verfahren werden:
- Kauf eines ESP8266 Witty Cloud, oder so
- Download des Basics zur Übertragung der 2MB-Version von Windows aus
- Weiter verfahren wie in Kapitel 1.1 im Buch beschrieben
- LED-Streifen vorbereiten und anschließen
- Unten angegebenes Programm eingeben, speichern und starten
Wenn das erste "Hallo Welt" geklappt hat, kann das Programm "Rheinturmuhr" eingegeben und gespeichert werden.
Der WS2812/NeoPixel-Streifen wird wie im Arduino-Beitrag vorbereitet, dann die Masseleitung an GND und die Datenleitung des Steifens an GPI00 (3. Pin über GND) des Boards. NICHT Vcc vom Witty Clous an Vcc der LED verbinden, sondern externe Spannungsquelle (z.B. 5V-USB-Powerbank) verwenden.
|
Rheinturmuhr in ESP-BASIC einfach, übersichtlich und preiswert
|
ESP8266Basic in der 2MB-Version enthält alle wesentlichen Bibliotheken der in Arduino-Kreisen oft verwendeten Harware-Bausteine. So auch die NeopPixel-Bibliothek, die in diesem Beispiel benutzt werden soll. Mit ganzen 6 Routinen wird der Farbstreifen unterstützt. Hier werden nur die Befehle neo.setup, neo, neo.cls und neo.stripcolor benötigt.
Das Listing ist erfreulich kurz, wenn man bedenkt, dass die komplette Steuerung für die sogenannte Dezimaluhr darin enthalten ist.
Es wurde die Timer-Variante gewählt. Dabei wird ein "Branch" im Timerintervall - 1000 ms - aufgerufen. Hier ist dies die "uhr". Davor erfolgt die Initialisierung duch Festlegung des benutzten Data-Pins (neo.setup), löschen aller LED mit neo.cls und schließlich das diskrete Einschalten der roten Markierungen zwischen den verschiedenen LED-Abschnitten. Es gibt ja jeweils 9, 5, 9, 5, 9, 2 LED-Abschnitte für Sekunden, Minuten und Stunden in Dezimalschreibweise. Die erste Anweisung sorgt dafür, dass der ESP sowohl als eigener AP als auch als Station erreichbar ist. Dazu weiter unten mehr.
In der Timer-Routine [uhr] erfolgt die Zeitabfrage in t$ in der Form "hh:mm:ss". Mit dem Wert in s0 werden die Einerstellen der Sekunden gesteuert. Mit den Basic Funktionen Val und Mid erhält man den numerischen Wert der 8. Stelle der Zeichenkette. Mit neo.stripcolor(anfang,ende,r,g,b) werden ganze Bereiche von LED mit den angegebenen RGB-Werten geschaltet. Da das Witty Cloud Modul auch über einen LDR verfügt, wird mit io(ai) die Helligkeit i der Anzeige berücksichtigt. Das kleine o legt die Helligkeit für "aus" fest - nicht zu verwechseln mit einer 0. Wenn die Variable s0 eine "0" enthalt, sind 10 Sekunden vergangen und die 9 unteren LED werden "aus" geschaltet. Jetzt folgen auch alle anderen Aktualisierungen, die im Prinzip genau so funktionieren, nur mit anderen Variablen und LED-Nummern.
Am Ende folgt noch der Lichterwechsel der LED an der Turmspitze - hier in grün - ein Wechselblinken im Sekundentakt.
|
'NEOPIXEL Rheinturmuhr in ESP8266Basic: by hjberndt.de
'wifiapsta
Neo.setup(0)
Neo.cls()
Neo(00,20,00,00)
Neo(10,20,00,00)
Neo(16,20,10,00)
Neo(26,20,10,00)
Neo(32,20,00,00)
Neo(42,20,00,00)
print "RTC WS PIN 0"
timer 1000,[uhr]
Wait
[uhr]
i = io(ai)/15+5
o = 1
t$ = time("hour:min:sec")
'Print t$
s0 = val(mid(t$,8,1))
if s0 = 0 then
neo.stripcolor(1,9,0,0,o)
s1 = val(mid(t$,7,1))
neo.stripcolor(11,10+s1,i,i,i)
if s1 = 0 then neo.stripcolor(11,10+5,0,0,o)
m0 = val(mid(t$,5,1))
neo.stripcolor(17,16+m0,i,i,i)
if m0 = 0 then neo.stripcolor(17,16+9,0,0,o)
m1 = val(mid(t$,4,1))
neo.stripcolor(27,26+m1,i,i,i)
if m1 = 0 then neo.stripcolor(27,26+5,0,0,o)
h0 = val(mid(t$,2,1))
neo.stripcolor(33,32+h0,i,i,i)
if h0 = 0 then neo.stripcolor(33,32+9,0,0,o)
h1 = val(mid(t$,1,1))
neo.stripcolor(43,42+h1,i,i,i)
if h1 = 0 then neo.stripcolor(43,42+2,0,0,o)
endif
neo.stripcolor(1,s0,i,i,i)
b = s0 and 1
Neo(45,0,b*20,00)
Neo(46,0,(1-b)*20,00)
Memclear
Wait
|
Synchronisierung Die richtige Uhrzeit
|
Basic startet wie folgt nach Reset:
- Versucht ca. 10 Sekunden eine Verbindung mit einem im Setup gespeicherten Access Point (Router)
- Bei Misserfolg, Start des eigenen AP mit Namen "ESP..."
- Nach 30 Sekunden Start des als "\default.bas" abgelegten Programms, falls so im Setup eingestellt (Haken).
Die Uhr des Witty-Cloud steht auf "00:00:00". Das bedeutet, dass ohne Internetanbindung keine Änderung eintritt und die Uhr dunkel bleibt- von den Positionsleuchten abgesehen.
Ist z.B. eine FritzBox mit Zugangspasswort eingetragen und das Hinzufügen von Geräten erlaubt, verbindet sich der ESP damit und ist unter 192.168.178.xxx erreichbar. Dann gestaltet sich ein erster Start wie folgt:
Der ESP wird mit Spannung versorgt und startet das Basic-System, welches nun die Verbindung mit dem Router herstellt - Die blaue LED leuchtet kurz auf. Nach weiteren 30 Sekunden startet das obige Listing, wenn es als "default.bas" abgespeichert wurde und der Autostart im Setup vom ESPBasic abgehakt ist. Die Positionsleuchten gehen an. Basic versucht nun selber die Zeit ein zu stellen (TimeLib). Nach einer Weile - oder auch sofort - laufen die unteren Sekunden los. Nach der 0ten Sekunde erscheint die komplette Uhrzeit in der Rheinturmuhr üblichen Dezimalform. Bleibt die Uhr stationär, kann auf den eigenen AP verzichtet werden und die Uhr sollte immer genau gehen, solange das Internet ab und zu die Zeit liefern kann.
War bei der Arduino-Lösung die Zeit-Synchronisation ein Problem, so entfällt sie hier ganz - fast ganz. Die Zeitsynchronisation ist im Basic enthalten, setzt aber eine Internetverbindung voraus, darum ist dies in erster Linie keine Off-Grid-Lösung.
Anmerkung: Für den mobilen Einsatz kann die Uhr auch mit einem Smartphone und gelegentlichem Tethering synchronisiert werden. Neuere Smartphones erlauben Wlan und Hotspot gleichzeitig. Zwischendurch läuft die Uhr mit geringer Gangungenauigkeit allein weiter bis der Hotspot wieder aktiviert ist, der ESP sich nach einer Weile wieder verbindet und die Internetzeit holt.
|
Erweiterung
Pips und Flash
|
Inzwischen läuft der Rheinturmuhrstreifen sehr gut und ohne Abweichung in Verbindung mit einer stationären Fritzbox, könnte jedoch jederzeit via WiFi einem anderen Router zugeordnet werden, notfalls mit dem AP des ESP selber. Sollte das System einmal neu starten müssen, so stellt sich die Uhr automatisch wieder über das Internet.
Die Ganggenauigkeit von Uhren konnte und kann bei FM/UKW-Sendern, die nicht über Umwege/Digitalisierung verzögert sind, beobachtet werden. Bereits die GPS-Variante verfügte über Pips über einen Piezo-Beeper. Die WLAN-Uhr mit dm Witty-Cloud-ESP kann wie folgt erweitert werden:
- fünf Sekunden vor der vollen Stunde blinken die oberen RGB-LED des Streifens hell
- fünf Sekunden vor der vollen Stunde gibt es Pips.
- zur vollen Stunde gibt es einen langen Pip
- zur halben Stunde gibt es einen kurzen Pip
Die Pips werden über PWM realisiert. Da ESPBasic die PWM-Frequenz einstellen kann, wird diese auf 1000 Hz gestellt. Bei Quasi-Analogausgaben über Puls-Breiten-Modulation (PWM) entsteht bei einem Ausgabewert von 127 ein symmetrisches Rechtecksignal mit einem Mittelwert der halben Amplitude. Wird ein Piezo-Beeper an GPIO 15 angeschlossen, so kann man dieses Signal hören. Das Signal bleibt erhalten, auch wenn das Programm weiter läuft. Mit dieser Methode wird am Witty Cloud Pin 15 per PWM angesteuert und damit gleichzeitig die dort angeschlossene interne rote LED mit halber Spannung versorgt. Der kurze Pip ist in einem Unterprogramm ausgelagert und wird entsprechend mit gosub aufgerufen.
Für die Erweiterung wird Memclear und Wait des obigen Listings ersezt durch:
x = val(mid(t$,4,2)) * 100
x = val(mid(t$,7,2)) + x
If (x > 5954) then
Neo.stripcolor(50,60,100,100,100)
gosub [pip]
delay 60
Neo.stripcolor(50,60,0,0,0)
Endif
if (x = 3000) then
gosub [pip]
endif
if x = 0 then
io(pwo,15,127)
else
io(pwo,15,0)
endif
Memclear
Wait
[pip]
pwmfreq 1000
io(pwo,15,127)
delay 40
io(pwo,15,0)
return
Diese Ergänzung von /default.bas erfolgt im Browser. Speichern nicht vergessen und mit Run starten. |
Fazit
Ergebnis
|
|
Abbildung: (Foto) LED-BAND als Meterware und Rheinturmuhr. |
Dank der integrierten Bibliotheken ist der Programmieraufwand und der Aufbau ein Kinderspiel. Im Gegensatz zum ersten Rheinturmuhr-Projekt aus dem Jahr 2010 leuchten nun die Lampen gleichmäßig und hell. Zusätzlich können die Farben den persönlichen Vorlieben nach gestaltet werden. Das hier überwiegend Rot/Weiß gewählt wurde liegt eher an der Vorlage.
Die völlige Unabhängigkeit von weiterer Hardware, wenn das Basic einmalig übertragen wurde und nun im Witty Cloud wohnt ist nicht zu unterschätzen. Umprogrammierung oder Konfiguration erfolgen per Browser über Wlan auf Laptop, Tablet, Smartphone oder iPod-Touch. OTA also inklusive. Der Quelltext bleibt extrem kurz und übersichtlich.
Die Helligkeit und die vielfältigen Möglichkeiten laden quasi dazu ein, auch diese Anzeige in ein künstlerisch-ästhetisches Umfeld zu bringen, so dass eine stilvolle Zeitanzeige im Wohnbereich entsteht.
|
Arduino Rheinturmuhr mit 39 LED
Arduino-Simulator und LED-Rheinturmuhr
Arduino Rheinturmuhr auf TFT-Display
Arduino Rheinturmuhr mit TFT/DCF77-Funk
Arduino Rheinturmuhr mit TFT/GPS-Funk
Arduino Rheinturmuhr mit WS2812/NeoPixel RGB-LED
Weitere Software
|