Kollision von nextion.read und nextion.print

Hallo Zusammen

Ein Luftzylinder für eine Hatch wird über ein Nextion Display von einem Arduino gesteuert.

Programm TEIL 1
Durch betätigen des Nextion Button läuft der Luftzylinder (an pin 6) bis er den Endschalter (an Pin 3) erreicht hat.

Programm TEIL 2
Nach Erreichen des Endschalters schaltet im Display das Bild „Hatch“ von pic ID 8 auf pic Id 9 um. Der Bediener weiß bescheid

PROBLEM:
Beide Programmteile arbeiten, wenn ich sie getrennt „aufspiele“ einwandfrei.

Schreibe ich sie aber zusammen in einen Sketch steigt der Programm TEIL 1 aus. d.h. der Button läst sich noch auf dem Nextion-Display betätigen (wechsel von grau auf rot ist erkennbar), aber die Serialle Übertragung erfolgt nicht mehr.

Noch kurioser ist es, das nach dem Programmstart, solange kein nextion.print ausgeführt wird nextion.write ausführt. Nach dem ersten nextion.print ist kein nextion.write mehr möglich.

Vielen Dank für Eure Überlegungen dazu

SunRunner

#include <SoftwareSerial.h>

SoftwareSerial nextion(10, 11); // RX, TX

int HatchAUFPin = 6;  // Pin für Railaus Hatch AUF
int EndschPin = 3;    // Endschalter abfrage
int CRLED = 12;       // Control LED
int valEndS = 0;      // FLAG zeigt an, ob der Endschalter geöffnet oder geschlossen ist, nur mit geschlossenen Schalter kann weiter aufgefahren werden

String daten_display = "";

void setup()  {
    // Define pin modes for TX and RX
    pinMode(10, INPUT);
    pinMode(11, OUTPUT);

    pinMode (HatchAUFPin, OUTPUT);
    
    pinMode (EndschPin, INPUT);    //Pin für Endschalter Hatch heben

    pinMode (CRLED, OUTPUT);


    // Set the baud rate for the SoftwareSerial object
    Serial.begin(9600);
    nextion.begin(9600);


    
}
//==================================================================
//==================================================================
  
void loop() {

// Hier wird geguckt ob Daten an der Seriellen Schnittstelle vorliegen.
  if (nextion.available() > 0)
  {
    daten_display += char (nextion.read());
  }

//==================================================================
// TEIL 1
// Abfrage Hatch AUF Button.
  if (daten_display == "HatchAUF gedr")
  {
    digitalWrite(HatchAUFPin, HIGH); // Relais zieht an
    daten_display="";
  }
  else if (daten_display == "HatchAUF los")
  {
    digitalWrite(HatchAUFPin, LOW); // Relais fällt ab
    daten_display="";
  }

//============================================================================
// TEIL 2
// Abfrage Endschalter Button.
 valEndS = digitalRead(EndschPin);

  // check if the Endschalter, wenn er betätigt ist ist er auf LOW
  if (valEndS == LOW) {
    // turn LED off:
    digitalWrite(CRLED, LOW);
    nextion.print("page2.Hatch.pic=8"); // Es wird ein Bild mit der ID8 angezeit
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
  } else {
    // turn LED on:
    digitalWrite(CRLED, HIGH);
    nextion.print("page2.Hatch.pic=9");// Es wird ein Bild mit der ID9 angezeigt
    nextion.write(0xFF);
    nextion.write(0xFF);
    nextion.write(0xFF);
  }
  
}

Das ist ein Problem.
Wenn z.B. Deine Zeichenkette durch einen anderen Charakter begonnen wurde ausser H, dann bist Du raus.

Mach Dir nicht so lange Zeichenketten.
Wenn Du auf oder zu machen willst, dann reicht auch 1 oder 0 zu senden - fertig.

Vielen Dank für die schnelle Antwort, klingt sinnvoll, probiere ich aus :raising_hand_man:

Der Teil 2 alleine funktioniert?

Jedenfalls flutet der die serielle nextion Schnittstelle permanent, entweder mit dem einen oder dem anderen Text.

Da kann sonst nicht viel nebenher gehen, fürchte ich.

Zumindest im Editor stört das das Nextion nicht.

cu

Problem gelöst!!!! Super DANKESCHÖN

1.) Ich habe alle zu übertragende Zeichenketten gegen einstellige Zahlen getauscht.
2.) Der Arduino senden nur wenn ein Wechsel von H auf L bzw von H auf L am Pin stattfindet. Das "entlastet" die Serielle auf die relevanten Infos.

Top
Grüße
SunRunner

1 Like

Vier Nextion Display Zur Anzeige von MotorDaten füre Zwei Bootsmotoren

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.