Daten vom Nextion empfangen

Wir wissen jetzt prinzipiell, wie wir vom Host-Controller aus auf die Komponenten der grafischen Oberfläche zugreifen können. Schauen wir uns nun an, wie der Nextion Daten an interne Komponenten oder aber an unseren Host-Controller schickt.

Häufig werden Benutzereingaben nicht nur an die vearbeitende Einheit übertragen, sondern auch als Rückmeldung dargestellt.

Beispiel: Bei einem Taschenrechner müssen die eingegeben Zeichen dargestellt werden, damit der Anwender sieht, ob seine Eingabe auch korrekt ist.

Bei einer konventionellen Mikrocontroller-Anwendung würde das wie folgt ablaufen:

  • Die Tastatur-Eingabe wird laufend abgefragt.
  • Der Controller übernimmt die Daten und speichert sie für die Verarbeitung.
  • Der Controller konvertiert falls erforderlich die Daten und steuert damit die Anzeige an.

Dadurch ist der eigentliche Mikrocontroller sehr stark beschäftigt. Arbeiten Sie hingegen mit einem Nextion-Display, so geschieht die Synchronisierung zwischen der Eingabe und der Anzeige (oder beliebigen anderen GUI-Komponenten) ausschließlich auf der Seite des Nextions. Dazu werden wir ein kleines Beispiel erstellen

Interne Kommunikation

Für unser Beispiel nutzen wir einen Schieberegler und eine numerische Ausgabe, die den eingestellten Wert anzeigt. Der Nextion-Editor vergibt für den ersten Schieberegler den Namen „h0“ und für die numerischen Anzeige „n0“. Wir ändern diese Werte in „eingabe“ und „ausgabe“.

 

 

Wir wissen, dass die Werte einer Komponente durch die Eigenschaft „val“ repräsentiert wird. Die Beziehung würde im Beispiel durch die Gleichung „ausgabe.val = eingabe.val“ bestimmt und genauso können wir sie auch eingeben. Wo? Da es sich um ein Event des Schiebereglers handelt, muss das entsprechechende Ereignis auch dort zu finden sein. Klicken Sie den Schieberegler an, dann öffnet sich unten das entsprechen Fenster mit den Events:

 

 

Jetzt müssen wir nur noch festlegen, welches Event am besten geeignet. Beim „Touch Press Event“ wird der Wert jedes Mal erneuert, wenn wir auf den Schieberegler drücken – das ist nicht sehr sinnvoll, denn wir wollen ja wissen, welcher Wert eingestellt wurde, wenn der Regler wieder losgelassen wird. Von daher wäre „Touch Release Event“ besser geeignet, aber dann würden wir den neuen Wert erst dann sehen, wenn wir den Regler los lassen. Ideal ist „Touch Move“, dabei wird bei jeder Bewegung ein Ereignis ausgelöst. Also tragen wir hier unsere Bedingung ein:

 

 

Eine besonders vorteilhafte Funktion des Nextion-Editors ist der Debugger. Wir können eine bestimmte Funktionalität sofort testen, ohne das Programm extra uploaden zu müssen. Das tun wir jetzt und es funktoniert genauso wie wir es uns vorgestellt haben.

 

 

Danach laden wir die Datei ins Nextion, um zu prüfen, ob es auch real funktioniert. Und das tut es auch. Doch es bleibt noch die Frage, die man die Werte anpassen kann. Der Schieberegler produziert je nach Stellung Ausgaben zwischen 0 und 100. Diesen Bereich können wir auch nicht direkt verändern, wir können aber innerhalb der Verbindungsbedingung anstatt der 1:1-Verbindung eine Formel eingeben, z. B. „ausgabe.val = eingabe.val * 2“.

Senden der Daten an den Host-Controller

Die hautsächliche Arbeit – das Anzeigen und Erneuern des Schiebereglers und das Aktualisieren der Anzeige übernimmt das Nextion-Display jetzt ohne unser Zutun. Bleibt uns nur noch die aktuellen Werte vom Nextion zum Hostcontroller (in diesem Fall wieder unser PC) zu senden.

Das Ereignis könnten wir bei „Touch Move“ belassen, aber welches Event tatsächlich das richtige ist, hängt von der Anwendung ab.

1. Fall: Sie wollen mit dem Schieberegler eine Temparatur einstellen, die ein Heizgerät dann erzeugen soll. Dabei macht es wenig Sinn, alle Ereignisse bei der Veränderung zu übertragen. Sie können sich auf den letzten Wert beschränken, denn nur der ist relevant. Die richtige Wahl wäre das „Touch Release Event“.

2. Fall: Der Schieberegler verändert die Lautstärke eine Tons. Sie wollen aber während der Veränderung hören, wie laut der Ton aktuell ist und sich nicht erschrecken, wenn Sie den Regler loslassen und der Wert erst dann auf die aktuelle Höhe springt.

Wählen wir für unser Beispiel den 1. Fall, dann ist die Kommunikation über die serielle Schnittstelle auch leichter nachzuvollziehen.

Das Kommando, mit dem wir den Wert einer Komponente aktiv über die serielle Schnittstelle senden können, lautet:

print komponentenName.val in unserem Fall also print eingabe.val

Wir laden das Programm erneut in unseren Nextion und verbinden im HTerm den PC mit der Anzeige.

Falls der Nextion-Editor oder das Terminalprogramm einmal meckert, weil die Schnittstelle belegt ist, dann haben Sie höchstwahrscheinlich noch eines der beiden Programm aktiviert, während Sie das andere starten wollen. Klicken Sie dann entweder im Editor oder im Terminalprogramm auf „Disconnect“.

Wenn Sie jetzt den Schieberegler bewegen, erkennen Sie bei jedem Loslassen eine Meldung im Empfangsfenster von HTerm, die wie folgt aussehen:

 

 

Hier wurde der Schieberegler 3 Mal verändert. Beim ersten Mal blieb der Regler auf dem Wert „25“ (hex: 19) stehen, beim 2. Mal sind es „76“ (hex: 4C) und beim 3. Mal dann „44“ (hex: 2C). Bei einer Übertragung mit dem Befehl „print“ werden 4 Byte übertragen, deshalb die 3 Nullen am Ende.

Bei Übertragungen mit fixer Länge, wie in diesem Fall mit 4 Byte, fehlt die Abschlusssequenz der drei 0xff da sie nicht notwendig sind.

Jetzt haben wir aber noch ein Problem, wenn mehrere Komponenten senden. Wie können wir die Daten auseinander halten? Hier gibt es 2 Möglichkeiten:

  • 1. Sie machen ein Häkchen bei „Send Component ID“ für das „Touch Release Event“. Dann wird die eindeutige Komponente-ID mit gesendet.
  • 2. Sie fügen vor dem print-Befehl, der die Value-Daten sendet einen weiteren print-Befehl hinzu, der den Namen der Komponente sendet, z. B. print "eingabe1"

Schauen wir uns für beide Fälle die Ergebnisse an:

 

 

Beim Senden der ID erhalten wir zunächst einen Code „0x65“, der uns angibt, das es sich um ein Touch-Event handelt, danach folgt eine „0x00“ die für die aktuelle Seite (page 0) steht und im Anschluss sehen wir die ID der Komponente „0x01“. Die 4. Zahl gibt an, ob die Komponeten gedrückt (1) oder losgelassen (0) wurde und dann folgen die drei Endezeichen 0xff. Im Anschluss kommt in 4 Byte der Wert, hier „100“ (hex: 64).

 

 

Im zweiten Fall finden wir unseren String für die Bezeichnung „eingabe1“ und direkt dahinter wieder den Wert. Da auch hier die gesendeten Namen bekannt sind, ist eine Terminierung nicht erforderlich.