Prof. J. Walter - Informationstechnik, Mikrocomputertechnik, Digitale Medien Bedienungsanleitung
Hochschule Karlsruhe Logo HIT - Human Information Technology
Feinstaubmessungen über LoRaWAN
Gruppe 6 - Empfang + Web-Info
Sommersemester 2018
Christian Janson (jach1014)
Maximilian Schmitz (scma1172)

Bedienungsanleitung

Bedienungsanleitung Hardware

Zuerst werden die Sensoren gestartet, indem man die Module an die Powerbanks anschließt und somit den ESP32 mit 5V Spannung versorgt. Am besten positioniert man die Sensoren schon am Messort, allerdings ist das nicht zwingend notwendig. Danach wird das Gateway gestartet, indem man die Powerbank an das Modul anschließt. Hierbei ist es wichtig, dass dieses in der Nähe des konfigurierten WiFi eingeschaltet wird. Wahlweise können die Module auch an einem Computer per USB angeschlossen werden und damit der Serialport des Gateway-Moduls über die Arduino IDE ausgelesen werden, um das Senden/Empfangen der Daten und den Progammablauf zu kontollieren.
Hinweis: Die LoRa Module blinken bei Übertragung einmal alle 16 Sekunden grün auf.

Über das verbundene Thingspeak-Konto können dann die Daten eingesehen werden. Bei Thingspeak kann man sich mit seinem Mathworks Account einloggen und muss dann die entsprechenden Fields in der Oberfläche erstellen und anschließend den API Key im Arduino Code des Gateways abändern.

 

Bedienungsanleitung Code:

 

Downloaden des Codes:

-          LoRa Gateway.zip

-          LoRa Sensor.zip

-          CFeinstaubsensor.zip

-          Ssensordata.zip

Downloaden der Abhängigkeiten:

-          Libhydrogen-master.zip

-          QueueList.zip

-          Arduino-LoRa-master.zip

-          Adafruit Sensor-master.zip

-          DHT Sensor-master.zip

-          Thingspeak-arduino-master.zip

-          SDS011-select-serial-master.zip

 

Struct Ssensordata:

Ssensordata ist eine struct-Deklaration, das für die zu speichernden Messdaten zuständig ist. Dieses struct bildet auch den Grundstein für die verkettete Liste, die als Puffer genutzt wird.

 

Klasse CFeinstaubsensor:

Im Konstruktor wird die Sensor ID übergeben. Die Funktion request_data() dient dazu, die Daten der Sensoren anzufordern. Mit push_queue und pop_queue werden Daten an die verkettete Liste angefügt oder herausgenommen. Im private-Bereich befinden sich en invalid_response flag, eine Countervariable, die Sensor ID, das Message-byte, ein struct-Ssensordata Objekt, der Verschlüsselungskey und eine verkettete Liste aus den struct-Ssensordata. Das flag invalid_response kennzeichnet invalide Nachrichten, also Nachrichten, die beim Senden oder Verschlüsseln Fehler vorweisen. Diese Daten werden nicht an die verkettete Liste angehängt. Die Countervariable cntr zählt die Messagebytes mit. Im struct en_data werden die zu verschlüsselnden Messwerte gespeichert.

void request_data:

Am Anfang wird die Sensor ID über LoRa ausgesendet. Danach wird in der Busy-loop gewartet und die Zeit gemessen, bis die Nachricht ankommt. Sollte die Nachricht nicht innerhalb von max_response_time ankommen, wird fortgeschritten und invalid_response gesetzt, um das Programm nicht dauerhaft zu blockieren. Falls die Nachricht ankam, wird sie nun ausgelesen und im array ciphertext gespeichert und entschlüsselt. Falls die Entschlüsselung nicht gelingt (return != 0), wird ebenfalls invalid_response gesetzt. Wenn die Entschlüsselung funktioniert, wird die entschlüsselte Nachricht aus dem array encrypted in das struct-Objekt kopiert und an die verkettete Liste gehängt.

 

LoRa Gateway:

Dies ist das Arduino-Programm für den ESP32, der die Sensoren abfragen soll und anschließend über WLAN die Daten auf Thingspeak veröffentlichen soll.
Für jeden Sensor muss eine Sensor ID des Datentyps byte angelegt werden. Die Wahl der ID ist frei (0x00-0xFF), allerdings müssen sich die Sensor ID’s aller Sensoren in Benutzung unterscheiden. Die Sensor ID muss auch bei den jeweiligen Sensoren im Code auf die gleiche Weise gesetzt werden, um den jeweiligen Sensor ansprechen zu können.
Danach muss mit der Klasse CFeinstaubsensor ein neues Objekt erzeugt werden, also ein neuer Sensor initialisiert werden, in dessen Konstruktor die Sensor ID übergeben und somit festgelegt wird.
Wenn dies geschehen ist, kann mithilfe der Funktion request_data() der jeweiligen Objekte, die Sensordaten abgefragt werden und mit der Funktion pop_queue() struct-Elemente aus der verketteten Liste genommen werden. Die Funktion gibt das struct-Element zurück, welches in einem zuvor für jeden Sensor initialisierten, globalen struct-Element gespeichert wird.
Die einzelnen Messwerte in diesem struct-Element werden dann mit der Thingspeak API auf Thingspeak.com veröffentlicht. Dies darf ohne Thingspeak-Premiumaccount maximal alle 15 Sekunden geschehen.
Das Auslesen der Sensoren und das Hochladen der Messdaten sind zudem durch Tasks voneinander entkoppelt, um gegebenenfalls eine einfache Mehrfachmessung zur Wertemittelung zu implementieren.

 

Die Ausgabe des Serial Monitors sieht üblicherweise aus, wie folgt:

Requesting data… :        Daten werden angefragt
Responsetime in ms:     Vergangene Zeit von Anfrage bis Antwort erhalten
Encrypted mesasge:      Verschlüsselte Nachricht
Decryption successful:  Sucessful: Entschlüsselung erfolgreich
                                        Failed: Entschlüsselung aufgrund von fehlerhafter Nachricht nicht möglich
items in queue:              Anzahl Elemente in verketteter Liste
RSSI:                               Received signal strength indication
SNR:                               Signal to Noise Ratio
DEQUEUE:                      Es folgt ein Testprint der Messwerte

 

LoRa Sensor:

Als Erstes sollte die, für diesen Sensor in LoRa Gateway, vereinbarte Sensor ID als byte gesetzt werden. Auch in LoRa Sensor wird ein struct-Objekt global deklariert, in welchem die Daten zwischengespeichert werden.
Da wir zwischen dem Kommunikations-Task und der loop eine geteilte Ressource haben, welche größer als ein atomic byte ist (das ciphertext array), müssen vor und nach dem Zugriff Lese- und Schreibsemaphoren gesetzt werden. In Der loop()-Funktion werden die Messwerte aus den Sensoren ausgelesen und im struct-Objekt gespeichert. Mit memcpy wird das struct nun auf das encrypted-array gecasted, in dem die zu verschlüsselten Werte der Verschlüsselungsfunktion übergeben werden. Der Kommunikations-Task wartet darauf, seine Sensor ID über LoRa zu empfangen. Zur Sicherheit überprüft er auch die Länge der Gesamtnachricht, die er über LoRa empfangen hat, damit er seine ID nicht innerhalb einer fremden Kommunikation erkennt und selbst anfängt zu senden. Falls er also seine ID in einem 1 byte großen Paket empfangen hat, sendet er die verschlüsselten Messdaten über LoRa und gibt eine Testausgabe auf seinem Serial Monitor.

 

Die Ausgabe des Serial Monitors sieht üblicherweise aus, wie folgt:

h, t, pm10, pm25 updated:   Sensorwerte wurden ausgelesen
Package sent!:                        Paket wurde über LoRa versendet
Werte:                                     Es folgt ein Testprint des übertragenen Arrays und der Messwerte

 

 Erprobung:

Der Aufbau wurde zwei Langzeittests unterzogen. Zum einen wurde über ca. 10h Messungen durchgeführt. Der Test verlief ohne Fehler. Zum anderen wurden in einem 2. Test über 4 Stunden Messwerte übertragen und ausgewertet, wie viele davon fehlerfrei übertragen wurden. Dabei waren von 910 Nachrichten, 3 Stück invalide. Die Ausfallquote der Nachrichten lag somit bei 0,33%.

 

Problembehandlung:

LoRa failed:

Auf den Hochschulrechnern bekamen wir nach dem flashen des ESP32 oftmals den Fehler, dass LoRa nicht mehr starten wollte. Wir konnten nicht herausfinden, wieso das der Fall ist.
Auf unseren privaten Laptops und Rechnern liefen die Programme auf Anhieb.

 

Sensor DHT22:

Sendet ab und an nur „nan“. Dies liegt unseres Erachtens am Steckbrettaufbau. Wenn man das Bauteil aus dem Steckbrett herausnimmt und neu einsetzt, funktioniert er wieder.
-> Wackelkontakt

 

Dokumentationen der abhängigen Libraries:

·         https://github.com/sandeepmistry/arduino-LoRa/blob/master/API.md

·         https://github.com/jedisct1/libhydrogen/wiki/Secret-key-encryption

·         https://playground.arduino.cc/Code/QueueList

·         https://github.com/sensebox/SDS011-select-serial

 

 


  Mit Unterstützung von Prof. J. Walter Sommersemester 2018