Hallo, ich habe nochmal ein Problem zum Thema Nextion Display ich komm einfach nicht darauf..
Vielleicht kann mit jemand mit seinem Fachwissen helfen.
Ich möchte gerne mehrere Buttons sowie ein paar Eingänge abfragen und ein paar ausgänge schalten..
Das mit den Buttons funktioniert schon mal, aber das einlesen mit den EIngängen nicht.
// PAGE 2 t1.txt HAUPTSTATUS ANZEIGE
// PAGE 2 t4.txt KEYSWITCH ON/OFF
//#####################################################################################################
//SETUP CONTROLLER
//#####################################################################################################
// GENERAL INPUTS
int ESTOPIN = 4; // EINGANG ESTOP IN FÜR MELDUNG
int KEYSWITCH=5; // EINGANG KEYSWITCH IN FÜR FREIGABE
int RESETINTERN=6; // EINGANG RESET TASTE INTERN
int RESETEXT=7; // EINGANG RESET TASTE EXTERN
int RESERVE1= 8; // EINGANG RESERVE
int RESERVE2= 9; // EINGANG RESERVE
int RESERVE3= 10; // EINGANG RESERVE
int RESERVE4= 11; // EINGANG RESERVE
int RESERVE5= 12; // EINGANG RESERVE
int RESERVE6= 13; // EINGANG RESERVE
// GENERAL OUTPUTS
// OUTPUTS LEDS
int ESTOPLED= 14; // AUSGANG LED ROT FÜR E-STOP AKTIV
int WARNLED= 15; // AUSGANG LED GELD WARNUNG LASER EMMISION EIN
int READYLED= 16; // AUSGANG LED GRÜN SYSTEM READY
int POWERLED= 17; // AUSGANG POWER LED
// OUTPUTS RELAIS
int RELAIS1= 18; // AUSGANG RELAIS 1
int RELAIS2= 19; // AUSGANG RELAIS 2
int RELAIS3= 20; // AUSGANG RELAIS 3
int RELAIS4= 21; // AUSGANG RELAIS 4
int RELAIS5= 22; // AUSGANG RELAIS 5
int RELAIS6= 23; // AUSGANG RELAIS 6
int RELAIS7= 24; // AUSGANG RELAIS 7
int RELAIS8= 26; // AUSGANG RELAIS 8
int RESERVE7= 27; // AUSGANG RESERVE
int RESERVE8= 28; // AUSGANG RESERVE
int RESERVE9= 29; // AUSGANG RESERVE
int RESERVE10= 30; // AUSGANG RESERVE
int RESERVE11= 31; // AUSGANG RESERVE
void setup() {
// STARTE COMMUNICATION
Serial.begin(9600);
Serial.println("SERIAL 1 BEGINN");
// DEFINIERTE E/As
pinMode(ESTOPIN, INPUT);
pinMode(KEYSWITCH, INPUT);
pinMode(RESETINTERN, INPUT);
pinMode(RESETEXT, INPUT);
pinMode(RELAIS1, OUTPUT);
pinMode(RELAIS2, OUTPUT);
pinMode(RELAIS3, OUTPUT);
pinMode(RELAIS4, OUTPUT);
pinMode(RELAIS5, OUTPUT);
pinMode(RELAIS6, OUTPUT);
pinMode(RELAIS7, OUTPUT);
pinMode(RELAIS8, OUTPUT);
}
//#####################################################################################################
//AUFRUF PROGRAMM
//#####################################################################################################
void loop() {
if(Serial.available()){
String data_from_display="";
delay(30);
while(Serial.available()){
data_from_display += char(Serial.read());
}
Serial.println(data_from_display);
sendData(data_from_display);
}
}
void sendData(String data_from_display)
{
if(data_from_display =="BT98ON")
{
Serial.print("t1.pco=65504");
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
Serial.print("t1.txt=\"INTERLOCK ON\"");
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
if(data_from_display =="BT98OFF"){
Serial.print("t1.pco=65504");
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
Serial.print("t1.txt=\"INTERLOCK OFF\"");
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
if (digitalRead(KEYSWITCH) == HIGH){ // FUNKTION MELDUNG KEYSWITCH OFF/ON
Serial.print("t4.pco=65504"); //+++++++++++++++++++++++++++++++++++++++++++
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
Serial.print("t4.txt=\"OFF\""); // SENDE TEXT AN DISPLAY KEYSWITCH OFF
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
else if (digitalRead(KEYSWITCH) == LOW){ // FUNKTION MELDUNG KEYSWITCH OFF/ON
Serial.print("t4.pco=65504"); //+++++++++++++++++++++++++++++++++++++++++++
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
Serial.print("t4.txt=\"ON\""); // SENDE TEXT AN DISPLAY KEYSWITCH OFF
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
}
Was genau geht denn nicht? Inwiefern unterscheiden sich (auch elektrisch) die Eingänge und die Buttons?
Mal nebenbei: Du solltest die Abfrage der Buttons/Eingänge nicht in die Funktion "sendData" tun. Denn: was hat das Auslesen der Eingänge mit dem Display zu tun? Nichts. Das zu separieren erhöht die Lesbarkeit und Wartbarkeit und hilft auch anderen Leuten (zum Beispiel im Forum) deinen Code zu verstehen.
Also den Button einlesen und etwas ausgeben auf dem Display funktioniert.
Was nicht funktioniert ist wenn ich einen Eingang einlesen möchte diesen dann mit einem Text an das Display senden (wie eine Art Meldung)
Da musst du noch etwas genauer werden. Funktioniert das Lesen der Eingänge nicht? Das kannst du zum Beispiel mit einer einfachen Debug-Ausgabe prüfen:
if (digitalRead(ESTOPIN) == HIGH) {
Serial.println("estopin gedrueckt");
}
Oder wird nach einem erfolgreich erkannten Flankenwechsel/Pegel keine Nachricht aufs Display geschrieben? Dann könntest du erstmal überprüfen, ob die Nachricht generell auf das Display geschrieben werden kann:
Wenn beides für sich funktioniert, dann weißt du schonmal, dass der Fehler irgendwo zwischen dem Einlesen und der Ausgabe auf dem Display liegen muss.
EDIT: Okay, es scheint, dass du beides schon geprüft hast, sehr schön. Kannst du einmal die Stelle im Code posten, wo du die Eingänge einliest und was auf dem Display ausgeben willst? Ich vermute mal in send_data liest du nur die Buttons?
Wenn ich mir deine Loop-Funktion so anschaue, dann wird send_data (also da wo du aktuell auch die Eingänge überprüfst) nur aufgerufen, wenn serielle Daten empfangen wurden.
Die Eingänge, besonders der E-Stop (!!), darf aber von sowas nicht abhängig sein. Probiere mal die Eingänge immer zu prüfen, auch wenn keine seriellen Daten vorhanden sind:
void loop()
{
// Kommunikation mit Display (buttons auslesen)
if(Serial.available()){
String data_from_display="";
delay(30);
while(Serial.available()){
data_from_display += char(Serial.read());
}
Serial.println(data_from_display);
sendData(data_from_display);
}
// hier die Eingänge prüfen
if (digitalRead(KEYSWITCH) == HIGH){ // FUNKTION MELDUNG KEYSWITCH OFF/ON
Serial.print("t4.pco=65504"); //+++++++++++++++++++++++++++++++++++++++++++
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
Serial.print("t4.txt=\"OFF\""); // SENDE TEXT AN DISPLAY KEYSWITCH OFF
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
else if (digitalRead(KEYSWITCH) == LOW){ // FUNKTION MELDUNG KEYSWITCH OFF/ON
Serial.print("t4.pco=65504"); //+++++++++++++++++++++++++++++++++++++++++++
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
Serial.print("t4.txt=\"ON\""); // SENDE TEXT AN DISPLAY KEYSWITCH OFF
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
}
Das Prüfen der Eingänge sollte natürlich in eine eigene Funktion und das Schreiben auf dem Display sollte natürlich nur beim Pegelwechsel passieren. Aber zum Testen sollte das gehen.
Ich versteh jetzt mit deinem neuen Code nur Bahnhof.
Ich möchte einfach von einem Display mehrere Buttons über die Serielle Schnittstelle abfragen.
und z.B. einen Text wieder auf das Display senden oder ein Relais schalten.
Und Eingänge einlesen und dementsprechend dann auch ein Textfeld beschreiben oder einen Ausgang schalten..