PHP-Script für LoRaWAN Sensordaten
07.07.2024
Elektronik | Funk | Software
Der Technik-Blog
Mit dem TTGO (LILYGO) GPS LoRa Board kann man einen sehr günstigen und genauen LoRaWAN GPS-Tracker bauen. Im ersten Teil vom Projekt "LoRa GPS-Tracker" ging es allgemein um dieses Board sowie um die Inbetriebnahme vom UBLOX NEO6 GPS Modul. In diesem Artikel geht es um die Inbetriebnahme von LoRa, die Registrierung im LoRaWAN Netzwerk sowie um das encodieren und decodieren der Payload.
Teil 1: Inbetriebnahme vom Lilygo-Board und NEO6 GPS
Teil 3: LoRaWAN GPS Tracker Webapp
Vollständiger Source Code LoRaWAN GPS Tracker (OTTA)
Vollständiger Source Code LoRaWAN GPS Tracker (ABP)
LILYGO (TTGO) Board bei TTS registrieren (OTTA)
ESP32 im Arduino IDE installieren
LILYGO ESP32 LoRa GPS Board (V1.1)
Voraussetzungen Grundvoraussetzung ist die Installation des ESP32 im Arduino IDE. Außerdem sollte der GPS-Empfänger bereits vorab wie im ersten Teil erklärt, getestet werden. Für die Inbetriebnahme von LoRa wird eine Library benötigt. Als Library wird die Arduino LMIC LoRa Library von MCCI Catena verwendet. Weitere Informationen dazu gibt es auf der Webseite vom vollständigen Source Code.
Damit die Kommunikation zum LoRaWAN Netzwerk TTS (Nachfolger von TTN, The Things Network) funktioniert, muss das Device vorab im Netzwerk registriert werden. Eine allgemeine Anleitung zur Registrierung von ESP32 & Arduino Boards mit OTAA gibt es hier. Anschließend können alle Schlüssel, welche für das jeweilige LoRaWAN Netzwerk notwendig sind, in den Beispielcode kopiert werden. Ein eigenes LoRaWAN Gateway ist grundsätzlich nicht erforderlich, wird jedoch empfohlen. Dadurch beteiligt man sich am Ausbau vom LoRaWAN Netzwerk und hat gleichzeitig ein sehr hilfreiches Tool zur Fehleranalyse. Ein günstiges und gutes Multi-Channel Gateway wäre das MikroTIK LR8.
Bevor der Beispielcode hochgeladen wird, müssen dafür einiges Pins angepasst werden. Der GPS-Empfänger kommuniziert die Positionsdaten seriell zum ESP32. Die dafür notwendigen RX & TX Pins werden aus dem ersten Teil übernommen. Die folgenden Zeilen definieren die Pins für das GPS-Modul:
#define SERIAL1_RX 34 // GPS_TX -> 34 #define SERIAL1_TX 12 // 12 -> GPS_RX
Die Kommunikation zwischen ESP32 und den LoRa Modul findet über die SPI-Schnittstelle statt. Während SPI-Pins am Arduino eine fixe Zuweisung haben, ist dies am ESP32 nicht der Fall. Hier können verschiedene Pins für SPI genutzt werden. In der Setup-Methode (void setup()) werden daher die SPI-Pins festgelegt. Folgende Zeile definiert die SPI-Pins für den LoRa-Chip:
SPI.begin(5, 19, 27, 18);
Neben SPI werden für die Kommunikation zwischen ESP32 und LoRa-Chip noch weitere Pins benötigt. Ganz wichtig dabei ist der Reset-Pin und die DIO-Pins, insbesondere der DIO0 Pin. Folgendes Pin-Mapping muss vor den Methoden deklariert werden:
const lmic_pinmap lmic_pins = { .nss = 18, .rxtx = LMIC_UNUSED_PIN, .rst = 23, .dio = {26, 33, 32}, };
Achtung: Es sind verschiedene Versionen vom LILYGO TTGO Board im Umlauf. Die Pinbelegung variiert zwischen den Versionen und muss möglicherweise angepasst werden
Im Hauptverzeichnis der MCCI-Library befindet sich der "project_config"-Ordner. In der "lmic_project_config.h"-Datei können verschiedene Optionen aktiviert und deaktiviert werden. Hier wird auch das Frequenzband eingestellt. Eine weitere sehr nützliche Option ist der Debug-Mode. Durch diese Aktivierung (Level 2) werden sämtliche Statusinformationen im Serial Monitor angezeigt. Folgende Beispielkonfiguration aktiviert das EU-Band und den Debug-Level:
// project-specific definitions #define CFG_eu868 1 //#define CFG_us915 1 //#define CFG_au915 1 //#define CFG_as923 1 // #define LMIC_COUNTRY_CODE LMIC_COUNTRY_CODE_JP /* for as923-JP */ //#define CFG_kr920 1 //#define CFG_in866 1 #define CFG_sx1276_radio 1 //#define LMIC_USE_INTERRUPTS #define LMIC_DEBUG_LEVEL 2
Zuerst müssen in der Software die Schlüssel für das LoRaWAN Netzwerk angepasst werden. AppEUI und DevEUI werden in LSB eingefügt. Der AppKEY wird 1:1 wie in TTS angezeigt in MSB kopiert.
Die Software startet anschließend mit einem JOIN-Request und wartet in den RX-Zeitfenstern auf eine Antwort vom LoRaWAN Netzwerk mit den Sitzungsschlüsseln. Wurde der JOIN-Request vom LoRaWAN Netzwerk korrekt verarbeitet, sollten im Serial Monitor AppSKey (App Session Key) und NwkSKey (Network Session Key) angezeigt werden. Anschließend erfolgt die Ausgabe "EV_Joined" im Serial Monitor. Der JOIN-Request ist somit abgeschlossen und eine Device-ID wurde zugewiesen. Der Controller hat somit alle notwendigen Daten, um zukünftige Datensätze an das LoRaWAN Netzwerk senden zu können. Erst nachdem der JOIN-Request erfolgreich war, fängt das eigentliche Programm in der Main-Schleife an zu laufen. Der folgende Screenshot zeigt den Serial Monitor nach einem erfolgreichen JOIN bei TTS:
Das Hauptprogramm wartet ständig auf neue NMEA Datensätze vom GPS-Modul und holt sich einzelne Parameter aus dem Datenstrom. Anschließend werden die empfangenen Koordinaten in den Dezimalgrad umgerechnet. Eine genaue Beschreibung zum Programmablauf und zur Umrechnung befinden sich im ersten Teil.
Neu hinzugekommen ist die Methode "generate_payload()". Beim Aufruf dieser Methode werden die zu übertragenden Parameter (Breitengrad, Längengrad, Höhe & Anzahl aktiver Satelliten) übergeben. In der Methode werden die einzelnen Parameter in das "uint8_t tx_payload[11]"-Array übergeben. Die Aufteilung der Payload sieht wie folgt aus:
Von Bit | Bis Bit | Beschreibung |
---|---|---|
0 | 3 | Breitengrad (Long) |
4 | 7 | Längengrad (Long) |
8 | 9 | Höhe (Integer) |
10 | 10 | Anzahl aktiver Sat (Byte) |
Eine allgemeine ausführliche Erklärung zur LoRa Payload sowie zum Encoder & Decoder gibt es im Artikel zur LoRa Payload sowie in diesem YouTube Video.
Das TX-Intervall ist im Beispielcode auf 60 Sekunden eingestellt und dient nur zu Testzwecken. In einem stark frequentierten Netzwerk sollte dieses Intervall jedoch unbedingt erhöht werden, damit Kapazitäten für alle Teilnehmer vorhanden bleiben. Die Payload wird ständig neu generiert und mit aktuellen Positionsdaten gefüllt. Vor der Übertragung wird die hexadezimale Payload, wie sie später auch am Application-Server zu sehen ist, im Serial Monitor ausgegeben.
Der Decoder wandelt die vom GPS-Tracker generierte Payload wieder in ihre einzelnen Bestandteile um. Zuvor aufgetrennte Varaiblen werden wieder zusammengeführt und teilweise auch gerundet. Der Payload-Decoder wird als Javascript kopiert und kann entweder global in der Application eingefügt werden oder nur für das jeweilige Gerät. Anschließend sollten in der Application neben der hexadezimalen Payload auch die Koordinaten in Klartext angezeigt werden. Folgender Decoder wird in der TTS Application eingefügt:
function Decoder(bytes, port) { var lat_coord = bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3]; var lat = lat_coord / 1000000 - 90; var lon_coord = bytes[4] << 24 | bytes[5] << 16 | bytes[6] << 8 | bytes[7]; var lon = lon_coord / 1000000 - 180; var alt = (bytes[8] << 8 | bytes[9]); var sats = bytes[10]; return { latitude: Math.round(lat*1000000)/1000000, longitude: Math.round(lon*1000000)/1000000, altitude: alt, sat: sats } }
Nach einfügen des Decoders sollten die einzelnen Positionsparameter mit dem nächsten eintreffenden Datensatz angezeigt werden:
Generell speichert das LoRaWAN Netzwerk keine Daten. Empfangene Datensätze werden vom Thing Network an eine vom Anwender eingestellte Software weitergeleitet. Dafür gibt es bereits viele, teilweise sogar kostenlose Anbieter, die eine direkte Schnittstelle zum jeweiligen Thing Network haben und die Datensätze vom LoRaWAN Netzwerk entgegennehmen. Sowohl TTN als auch TTS können die Daten an eine eigene Webseite via JSON-Post weiterleiten. Eine Anleitung dazu gibt es im dritten Teil.
Einstieg in das LoRaWAN (TTN) mit dem Heltec LoRa32 V3 und Einrichtung vom Board in der Arduino IDE
WeiterlesenStarthilfe LoRaWAN - Diese Seite richtet sich an alle Einsteiger, die mit LoRaWAN starten wollen und ihre Sensoren in das IoT-Netzwerkt TTN integrieren wollen
WeiterlesenAEQ-WEB © 2015-2024 All Right Reserved