Arduino mit Nextion 7"Touchdisplay Buttons reagieren nicht immer

Hallo Zusammen

Ich habe ein Problem.

Die Touchbuttons beziehungsweise die Callback funktion der Nextion Library funktioniert nicht immer.
manchmal muss man die Buttons mehrmals drücken bis sie reagieren.
Je mehr ich in den Void loop () Programmiere je schlechter die reaktion.

und der externe Button wird nicht sauber entprellt.

vieleicht kann mir jemand helfen… habe den Programmcode im Anhang.

#include "Nextion.h"  //Library für Display

#include <OneWire.h>  //Library für Bus Temperatursensor
#include <DallasTemperature.h> //Library für Temperatursensor

#define ONE_WIRE_BUS 2 // Bus Temperatursensor auf Pin 2 Definiert
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire); // oneWire bus referenz auf Temperatur Sensor


const int buttonPin = 5;        //Externer Taster-eingang für Licht auf Pin 5
volatile int buttonState = 0;   //externer Button Status zum Entprellen (Debounce)
int buttonState1 = 0;           //
const int ledPin =  12;         // Kontakt für Relaisansteuerung Licht
int stateLight = 0;             //Status Variable für Licht

const int HeatPin = 4;          //Kontakt für Relaisansteurung Heizung
int stateHeater = 0;            //Status Variable für Heizung
uint32_t number = 0;            //Temperatur Variable vom Temperatursensor

int stateCool = 0;              //Status  Relais für Kühlbox
const int CoolPin = 7;          //Kontakt für Relaisansteuerung Kühlbox
int buttonStateold =0;
                                      
NexText t1 = NexText(0, 2, "t1");
NexText t2 = NexText(0, 3, "t2");      // Deklaration der Nextion Display objekte (page id = 0, component id = 1, component name = "b0")  
NexText t3 = NexText(0, 4, "t3");
NexText t4 = NexText(0, 10, "t4");
NexButton b0 = NexButton(0, 5, "b0");
NexButton b1 = NexButton(0, 6, "b1");
NexButton b2 = NexButton(0, 7, "b2");
NexButton b3 = NexButton(0, 8, "b3");
NexButton b4 = NexButton(0, 9, "b4");
NexButton b5 = NexButton(0, 12, "b5");
NexButton b6 = NexButton(0, 13, "b6");
NexSlider h0 = NexSlider(0, 11, "h0");



NexTouch *nex_listen_list[] = {             //Registriert Eingabe objekt für Touch Event
  &b0,
  &b1,
  &b2,
  &b3,
  &b4,
  &b5,
  &b6,
  &h0,

  NULL
};
////////////////////////////////////////////////////////////////////////////////////////////
//Funktion Debouncer
unsigned long DebouncerTimeStart = millis();     //Startzeit der Statusaenderung
int KEYstatusOld;                                //alter Zustand der StateMachine
int KEYstatusCurrent = 4;                        //aktueller Zustand der StateMachine

int debouncer(int KEY, unsigned long DebounceTime) {
  unsigned long TimeCurrent;    //aktuelle Zeit
  int KEYpressed;               //Ausgabe

  //Eingabe
  TimeCurrent = millis();

  //Verarbeitung
  switch (KEYstatusCurrent) {
    case 1:
      if (KEY == true and TimeCurrent > DebouncerTimeStart + DebounceTime) {
        KEYstatusCurrent = 2;
      }
      if (KEY == false and TimeCurrent > DebouncerTimeStart + DebounceTime) {
        KEYstatusCurrent = 4;
      }
      break;
    case 2: //ON
      KEYpressed = true;
      if (KEY == false) {
        KEYstatusCurrent = 3;
      }
      break;
    case 3:
      if (KEY == false and TimeCurrent > DebouncerTimeStart + DebounceTime) {
        KEYstatusCurrent = 4;
      }
      if (KEY == true and TimeCurrent > DebouncerTimeStart + DebounceTime) {
        KEYstatusCurrent = 2;
      }
      break;
    case 4:
      KEYpressed = false;
      if (KEY == true) {
        KEYstatusCurrent = 1;
      }
      break;
    default:
      KEYstatusCurrent = 1;
  }


  //bei einem Zustandsuebergang wird der die Startzeit aktualisiert
  TimeCurrent = millis();
  if (KEYstatusCurrent != KEYstatusOld) {
    DebouncerTimeStart = TimeCurrent;
    KEYstatusOld = KEYstatusCurrent;
  }

  //Debug
  Serial.print(KEY);
  Serial.print(",");
  Serial.print(KEYstatusCurrent);
  Serial.print(",");
  Serial.print(KEYpressed);
  Serial.print(",");
  Serial.print(TimeCurrent);
  Serial.print(",");
  Serial.print(DebouncerTimeStart);
  Serial.println();

  //Ausgabe
  return KEYpressed;
}

// Ende Funktionen
////////////////////////////////////////////////////////////////////////////////////////////

void b0PopCallback(void *ptr) {      //Callbackmethoden der Nextion Display Buttons On Off
  stateLight = 1;
}

void b1PopCallback(void *ptr) {
  stateLight = 0;

}

void b2PopCallback(void *ptr) {
  stateHeater = 1;

}
void b3PopCallback(void *ptr) {
  stateHeater = 0;

}
void b4PopCallback(void *ptr) {
  stateHeater = 2;

}
void b5PopCallback(void *ptr) {
  stateCool = 1;

} void b6PopCallback(void *ptr) {
  stateCool = 0;

}
void h0PopCallback(void *ptr)
{
  char temp[10] = {0};               //Callbackmethode zum Temperatur einlesen
  h0.getValue(&number);               
  utoa(number, temp, 10);
  t4.setText(temp);
  Serial.print(number);
}


void setup(void) {
  Serial.begin(9600);

  
  nexInit();                       

  b0.attachPop(b0PopCallback, &b0);       //Registriert den Pop Event der Callback Funktion
  b1.attachPop(b1PopCallback, &b1);
  b2.attachPop(b2PopCallback, &b2);
  b3.attachPop(b3PopCallback, &b3);
  b4.attachPop(b4PopCallback, &b4);
  b5.attachPop(b5PopCallback, &b5);
  b6.attachPop(b6PopCallback, &b6);
  h0.attachPop(h0PopCallback);

  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  pinMode(HeatPin, OUTPUT);
  pinMode(CoolPin, OUTPUT);
  interrupts();
  sensors.begin();
}




void loop(void) {

  nexLoop(nex_listen_list);
  
buttonState = digitalRead(buttonPin);
buttonState1=debouncer(buttonState,200);
  if(buttonState1 == 0&&buttonStateold==1){
    if(stateLight==1){
      stateLight=0;
    }    
    else{
        stateLight=1;
      }
    buttonStateold=buttonState1;
  }



  switch (stateLight) {
    case 0:
      t1.setText("Licht: Off");
      digitalWrite(ledPin, HIGH);
      break;
    case 1:
      t1.setText("Licht: On");
      digitalWrite(ledPin, LOW);
      break;
  }
  delay(10);

  switch (stateHeater) {
    case 0:
      t3.setText("Heater : Off");
      digitalWrite(HeatPin, HIGH);
      break;
    case 1:
      t3.setText("Heater: On");
      digitalWrite(HeatPin, LOW);
      break;
    case 2:

      sensors.requestTemperatures();
      if (sensors.getTempCByIndex(0) < number) {
        digitalWrite(HeatPin, HIGH);
        t3.setText("Auto Off");
      }
      else {
        digitalWrite(HeatPin, LOW);
        t3.setText("Auto On");
      } delay(10);

      break;
  }
  delay(100);

  if (stateCool == 1) {
    digitalWrite(CoolPin, LOW);
    t2.setText("Kühl: On");
  } else {
    digitalWrite(CoolPin, HIGH);
    t2.setText("Kühl: Off");

  } delay(100);

}

BatterieCool.ino (6.38 KB)

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Gruß Tommy

delay() blockiert den Controller. Und in der Temperatur-Auslesung ist auch noch ein Delay in drin (genauer ist es die AD-Wandlung die etwas Zeit braucht). Das kann man aber auch nicht-blockierend programmieren.

Andererseits sind das jedesmal nur etwas maximal 200ms. So extrem sollte sich das nicht auswirken

Ja damit hätte ich auch kein Problem wegen 200ms zeitverzöggerung...
Es passiert aber gar kein Ereigniss wenn ich die Touch Buttons betätige, teilweise muss ich 5-6 mal drauf drücken bis etwas passiert.
im seriell monitor erhalte ich die meldung recvRetCommandFinished err

Schade, dass du unsere (Tommy) "Bitten" ignorierst.
Du hättest deutlich mehr Helfer.

Was für einen Arduino verwendest du und wo hast du dein Display angeschlossen ?

(deleted)

Es arbeitet ja kaum einer mit der Nextion-Lib. Die meisten Leute lösen die Kommunikation händisch.
Ein Problem gibt es bei SoftwareSerial mit dem Nextion: Wenn zum Display gesendet wird, funktioniert der Empfang der Events von dort nicht immer.
Da gab es hier mal einen langen Thread. Such mal danach.

Gruß Tommy

Ich vermute, der TO hat Probleme mit der seriellen.
Ich verwende diese Library nicht, daher kann ich nur vermuten

Wäre schön, wenn er sich noch mal dazu meldet.

danke für eure rückmeldungen. Mittlerweilen startet das display nicht mehr bei anschluss der Speisung. Werde mir wohl ein neues besorgen müssen.

switch5:
danke für eure rückmeldungen. Mittlerweilen startet das display nicht mehr bei anschluss der Speisung. Werde mir wohl ein neues besorgen müssen.

Dann schreib doch mal, wie du alles angeschlossen hast.
Auch die Spannung vom Display.
Evtl. liegt da ja dein Problem.

RX TX gekreuzt auf RX2 TX2 und die Speisung von einer 12V batterie auf ein USB auto Stecker von dort 5v und gnd

switch5:
RX TX gekreuzt auf RX2 TX2 und die Speisung von einer 12V batterie auf ein USB auto Stecker von dort 5v und gnd

Dann nutzt du einen Mega, war z,B. auch eine Frage.
Hast du die Spannung mal gemessen ?
Die Nextion sind sehr anfällig auf zu hohe Spannung. Auch wenn die 5 Volt zu niedrig wird.