Prof. J. Walter - Informationstechnik, Mikrocomputertechnik, Digitale Medien Softwaredoku
Hochschule Karlsruhe Logo Fach Energieeffiziente Mikrocontroller
8x8-Seq
Wintersemester 2020
Jakob Mattes
Niclas Huber

Software Dokumentation

In diesem Abschnitt soll näher beschrieben werden, welche Informationen von der Web-App gesendet werden und welche Auswirkungen diese auf den ausführenden Code haben. Das generelle Konzept der Kommunikation von der Web-App zu den einzelnen ESP32-Mikrocontroller wurde bereits in dem Kapitel "Konzeptentwicklung" erklärt.

Die 16 ESP32-Mikrocontroller erhalten vom MQTT-Broker das Datenpaket "receivedMsg", welches alle relevanten Daten beinhaltet. Dieses Datenpaket ist im JSON-Format aufgebaut. Die darin enthaltenen Topics sind Command, Brightness, PlayinSequence, ESPSelect, TextGenerator, Pixels, LightShow, ESPState. Die einzelnen Informationen, die diese Topics übermitteln, werden im folgenden näher erläutert.

Die Funktion der obersten Ebene ledRoutine() wird in einer loop-Schleife vom ESP32 immer wieder aufgerufen. Dort wird zuerst der aktuelle Status überprüft. Dieser wird mit dem Topic "Command" übermittelt. Er kann vier verschiedene Zustände annehmen. Diese sind in der folgenden Tabelle aufgeführt.

Command

„cmd“: LightOff/

TaptoLight/

TextGenerator/

LightShow


Außerdem wird ein Wert für die Helligkeit ("Brightness") übermittelt, die die LEDs annehmen sollen. Dieser Wert berechnet sich aus der an der Web-App eingestellten Helligkeit und dem vom LDR-Sensor gemessene Wert.

Brightness

„br“: 0 … 255

„adp“: 0/1


Daneben wird vom Anwender festgelegt, welche der 16 ESP32-Mikrocontroller beleuchtet und in welcher Reihenfolge die Sequenz abgespielt werden sollen. Diese beiden Topics "PlayinSequence" und "ESPSelect" haben jeweils 16 Werte, mit denen die einzelnen ESPs angesprochen werden. Die Reihenfolge wird durch das Aufbringen einer Verzögerung festgelegt, die einen Wert von 0 bis theoretisch unendlich annehmen kann. Ob ein ESP32 aktiviert ist, wird lediglich mit einem boolschen Wert (true/false) definiert.

PlayinSequence

„seq“: 0 ... INF, 0 ... INF, … (16 times)


ESPSelect

„sel“: true/false, true/false, … (16 times)


Abhängig davon, welcher Zustand über "Command" übermittelt wurde, werden im Code unterschiedliche Funktionen gestartet, die jeweils unterschiedliche Informationen von der Web-App benötigen. Es werden allerdings immer alle Topics an die ESPs geschickt. Ob sie benötgt werden oder nicht, spielt dabei keine Rolle.

Der Text Generator benötigt zum einen den anzuzeigenden Text, zum anderen den Farbwert, in dem der Text sichtbar ist, sowie die Geschwindigkeit, wie schnell der Text horizontal über die 8x8-Matrix abgespielt wird. Die genaue Farbe wird als RGB-Wert definiert, wobei jeder der drei Farbanteile zwischen 0 und 255 liegen kann. Die Geschwindigkeit des Textes wird mit einem vierten Wert übergeben, der ebenfalls zwischen 0 und 255 liegt.

TextGenerator

„txt“: „Hello World“

„r“: 0 … 255

„g“: 0 … 255

„b“: 0 … 255

„spd“: 0 … 255


Das Topic "Pixels" beinhaltet die Informationen der Funktion "Tap-To-Light". Da in dieser Funktion nur jeweils ein Pixel der Matrix ausgewählt wird, muss hier nur die aktuelle Position des betreffenden Pixels in Form von Reihen- und Spaltennummer angegeben werden. Die Werte bewegen sich zwischen 0 und 7. Außerdem muss festgelegt werden, ob dieses Pixel ein- oder ausgeschaltet wird. Identisch zu der Funktion "Text Generator" wird die Farbe des Pixels ebenfalls als RGB-Wert übergeben.

Pixels

„col“: 0 … 7

„row“: 0 … 7

„on“: 0/1

„r“: 0 … 255

„g“: 0 … 255

„b“: 0 … 255



Hinter der Funktion "Lightshow" verbergen sich im Gesamten 16 unterschiedliche Farbabfolgen, die jeweils auf einer 8x8-Matrix abgespielt werden können. Welche dieser Sequenzen gezeigt werden, hängt von der Auswahl des Anwenders auf der Web-App ab. Diese Information wird über das gleichnamige Topic gesendet und kann einen Wert zwischen 1 und 16 annehmen.

LightShow

„sel“: 1 … 16

„ptr“: 20


 
Das letzte verbleibende Topic wird in die andere Richtung gesendet, also vom ESP32 zur Web-App. Darin sind die Nummer des ESP32 (ADR-Wert), sowie der aktuelle Batterie-Ladestand und LDR-Wert jeweils in Prozent. Dieses Topic hat keinen direkten Einfluss auf die im Code ablaufenden Funktionen, liefert allerdings relevante Inhalte für die Helligkeit der LEDs.

ESPState

„ADR“: ESP_NO

„BAT“: value %

„LDR“: value %



Um einen Eindruck von den vorprogrammierten Sequenzen zu bekommen, wird hier beispielhaft die Funktion Nr. 12 erläutert.

Die Funktion launchLightShow_12() wird aufgerufen, sobald die entsprechende Informationen über das Datenpaket receivedMsg gesendet werden (u.a. "cmd": LightShow", "sel": 12).



Hierbei wird eine 8x8-Matrix definiert, in welcher die später leuchtenden LEDs mit einer "1" festgelegt sind. In diesem Fall haben die Pixel die Form eines Pfeils.
Außerdem werden die beiden Funktionen pre_arrow() und arrow() aufgerufen, die im Code jedoch schon über der Funktion launchLightShow_12() stehen. Hier werden sie der besseren Nachvollziehbarkeit halber anschließend aufgeführt.

Der Funktion pre_arrow() wird die Matrix logo übergeben. Innerhalb dieser Funktion werden alle Pixel der Matrix bei Strat der Sequenz launchLightShow_12() mit der Farbe Grün belegt.




In der danach aufgerufenen Funktion arrow() ist die eigentlich erkennbare Abfolge hinterlegt. Um die einzelnen Schritte der Abfolge für das menschliche Auge sichtbar zu machen, wird eine zeitliche Begrenzung benötigt, in der die Schritte nacheinander ablaufen sollen. Dies ist mit einer anfänglichen if-Schleife realisiert, die die aktuelle Systemzeit millis() nutzt. Somit wird nur alle 75 ms ein Schritt durchgeführt und kann mit dem menschlichen Auge nachverfolgt werden.

Anschließend wird zum einen in der ersten Zeile ein blauer Punkt in Form eines Pixels schrittweise von links nach rechts bewegt. In der entsprechenden Spalte, in der sich dieser blaue Punkt gerade befindet, werden alle Grün leuchtenden Pixel zeitweise auf Rot gesetzt.
Nach jedem Schritt werden alle Pixel auf schwarz geschaltet. Dieses kann man später jedoch kaum erkennen, da mit der Funktion pre_arrrow() sehr schnell alle Pixel wieder auf Grün gesetzt werden.



Die Funktion launchLightShow_12() läuft so lange in Dauerschleife, bis eine neue Information von der Web-App gesendet wird.



 

  Mit Unterstützung von Prof. J. Walter Wintersemester 2020