Send / Recieve Nextion to Arduino Mega

Hallo Community,

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.

Der Code schaut so aus:

void setup() {
Serial.begin(9600);
Serial.println("Start");
Serial2.begin(9600);
}

void loop()
{                         
Nextion_serial_listen();
delay(10);
}

void Nextion_serial_listen()
{
  if(Serial2.available()>0 ){
        
     int Zahl=Serial2.read();
     Serial.print("Zahl:");
     Serial.println(Zahl);

      if(Zahl==76){

        Serial.println("Text");
        Serial2.print("t0.txt=\"AA\"");
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Zahl=0;
      }
      if(Zahl==77){

        Serial.println("Nummer");
        Serial2.print("n0.val=" + String(Zahl));
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Zahl = 0;
      }      
}
}

Wenn ich jetzt in den Seriellen Monitor gucke, dann schaut das so aus:

12:04:43.003 → Start
12:04:48.408 → Zahl:140
12:04:48.408 → Zahl:1
12:04:48.455 → Zahl:1
12:04:48.455 → Zahl:255
12:04:48.455 → Zahl:255
12:04:48.455 → Zahl:255
12:04:48.455 → Zahl:76
12:04:48.501 → Text
12:04:48.501 → Zahl:116
12:04:48.501 → Zahl:48
12:04:48.501 → Zahl:46
12:04:48.501 → Zahl:116
12:04:48.547 → Zahl:120
12:04:48.547 → Zahl:116
12:04:48.547 → Zahl:61
12:04:48.547 → Zahl:34
12:04:48.547 → Zahl:65
12:04:48.593 → Zahl:65
12:04:48.593 → Zahl:34
12:04:48.593 → Zahl:255
12:04:48.593 → Zahl:255
12:04:48.640 → Zahl:255
12:04:52.689 → Zahl:101
12:04:52.689 → Zahl:0
12:04:52.689 → Zahl:2
12:04:52.735 → Zahl:1
12:04:52.735 → Zahl:255
12:04:52.735 → Zahl:255
12:04:52.735 → Zahl:77
12:04:52.735 → Nummer
12:04:52.781 → Zahl:110
12:04:52.781 → Zahl:48
12:04:52.781 → Zahl:46
12:04:52.781 → Zahl:118
12:04:52.781 → Zahl:97
12:04:52.827 → Zahl:108
12:04:52.827 → Zahl:61
12:04:52.827 → Zahl:55
12:04:52.827 → Zahl:55
12:04:52.827 → Zahl:255
12:04:52.874 → Zahl:255
12:04:52.874 → Zahl:255

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!

Dass

    int zahl = Serial2.read();
    Serial.println(zahl);

nur ein Zeichen liest, und dann dessen Code dezimal ausgegeben wird, weißt du sicher.
76 ( oder 0x4C) ist übrigens ein ‘L’ und 77 (0x4D) ein ‘M’

12:04:48.501 → Zahl:116
12:04:48.501 → Zahl:48
12:04:48.501 → Zahl:46
12:04:48.501 → Zahl:116
12:04:48.547 → Zahl:120
12:04:48.547 → Zahl:116
12:04:48.547 → Zahl:61
12:04:48.547 → Zahl:34
12:04:48.547 → Zahl:65
12:04:48.593 → Zahl:65
12:04:48.593 → Zahl:34
12:04:48.593 → Zahl:255
12:04:48.593 → Zahl:255
12:04:48.640 → Zahl:255

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. :slight_smile:

Hallo Michael,

danke für deine Antwort.

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 Dein Nextion an Serial1 hängt, wie soll es dann woanders hin senden?
Ansonsten beschreibe doch mal genau, was Du wo angeschlossen hast.

Gruß Tommy

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.


Gruß Walter

@Tommy56 Es hängt natürlich nicht an Serial1, sondern an Serial 2.

@wno158 Die Component ID ist deaktiviert. Das mit 4C hat tatsächlich sehr gut funktioniert. Ich sehe aber deinen Punkt. Das probiere ich mal noch aus.

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.

Danke für eure Hilfe!

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.

Gruß Tommy

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.

Danke für eure ganzen Antworten!

@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:

        Serial.println("Text");
        Serial2.print("t0.txt=\"AA\"");
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);

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 :slight_smile:

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.


Gruß Walter

1 Like

@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.

Also vielen Dank für eure Hilfe!!

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!! :slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.