{"id":94,"date":"2019-04-14T14:41:14","date_gmt":"2019-04-14T12:41:14","guid":{"rendered":"http:\/\/wordpress.werner-boecker.info\/?page_id=94"},"modified":"2025-06-06T21:58:36","modified_gmt":"2025-06-06T19:58:36","slug":"daten-vom-nextion-empfangen","status":"publish","type":"page","link":"https:\/\/technical-publishing.de\/?page_id=94","title":{"rendered":"Daten vom Nextion empfangen"},"content":{"rendered":"\r\n<div class=\"textregion\">\r\n<p>Wir wissen jetzt prinzipiell, wie wir vom Host-Controller aus auf die Komponenten der grafischen Oberfl\u00e4che zugreifen k\u00f6nnen. Schauen wir uns nun an, wie der Nextion Daten an interne Komponenten oder aber an unseren Host-Controller schickt.<\/p>\r\n<p>H\u00e4ufig werden Benutzereingaben nicht nur an die vearbeitende Einheit \u00fcbertragen, sondern auch als R\u00fcckmeldung dargestellt.<\/p>\r\n<div class=\"beispiel\">Beispiel: Bei einem Taschenrechner m\u00fcssen die eingegeben Zeichen dargestellt werden, damit der Anwender sieht, ob seine Eingabe auch korrekt ist.<\/div>\r\n<p>Bei einer konventionellen Mikrocontroller-Anwendung w\u00fcrde das wie folgt ablaufen:<\/p>\r\n<ul>\r\n<li>Die Tastatur-Eingabe wird laufend abgefragt.<\/li>\r\n<li>Der Controller \u00fcbernimmt die Daten und speichert sie f\u00fcr die Verarbeitung.<\/li>\r\n<li>Der Controller konvertiert falls erforderlich die Daten und steuert damit die Anzeige an.<\/li>\r\n<\/ul>\r\n<p>Dadurch ist der eigentliche Mikrocontroller sehr stark besch\u00e4ftigt. Arbeiten Sie hingegen mit einem Nextion-Display, so geschieht die Synchronisierung zwischen der Eingabe und der Anzeige (oder beliebigen anderen GUI-Komponenten) ausschlie\u00dflich auf der Seite des Nextions. Dazu werden wir ein kleines Beispiel erstellen<\/p>\r\n<h3>Interne Kommunikation<\/h3>\r\n<p>F\u00fcr unser Beispiel nutzen wir einen Schieberegler und eine numerische Ausgabe, die den eingestellten Wert anzeigt. Der Nextion-Editor vergibt f\u00fcr den ersten Schieberegler den Namen &#8222;h0&#8220; und f\u00fcr die numerischen Anzeige &#8222;n0&#8220;. Wir \u00e4ndern diese Werte in &#8222;eingabe&#8220; und &#8222;ausgabe&#8220;.<\/p>\r\n<p>&nbsp;<\/p>\r\n<div class=\"imgDiv\">\r\n<div class=\"imgDiv\">\r\n<div class=\"imgDiv\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-217 size-full\" src=\"http:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2.png\" alt=\"\" width=\"404\" height=\"244\" srcset=\"https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2.png 404w, https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2-300x181.png 300w\" sizes=\"auto, (max-width: 404px) 100vw, 404px\" \/><\/div>\r\n<div>&nbsp;<\/div>\r\n<\/div>\r\n<\/div>\r\n<p id=\"anker\">Wir wissen, dass die Werte einer Komponente durch die Eigenschaft &#8222;val&#8220; repr\u00e4sentiert wird. Die Beziehung w\u00fcrde im Beispiel durch die Gleichung &#8222;ausgabe.val = eingabe.val&#8220; bestimmt und genauso k\u00f6nnen 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 \u00f6ffnet sich unten das entsprechen Fenster mit den Events:<\/p>\r\n<p>&nbsp;<\/p>\r\n<div class=\"imgDiv\">\r\n<div class=\"imgDiv\">\r\n<div class=\"imgDiv\">\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-218 size-full\" src=\"http:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2a.png\" alt=\"\" width=\"717\" height=\"95\" srcset=\"https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2a.png 717w, https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2a-300x40.png 300w, https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2a-700x93.png 700w\" sizes=\"auto, (max-width: 717px) 100vw, 717px\" \/><\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<p>&nbsp;<\/p>\r\n<p>Jetzt m\u00fcssen wir nur noch festlegen, welches Event am besten geeignet. Beim &#8222;Touch Press Event&#8220; wird der Wert jedes Mal erneuert, wenn wir auf den Schieberegler dr\u00fccken &#8211; das ist nicht sehr sinnvoll, denn wir wollen ja wissen, welcher Wert eingestellt wurde, wenn der Regler wieder losgelassen wird. Von daher w\u00e4re &#8222;Touch Release Event&#8220; besser geeignet, aber dann w\u00fcrden wir den neuen Wert erst dann sehen, wenn wir den Regler los lassen. Ideal ist &#8222;Touch Move&#8220;, dabei wird bei jeder Bewegung ein Ereignis ausgel\u00f6st. Also tragen wir hier unsere Bedingung ein:<\/p>\r\n<p>&nbsp;<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-219 size-full\" src=\"http:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2b.png\" alt=\"\" width=\"717\" height=\"130\" srcset=\"https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2b.png 717w, https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2b-300x54.png 300w, https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2b-700x127.png 700w\" sizes=\"auto, (max-width: 717px) 100vw, 717px\" \/><\/p>\r\n<div class=\"imgDiv\">&nbsp;<\/div>\r\n<p>Eine besonders vorteilhafte Funktion des Nextion-Editors ist der Debugger. Wir k\u00f6nnen eine bestimmte Funktionalit\u00e4t sofort testen, ohne das Programm extra uploaden zu m\u00fcssen. Das tun wir jetzt und es funktoniert genauso wie wir es uns vorgestellt haben.<\/p>\r\n<p>&nbsp;<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-220 size-full\" src=\"http:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2c.png\" alt=\"\" width=\"403\" height=\"245\" srcset=\"https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2c.png 403w, https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2c-300x182.png 300w\" sizes=\"auto, (max-width: 403px) 100vw, 403px\" \/><\/p>\r\n<div class=\"imgDiv\">\r\n<p>&nbsp;<\/p>\r\n<\/div>\r\n<p>Danach laden wir die Datei ins Nextion, um zu pr\u00fcfen, 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\u00f6nnen wir auch nicht direkt ver\u00e4ndern, wir k\u00f6nnen aber innerhalb der Verbindungsbedingung anstatt der 1:1-Verbindung eine Formel eingeben, z. B. &#8222;ausgabe.val = eingabe.val * 2&#8220;.<\/p>\r\n<h3>Senden der Daten an den Host-Controller<\/h3>\r\n<p>Die hauts\u00e4chliche Arbeit &#8211; das Anzeigen und Erneuern des Schiebereglers und das Aktualisieren der Anzeige \u00fcbernimmt 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.<\/p>\r\n<p>Das Ereignis k\u00f6nnten wir bei &#8222;Touch Move&#8220; belassen, aber welches Event tats\u00e4chlich das richtige ist, h\u00e4ngt von der Anwendung ab.<\/p>\r\n<div class=\"beispiel\"><b>1. Fall:<\/b> Sie wollen mit dem Schieberegler eine Temparatur einstellen, die ein Heizger\u00e4t dann erzeugen soll. Dabei macht es wenig Sinn, alle Ereignisse bei der Ver\u00e4nderung zu \u00fcbertragen. Sie k\u00f6nnen sich auf den letzten Wert beschr\u00e4nken, denn nur der ist relevant. Die richtige Wahl w\u00e4re das &#8222;Touch Release Event&#8220;.\r\n<p><b>2. Fall:<\/b> Der Schieberegler ver\u00e4ndert die Lautst\u00e4rke eine Tons. Sie wollen aber w\u00e4hrend der Ver\u00e4nderung h\u00f6ren, wie laut der Ton aktuell ist und sich nicht erschrecken, wenn Sie den Regler loslassen und der Wert erst dann auf die aktuelle H\u00f6he springt.<\/p>\r\n<\/div>\r\n<p>W\u00e4hlen wir f\u00fcr unser Beispiel den 1. Fall, dann ist die Kommunikation \u00fcber die serielle Schnittstelle auch leichter nachzuvollziehen.<\/p>\r\n<p>Das Kommando, mit dem wir den Wert einer Komponente aktiv \u00fcber die serielle Schnittstelle senden k\u00f6nnen, lautet:<\/p>\r\n<p><code>print komponentenName.val<\/code> in unserem Fall also <code>print eingabe.val<\/code><\/p>\r\n<p>Wir laden das Programm erneut in unseren Nextion und verbinden im HTerm den PC mit der Anzeige.<\/p>\r\n<div class=\"hinweis\">Falls der Nextion-Editor oder das Terminalprogramm einmal meckert, weil die Schnittstelle belegt ist, dann haben Sie h\u00f6chstwahrscheinlich noch eines der beiden Programm aktiviert, w\u00e4hrend Sie das andere starten wollen. Klicken Sie dann entweder im Editor oder im Terminalprogramm auf &#8222;Disconnect&#8220;.<\/div>\r\n<p>Wenn Sie jetzt den Schieberegler bewegen, erkennen Sie bei jedem Loslassen eine Meldung im Empfangsfenster von HTerm, die wie folgt aussehen:<\/p>\r\n<p>&nbsp;<\/p>\r\n<\/div>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-221\" src=\"http:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2d.png\" alt=\"\" width=\"477\" height=\"186\" srcset=\"https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2d.png 477w, https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2d-300x117.png 300w\" sizes=\"auto, (max-width: 477px) 100vw, 477px\" \/><\/p>\r\n<div class=\"textregion\">\r\n<div class=\"imgDiv\">&nbsp;<\/div>\r\n<p>Hier wurde der Schieberegler 3 Mal ver\u00e4ndert. Beim ersten Mal blieb der Regler auf dem Wert &#8222;25&#8220; (hex: 19) stehen, beim 2. Mal sind es &#8222;76&#8220; (hex: 4C) und beim 3. Mal dann &#8222;44&#8220; (hex: 2C). Bei einer \u00dcbertragung mit dem Befehl &#8222;print&#8220; werden 4 Byte \u00fcbertragen, deshalb die 3 Nullen am Ende.<\/p>\r\n<div class=\"hinweis\">Bei \u00dcbertragungen mit fixer L\u00e4nge, wie in diesem Fall mit 4 Byte, fehlt die Abschlusssequenz der drei 0xff da sie nicht notwendig sind.<\/div>\r\n<p>Jetzt haben wir aber noch ein Problem, wenn mehrere Komponenten senden. Wie k\u00f6nnen wir die Daten auseinander halten? Hier gibt es 2 M\u00f6glichkeiten:<\/p>\r\n<ul>\r\n<li>1. Sie machen ein H\u00e4kchen bei &#8222;Send Component ID&#8220; f\u00fcr das &#8222;Touch Release Event&#8220;. Dann wird die eindeutige Komponente-ID mit gesendet.<\/li>\r\n<li>2. Sie f\u00fcgen vor dem print-Befehl, der die Value-Daten sendet einen weiteren print-Befehl hinzu, der den Namen der Komponente sendet, z. B. <code>print \"eingabe1\"<\/code><\/li>\r\n<\/ul>\r\n<p>Schauen wir uns f\u00fcr beide F\u00e4lle die Ergebnisse an:<\/p>\r\n<p>&nbsp;<\/p>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-222\" src=\"http:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2e.png\" alt=\"\" width=\"394\" height=\"122\" srcset=\"https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2e.png 394w, https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2e-300x93.png 300w\" sizes=\"auto, (max-width: 394px) 100vw, 394px\" \/><\/p>\r\n<div class=\"imgDiv\">&nbsp;<\/div>\r\n<p>Beim Senden der ID erhalten wir zun\u00e4chst einen Code &#8222;0x65&#8220;, der uns angibt, das es sich um ein Touch-Event handelt, danach folgt eine &#8222;0x00&#8220; die f\u00fcr die aktuelle Seite (page 0) steht und im Anschluss sehen wir die ID der Komponente &#8222;0x01&#8220;. Die 4. Zahl gibt an, ob die Komponeten gedr\u00fcckt (1) oder losgelassen (0) wurde und dann folgen die drei Endezeichen 0xff. Im Anschluss kommt in 4 Byte der Wert, hier &#8222;100&#8220; (hex: 64).<\/p>\r\n<p>&nbsp;<\/p>\r\n<\/div>\r\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-223\" src=\"http:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2f.png\" alt=\"\" width=\"390\" height=\"136\" srcset=\"https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2f.png 390w, https:\/\/technical-publishing.de\/wp-content\/uploads\/2019\/04\/beispiel2f-300x105.png 300w\" sizes=\"auto, (max-width: 390px) 100vw, 390px\" \/><\/p>\r\n<div class=\"imgDiv\">&nbsp;<\/div>\r\n<div class=\"textregion\">\r\n<p>Im zweiten Fall finden wir unseren String f\u00fcr die Bezeichnung &#8222;eingabe1&#8220; und direkt dahinter wieder den Wert. Da auch hier die gesendeten Namen bekannt sind, ist eine Terminierung nicht erforderlich.<\/p>\r\n<\/div>\r\n<div class=\"footer\">&nbsp;<\/div>\r\n\r\n\r\n\r\n<p>&nbsp;<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>Wir wissen jetzt prinzipiell, wie wir vom Host-Controller aus auf die Komponenten der grafischen Oberfl\u00e4che zugreifen k\u00f6nnen. Schauen wir uns nun an, wie der Nextion Daten an interne Komponenten oder aber an unseren Host-Controller schickt. H\u00e4ufig werden Benutzereingaben nicht nur an die vearbeitende Einheit \u00fcbertragen, sondern auch als R\u00fcckmeldung dargestellt. Beispiel: Bei einem Taschenrechner m\u00fcssen&hellip;&nbsp;<a href=\"https:\/\/technical-publishing.de\/?page_id=94\" rel=\"bookmark\">Weiterlesen &raquo;<span class=\"screen-reader-text\">Daten vom Nextion empfangen<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":113,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":70,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"class_list":["post-94","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/pages\/94","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/technical-publishing.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=94"}],"version-history":[{"count":10,"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/pages\/94\/revisions"}],"predecessor-version":[{"id":224,"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/pages\/94\/revisions\/224"}],"up":[{"embeddable":true,"href":"https:\/\/technical-publishing.de\/index.php?rest_route=\/wp\/v2\/pages\/113"}],"wp:attachment":[{"href":"https:\/\/technical-publishing.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}