Prof. J. Walter - Informationstechnik, Mikrocomputertechnik, Digitale Medien Softwaredoku
Hochschule Karlsruhe Logo Energieeffiziente Mikrocontroller
Cor-Sen
Wintersemester 2020
Tim Zink
Tim Brachat

Software Dokumentation


Die Software Dokumentation des Gesamtprojekts Corona-Ampel für den Steuerungs ESP32 kann hier eingesehn werden.
Die Software Dokumentation für die ESP-Cam findet man unter diesem Link.

Zur Entwicklung des Quellcodes wurde in diesem (Teil-) Projekt die Arduino IDE V1.8.13 benutzt. Der Quellcode enthält Funktionen, welche die VL53L0X ToF-Sensoren ansteuern und auslesen können, sowie eine Erkennung der Laufrichtung der durch das Sensormessfeld gehenden Personen. Auf die einzelnen Teilfunktionen wird im folgenden eingegangen.

Wie bei allen in der Arduino IDE entwickelten Programmen durchläuft der ESP32 zuerst eine Setup-Funktion, welche dann nach erfolgreicher Beendigung in eine Loop-Funktion übergeht. Die Loop-Funktion wird dabei immer wiederholt. 


Setup-Funktion
Abb.: Setup-Funktionen

Im Setup wird zuerst die serielle Schnittstelle und Pins für den Shutdown/Reset der ToF-Sensoren initialisiert. Anschließend werden diese mit einem LOW-Pegel beschrieben. Dies ist wichtig für die nachfolgende Adresszuweisung der Sensoren, welche in setID() stattfindet. Zuletzt wird jeweils eine Interrupt Service Routine pro ToF an den Pins zugewiesen, welche mit den GPIO1 Pins des VL53L0X-Carriers verbunden sind. 


setID-Funktion
Abb.: setID-Funktion  

Am Anfang der setID werden die ToF-Sensoren noch einmal neu gebootet und anschließend die Adressen zu setzen. Es ist wichtig, nicht beide Sensoren gleichzeitig aktiv zu haben, da man sonst beiden Sensoren eine gleiche I2C-Adresse zuweist. Zuerst wird Sensor 1 die Adresse zugewiesen, während 2 sich in Reset-Modus befindet. Nachfolgend wird zwei wieder aktiviert und eine Adresse zugewiesen.


loop-Funktion
Abb.: loop-Funktion  

In der loop-Funktion wird in diesem Teilprojekt in einem Messinterval der jeweilige Status und die Range der Sensoren ausgelesen. Hierfür wird ein Interval eingeführt, welches das Messen ohne Benutzung der delay-Funktion von Arduino ermöglicht. Ist die Zeit vergangen, welche das Interval vorgibt, wird die Variable für das Interval neu definiert. Ist dies nicht der Fall, wird so lange die Bedingung abgefragt, bis die Bedingung wahr ist. Anschließend werden die Sensoren ausgelesen und die Personenanzahl in dem jeweiligen Raum ermittelt. Um die Personenanzahl bestimmen zu können wird der Rückgabewert der get_Direction()-Funktion an die peopleInRoom-Funktion weitergegeben. Nach dem Aufrufen dieser Funktionen startet die loop-Funktion wieder von neuem.


read_dual_sensors-Funktion
Abb.: read_dual_sensors-Funktion  

Die von der Bibliothek bereitgestellte Funktion rangingTest wird aufgerufen. Diese Ermittelt den Status des Sensors. Befindet sich der Sensor im Status "out of Range" wird der Für die Richtungserkennung relevante Wert definiert. Dies ist notwendig um später unterscheiden zu können, ob sich gerade eine Person im Sichtfeld des Sensors befindet oder nicht. Ist der Status nicht "out of Range" wird der aktuelle Entferungswert in die Variable currentRange1 geschrieben. Selbiges passiert für den zweiten Sensor. Um überhaupt eine Aussage treffen zu können, ob sich eine Person im Sichtfeld des Sensors befindet, müssen die Variablen currentRange und previousRange im Zusammenspiel ausgewertet werden. previousRange wird allerdings nur beschrieben, wenn sich einmal der Wert von currentRange geändert und diese miteinander verglichen werden. Daher muss eine Überprüfung erfolgen, ob es sich um die erste Messung handelt und Falls ja, wird previousRange currentRange zugewiesen. Somit haben beide Variablen einen gleichen Wert und sollte sich currentRange ändern, ist auch der angestrebte Vergleich möglich. Diese Prozedur wird nur einmal ausgeführt.


get_Direction-Funktion
Abb.: get_Direction-Funktion

Die get_Direction-Funktion wertet die Sensor-Signale aus. Diese Funktion besitzt einen Rückgabewert in form eines Integers, welcher von anderen Funktionen ausgewertet werden kann. Der Rückgabewert wird bei jedem Aufruf der Funktion als Standard auf -1 gesetzt. Wie im vorangegangenen Kapitel "Ausgewählte Lösung" erläutert wird die Reihenfolge der Summe der Sensorsignale ausgewertet. Die Summe wird gebildet und überprüft, ob sich der Wert von der verherigen Summe unterscheidet oder ob beide Summen den Wert 0 haben. Die Überprüfung ob beide Summen 0 sind ist wichtig, da die Summen kontinuierlich in ein Array eingelesen werden und die Zahlenfolge für die Richtungserkennung entscheidend ist. Es können der im vorangegangenen Kapitel erklären Zahlenfolge Permutationen auftreten. Um diese zu identifizieren ist der Fall sum == 0 und prevSum == 0 notwendig, da in jeder Zahlenfolge zwei Nullen vorkommen und diese auch hintereinander anliegen können.
Ist dies der Fall, wird die Summe in numbers-Array gespeichert und der Variable prevSum der Wert sum zugewiesen. Ist dies nicht der Fall, wird überprüft, ob der Zähler für das 5-stellige Array größer oder gleich 4 ist. Ist diese Bedingung wahr, wird die letzte Ziffer aus dem numbers-Array gespeichert und der Zähler für das Array gleich 0 gesetzt. Wenn diese Bedingung nicht wahr ist, wird der Zähler erhöht.
In beiden Fällen wird nun zur Überprüfung der Summenreihenfolge fortgeschritten. Je nach Fall bzw. Summenreihenfolge, wird eine Nummer zurückgegeben, welche einer Laufrichtung entspricht. Anschließend wird die Funktion setNumbers() aufgerufen und get_Direction() gibt die Laufrichtungsnummer zurück.


peopleInRoom-Funktion
Abb.: peopleInRoom-Funktion

Diese Funktion wurde für die Ausgabe der Personenanzahl bei in der seriellen Schnittstelle implementiert. Die Integration dieser Funktion in das Gesamtprojekt "Corona-Ampel" bleibt optional.
Die übergebene directionNumber wird auf ihren Zahlenwert überprüft. Mit der Wertigkeit -1, 3 oder 4 wird der Funktionsaufruf beendet. Besitzt die Variable den Wert 1 wird der Personenzähler dekrementiert und die Personenanzahl ausgegeben. Bei Wert 2 wird der Zähler erhöht und der Wert ebenfalls auf dem seriellen Monitor ausgegeben. Bei beiden Fällen wird der Funktionsaufruf nach diesen Befehlen beendet. 


setNumbers-Funktion
Abb.: setNumbers-Funktion

Bei Funktionsaufruf von setNumbers werden alle Werte des numbers-Array 0 gesetzt.
 


ISR_ToF1-Funktion ISR_ToF2-Funktion
Abb.: ISR_ToF1-Funktion und ISR_ToF2-Funktion

Für jeden der ToF-Sensoren wurde eine Interrupt Service Routine entwickelt. In diesen Funktionen werden die gemessenen Abstände miteinander verglichen. Wenn die aktuelle Entfernung zum Messobjekt größer ist als die vorherige, befindet sich etwas im Sichtfeld des Sensors, das Signal wird jeweils gesetzt und der aktuelle Entferungswert dem vorherigen zugewiesen. Entspricht der aktuelle Entfernungswert dem vorherigen mit Hysterese wird die ISR verlassen, da auf eine Änderung der Entfernungswerte gewartet wird. Ist die aktuelle Entfernung größer als die vorherige Entfernung, hat das Messobjekt das Sichtfeld verlassen. Hierbei wird das Signal jeweils auf 0 gesetzt und der Wert der aktuellen Entferung der Variablen für die vorherige Entferung zugewiesen.

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