Problem Mit Relaisschaltung und Code

Hallo,
Ich erstelle gerade einen Code auf einem ESP 32 mit angeschlossenem Nextion Display.
Das Display hängt an den seriellen Ports (RX=16, TX=17). Die Buttons sind als DualState Buttons definiert.

Habe folgende Probleme:
Die Ausgänge zu den Relais (hier hängen derzeit Leds) funktioniert nur eine auf GPIO 13. Die anderen reagieren nicht.
Das Problem mit dem Code ist mir auch schleierhaft. Wenn ich den Button mit Name "Weichen" drücke, steht zwar am Display noch aus. Hier Button soll ja gleich zwei Buttons (Ausgänge) bedienen. Danach funktioniert aber gar nichts mehr am Display.
Erst nach einem Reset funktioniert es wieder.

Hier mein Code:


```cpp
// esp32 mit Nextion Display

#include <SoftwareSerial.h>
SoftwareSerial nextion(16, 17); // RX, TX

String daten_display = "";
int btn_state = 0;
// Ausgänge für Relais festlegen
unsigned int REL_Boxg=37;
unsigned int REL_AKS=36;
unsigned int REL_WEI=33;
unsigned int REL_Bah=31;
unsigned int REL_AD=30;
unsigned int REL_Saf=13;

void setup() {
  nextion.begin(9600); 
  pinMode(REL_Boxg,OUTPUT);
  pinMode(REL_AKS,OUTPUT);
  pinMode(REL_WEI,OUTPUT);
  pinMode(REL_Bah,OUTPUT);
  pinMode(REL_AD,OUTPUT);
  pinMode(REL_Saf,OUTPUT);
}

void loop() {
//Schauen ob Daten an der Seriellen Schnittstelle ankommen.
  if (nextion.available() > 0)
  {
    daten_display += char (nextion.read());
    
  }

// Abfrage zu den jeweiligen Buttons.
  if (daten_display == "Boxengasse" && (!btn_state)) {

    btn_state = 1;
    digitalWrite(REL_Boxg, HIGH);
    nextion.print("tb0.txt=\"AUS\"");
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
    
  }
  else if (daten_display == "Boxengasse" && (btn_state))
  {
    btn_state = 0;
    digitalWrite(REL_Boxg, LOW);
    nextion.print("tb0.txt=\" \"");
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";

  }
  if (daten_display == "AKS" && (!btn_state)) {

    btn_state = 1;
    digitalWrite(REL_AKS, HIGH);
    nextion.print("tb1.txt=\"AUS\"");
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
  }
  else if (daten_display == "AKS" && (btn_state))
  {
    btn_state = 0;
    digitalWrite(REL_AKS, LOW);
    nextion.print("tb1.txt=\" \"");
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
  }

  if (daten_display == "Weichen" && (!btn_state))
  {
    btn_state = 1;
    digitalWrite(REL_WEI, HIGH);
    digitalWrite(REL_AKS, HIGH);          //AKS wird auch abgeschaltet
    nextion.print("tb2.txt=\"AUS\"");
    nextion.print("tb1.txt=\"AUS\"");     //AKS wird auch abgeschaltet
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
  }
  else if (daten_display == "Weichen" && (btn_state))
  {
    btn_state = 0;
    digitalWrite(REL_WEI, LOW);         // Weichen ein
    digitalWrite(REL_AKS, LOW);         // Relais AKS 
    nextion.print("tb2.txt=\" \"");     // Weichen ein
    nextion.print("tb1.txt=\" \"");     // AKS ein
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
  }

  if (daten_display == "Bahnstrom" && (!btn_state))
  {
    btn_state = 1;
    digitalWrite(REL_Bah, HIGH);
    nextion.print("tb3.txt=\"AUS\"");
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
  }
  else if (daten_display == "Bahnstrom" && (btn_state))
  {
    btn_state = 0;
    digitalWrite(REL_Bah, LOW);
    nextion.print("tb3.txt=\" \"");
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
  }

  if (daten_display == "Analog/Digital" && (!btn_state))
  {
    btn_state = 1;
    digitalWrite(REL_AD, HIGH);
    nextion.print("tb4.txt=\"Analog\"");
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
  }
  else if (daten_display == "Analog/Digital" && (btn_state))
  {
    btn_state = 0;
    digitalWrite(REL_AD, LOW);
    nextion.print("tb4.txt=\" \"");
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
  }

  if (daten_display == "Safetycar" && (!btn_state))
  {
    btn_state = 1;
    digitalWrite(REL_Saf, HIGH);
    nextion.print("tb5.txt=\"AUS\"");
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
  }
  else if (daten_display == "Safetycar" && (btn_state))
  {
    btn_state = 0;
    digitalWrite(REL_Saf, LOW);
    nextion.print("tb5.txt=\" \"");
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
    daten_display="";
  }


}

Bezeichne mich zwar als Anfänger, aber einige Codes habe ich schon erfolgreich umgesetzt.
Bisher auf einem ESP8266 mit Werte erfassen und per MQTT übertragen.
Das jetzt mit Display und Relais schalten ist neu für mich.
Bitte um Hilfe.

Gruß Georg

Bitte bearbeiten nochmal Deinen Beitrag, der ist noch nicht richtig formatiert.

Bist Du Rennfahrer? Da habe wir schon @Benziner mit einer Schlitzrennbahn.

Was ich schreibe, ist freundlich gemeint, auch wenn ich Dir meine Meinung vor den Latz knalle.

Annötig beim ESP32, der hat Serial2 eingebaut:

  • RXD2 an GPIO16
  • TXD2 an GPIO17

Serial1 liegt unzugänglich, daher besser Serial2.

Pinout meines ESP32.

bool btn_state = 0;
// Ausgänge für Relais festlegen
const unsigned int REL_Boxg {37};
const unsigned int REL_AKS {36};
const unsigned int REL_WEI {33};
const unsigned int REL_Bah {31};
const unsigned int REL_AD {30};
const unsigned int REL_Saf {13};

Beim ESP32 bin ich mir unsicher, ob für einen Pin unsigned int oder byte effektiver ist, durch const wird es aber zu einer Textersetzung des optimierenden Compilers, dann ist es egal.

Die geschweiften Klammern erzeugen eine Typprüfung.

Hallo,
bitte als erstes folgende Fehler beseitigen:

  1. Die von die genutzten Pins zum Display sind Hardware Serielle, da brauchst du kein SoftwareSerial.
  2. Das Display benötigt an den Pins 5Volt, dein ESP32 nur 3,3Volt. Damit kannst du die Pins schnell töten. Du brauchst min. einen Spannungsteiler dazwischen TX-TFT und RX-ESP.

Ahh!
Danke für die Info.

Formatfehler gefunden und behoben.

Ja, ich bin Rennfahrer und baue gerade meine Bahn

Deine Frage läßt sich doch auf

    digitalWrite(REL_Boxg, HIGH);
...
    digitalWrite(REL_Boxg, LOW);

reduzieren, oder?

Logische Fehler im Programm kannst Du mit Serial.print() finden.

Oder schaltet der ESP32-Pin das Relais nicht ordentlich. Kann auch sein, hängt vom Relaismodultyp ab. Da bräuchte es dann Infos.

Habe nun einen LevelConverter dazwischen geschaltet.

Nun habe ich keine Verbindung mehr zum Display und umgekehrt.

Entweder hab ich den Levelkonverter nicht richtig angeschlossen, oder er funktioniert nicht richtig.
Angeschlossen ist GND am GND Eingang, 5 Volt vom Display am 5Volt Eingang.
RX und TX vom Display an der High Seite
RX und TX zum ESP auf der Low Seite.
Werde mir mal das Messgerät holen und nachmessen.

Derzeit hängen in der Enwicklungsphase eine Leds dran.
Später werden dann die Relais über einen ULN2803 geschaltet.

Wir suchen also nach einem logischen Fehler im Programm, richtig?

Was für einen Levelconverter ?

Ein üblicher I2C Levelshifter funktioniert da meist nicht.
Nimm einen Spannungsteiler aus Widerständen, das funktioniert sicher.

Hier ist ein Prima Lehrgang zu den Thema.

Interessant fand ich die Anmerkung das man die Serialen Leitungen kreuzen soll.

Und auch den in meinen Augen gigantischen Stromverbrauch.

Wenn die 5V aus einen USB-2.0 Port kommen ist das sehr wahrscheinlich der Fehler. Das Teil verhungert.

Vielleicht hilft dir das ja weiter.

Gruß

Pucki

Das habe ich jetzt gemacht.

Gigantisch heißt das Teil frisst ALLEIN 510 mA. Der USB-2.0 Port hat aber nur 500 mA.

Ergo das ganze verhungert, und das kann tödlich enden.

Link funktioniert nur halb. Bitte nach den Aufruf auf EXTERNE STROMVERSORGUNG klicken und das da lesen.

Gruß

Pucki

Und das ist auch kein Wunder, diese GPIO sind teilweise nur Eingänge.
Sieh dir dazu bitte diesen Beitrag an.

Und poste bitte mal, welchen ESP32 du genau hast, es gibt nicht nur einen.

Ja....und funktioniert es jetzt ?
Und es wäre auch gut, wenn du den aktuellen Sketch postest.

Zeig das mall, ein 5" je nach Typ braucht zw. 140 ~ 410 mA.

Wann lernst du eigentlich mal lesen ???

Aber Post 13 ist anscheinend eine Unglückszahl :wink:

Aber selbst 400 mA sind viel zu viel. Rechne doch mal nach. 400 mA das Display, + ESP + Step-up-Modul + Relais + Hühnerfutter. ???

Und wo steht das es ein 5-Zoll Teil ist.???

Gruß

Pucki

Könne die Anleitung seit fast Ewigkeit, nur stimmt die Angabe nicht mit dem was Hersteller schreibt.

OK. Dann hilft nur noch eins. NACHMESSEN.

Wobei, was zieht eigentlich so ein Relais wenn es AUSLÖST , ich meine genau diesen ms-Bereich.

Gruß

Pucki

Nein keine Funktion.

Ich teste das ganze jetzt mal am Uno.