Nextion mit esp32

Ich beschäftige mich seid heute früh mit einem Nextion Display, welches ich gerne mit einem esp32 verbinden würde.

Nach vielen versuchen habe ich es jetzt auch endlich geschafft das ich einen wert in einem Textfeld anzeigen kann. Nur die abfrage von 2 Button will einfach nicht funktionieren und ich komm nicht darauf was falsch ist.

Was ich bis jetzt gemacht habe:

Im Nextion Editor ein kleines Menü erstellt mit 2 Button und einem Textfeld.

Alles befindet sich auf page0

Das Textfeld hat die id:1 und den objnamen:t0
Button1 hat die id:2 und den objnamen:b0
Button1 hat die id:3 und den objnamen:b1

Das Hochladen auf das Display hat ohne Probleme funktioniert

dann, hab ich die ITEADLIB_Arduino_Nextion library installiert und mithilfe dieser Seite für den esp32 angepasst.
(erst habe ich es ohne die library versucht da überall von der abgeraten wird, leider konnte ich ohne diese aber Nichtmal den Text ändern)

Danach hab ich diesen code hochgeladen

#include "Nextion.h"
#define ONBOARD_LED  2
float counter = 0;


NexButton p0_b0 = NexButton(0,2,"b0");
NexButton p0_b1 = NexButton(0,3,"b1");
NexText p0_t0 = NexText(0,1,"t0");

uint32_t next, myInt = 0;


NexTouch *nex_listen_list[] = {
  &p0_b0, &p0_b1, NULL
};

void p0_b1_Press(void *ptr) {
counter=counter+10;
Serial.print("Button1");
  
}

void p0_b0_Press(void *ptr) {
  
  counter=counter-10;
  Serial.print("Button0");
}

void setup() {
  // put your setup code here, to run once:

nexInit();
pinMode(ONBOARD_LED,OUTPUT);
digitalWrite(ONBOARD_LED,LOW);
p0_b0.attachPush(p0_b0_Press, &p0_b0);
p0_b1.attachPush(p0_b1_Press, &p0_b1);
p0_t0.setText("Arduino Text");
next = millis();
}

void loop() {
  // put your main code here, to run repeatedly:
delay(50);

counter=counter+0.5;

String myStr;
myStr=String(counter);

p0_t0.setText(myStr.c_str());

Serial.print("test");
nexLoop(nex_listen_list);
}

Der esp ist mit RX auf pin17 und mit TX auf 16
(hab es auch schon andersrum versucht leider ohne Erfolg)

Mit dem Setup zeigt das Display den count wert an und zählt immer um 0.5 hoch.
Im Seriell Monitor wird folgendes ausgegeben test recvRetCommandFinished ok

wen ich Button 1 oder 0 drücke passiert nichts

Wäre super wen mir einer sagen könnte was ich falsch mache. Ich bin mir sicher, dass es nur eine Kleinigkeit ist aber ich komm einfach nicht drauf was es ist.

Und dann habe ich noch eine Frage. Wen ich das Problem mit dem Button gelöst haben möchte ich noch einen INA219 mit dem esp verbinden. Ist das möglich oder bekomme ich da Probleme?

Ich habe jetzt nämlich schon mehrmals gelesen, dass ein Sensor Probleme bei der Kommunikation zwischen Arduino und Nextion verursachen kann.

Hier arbeitet kaum einer mit der Nextion-Lib, da deren Qualität nicht berauschend ist.
Man kann das problemlos selbst handeln.

Whandall hat mal eine sehr gute Routine hier im Forum veröffentlicht. Ich habe eine Funktion draus gemacht:

// nach Whandall 05.09.2019 forum.arduino.cc
// https://forum.arduino.cc/index.php?topic=634382.15
const byte bufferSize = 15;
uint8_t buffer[bufferSize];

bool readNex(Stream s) {
  static uint8_t bIndex = 0;
  bool allesDa = false;
  if (s.available()) {
    uint8_t inChar = s.read();
    buffer[bIndex++] = inChar;
		// 0x71 bei diesen Paketen können drei 0xFF Bestandteil des Pakets sein,
    // also ergibt es nur Sinn auf die Delimiter hinter dem Wert zu testen
    if (inChar == 0xFF && (bIndex >= (*buffer == 0x71 ? 8 : 3)) &&
        buffer[bIndex - 2] == 0xFF && buffer[bIndex - 3] == 0xFF) {
      allesDa = true;
    } else {
      allesDa = (bIndex == bufferSize);
    }
  }
  if (allesDa) bIndex = 0; // Index zurücksetzen 
  return allesDa;
}

// im loop() 

unsigned long varVomNextion;
bool fertig = readNex(Serial2);
if (fertig) {
  // auswerten
}

Für die Auswertung brauchst Du die Returncodes aus dem Manual.

Gruß Tommy

Edit: Wo hast Du denn das Nextion angeschlossen? Das verwendet aber 5V-Pegel. Der ESP32 ist nach meinem Wissen (man möge mich korrigieren) nicht 5V-tolerant.

Und warum sollte ein Sensor Probleme bereiten, wenn ein Nextion angeschlossen ist ?
Zeig uns mal einen Link wo das steht.

Tommy56:
Edit: Wo hast Du denn das Nextion angeschlossen? Das verwendet aber 5V-Pegel. Der ESP32 ist nach meinem Wissen (man möge mich korrigieren) nicht 5V-tolerant.

Erstmal danke für deine Antwort :smiley:

Das Display habe ich an de 5V und ground pin des esp angeschlossen.

Ich habe jetzt mithilfe deines Beispiels einen neuen code geschrieben. Der schaut folgendermaßen aus.

const byte bufferSize = 15;
uint8_t buffer[bufferSize];
float count=0;
float countalt=0;
byte NexT[3] = {255, 255, 255};

bool readNex(Stream s) {
  static uint8_t bIndex = 0;
  bool allesDa = false;
  if (s.available()) {
    uint8_t inChar = s.read();
    buffer[bIndex++] = inChar;
    // 0x71 bei diesen Paketen können drei 0xFF Bestandteil des Pakets sein,
    // also ergibt es nur Sinn auf die Delimiter hinter dem Wert zu testen
    if (inChar == 0xFF && (bIndex >= (*buffer == 0x71 ? 8 : 3)) &&
        buffer[bIndex - 2] == 0xFF && buffer[bIndex - 3] == 0xFF) {
      allesDa = true;
    } else {
      allesDa = (bIndex == bufferSize);
    }
  }
  if (allesDa) bIndex = 0; // Index zurücksetzen
  return allesDa;
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(250000);
  Serial2.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
unsigned long varVomNextion;
bool fertig = readNex(Serial2);

Serial.print(fertig);

if (fertig=65 00 02 01 FF FF FF ) {
count=count+0.5;
}

if (fertig=65 00 03 01 FF FF FF ) {
count=count-0.5;
}

if (countalt != count ) {

countalt=count;
  
  String myStr;
  myStr=String(count);
  
  
  Serial2.print("t0.txt=\"");
  Serial2.print(myStr);
  Serial2.write('"');
  Serial2.write(NexT, 3); 
}

delay(50);
}

Leider bekomme ich noch jede menge Fehlermeldungen, die ich nicht loswerde.

sketch_jun21a:7:21: error: cannot declare parameter 's' to be of abstract type 'Stream'

 bool readNex(Stream s) {

                     ^

In file included from C:\Users\Max\Documents\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:147:0,

                 from C:\Users\Max\AppData\Local\Temp\arduino_build_733418\sketch\sketch_jun21a.ino.cpp:1:

C:\Users\Max\Documents\Arduino\hardware\espressif\esp32\cores\esp32/Stream.h:38:7: note:   because the following virtual functions are pure within 'Stream':

 class Stream: public Print

       ^

In file included from C:\Users\Max\Documents\Arduino\hardware\espressif\esp32\cores\esp32/Stream.h:26:0,

                 from C:\Users\Max\Documents\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:147,

                 from C:\Users\Max\AppData\Local\Temp\arduino_build_733418\sketch\sketch_jun21a.ino.cpp:1:

C:\Users\Max\Documents\Arduino\hardware\espressif\esp32\cores\esp32/Print.h:60:20: note: 	virtual size_t Print::write(uint8_t)

     virtual size_t write(uint8_t) = 0;

                    ^

In file included from C:\Users\Max\Documents\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:147:0,

                 from C:\Users\Max\AppData\Local\Temp\arduino_build_733418\sketch\sketch_jun21a.ino.cpp:1:

C:\Users\Max\Documents\Arduino\hardware\espressif\esp32\cores\esp32/Stream.h:48:17: note: 	virtual int Stream::available()

     virtual int available() = 0;

                 ^

C:\Users\Max\Documents\Arduino\hardware\espressif\esp32\cores\esp32/Stream.h:49:17: note: 	virtual int Stream::read()

     virtual int read() = 0;

                 ^

C:\Users\Max\Documents\Arduino\hardware\espressif\esp32\cores\esp32/Stream.h:50:17: note: 	virtual int Stream::peek()

     virtual int peek() = 0;

                 ^

C:\Users\Max\Documents\Arduino\hardware\espressif\esp32\cores\esp32/Stream.h:51:18: note: 	virtual void Stream::flush()

     virtual void flush() = 0;

                  ^

sketch_jun21a:7:21: error: cannot declare parameter 's' to be of abstract type 'Stream'

 bool readNex(Stream s) {

                     ^

C:\Users\Max\AppData\Local\Temp\arduino_modified_sketch_341627\sketch_jun21a.ino: In function 'void loop()':

sketch_jun21a:36:30: error: cannot allocate an object of abstract type 'Stream'

 bool fertig = readNex(Serial2);

                              ^

sketch_jun21a:40:15: error: expected ')' before numeric constant

 if (fertig=65 00 02 01 FF FF FF ) {

               ^

sketch_jun21a:44:15: error: expected ')' before numeric constant

 if (fertig=65 00 03 01 FF FF FF ) {

               ^

exit status 1
cannot declare parameter 's' to be of abstract type 'Stream'

Wäre super wen mir jemand sagen kann was ich falsch mache. ???

Ich habe es in meinem Beitrag korrigiert. Es muss Stream &s heißen.

Gruß Tommy

Moto20x:
Wäre super wen mir jemand sagen kann was ich falsch mache. ???

Wäre aber auch super, wenn du unsere Fragen beantwortest.

Tommy56:
Ich habe es in meinem Beitrag korrigiert. Es muss Stream &s heißen.

Gruß Tommy

Ah OK. Werde ich mal ausprobieren.

Ich hab jetzt aber auch noch eine andere Möglichkeit gefunden die super für mich funktioniert. Ich glaube, das Prinzip ist das gleiche wie du gesagt hast. Nur das ich bei der Nextion Software anstelle von dem send comand ID mit print"XXX" einen wert übermittel welchen ich dann mit dem code auslese.

    if (Serial2.available()){
     String data_from_display="";
     delay(20);
     while(Serial2.available()){
      data_from_display +=char(Serial2.read());
     
     }
     Serial.println(data_from_display);
     sendData(data_from_display);
    Menueloop();
  
  }

void sendData(String data_from_display){

//Menü abfragen

    if(data_from_display == "P0"){
    Serial.println("Menü=0");
    Menue=0;
  }
}

Vielen Dank nochmal für die Hilfe :slight_smile:

Wenn Du eigene print-Ausgaben auf dem Nextion generierst, solltest Du dich möglichst an den Aufbau:

Kennbyte, Inhalt, 3 Mal 0xFF

halten, wie bei den normalen Ausgaben, sonst kannst Du diese nicht mehr empfangen.
Es sind noch genug Kennbytes frei.

Gruß Tommy

Tommy56:
Wenn Du eigene print-Ausgaben auf dem Nextion generierst, solltest Du dich möglichst an den Aufbau:

Kennbyte, Inhalt, 3 Mal 0xFF

Wie meinst Du das genau?

Ich habe halt jetzt einfach wen ich z.b. einen Button drücke bei Touch Press Event print "WUp" drin stehen. Bei der Ausgabe im Debug wird dann 57 55 70 angezeigt ohne die 3 FF.

Das Auslesen mit dem esp funktioniert so weit aber ohne Probleme.

Das kannst Du machen, aber dann kannst Du die Standardausgaben des Nextion nicht mehr empfangen.
Wenn Du es doch so machen willst, solltest Du evtl. dann noch ein '\n' als Endekennung anhängen, sonst weißt Du ja nicht, wann Deine Übertragung zu Ende ist.

Die Rückgaben vom Nextion, die ich verlinkt habe, musst Du schon selbst lesen, um deren Aufbau zu verstehen.

Gruß Tommy