ich habe bereits alles durchforstet, was ich hier gefunden habe. Ich habe einen Arduino Mega und ein Nextion NX4832K035 Display.
Ich möchte lediglich Daten über den I2C Bus austauschen.
Das HMI sieht so aus: 1 Button der beim Drücken die hexagonale Zahl "4C" verschickt. Das entspricht Dezimal der Zahl 76. Das Programm geht dann in eine Schleife (das funktioniert ganz gut). In der Schleife soll ein Beispieltext in das Textfeld (t0.txt )auf dem Display geschrieben werden (Funktioniert nicht).
Ein zweiter Button schickt beim Drücken die hexagonale Zahl "4D", was dezimal 77 sind. Das Programm geht wieder in eine Schleife und soll die Zahl 77 (n0.val) eintragen.
Man sieht schon, dass da Viel Müll mitkommt und am Display ändert sich absolut nichts. Das Textfeld ist leer und die Zahl hat sich auch nicht geändert.
Falls jemand den Fehler findet, wäre das super.
Vielen Dank!
Da ist einfach die Nachricht t0.txt="AA" angekommen. Genau das, was du auch sendest.
Ob das "viel Müll" ist will ich nicht bewerten, das ist eben Nextions's Art der Kommunikation.
Schau dir mal die einfachen Beispiele/Tutorials zu Nextion an.
Hexagonal ist übrigens "Sechseckig", da willst du wohl nur die Leute verwirren.
Er verschickt auch nur 1 Zeichen. Hier ein Auszug aus der Webseite von Nextion:
---printh 0d // send single byte: value 13 hex: 0x0d---
Also es wird 1 Byte verschickt. Das kommt auch richtig an und ich kann damit super arbeiten.
Das Problem kommt, wenn Daten zurück auf das Display sollen. Da schickt der Controller offenbar mehrere Bytes, und offenbar auch noch an die 1. Serielle Schnittstelle (Ich habe den Bus auf Serial2...).
Ich möchte jetzt also erreichen, dass der Controller nur 1 Byte wieder zurück an das Display schickt über die zweite Serielle Schnittstelle und nicht 10 Bytes mit random Werten und an alle Schnittstellen. Also als Fazit kann man sagen, dass der Serielle Monitor (Serial1) voll ist mit Bytes die er versucht an das Display zu senden.
Wie kann ich jetzt also meinen Code so verändern, dass nur noch z.B. 1 Byte über die 2. Serielle Schnittstelle gesendet wird?
Wenn ich das richtig sehe gibt es möglicherweise diese Probleme:
Im Nextion-Editor ist beim markierten Button "Text" noch "Send Component ID" noch aktiviert. Dann wird natürlich mehr als nur die Zahl gesendet.
Außerdem geht "4C" nicht - eigentlich sollte das eine Fehlermeldung beim Kompilieren der HMI-Datei geben. print 0x4C oder aber print 76 wären korrekt.
Bei meinem Nextion wird eine Zahl als 32-Bit-Wert gesendet; es kommen also mindestens vier Byte (0x4C 00 00 00).
Ich habe nie ausprobiert, ob die serielle Kommunikation mit dem Nextion "full duplex" laufen darf; also senden an t0.txt klappt während die Zahl noch nicht komplett abgeholt ist.
Beim normalen print ... gebe ich dir recht. Aber wenn man printh macht, ist es möglich einzeln ein Byte zu senden. Im Bild sieht man das nochmal.
Wenn du dir das über den Seriellen Monitor anzeigen lässt, was da verschickt wird, hast du dann auch so viel Zeug drin stehen? Falls du Zeit und Lust hast, wäre das interessant für mich zu wissen, ob des vielleicht einfach normal ist.
Für mich war immer klar, dass da was nicht passt, weil nur so viele Daten verschickt werden, wenn ich vom Controller an den Nextion sende.
Ich habe jetzt nochmal etwas ausprobiert. Dieses 3,5 Zoll Display ist nur ein Display zum rumspielen und ausprobieren. Es gibt noch ein 10,5 Zoll Display bei dem der ganze Bums laufen soll.
Deshalb habe ich ein externes Netzteil mit 5V und 2A angeschlossen (das große Display zieht das auch). Bei dem 3,5 Zoll Display habe ich jetzt mal die Stromversorgung an den Arduino gehängt also an 5V und GND. Es schickt zwar immernoch viel mit, aber ich kann jetzt auf einmal Daten an das Display senden. Ich verstehe den Zusammenhang aber leider nicht. Falls das jemand versteht....
Hattest Du bei 3.5" und externem Netzteil die GNDs verbunden?
Kannst/willst Du die HMI-Datei vom 3.5er zur Verfügung stellen? Dann kann ich bei Gelegenheit (wird heute eher nix mehr) meines mal damit versorgen und sehen was ich empfange.
Danke für den Tipp mit printh - habe ich bisher vollständig ignoriert.
Ich habe bisher print gar nicht verwendet, sondern will die Command-ID nehmen; das Projekt ist aber noch sehr am Anfang.
Ich finde, man sollte sich auch bei eigenen Antorten an das Nextionschema halten:
Kennbyte (da sind noch genug frei für eigene Erweiterungen)
Inhalt (je nach Gusto und eigener Festlegung
3 Mal 0xFF
Dann kann man auch die Standardmeldungen auswerten, aus denen man sich sonst ausschließt.
Das Byte in dem markierten Text ist aber nicht irgendein beliebiges Byte. 0x0D ist ein CR (carriage return). und 0x0D 0x0A ist CR + LF
Oder es ist nur ein Beispiel und man kann auch was anderes senden. Wird wohl so sein
Flexibler ist man halt wenn man sich in das allgemeine Protokoll hält mit dem man alle möglichen Daten Versenden kann.
@wno158 Ich werde das .hmi am Dienstag mal hier rein stellen, da ich erst dann wieder in der Arbeit bin. Ich glaube aber, dass das relativ uninteressant sein wird.
Ich habe (und das könnte hier tatsächlich das problem sein) den GND vom Controller und den GND vom Bildschirm nicht auf dem gleichen Potential. Ich habe mir jetzt Spannungsteiler gekauft und werde die 24V des Controllino nach dem guten Herrn Kirchhoff auf 5V für den Bildschirm teilen. Damit kann ich das GND auf das selbe Potential legen und spare mir ein Netzteil.
@Tommy56 kannst du mal bitte einen Beispielcode für das Kennbyte + Inhalt schreiben?
@Serenifly Danke für deine Antwort. Ich habe daran gar nicht gedacht, dass die 0x0D & 0x0A auch für was anderes stehen können.
Ich merke, dass ihr beide wohl vom printh nicht so begeistert seit. Es funktioniert aber ganz gut. Wie gesagt ich bekomme ja nur keine Daten auf das Display. Zur Erinnerung hier nochmal der Code:
Wie würdet ihr den Code schreiben, falls ihr z.B. wie hier ein Textfeld im Nextion ändern wollt? Ich habe ja offenbar nicht den gut funktionierenden "Standartweg" genommen.
Danke für eure Hilfe, das hilft mir wirklich weiter!
Grüße
Das mit dem hmi dient ggf. nur dazu, Deine Datei zum Nachtesten zu verwenden; ich kann mir zwar selbst eins bauen - aber das wird dann u.U. nicht dasselbe Verhalten zeigen.
Zuerst müssen aber die HW-Probleme gelöst werden. Die GND-Verbindung ist Pflicht.
Ich würde statt den Herrn Kirchhoff zu bemühen lieber einen StepDown-Regler verwenden (z.B. hier oder auch da). Gibt's für kleines Geld und liefert zuverlässig die benötigten 5V.
@wno158 das mit dem Abwärtsregler hat man mir tatsächlich auch geraten. Ich habe mir jetzt was auf Amazon bestellt, weil des dann einfach schnell da ist. Abwärtswandler
In dem Fall hat es sogar eine 7-Segment-Anzeige.
Ich werde das am Dienstag einbauen und euch dann mal berichten, weil ich auch der Meinung bin dass es nicht funktioniert, weil nicht das gleiche Potential da ist. Hat ja funktioniert, als ich mit dem kleinen Display auf dem selben Potential war.
@skorpi080 Vielen Dank für den Code! Das werde ich auf jeden Fall ausprobieren. Ich bin immer auf der Suche nach eleganten Lösungen.
Es lag tatsächlich an dem Potentialunterschied der beiden Netzteile. Durch den Spannungsregler konnte ich den Bildschirm mit dem gleichen Netzteil betreiben.
Außerdem benutze ich jetzt öfter "prints" , da man bei dem Ausdruck die Anzahl der Bytes bestimmen kann und es nicht in Hexadezimal umgerechnet wird. Somit schaut der serielle Monitor jetzt auch sehr Schick aus. Ich schicke jetzt nicht mehr mein HMI , da ja alles funktioniert und es nur aus zwei Buttons besteht für Testzwecke.
Das Problem wäre dann damit wohl gelöst und ich habe eine Lektion fürs Leben gelernt. Vielen Dank!!