Buttons und IN/OUPUTS Abfragen

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);
}




}



Portmanipulation

Wie meinst Portmanipulation ? Ich bin im dem Thema neu.. aber nach 5 Stunden suchen weiß ich jetzt auch nicht weiter

@mod: Please move to german section.

Hi,

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:

void loop() {
        display_write_message("hello world");
        delay(1000);
}

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?

noch eine weitere Sekunde googeln

Genau das Send Data soll nur die Buttons einlesen und dann auf dem Display den jeweilgen Text ausgeben, das funktioniert.

Jetzt möchte ich gerne einen Eingang einlesen z.B. ESTOP gedrückt, und den dann auf ein anderes Textfeld senden..


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);
}




}

Ach, die Buttons gehören zum Display dazu?
Sprich if(data_from_display =="BT98OFF") ist die Abfrage, ob ein Button gedrückt ist?

Genau wenn er gedrückt ist
"BT98ON" = ON
"BT98OFF" =OFF das tut auch

mir geht es hauptsächlich nur um einen 5V eingang einzulesen und auf ein Textfeld im Display auszugeben

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.

Hast du mir da mal eine Lösung wie ich das richtig mache? steh gerade echt aufm Schlauch...

// PAGE 2 t1.txt HAUPTSTATUS ANZEIGE
// PAGE 2 t4.txt KEYSWITCH ON/OFF

//#####################################################################################################
//SETUP CONTROLLER
//#####################################################################################################
// GENERAL INPUTS
const byte ESTOPIN = 4;      // EINGANG ESTOP IN FÜR MELDUNG
const byte KEYSWITCH = 5;    // EINGANG KEYSWITCH IN FÜR FREIGABE
const byte RESETINTERN = 6;  // EINGANG RESET TASTE INTERN
const byte RESETEXT = 7;     // EINGANG RESET TASTE EXTERN

// OUTPUTS LEDS
const byte LED[4] = {14, 15, 16, 17};
enum LED_Names {
  ESTOPLED ,   // AUSGANG LED ROT FÜR E-STOP AKTIV
  WARNLED ,    // AUSGANG LED GELD WARNUNG LASER EMMISION EIN
  READYLED,   // AUSGANG LED GRÜN SYSTEM READY
  POWERLED    // AUSGANG POWER LED
};
// OUTPUTS RELAIS
const byte RELAIS[8] = {
  18,   // AUSGANG RELAIS 1
  19,   // AUSGANG RELAIS 2
  20,   // AUSGANG RELAIS 3
  21,   // AUSGANG RELAIS 4
  22,   // AUSGANG RELAIS 5
  23,   // AUSGANG RELAIS 6
  24,   // AUSGANG RELAIS 7
  26   // AUSGANG RELAIS 8
};

void setup() {
  Serial.begin(9600);
  Serial.println("SERIAL 1 BEGINN");

  for (byte i = 0; i < sizeof(RELAIS); i++)pinMode(RELAIS[i], OUTPUT);
  for (byte i = 0; i < sizeof(LED); i++)pinMode(LED[i], OUTPUT);
}

void loop() {

  if (Serial.available() > 0) {
    String data_from_display = "";
    delay(30);
    while (Serial.available() > 0)       data_from_display += char(Serial.read());

    Serial.println(data_from_display);

    Serial.print("t1.pco=65504");
    Serial.write(0xff);
    Serial.write(0xff);
    Serial.write(0xff);
    if (data_from_display[5] == 'N' ) Serial.print("t1.txt=\"INTERLOCK ON\"") ;
    else Serial.print("t1.txt=\"INTERLOCK OFF\"");
    Serial.write(0xff);
    Serial.write(0xff);
    Serial.write(0xff);

    Serial.print("t4.pco=65504");                             //+++++++++++++++++++++++++++++++++++++++++++
    Serial.write(0xff);
    Serial.write(0xff);
    Serial.write(0xff);
    if (digitalRead(KEYSWITCH) ) Serial.print("t4.txt=\"OFF\"") ;
    else Serial.print("t4.txt=\"ON\"");                  
    Serial.write(0xff);
    Serial.write(0xff);
    Serial.write(0xff);
    
    digitalWrite(LED[ESTOPLED], !digitalRead(LED[ESTOPLED]));
  }
for (byte i = 0; i < sizeof(RELAIS); i++)digitalWrite(RELAIS[i], i == ((millis() / 1000) % 8));
}

??? JETZT BIN ICH HEFTIG VERWIRRT :smiley:

Will hier jemand 200-300 Euro verdienen wenn ich jemanden zeige wie es aussehen sollen und mit den Code liefert?

so besser?

das habe ich nicht verstanden.

Funktioniert leider nicht so wie gewünscht. Der Code ist zu High End für mich.. ez check ich gar nix mehr

was hälst du für "high end"? meine : welche Zeile?

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

was tut es jetzt?