Nextion -Timing problem ?

ich habe obiges Display und nutze die nextion library V0.9.0 GitHub - itead/ITEADLIB_Arduino_Nextion

Anzeige tut genau das was sich soll 1. Schirm buttons gehen normal rückmeldung im serielle Monitor :
fortlaufen recvRetCommandFinished ok - alles schön

im 2. Schirm gehen die Buttons nur sporadisch rückmeldung im seriellen Monitor:
fortlaufen recvRetCommandFinished err - nach 2-3 mal drücken gehen die buttons zwar es gibt aber trozdem die Fehlermeldung habt ihr eine Idee was das sein könnte

#include <doxygen.h>
#include <NexButton.h>
#include <NexCheckbox.h>
#include <NexConfig.h>
#include <NexCrop.h>
#include <NexDualStateButton.h>
#include <NexGauge.h>
#include <NexGpio.h>
#include <NexHardware.h>
#include <NexHotspot.h>
#include <NexNumber.h>
#include <NexObject.h>
#include <NexPage.h>
#include <NexPicture.h>
#include <NexProgressBar.h>
#include <NexRadio.h>
#include <NexRtc.h>
#include <NexScrolltext.h>
#include <NexSlider.h>
#include <NexText.h>
#include <NexTimer.h>
#include <Nextion.h>
#include <NexTouch.h>
#include <NexUpload.h>
#include <NexVariable.h>
#include <NexWaveform.h>



#include "Arduino.h"
#include <DHT_U.h>
#include <DHT.h>
#define DHTPIN 3
#define DHTTYPE DHT22

DHT_Unified dht(DHTPIN, DHTTYPE);

// 1.Seite
NexPage Home = NexPage(0, 0, "Home");
NexButton bAuf = NexButton(0, 2, "bAuf");
NexButton bZu = NexButton(0, 6, "bZu");
NexButton bTemp = NexButton(0, 7, "bTemp");
NexText tZeit = NexText(0, 2, "tZeit");
NexText tTemp = NexText(0, 4, "tTemp");
NexText tStatus = NexText(0, 3, "tStatus");

//2.Seite
NexPage Temp = NexPage(1, 0, "Temp");
NexButton bHome = NexButton(1, 6, "bHome");
NexButton bHigh = NexButton(1, 7, "bHigh");
NexButton bLow = NexButton(1, 8, "bLow");
NexButton bPlus = NexButton(1, 9, "bPlus");
NexButton bMinus = NexButton(1, 10, "bMinus");
 NexNumber nHigh = NexNumber(1, 4, "nHigh");
 NexNumber nLow = NexNumber(1, 5, "nLow");
#include <Adafruit_Sensor.h>
#include <TimeLib.h>
#include <Ethernet2.h>
#include <EthernetUdp2.h>
#include <SPI.h>
char buffer[10] = {0};
char buffer_temp[10] = {0};
char buffer_hour[10] = {0};
char buffer_temperature[10] = {0};

NexTouch *nex_Listen_List[] =
{
  &bAuf, &bZu, &bTemp, &bHome, &bHigh, &bLow, &bPlus, &bMinus, NULL
};

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// NTP Servers:
IPAddress timeServer(132, 163, 4, 101); // time-a.timefreq.bldrdoc.gov
const int timeZone = 1;     // Central European Time


EthernetUDP Udp;
unsigned int localPort = 8888;  // local port to listen for UDP packets
unsigned long prev = 0;
int myStunde, myMinute, mySekunde, myJahr, myTag, myMonat, MStatus, REED, TStatus;
int F_Auf = 18;
int F_Zu = 10;
#define Relais1Pin 5
#define Relais2Pin 6
#define ReedPin 2
const unsigned long Motor = 6000;    // 60 sekunden für Motorlauf
const unsigned long Cool =  2000;

void setup()
{
 // Serial.begin(9000);
  MStatus = 0;
  TStatus = 0;
  pinMode(Relais1Pin, OUTPUT);
  pinMode(Relais2Pin, OUTPUT);
  pinMode(ReedPin, INPUT_PULLUP);
  digitalWrite(Relais1Pin, HIGH);
  digitalWrite(Relais2Pin, HIGH);
  dht.begin();
  nexInit();
  if (Ethernet.begin(mac) == 0) {
    // no point in carrying on, so do nothing forevermore:
    while (1) {
      Serial.println("Failed to configure Ethernet using DHCP");
      delay(10000);
    }
  }
  Udp.begin(localPort);
  Serial.println("waiting for sync");
  setSyncProvider(getNtpTime);
  setSyncInterval(3600); // jede Stunde wiederholen
  bAuf.attachPop(bAufPopCallback, &bAuf);
  bZu.attachPop(bZuPopCallback, &bZu);
  bTemp.attachPop(bTempPopCallback, &bTemp);
  bHome.attachPop(bHomePopCallback, &bHome);
  bHigh.attachPop(bHighPopCallback, &bHigh);
  bLow.attachPop(bLowPopCallback, &bLow);
  bPlus.attachPop(bPlusPopCallback, &bPlus);
  bMinus.attachPop(bMinusPopCallback, &bMinus);
}

time_t prevDisplay = 0; // when the digital clock was displayed

void loop()
{
   sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (timeStatus() != timeNotSet) {
    if (now() != prevDisplay) { //update the display only if time has changed
      prevDisplay = now();
      digitalClockDisplay();
    }
  }
  REED = digitalRead(ReedPin);
  if (REED == HIGH) tStatus.setText("Fenster offen");
  else tStatus.setText("");
  dtostrf(event.temperature, 6, 2, buffer_temperature);
  tTemp.setText(buffer_temperature);
  if (myStunde < 20 && myStunde > 7) {
    if (REED == LOW && event.temperature > F_Auf && MStatus == 0)
    {
      MStatus = 2;
      digitalWrite(Relais1Pin, LOW);
      if ((millis() - prev) >= Motor && MStatus == 2 ) {
        prev = millis();
        MStatus = 1;
        Motor_halt();
      }
      if (REED == HIGH && event.temperature < F_Zu && MStatus == 0)
      {
        MStatus = 2;
        digitalWrite(Relais2Pin, LOW);
        if ((millis() - prev) >= Motor && MStatus == 2 ) {
          prev = millis();
          MStatus = 1;
          Motor_halt();
        }
        if ((millis() - prev) >= Cool && MStatus == 1) {
          prev = millis();
          MStatus = 0;
        }

      }
    }
  nexLoop(nex_Listen_List);
  delay(500);
  }
}
void digitalClockDisplay() {
  // digital clock display of the time
  myStunde = hour();
  itoa(myStunde, buffer, 10);
  strcat(buffer, ":");

  myMinute = minute();
  itoa(myMinute, buffer_temp, 10);
  if (myMinute < 10)
  {
    strcat(buffer, "0");
  }
  strcat(buffer, buffer_temp);
  strcat(buffer, ":");
  mySekunde = second();
  itoa(mySekunde, buffer_temp, 10);
  if (mySekunde < 10) strcat(buffer, "0");
  strcat(buffer, buffer_temp);

  tZeit.setText(buffer);
  myTag = day();
  myMonat = month();
  myJahr = year();

}

}
void Motor_halt()
{
  digitalWrite(Relais1Pin, HIGH);
  digitalWrite(Relais2Pin, HIGH);
}

void bAufPopCallback(void *ptr)
{
   Serial.println ("bAuf");
  digitalWrite(Relais1Pin, LOW);
  MStatus = 2;
}

void bZuPopCallback(void *ptr)
{
   Serial.println ("bZu");
  digitalWrite(Relais2Pin, LOW);
  MStatus = 2;
}
void bTempPopCallback(void *ptr)
{
   Serial.println ("bTemp");
  Temp.show();
 nHigh.setValue(F_Auf);
 nLow.setValue(F_Zu);
delay(500);
}

void bHomePopCallback(void *ptr)
{
  Serial.println ("bHome");
  bLow.setText("Low");
  bHigh.setText("High");
  TStatus = 0;
  Home.show();
}

void bHighPopCallback(void *ptr)
{
 bHigh.setText("High *");
 bLow.setText("Low");
 Serial.println ("bHigh");
  TStatus = 1;
}

void bLowPopCallback(void *ptr)
{
   bLow.setText("Low *");
   bHigh.setText("High");
   Serial.println ("bPlus");
  TStatus = 2;
Serial.println("Low");
}

void bPlusPopCallback(void *ptr)
{
   Serial.println ("bPlus");
  if (TStatus == 1) F_Auf++;
  else F_Zu++;
 nHigh.setValue(F_Auf);
 nLow.setValue(F_Zu);
}

void bMinusPopCallback(void *ptr)
{
 Serial.println ("bMinus");
  if (TStatus == 1) F_Auf--;
  else F_Zu-- ;
 nHigh.setValue(F_Auf);
 nLow.setValue(F_Zu);
}

Hallo,
ich nutze das Nextion ohne NextionLib, weil es wesentlich einfacher ist...

Wenn Du einen Button auf dem Nextion betätigst, dann gibt dieser, je nachdem wie er konfiguriert ist ein
Kommando aus.

Das "recvRetCommandFinished err" sieht für mich so aus, als wenn die NextionLib ein Kommando empfängt,
das sie nicht versteht.

Also überprüfe mal im seriellen Monitor ob die Button- alle, das richtige Kommando senden.
Schreibe Dir einen Sketch, der die serielle des Nextion lesen und schreiben kann. Im seriellen Monitor kannst
Du dann sehr gut überprüfen, was tatsächlich vom Nextion gesendet wird.

Das "nach 2-3 mal drücken gehen die buttons zwar" sieht für mich so aus, als wenn Du ein TimingProblem
auf dem Arduino hast. Werfe mal die "delay()" raus, und überprüfe mal, was die NextionLib denn eigentlich
an der seriellen Schnittstelle macht. Das Nextion ist es GANZ- sicher nicht!
Gruß und Spaß
Andreas

hatte erst kein delay drin da hatte ich das problem auch beim 1. schrim

Hallo,
wenn Du auf der sicheren Seite sein willst, dann sollten diese "delay" aus dem
Sketch verschwinden.

Wenn Du unbedingt auf etwas warten willst, dann mache das mit millis() oder
mit "while"

Ich sehe auch nicht, das eine zweite serielle Schnittstelle konfiguriert ist.
Das könnte aber auch die NextionLib machen…

Dann würde ich mal von denen "#include <xxx.h>" alle entfernen, die nicht
gebraucht werden.

Hier:
#include <NexConfig.h>
#include <NexHardware.h>
#include <NexConfig.h>

würde ich mal nachschauen, ob das auf Deine Hardware zutrifft.

Der Arduino verschluckt sich da an einer Stelle.
Und das "recvRetCommandFinished err" sagt eindeutig- das das Nextion ein
Kommando sendet mit dem die NextionLib nichts anfangen kann.

Wenn Du den Fehler nicht findest, dann wird das nie was.
Ich würde aus dem Sketch erst einmal alles löschen, was nicht benötigt wird,
dann mal probieren.

Das Kommando, das diese Fehelrmeldung "recvRetCommandFinished err" erzeugt
kannst Du Dir ausgeben lassen, dann weißt Du eigentlich wo es stoppt.

In Deiner Stelle würde ich den Sketch mal neu aufbauen, eines nach dem anderen
probieren und testen.

Ich kann Dir da nicht weiter helfen, weil ich mich mit dieser NextionLib
nicht auskenne.
Du kannst Dir das ja mal durchlesen, dann weißt Du wie sie funktioniert.

BDA
hier gibt es auch noch etwas:

mehr BDA

Der NextionEditor gibt Dir alles aus, was Du benötigst. Du kannst Dein
NextionProgramm im Editor simulieren und es vom Arduino aus steuern.
Dann siehst Du in Echtzeit, was nicht funktioniert.
Zum probieren und Testen wird das NextionDisplay NICHT- benötigt.
Gruß und Spaß
Andreas

hm also im nextion editor sagt er ständig data overflow

da ich weder die befehlscodes des Displays kenne noch einen Ahnung habe wie ich dann die Codes senden soll muss ich leider die Lib nutzen

ich glaub ich lass den scheiss und verwende einfach Taster

Hallo,
"die befehlscodes des Displays kenne noch einen Ahnung habe wie ich dann die Codes senden soll"

Genau, DAS- ist das Problem…
Einen Link zum Nextion habe ich Dir doch gesendet. Dort sind alle Befehle
aufgelistet.

Wenn Du im Nextion einen Button hast, dann sagst Du dem Nextion, wenn
Button gedrückt, mach was. Das sieht dann z.B. so aus:

print "A"

das Nextion sendet ein "A" an den Arduino

wenn der Arduino über die serielle Schnittstelle ein "A" empfängt,
dann sagst Du ihm, mach was.

Da brauch´s keine Lib für…

hier was auf deutsch

Wenn Du Dich nicht mit der verwendeten Hard- und Software auseinander setzt,
dann kannste das vergessen.
Probiere das Nextion mal ohne Lib, Du wirst sehen- es ist ganz einfach!
Gruß und Spaß
Andreas