PhyGauge – Visualisierung wie früher…
Wer kennt es nicht? Das Smart Home ist perfekt auf verschiedenen Bildschirmen visualisiert. Aber fehlt da nicht etwas? Ich habe mir gedacht, es wäre auch cool den einen oder anderen Datenwert mal auf die altmodische Weise darzustellen. Ein analoges Messinstrument sollte es sein!
Leider sind analoge Messinstrumente in entsprechender Größe schwer bis garnicht zu bekommen, oder sie sehen irgendwie doof aus.
Daher die Überlegung wie man so etwas nachbauen – bzw. anders abbilden künnte.
Da ein Zeigerinstrument, welches man per D/A-Wandler an einem Micro-Controller ansteuert zunächst ausfällt, könnte man alternativ ein Zeigerinstrument in gewünschter Größe und Optik nachbauen, und den Zeiger motorisch z.B. mit einem Schrittmotor oder einem Servo in die entsprechende Position bewegen.
Da ein Servo mit absoluten Werten zur Positionierung angesteuert werden kann, liegt diese Variante zunächst näher. Die darzustellenden Meswerte können direkt in den Drehwinkelwert umgerechnet werden.
Was brauchen wir also für eienen ersten Test? Ich habe erstmal nur auf Sachen aus meiner Schublade zurückgegriffen. Die Auswahl lässt sich sicherlich noch verfeinern.
- Micro-Controller: hier Wemos D1 ESP8266
- Schrittmotor: hier MG995
- Breadboard mit Jumper-Kabeln zum ersten Entwickeln
- PIR-Sensor: Damit das Ganze nacher nicht die ganze Nacht und bei Abwesenheit rattert…
- Datenquelle / Smart-Home System: Zum Aufbereiten und versenden der Daten an die Anzeige
- Weil ich dachte je nach Zeigerausschlag darf das Instrument noch andersfarbig beleuchtet werden, kann ein NeoPixel nicht schaden.
ESP8266 vorbereiten
Ich habe mich wiedermal für die Verwendung von ESP-Easy entschieden, weil man hiermit ohne Programmieraufwand schnell zu guten Ergebnissen kommen kann.
Wer gerne Programmiert, kann seinen ESP auch gerne komplett nativ mit dem benötigten Funktionsumfang betanken. 🙂
Nech dem Verbinden des ESP mit dem heimischen WLAN, bekam er erstmal eine statische IP-Adresse verpasst. Man kann es auch auf DHCP lassen, da man dem ESP auch beibringen kann, dass er on_wifi_connect seine IP-Adresse per MQTT an den eingestellten Broker mitteilt.
Die Verbindung zum MQTT-Broker herstellen wäre auch der nächste Schritt. Zusätzlich definiere ich noch Last Will Topic für Conect und Disconnect. Dazu später mehr…
Die „Devices“ habe ich wie folgt erstellt:

Wobei der „Generic – MQTT Import“ noch nicht so zum Einsatz kommt, wie ich es mir vorstelle. Die Idee ist, die Messwerte „mundgerecht“ für den Servo und den NeoPixel am Broker bereitzustellen und der ESP bekommt sie per Subscription zugeliefert. Bei jeder Änderung sollte ein Event generiert werden, worauf eine Rule den Wert in die Tat umsetzt: Servowinkel NeoPixel Farbe/Helligkeit anpassen. Derzeit erhalte ich noch keine Events. Vermutlich habe ich noch einen Knoten mit dem Topic.
Daher werden die Steuerbefehle aktuell noch per http-Request zu ESP gesendet.
In den Rules habe ich noch nichts eingefügt. Wenn der MQTT-Import funktioniert, werden hier ein paar Sachen stehen. Ebenso plane ich bei längeren Phasen unveränderter Werte, und bei PIR = 0 die Versorgungsspannung des Servo und NeoPixel per Relais abzuschalten:

Wenn man nun alles schnell zusammensteckt, sieht der erste Prototyp so aus:

Hier im Bild sieht man bereits, dass der Papierzeiger auf dem Servo schon einen Wert anzeigt und der NeoPixel darunter in einer Farbe leuchtet. Klassische Zeigerinstrumente haben ja bauartbedingt nur einen beschränkten Zeigerausschlagsbereich von ca. 80 – 100°. Dieses Verhalten habe ich durch Begrenzung des Wertebereichs versucht nachzuahmen. Der Servo kann von 0° bis 180° jede Position einnehmen.
Control-Service
Um die Anzeige zu steuern benöge ich erstmal eine Datenquelle und etwas, was die Daten aufbereitet und bei Änderungen der Werte zeitnah zu Anzeige überträgt.
Ich verarbeite meine Daten rund ums Smart-Home alle in node-red. Also liegt es nahe, auch hier die genannten Aufgaben zu erledigen.
Dank der grafischen flow-basierten Oberfläche ist es schnell zusammen geklickt:

In diesem Flow wird der anzuzeigende Wert über „Input Value“ per MQTT als Rohwert bezogen.
Im nächsten Schritt habe ich Message-Gates eingefügt. Diese ermöglichen es, konditioniert den Datenstrom zu unterbrechen, z.B. um keine http-Requests zu versenden, wenn der ESP offline ist, oder keine Anwesenheit erkannt wurde.
Da ich positive und negative Werte anzeigen möchte wird im Fall der „Abwesenheit, wird der Zeiger nach Schließen des Gates noch in Mittelstellung (Nullpunkt) gefahren und der NeoPixel ausgeschaltet.
Nach dem Gate werden nur noch „andere“ Daten (Wert-Änderungen), bezogen auf den letzten Wert weitergereicht. Ebenso wird danach die Datenrate auf 1 Wert/5s begrenzt. Im nächsten Schritt findet im oberen Strang wird der Servowinkel berechnet. Bezogen auf den Messwert und den relevanten Anzeigebereich (Begrenzung auf 40° in jede Richtung bezogen auf die Mittelstellung, wird der Wert lediglich skaliert. Da mein Servo die 0° Position rechts hat, muss ich noch 90° draufrechnen, sodass der Nullpunkt dann in der Mitte der Skala ist.
Im zweiten Strang findet das gleich für die Farb- und Helligkeitswerte für den NeoPixel statt. Mittelstellung bedeutet hier alles auf null. höchster positiver Wert wird zu <red>,<green>,<blue>[,<brightness>] 0,255,0,255 und der extremste negative Wert wird zu 255.0.0,255.
Durch die Skalierung ergeben sich die Zwischenwerte automatisch. 🙂
Damit der Zeiger nun aber nicht so hetisch zwischen den Werten hin und her hüpft habe ich den „easing“ Node eingefügt. Wer schon mal mit Splines und Keyframes bei Animationen gearbeitet hat, wird das Prinzip schnell wiedererkennen. Hier werden vom letzten Datenwert ausgehen, hin zu dem neuen Wert zwischenwerte mit verschiedenen „Kurven“ berechnet und so der Weg zum neuen Wert nicht mehr linear dargestellt. Der Zeiger kann z.B. zum Ende abgebremst auf den Zielwert gefahren werden. Das sieht für mein Empfinden realistischer nach einem Zeigerinstrument aus. Und der Servo bleibt dabei leiser.
Zum Schluss entferne ich noch die Nachkommastellen. Da kann der Servo nichts mit anfangen und Blockiere noch mal alles was gleich ist.
Dann können die Daten auch schon versendet werden.
Fertig! Der Zeiger bewegt sich, wie er soll.
Gehäuse
Hier kann jeder seinen bevorzugten Look verwirklichen. Das Ziffernblatt stelle ich mir in etwa so vor:

An einem Entwurf für das Gehäuse arbeite ich gerade. Ich werde es hier zu gegebener Zeit aktualisieren.