Tumgik
#serielleVerbindung
draegerit · 1 year
Text
JSON-Format zur Datenübertragung zwischen zwei Mikrocontroller
Tumblr media
In diesem Beitrag möchte ich dir zeigen, wie du das JSON-Format zur Datenübertragung zwischen zwei Mikrocontroller verwenden kannst.
Tumblr media
Die Idee zu diesem Beitrag kam aus den Kommentaren zum Beitrag Übertragen von Sensordaten per nRF24L01 Modul wo ich Sensordaten mit diesem Format von einem Arduino zum anderen sende. In dem verlinkten Beitrag habe ich die JSON-Daten per Hand geparst, hier möchte ich nun einen bequemen Weg zeigen, wie dieses mit einer Bibliothek geht.
Warum das JSON-Format?
Der Vorteil am JSON-Format ist, dass dieses einfach zu lesen und auch zu erweitern ist. Des Weiteren ist dieses gut komprimiert bzw. lässt sich gut komprimieren und somit ist eine hohe Datenübertragung möglich. { "vorname":"Stefan", "nachname":"Draeger", "alter":42 } Um ein selbst erstelltes JSON-Objekt zu prüfen, bieten sich einige Onlinetools wie Bsp https://jsonformatter.curiousconcept.com/# an. Hier bekommst du bei einem Fehler gleich den Hinweis, was fehlerhaft ist bzw. das Tool ergänzt sogar fehlende Anführungszeichen.
Benötigte Ressourcen für den Aufbau
Wenn du dieses kleine Projekt nachbauen möchtest, dann benötigst du: - einen Mikrocontroller Bsp Arduino Mega 2560 R3, - ein USB Datenkabel Der Arduino Mega 2560 R3 hat den Vorteil, dass dieser mehrere hardwareseitige serielle Schnittstellen hat.
Tumblr media
Funduino MEGA 2560 R3 - Buchsenleisten mit Pinbeschriftungen
Arduino UNO / Nano V3
Natürlich kannst du auch einen Arduino UNO oder Nano verwenden, diese haben lediglich nur einen seriellen Anschluss, und dieser ist beim Upload des Sketches belegt, somit musst du die Verbindungen (Breadboardkabel) vor dem Hochladen des Programmes entfernen. Alternativ kannst du auch die Bibliothek SoftwareSerial verwenden und somit zwei digitale Pins des Arduino UNOs als zusätzlichen seriellen Anschluss definieren.
Verbinden von zwei Mikrocontroller per serieller Schnittstelle
https://youtu.be/bEx_ASdbDXQ Die beiden Mikrocontroller kannst du auf verschiedene Wege verbinden, entweder per Bluetooth, nRF24L01, LoRa oder ganz einfach per serieller Schnittstelle. In diesem Beitrag verwende ich die serielle Schnittstelle, da dieses recht einfach ist und vor allem das eigentliche Projekt nicht zusätzlich durch Bibliotheken aufbläht.
Tumblr media
zwei Arduino Mega per serieller Schnittstelle verbunden Auf der Grafik ist zu sehen, dass die Kontakte RX & TX jeweils über Kreuz verbunden sind.
Programmieren
Nachdem wir nun die beiden Mikrocontroller verbunden haben, kommen wir zur Programmierung. Wie erwähnt möchte ich eine Bibliothek zum Verarbeiten der JSON Daten verwenden. Bibliothek - Arduino_JSON Bevor wir mit der eigentlichen Programmierung beginnen, installieren wir die benötigte Bibliothek über den Bibliotheksmanager der Arduino IDE. Zunächst öffnen wir den Bibliotheksverwalter in der Arduino IDE (1) danach suchen wir nach "json" (2) und wählen an dem Eintrag "Arduino_JSON by Arduino" die Schaltfläche "INSTALL" (3). Wenn die Installation abgeschlossen ist, dann erscheint der Text "INSTALLED" (4).
Tumblr media
Installieren der Bibliothek Arduino_JSON über den Bibliotheksverwalter Parsen eines JSONs Zerlegen wir zunächst einmal auf einem Mikrocontroller ein kleines JSON. { "vorname":"Stefan", "nachname":"Draeger", "alter":42 } Damit wir dieses JSON in eine String Variable ablegen können, müssen wir alle Anführungszeichen escapen, d.h. wir setzen ein Backslash davor. {"vorname":"Stefan", "nachname":"Draeger", "alter":42} Nachfolgend ein kleines Programm zum Parsen von JSON Daten auf dem Arduino. // einbinden der Bibliothek zum verarbeiten von JSON #include // das JSON-Objekt welches verarbeitet werden soll String input = "{"vorname":"Stefan", "nachname":"Draeger", "alter":42}"; void setup() { // beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); // initialisieren eines JSONVar Objektes // mit den verarbeiteten JSON Daten JSONVar jsonVar = JSON.parse(input); // prüfen ob es ein Key mit der Bezeichnung "vorname" gibt. if (jsonVar.hasOwnProperty("vorname")) { // Ausgeben der Zeichenkette "vorname:" auf der seriellen Schnittstelle Serial.print("vorname:"); // Ausgeben des Wertes zum Key Serial.println(jsonVar); } if (jsonVar.hasOwnProperty("nachname")) { Serial.print("nachname:"); Serial.println(jsonVar); } if (jsonVar.hasOwnProperty("alter")) { Serial.print("alter:"); Serial.println(jsonVar); } } void loop() { // bleibt leer } Die Ausgabe auf der seriellen Schnittstelle bzw. im seriellen Monitor sieht wie folgt aus:
Tumblr media
Übertragen eines JSON zwischen zwei Mikrocontroller per serieller Schnittstelle Im nächsten Schritt wollen wir ein JSON zwischen zwei Mikrocontroller übertragen. Das JSON könnte hier Sensordaten (Temperatur, Luftdruck, relative Luftfeuchtigkeit, CO₂ Konzentration etc.) enthalten. In meinem Fall möchte ich das JSON mit festen Daten beschreiben. Quellcode des Senders // einbinden der Bibliotheken zum verarbeiten // von JSON #include JSONVar output; void setup() { // beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); Serial1.begin(9600); // einfügen des Schlüssel/Werte Paares in // das JSON-Objekt output = "Stefan"; output = "Draeger"; output = 42; // Umwandeln des JSON-Objektes in ein String String jsonOutput = JSON.stringify(output); Serial.print(jsonOutput); Serial1.print(jsonOutput); } void loop() { // put your main code here, to run repeatedly: } Quellcode des Empfängers Am Empfänger müssen wir "lauschen", ob Daten an der seriellen Schnittstelle anliegen und diese dann mit der Funktion "readString()" im Ganzen lesen. Diese gelesenen Daten parsen wir dann in ein JSON-Objekt und können diese, wie zuvor im einfachen Beispiel gezeigt, auswerten und ausgeben. // einbinden der Bibliotheken zum verarbeiten // von JSON #include void setup() { // beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); Serial1.begin(9600); } void loop() { while (Serial1.available() > 0) { String data = Serial1.readString(); Serial.println(data); // initialisieren eines JSONVar Objektes // mit den verarbeiteten JSON Daten JSONVar jsonVar = JSON.parse(data); // prüfen ob es ein Key mit der Bezeichnung "vorname" gibt. if (jsonVar.hasOwnProperty("vorname")) { // Ausgeben der Zeichenkette "vorname:" auf der seriellen Schnittstelle Serial.print("vorname:"); // Ausgeben des Wertes zum Key Serial.println(jsonVar); } if (jsonVar.hasOwnProperty("nachname")) { Serial.print("nachname:"); Serial.println(jsonVar); } if (jsonVar.hasOwnProperty("alter")) { Serial.print("alter:"); Serial.println(jsonVar); } } } Hier nun die Ausgaben auf der seriellen Schnittstelle in der Arduino IDE.
Tumblr media
Downloads
Hier der Quellcode zu den Beispielen aus diesem Beitrag zum bequemen Download. Read the full article
0 notes