Endlich habe ich jetzt die Serial2 Schnittstelle vom NodeMCU ESP32 von Joy-it, an dem Nextion Display, mit dem Tipp eines Users im ArduinoCC Forum zum Laufen gebracht. War eine sehr schwere Geburt. Aber gut, wieder was dazu gelernt. Man braucht dafür eine Lib, die "HardSerial.h" dass man eine eigene Seriale für das Nextion Display hat. Sie ist an den Ausgängen zwar als "Serial2", also als TX2 / RX2 geschriftet, aber wenn man glaubt, man könnte sie einfach so, wie bei vorhandenen Hardware Serial Anschlüssen üblich, benutzen, dann irrt man sich gewaltig.
OK, aber jetzt klappt das schon mal. Das ist jetzt nur ein Testprogram, mit dem ich noch weiter alles was ich beim Nextion brauche, teste. Es fehlen noch die Rückantworten vom Nextion zum ESP32, dann kann ich das ganze im Langzeit - Spannungsüberwachungs Gerät einsetzen.
Code: Alles auswählen
#include <Wire.h>
#include <HardwareSerial.h>
HardwareSerial nxtSerial2(2);
byte NexT[3] = { 255, 255, 255 }; // global deklarieren
const byte bufferSize = 64;
/*
Wird dann so benutzt:
Serial2.write(NexT, 3);
*/
byte Seite = 0; // Nextion Startseite einstellen
int Messung = 35;
int ads_mv0 = 30;
String Text31 = "Ein Test";
unsigned long Sekundenablauf01 = 0;
const unsigned long Pausezeit01 = 5000;
unsigned long startzeit = 0;
unsigned long endzeit = 0;
//######################################################################################
//#################################### SETUP ###########################################
//######################################################################################
//
void setup() {
Serial.begin(115200);
nxtSerial2.begin(9600, SERIAL_8N1, 16, 17);
//
nxtSerial2.print("Startseite.Volt1.val="); // Messung in Anzeigefeld "Volt1" ausgeben.
nxtSerial2.print(Messung);
nxtSerial2.write(NexT, 3);
nxtSerial2.print("Startseite.Volt2.val="); // ads_mv0 in Anzeigefeld "Volt2" ausgeben.
nxtSerial2.print(ads_mv0);
nxtSerial2.write(NexT, 3);
}
//######################################################################################
//#################################### LOOP ############################################
//######################################################################################
//
void loop() {
startzeit = millis();
kommunikation();
NextionRueck();
endzeit = millis();
//Serial.println(endzeit - startzeit);
}
//######################################################################################
//########################## Kommunikation mit dem Nextion #############################
//######################################################################################
//
void kommunikation() {
nxtSerial2.print("DatenzumPC.Textfeld1.txt=\"Ein Test\"");
nxtSerial2.write(NexT, 3);
delay(1000);
nxtSerial2.print("DatenzumPC.Textfeld1.txt=\"Ein weiterer Test\"");
nxtSerial2.write(NexT, 3);
delay(1000);
nxtSerial2.print("Startseite.Volt3.val="); // Messung in Anzeigefeld "Volt1" ausgeben.
nxtSerial2.print(Messung);
nxtSerial2.write(NexT, 3);
nxtSerial2.print("Startseite.Volt4.val="); // ads_mv0 in Anzeigefeld "Volt2" ausgeben.
nxtSerial2.print(ads_mv0);
nxtSerial2.write(NexT, 3);
delay(1000);
nxtSerial2.print("Startseite.Volt4.val=34"); // ads_mv0 in Anzeigefeld "Volt2" ausgeben.
nxtSerial2.write(NexT, 3);
delay(1000);
nxtSerial2.print("Startseite.Volt4.val=37"); // ads_mv0 in Anzeigefeld "Volt2" ausgeben.
nxtSerial2.write(NexT, 3);
delay(1000);
nxtSerial2.print("Startseite.Volt4.val=32"); // ads_mv0 in Anzeigefeld "Volt2" ausgeben.
nxtSerial2.write(NexT, 3);
delay(1000);
nxtSerial2.print("Startseite.Volt3.val=34"); // ads_mv0 in Anzeigefeld "Volt2" ausgeben.
nxtSerial2.write(NexT, 3);
delay(1000);
nxtSerial2.print("Startseite.Volt4.val=39"); // ads_mv0 in Anzeigefeld "Volt2" ausgeben.
nxtSerial2.write(NexT, 3);
}
//######################################################################################
//########################### Rückmeldung vom Nextion auswerten ########################
//######################################################################################
//
void NextionRueck() {
static uint8_t bIndex;
static uint8_t buffer[bufferSize];
bool allesDa = false;
if (nxtSerial2.available()) {
uint8_t inChar = nxtSerial2.read();
buffer[bIndex++] = inChar;
if (inChar == 0xFF && (bIndex >= (*buffer == 0x71 ? 8 : 3)) && buffer[bIndex - 2] == 0xFF && buffer[bIndex - 3] == 0xFF) {
allesDa = true;
} else {
allesDa = (bIndex == bufferSize);
}
}
if (allesDa) {
if (*buffer != 0x65) {
Serial.println(F("No TouchEvent"));
} else {
Serial.print(F("TouchEvent: page "));
Serial.print(buffer[1]);
Serial.print(F(", id "));
Serial.print(buffer[2]);
Serial.print(F(", event "));
Serial.println(buffer[3] ? F("PRESS") : F("RELEASE"));
}
bIndex = 0;
}
}
Ich werde auch mal suchen, ob es andere ESP32 gibt, die das selbe Formal mit den 2x15 Anschlüssen haben und zum Ansprechen der Hardwaremässig vorhandenen Serial2 keine Lib benötigen. Solche Stolperfallen mag ich nicht. Also wenn es andere ESP32 für mein Anschluss - Shield gibt, trette ich die ESP32 von Joy-it in die Tonne. Denn dann kann ich gleich eine SoftSerial Lib nehmen, die ja dann nichts anderes macht, als bestimmte Stifte für TX/RX zu benutzen.