Il loop non si esegue tutto, con Nextion

Buon giorno,
rieccomi con un problema, non credo legato a Nextion display. Mi esegue il loop corretto dei tasti ma quando inserisco la parte per aggiornare il grafico mi esegue solo quello senza più rispondere ai tasti. Ho provato ad inserire un delay ma non funziona cmq la lettura dei tasti e non capisco perché

Grazie anticipatamente

[code]
#include "Nextion.h"
#include "DHT.h"

#define DHTPIN 2

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

#define LEVEL_HIGH      (90)
#define LEVEL_LOW       (0)

#define CH0_OFFSET  (40 - LEVEL_HIGH/2)
#define CH1_OFFSET  (CH0_OFFSET + 40 * 1)


const int led =8;
const int led2 =5;


int temp;
int umid;




byte imptemp;
byte impumid;
byte impore;
unsigned long ora;



void n0PopCallback(void *ptr);
void b0PopCallback(void *ptr);
void b1PopCallback(void *ptr);
void b2PopCallback(void *ptr);
void b3PopCallback(void *ptr);
void b4PopCallback(void *ptr);
void b5PopCallback(void *ptr);
void b6PopCallback(void *ptr);
void b7PopCallback(void *ptr);
void b8PopCallback(void *ptr);
void b9PopCallback(void *ptr);
void n1PopCallback(void *ptr);
void n2PopCallback(void *ptr);









NexNumber n0 = NexNumber(0, 3, "n0");
NexButton b0 = NexButton(0, 1, "b0");
NexButton b1 = NexButton(0, 2, "b1");
NexButton b2 = NexButton(0, 6, "b2");
NexButton b3 = NexButton(0, 7, "b3");
NexNumber n1 = NexNumber(0, 8, "n1");
NexNumber n2 = NexNumber(0, 14, "n2");
NexButton b4 = NexButton(0, 10, "b4");
NexButton b5 = NexButton(0, 11, "b5");
NexButton b6 = NexButton(0, 12, "b6");
NexButton b7 = NexButton(0, 13, "b7");
NexButton b8 = NexButton(0, 16, "b8");
NexButton b9 = NexButton(0, 17, "b9");
NexWaveform s0 = NexWaveform(3, 1, "s0");
NexText txt_gradi = NexText(1, 11, "t5");
NexText txt_umid  = NexText(1, 12, "t6");

static uint8_t ch0_data = LEVEL_LOW;
static uint8_t ch1_data = LEVEL_LOW;



char buffer[100] = {0};

NexTouch *nex_listen_list[] = 
{
    &n0,
    &b0,
    &b1,
    &b2,
    &b3,
    &n1,
    &n2,
    &b4,
    &b5,
    &b6,
    &b7,
    &b8,
    &b9,
    NULL
};

void n0PopCallback(void *ptr)
{
    n0.setValue(0);
}
void n1PopCallback(void *ptr)
{
    n1.setValue(0);
}
void n2PopCallback(void *ptr)
{
    n2.setValue(0);
}

void b0PopCallback(void *ptr)
{
    n0.getValue(imptemp);
    
    imptemp ++;
    
    n0.setValue(imptemp);
 }

void b1PopCallback(void *ptr)
{    
    n0.getValue(imptemp);
    
    imptemp --;
    
    n0.setValue(imptemp);
   }

void b2PopCallback(void *ptr)
{    
    n0.getValue(imptemp);
    
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    
    n0.setValue(imptemp);
   }

void b3PopCallback(void *ptr)
{    
    n0.getValue(imptemp);
    
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    
    n0.setValue(imptemp);
   }

void b4PopCallback(void *ptr)
{    
    n1.getValue(impumid);
    
    impumid ++;
    
    n1.setValue(impumid);
   }

void b6PopCallback(void *ptr)
{    
    n1.getValue(impumid);
    
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    
    n1.setValue(impumid);
   }

void b5PopCallback(void *ptr)
{    
    n1.getValue(impumid);
    
    impumid --;
    
    n1.setValue(impumid);
   }

void b7PopCallback(void *ptr)
{    
    n1.getValue(impumid);
    
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    
    n1.setValue(impumid);
   }

void b8PopCallback(void *ptr)
    {    
    n2.getValue(impore);
    
    impore ++;
    
    n2.setValue(impore);
   }

void b9PopCallback(void *ptr)
    {    
    n2.getValue(impore);
    
    impore --;
    
    n2.setValue(impore);
   }




   

void setup(void)
{
    nexInit();
    dht.begin();
    Serial.begin(9600);
    pinMode(led,OUTPUT);
    pinMode(led2,OUTPUT);
    
    
    n0.attachPop(n0PopCallback);
    n1.attachPop(n1PopCallback);
    n2.attachPop(n2PopCallback);
    b0.attachPop(b0PopCallback);
    b1.attachPop(b1PopCallback);
    b2.attachPop(b2PopCallback);
    b3.attachPop(b3PopCallback);
    b4.attachPop(b4PopCallback);
    b5.attachPop(b5PopCallback);
    b6.attachPop(b6PopCallback);
    b7.attachPop(b7PopCallback);
    b8.attachPop(b8PopCallback);
    b9.attachPop(b9PopCallback);
    
}

void loop()
{
    nexLoop(nex_listen_list);
    Serial.println(dht.readTemperature());
    Serial.println(dht.readHumidity());

    if(dht.readTemperature() >= imptemp)
    {
      digitalWrite(led,HIGH);
    }
    else
    {
      digitalWrite(led,LOW);
    }

    if(dht.readHumidity() >= impumid)
    {
      digitalWrite(led2,HIGH);
    }
    else
    {
      digitalWrite(led2,LOW);
    }
    delay(3000);
    static uint32_t started = 0;
    if (millis() - started >= 3000)
    {
        started = millis();    
        if (LEVEL_HIGH == ch0_data)
        {
            ch0_data = LEVEL_LOW;
        }
        else
        {
            ch0_data = LEVEL_HIGH;
        }
    }
    ch1_data = ch0_data;

    s0.addValue(0, CH0_OFFSET + ch0_data);
    s0.addValue(1, CH1_OFFSET + ch1_data);    
}

[/code]

E' sempre la solita cosa dell'altro thread che hai abbandonato perché le risposte fornite non ti piacevano evidentemente... la libreria Nextion va modificata in quanto usa la seriale hardware e tu la stai usando (correttamente) a scopo di debug, semplicemente non puoi avere due cose attaccate alla medesima seriale, occorre usare un altra scheda o la seriale software
Seconda cosa il polling del nextion deve essere effettuato di continuo, se tu metti il delay è normale che smetta di risponderti alle pressioni dei pulsanti

Come già detto nell'altra discussione non usa la libreria ma cercando su Google in due colpi sono arrivato a questo non so se funziona così comé o se coccorra adattarlo alle nuove versioni dell'IDE ma intanto senza modifiche alla libreria (almeno quella che suggeriscono loro su github) per disattivare il debug e ELIMINANDO l'uso della seriale per scrivere massaggi di debug andrai poco lontano

questo e gli altri simili a questo

  impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;

puoi tranquillamente sostituirli con

impumid=impumid+10;

:wink:

Ma per quello che dici della seriale riguarda l'invio della lettura al pc giusto? io sto usando arduino mega li ho 4 porte da usare no? o capisco male io?

Scusate forse è una gran cavolata quella che dico.. Ma se io mettessi un if che in una maniera mi accetta i tasti e mi cambia la variabile e nel altro senso mi faccia il loop senza più leggere i tasti ma mi comandi la parte grafica?
o sto dicendo una fesseria e non cambierebbe nulla?

Grazie mille

No, devi per forza di cose modificare la libreria Nextion per istruirla ad utilizzare una seriale hardware differente da quella che usi per il debug (Seriale principale o Serial0 che dir si voglia).
Senza qusta modifica non vai da nessuna parte poiché non poi avere due dispositivi differenti collegati sulla medesima seriale

Giusto come spunto io ho adottato un approccio completamente differente, ho deciso di non usare la libreria di Nextion ma gestisco il tutto da solo. Considera che i comandi da inviare al display non sono altro che stringhe (array di char) con il nome del controllo e il valore da assegnare via seriale e altrettanto fa il display, ovvero invia via seriale una serie di caratteri terminati da ter 0xFF io ho preferito gestira tutta la parte grafica sul display e invio i valori nuovi ad Arduino che li memorizza e fa ciò che deve, altrettanto aggiorno il display con varicomandi solo quando necessario, il tutto istanziando una seriale hardware 1 della MEGA, cambia in toto l'approccio e costringe ad un po' di lavoro software.
Vedi tu se ti conviene modificare la libreria standard o farti tutto in casa (io ti consiglio la prima peeché la seconda è tutta in salita e non usa codice già scritto)

Ma la libreria l'ho modificata dicendo di trasmettere sulla seriale2, però il problema resta ancora..
A questo punto non capisco più dov'è il problema del tutto se sketch oppure comunicazione, alla fine credevo fosse una cosa abbastanza banale creare dei pulsanti che modificassero dei parametri ma a quanto pare no..

Non so se hai modificato il codice ma se lasci i delay nel loop credo che tu avrai sempre di questi problemi, devi ragionare tutte le opeazioni usando millis e eliminando quindi i delay, come già indicato in precedenza la cattura degli eventi deve essere eseguita quasi in "real time" per funzionare correttamente

Grazie, il delay era stato già tolto prima.. io posto per l'ultima volta il codice se magari qualcuno sa che errore ha bene senò abbandono il progetto visto che è ineseguibile..

[/[code]
#include "Nextion.h"
#include "DHT.h"
#define DHTPIN 2

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

#define LEVEL_HIGH      (90)
#define LEVEL_LOW       (0)

#define CH0_OFFSET  (40 - LEVEL_HIGH/2)
#define CH1_OFFSET  (CH0_OFFSET + 40 * 1)


const int led =8;
const int led2 =5;


int temp;
int umid;




byte imptemp;
byte impumid;
byte impore;
unsigned long ora;



void n0PopCallback(void *ptr);
void b0PopCallback(void *ptr);
void b1PopCallback(void *ptr);
void b2PopCallback(void *ptr);
void b3PopCallback(void *ptr);
void b4PopCallback(void *ptr);
void b5PopCallback(void *ptr);
void b6PopCallback(void *ptr);
void b7PopCallback(void *ptr);
void b8PopCallback(void *ptr);
void b9PopCallback(void *ptr);
void n1PopCallback(void *ptr);
void n2PopCallback(void *ptr);









NexNumber n0 = NexNumber(0, 3, "n0");
NexButton b0 = NexButton(0, 1, "b0");
NexButton b1 = NexButton(0, 2, "b1");
NexButton b2 = NexButton(0, 6, "b2");
NexButton b3 = NexButton(0, 7, "b3");
NexNumber n1 = NexNumber(0, 8, "n1");
NexNumber n2 = NexNumber(0, 14, "n2");
NexButton b4 = NexButton(0, 10, "b4");
NexButton b5 = NexButton(0, 11, "b5");
NexButton b6 = NexButton(0, 12, "b6");
NexButton b7 = NexButton(0, 13, "b7");
NexButton b8 = NexButton(0, 16, "b8");
NexButton b9 = NexButton(0, 17, "b9");
NexWaveform s0 = NexWaveform(3, 1, "s0");
NexText txt_gradi = NexText(1, 11, "t5");
NexText txt_umid  = NexText(1, 12, "t6");

static uint8_t ch0_data = LEVEL_LOW;
static uint8_t ch1_data = LEVEL_LOW;



char buffer[100] = {0};

NexTouch *nex_listen_list[] = 
{
    &n0,
    &b0,
    &b1,
    &b2,
    &b3,
    &n1,
    &n2,
    &b4,
    &b5,
    &b6,
    &b7,
    &b8,
    &b9,
    NULL
};

void n0PopCallback(void *ptr)
{
    n0.setValue(0);
}
void n1PopCallback(void *ptr)
{
    n1.setValue(0);
}
void n2PopCallback(void *ptr)
{
    n2.setValue(0);
}

void b0PopCallback(void *ptr)
{
    n0.getValue(imptemp);
    
    imptemp ++;
    
    n0.setValue(imptemp);
 }

void b1PopCallback(void *ptr)
{    
    n0.getValue(imptemp);
    
    imptemp --;
    
    n0.setValue(imptemp);
   }

void b2PopCallback(void *ptr)
{    
    n0.getValue(imptemp);
    
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    imptemp++;
    
    n0.setValue(imptemp);
   }

void b3PopCallback(void *ptr)
{    
    n0.getValue(imptemp);
    
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    imptemp --;
    
    n0.setValue(imptemp);
   }

void b4PopCallback(void *ptr)
{    
    n1.getValue(impumid);
    
    impumid ++;
    
    n1.setValue(impumid);
   }

void b6PopCallback(void *ptr)
{    
    n1.getValue(impumid);
    
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    impumid++;
    
    n1.setValue(impumid);
   }

void b5PopCallback(void *ptr)
{    
    n1.getValue(impumid);
    
    impumid --;
    
    n1.setValue(impumid);
   }

void b7PopCallback(void *ptr)
{    
    n1.getValue(impumid);
    
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    impumid --;
    
    n1.setValue(impumid);
   }

void b8PopCallback(void *ptr)
    {    
    n2.getValue(impore);
    
    impore ++;
    
    n2.setValue(impore);
   }

void b9PopCallback(void *ptr)
    {    
    n2.getValue(impore);
    
    impore --;
    
    n2.setValue(impore);
   }




   

void setup(void)
{
    nexInit();
    dht.begin();
    pinMode(led,OUTPUT);
    pinMode(led2,OUTPUT);
    
    
    n0.attachPop(n0PopCallback);
    n1.attachPop(n1PopCallback);
    n2.attachPop(n2PopCallback);
    b0.attachPop(b0PopCallback);
    b1.attachPop(b1PopCallback);
    b2.attachPop(b2PopCallback);
    b3.attachPop(b3PopCallback);
    b4.attachPop(b4PopCallback);
    b5.attachPop(b5PopCallback);
    b6.attachPop(b6PopCallback);
    b7.attachPop(b7PopCallback);
    b8.attachPop(b8PopCallback);
    b9.attachPop(b9PopCallback);
    
}

void loop()
{
    nexLoop(nex_listen_list);
    
    if(dht.readTemperature() >= imptemp)
    {
      digitalWrite(led,HIGH);
    }
    else
    {
      digitalWrite(led,LOW);
    }

    if(dht.readHumidity() >= impumid)
    {
      digitalWrite(led2,HIGH);
    }
    else
    {
      digitalWrite(led2,LOW);
    }

    static uint32_t started = 0;
    if (millis() - started >= 3000)
    {
        started = millis();    
        if (LEVEL_HIGH == ch0_data)
        {
            ch0_data = LEVEL_LOW;
        }
        else
        {
            ch0_data = LEVEL_HIGH;
        }
    }
    ch1_data = ch0_data;

    s0.addValue(0, CH0_OFFSET + ch0_data);
    s0.addValue(1, CH1_OFFSET + ch1_data);    
}

code]

Ma hai provato a eliminare la lettura di temperatura ed umidità e simularlo con due valori fissi? Se non l'hai ancora fatto prova, metti due valori statici e giocando con i pulsanti del display vedi se il tutto funziona, se si (come penso) allora devi mettere le letture di temperatura e umidità non ad ogni ciclo di loop ma ogni N secondi sempre con millis() (tanto il sensore è lento quindi anche effettuandolo ogni secondo non è che ti cambia tanto).
Altra cosa magari è anche quella addValue ad ogni ciclo di loop che manda il tutto in crisi, metti anche quella sotto millis() e vedi se la cosa cambia, considera che il loop viene eseguito molto velocemente, anche troppo per la comunicazione seriale con il display (che se non hai modiifcato è 9600bps).