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)