Nextion display non esegue il codice. Errore software?

Buongiorno a tutti,
sono nuovo nel forum infatti questo è il mio primo argomento pubblicato.
sto lavorando da un po a questo progetto ma sono arrivato a scontrarmi con un problema che non riesco a risolvere in nessun modo ed eccomi qui sul forum.

DESCRIZIONE DEL PROGETTO:
serra completamente automatizzata con regolazione di : temperatura, umidità, e cicli di areazione.
in base ai parametri impostati, Arduino mantiene costanti le condizioni all'interno della serra e
sul display è possibile visualizzare: i valori attuali, i valori registrati in Arduino, dei checkbox che mostrano in tempo reale quale attuatore è attivo ed infine è possibile selezionare tramite i rispettivi pulsanti il funzionamento in manuale di ogni singolo attuatore ed escluderlo cosi dal ciclo automatico.

il tutto è indicizzato in modo da poter cambiare i parametri a proprio piacimento, soprattutto in base alla tipologia di coltura in serra, tramite un display Nextion "nx4827t043_011" ed un Arduino uno.
Il display è programmato con la libreria ufficiale (modificata in modo da essere compatibile con arduino)

Il problema è il seguente.
se faccio girare il programma caricando in Arduino le singole funzioni una per volta tutto funziona correttamente.
Nel momento in cui metto tutte le funzioni insieme e carico nell'Arduino alcuni pulsanti sul display non funzionano più.
Non riesco a capire se mettendo tutti insieme ci sia qualche pezzo di programma che entra in qualche loop strano oppure se ho sbagliato qualcosa io.

Il programma non è così complesso è solo un po lungo, spero che qualcuno con più esperienza di me riesca a indicarmi l'errore che ho commesso.

GRAZIE IN ANTICIPO. :slight_smile:

ecco il programma.

#include <Nextion.h>
#include <SimpleDHT.h>
NexText Temperatura_Letta = NexText(0, 7, "t50");
NexText Umidita_Letta = NexText(0, 8, "t51");
NexCheckbox Presenza_Luce = NexCheckbox(0, 12, "c8");
NexNumber Temperatura_Max_Giorno = NexNumber(1, 5, "n50");
NexNumber Temperatura_Min_Giorno = NexNumber(1, 6, "n51");
NexNumber Temperatura_Max_Notte = NexNumber(1, 20, "n54");
NexNumber Temperatura_Min_Notte = NexNumber(1, 21, "n55");
NexNumber Umidita_Max = NexNumber(1, 13, "n52");
NexNumber Umidita_Min = NexNumber(1, 14, "n53");
NexButton Pulsante_Invio_Temp = NexButton(1, 7, "i0");
NexNumber Ventilatore_Ton_Set = NexNumber(2, 8, "n58");
NexNumber Ventilatore_Toff_Set = NexNumber(2, 9, "n59");
NexNumber Ventilatore_Ton_Arduino = NexNumber(2, 20, "n60");
NexNumber Ventilatore_Toff_Arduino = NexNumber(2, 21, "n61");
NexNumber Estrattore_Ton_Set = NexNumber(2, 14, "n62");
NexNumber Estrattore_Toff_Set = NexNumber(2, 15, "n63");
NexNumber Estrattore_Ton_Arduino = NexNumber(2, 24, "n64");
NexNumber Estrattore_Toff_Arduino = NexNumber(2, 25, "n65");
NexButton Pulsante_Invio_Aria = NexButton(2, 16, "i1");
NexButton Pulsante_On_Tenda_Mano = NexButton(3, 6, "b10");
NexButton Pulsante_Off_Tenda_Mano = NexButton(3, 7, "b11");
NexText Txt_Tenda_Mano = NexText(3, 20, "t53");
NexButton Pulsante_On_Estrattore_Mano = NexButton(3, 10, "b12");
NexButton Pulsante_Off_Estrattore_Mano = NexButton(3, 11, "b13");
NexText Txt_Estrattore_Mano = NexText(3, 21, "t54");
NexButton Pulsante_On_Ventilatore_Mano = NexButton(3, 13, "b14");
NexButton Pulsante_Off_Ventilatore_Mano = NexButton(3, 14, "b15");
NexText Txt_Ventilatore_Mano = NexText(3, 18, "t55");
NexButton Pulsante_On_Umidificatore_Mano = NexButton(3, 16, "b16");
NexButton Pulsante_Off_Umidificatore_Mano = NexButton(3, 17, "b17");
NexText Txt_Umidificatore_Mano = NexText(3, 19, "t56");
NexCheckbox Checkbox_Tenda_On = NexCheckbox(4, 7, "c4");
NexCheckbox Checkbox_Estrattore_On = NexCheckbox(4, 5, "c5");
NexCheckbox Checkbox_Ventilatore_On = NexCheckbox(4, 3, "c6");
NexCheckbox Checkbox_Umidificatore_On = NexCheckbox(4, 1, "c7");
NexNumber Temp_Giorno_Max_Set = NexNumber(5, 5, "n70");
NexNumber Temp_Giorno_Min_Set = NexNumber(5, 6, "n71");
NexNumber Temp_Notte_Max_Set = NexNumber(5, 19, "n74");
NexNumber Temp_Notte_Min_Set = NexNumber(5, 20, "n75");
NexNumber Umi_Max_Set = NexNumber(5, 12, "n72");
NexNumber Umi_Min_Set = NexNumber(5, 13, "n73");

NexTouch *nex_list[] = {
&Pulsante_Invio_Temp, &Pulsante_Invio_Aria,
&Pulsante_On_Tenda_Mano, &Pulsante_Off_Tenda_Mano,
&Pulsante_On_Estrattore_Mano, &Pulsante_Off_Estrattore_Mano,
&Pulsante_On_Ventilatore_Mano, &Pulsante_Off_Ventilatore_Mano,
&Pulsante_On_Umidificatore_Mano, &Pulsante_Off_Umidificatore_Mano,
NULL
};

SimpleDHT22 dht22(5);
float temp = 0;
float umi = 0;
unsigned int lux;

const int tenda = 8;
const int umidificatore = 9;
const int ventilatore = 10;
const int estrattore = 11;

bool t = false;
bool u = false;
bool v = false;
bool e = false;
bool t_mano = false;
bool u_mano = false;
bool v_mano = false;
bool e_mano = false;

unsigned long Temp_Max_Giorno = 25;
unsigned long Temp_Min_Giorno = 20;
unsigned long Temp_Max_Notte = 25;
unsigned long Temp_Min_Notte = 20;
unsigned long Umi_Max = 60;
unsigned long Umi_Min = 40;

unsigned long HMI_t1, HMI_dt;
unsigned long V_t1, V_dt1;
bool VENT = LOW;
unsigned long tempoVent = 0;
unsigned long tempoVent_ON = 1;
unsigned long tempoVent_OFF = 4;
unsigned long bk_V_ON;
unsigned long bk_V_OFF;

unsigned long E_t1, E_dt1;
bool EST = LOW;
unsigned long tempoEst = 0;
unsigned long tempoEst_ON = 1;
unsigned long tempoEst_OFF = 9;
unsigned long bk_E_ON;
unsigned long bk_E_OFF;

unsigned long h = 60000;

void setup() {
Serial.begin(9600);
nexInit();
Pulsante_Invio_Temp.attachPop(Inviadati_Temperatura, &Pulsante_Invio_Temp);
Pulsante_Invio_Aria.attachPop(Timer, &Pulsante_Invio_Aria);
Pulsante_On_Tenda_Mano.attachPop(manu_tenda_on, &Pulsante_On_Tenda_Mano);
Pulsante_Off_Tenda_Mano.attachPop(manu_tenda_off, &Pulsante_Off_Tenda_Mano);
Pulsante_On_Estrattore_Mano.attachPop(manu_estrattore_on, &Pulsante_On_Estrattore_Mano);
Pulsante_Off_Estrattore_Mano.attachPop(manu_estrattore_off, &Pulsante_Off_Estrattore_Mano);
Pulsante_On_Ventilatore_Mano.attachPop(manu_ventilatore_on, &Pulsante_On_Ventilatore_Mano);
Pulsante_Off_Ventilatore_Mano.attachPop(manu_ventilatore_off, &Pulsante_Off_Ventilatore_Mano);
Pulsante_On_Umidificatore_Mano.attachPop(manu_umidificatore_on, &Pulsante_On_Umidificatore_Mano);
Pulsante_Off_Umidificatore_Mano.attachPop(manu_umidificatore_off, &Pulsante_Off_Umidificatore_Mano);

pinMode(tenda, OUTPUT);
pinMode(umidificatore, OUTPUT);
pinMode(ventilatore, OUTPUT);
pinMode(estrattore, OUTPUT);
digitalWrite(tenda, HIGH);
digitalWrite(umidificatore, HIGH);
digitalWrite(ventilatore, HIGH);
digitalWrite(estrattore, HIGH);
}

void loop() {
nexLoop(nex_list);
Ciclo();
Leggi();
Attuatori();
HMI_dt = millis() - HMI_t1;
if (HMI_dt > 300) {
Lettura_Temp_Umi_Luce();
HMI_t1 = millis();
}
}

void Ciclo() {
  if (lux > 100) {
    if (t_mano == false) {
      if (temp <= Temp_Min_Giorno) {
        digitalWrite(tenda, LOW);
        t = true;
      } else if (temp >= Temp_Max_Giorno) {
        digitalWrite(tenda, HIGH);
        t = false;
      }
    }
  } else if (lux < 60) {
    if (t_mano == false) {
      if (temp <= (Temp_Min_Notte)) {
        digitalWrite(tenda, LOW);
        t = true;
      } else if (temp >= Temp_Max_Notte) {
        digitalWrite(tenda, HIGH);
        t = false;
      }
    }
  }
  if (temp > 30.00) {
    digitalWrite(estrattore, LOW);
    digitalWrite(ventilatore, LOW);
    digitalWrite(umidificatore, HIGH);
    e = true;
    v = true;
    u = false;
  } else if (temp <= 30.00) {
    if (u_mano == false) {
      if (umi >= Umi_Max) {
        digitalWrite(umidificatore, HIGH);
        u = false;
      } else if (umi <= Umi_Min) {
        digitalWrite(umidificatore, LOW);
        u = true;
      }
    }
    if (v_mano == false) {
      V_dt1 = millis() - V_t1;
      if (V_dt1 >= tempoVent) {
        V_t1 = millis();
        VENT = !VENT;
        digitalWrite(ventilatore, !VENT);
        if (VENT) {
          bk_V_ON = tempoVent = (tempoVent_ON * h);
          Ventilatore_Ton_Arduino.setValue(bk_V_ON / h);
          v = true;
        } else {
          bk_V_OFF = tempoVent = (tempoVent_OFF * h);
          Ventilatore_Toff_Arduino.setValue(bk_V_OFF / h);
          v = false;
        }
      }
    }
    if (e_mano == false) {
      E_dt1 = millis() - E_t1;
      if (E_dt1 >= tempoEst) {
        E_t1 = millis();
        EST = !EST;
        digitalWrite(estrattore, !EST);
        if (EST) {
          bk_E_ON = tempoEst = (tempoEst_ON * h);
          Estrattore_Ton_Arduino.setValue(bk_E_ON / h);
          e = true;
        } else {
          bk_E_OFF = tempoEst = (tempoEst_OFF * h);
          Estrattore_Toff_Arduino.setValue(bk_E_OFF / h);
          e = false;
        }
      }
    }
  }
}

void Lettura_Temp_Umi_Luce() {
  lux = analogRead(A1);
  dht22.read2(&temp, &umi, NULL);
  if (lux > 100) {
    Presenza_Luce.Set_font_color_pco(1024);
  } else if (lux < 60) {
    Presenza_Luce.Set_font_color_pco(65535);
  }
  String command = "t50.txt=\"" + String(temp, 1) + "\"";
  Serial.print(command);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
  String command2 = "t51.txt=\"" + String(umi, 1) + "\"";
  Serial.print(command2);
  Serial.write(0xff);
  Serial.write(0xff);
  Serial.write(0xff);
}

void Inviadati_Temperatura(void *ptr) {
  Temperatura_Max_Giorno.getValue(&Temp_Max_Giorno);
  Temperatura_Min_Giorno.getValue(&Temp_Min_Giorno);
  Temperatura_Max_Notte.getValue(&Temp_Max_Notte);
  Temperatura_Min_Notte.getValue(&Temp_Min_Notte);
  Umidita_Max.getValue(&Umi_Max);
  Umidita_Min.getValue(&Umi_Min);
}

void Leggi() {
  Temp_Giorno_Max_Set.setValue(Temp_Max_Giorno);
  Temp_Giorno_Min_Set.setValue(Temp_Min_Giorno);
  Temp_Notte_Max_Set.setValue(Temp_Max_Notte);
  Temp_Notte_Min_Set.setValue(Temp_Min_Notte);
  Umi_Max_Set.setValue(Umi_Max);
  Umi_Min_Set.setValue(Umi_Min);
}

void Timer(void *ptr) {
  Ventilatore_Ton_Set.getValue(&tempoVent_ON);
  Ventilatore_Toff_Set.getValue(&tempoVent_OFF);
  Estrattore_Ton_Set.getValue(&tempoEst_ON);
  Estrattore_Toff_Set.getValue(&tempoEst_OFF);
  Ventilatore_Ton_Arduino.setValue(tempoVent_ON);
  Ventilatore_Toff_Arduino.setValue(tempoVent_OFF);
  Estrattore_Ton_Arduino.setValue(tempoEst_ON);
  Estrattore_Toff_Arduino.setValue(tempoEst_OFF);
}
void manu_tenda_on(void *ptr) {
  t_mano = true;
  digitalWrite(tenda, LOW);
  t = true;
}
void manu_tenda_off(void *ptr) {
  t_mano = false;
  digitalWrite(tenda, HIGH);
  t = false;
}
void manu_estrattore_on(void *ptr) {
  e_mano = true;
  digitalWrite(estrattore, LOW);
  e = true;
}
void manu_estrattore_off(void *ptr) {
  e_mano = false;
  digitalWrite(estrattore, HIGH);
  e = false;
}
void manu_ventilatore_on(void *ptr) {
  v_mano = true;
  digitalWrite(ventilatore, LOW);
  v = true;
}
void manu_ventilatore_off(void *ptr) {
  v_mano = false;
  digitalWrite(ventilatore, HIGH);
  v = false;
}
void manu_umidificatore_on(void *ptr) {
  u_mano = true;
  digitalWrite(umidificatore, LOW);
  u = true;
}
void manu_umidificatore_off(void *ptr) {
  u_mano = false;
  digitalWrite(umidificatore, HIGH);
  u = false;
}

void Attuatori() {
  if (t) {
    Checkbox_Tenda_On.Set_font_color_pco(1024);
  } else {
    Checkbox_Tenda_On.Set_font_color_pco(0);
  }
  if (e) {
    Checkbox_Estrattore_On.Set_font_color_pco(1024);
  } else {
    Checkbox_Estrattore_On.Set_font_color_pco(0);
  }
  if (v) {
    Checkbox_Ventilatore_On.Set_font_color_pco(1024);
  } else {
    Checkbox_Ventilatore_On.Set_font_color_pco(0);
  }
  if (u) {
    Checkbox_Umidificatore_On.Set_font_color_pco(1024);
  } else {
    Checkbox_Umidificatore_On.Set_font_color_pco(0);
  }
  if (t_mano == true) {
    Txt_Tenda_Mano.setText("Manuale");
    Txt_Tenda_Mano.Set_background_color_bco(1024);
  } else {
    Txt_Tenda_Mano.setText("Automatico");
    Txt_Tenda_Mano.Set_background_color_bco(16904);
  }
  if (e_mano == true) {
    Txt_Estrattore_Mano.setText("Manuale");
    Txt_Estrattore_Mano.Set_background_color_bco(1024);
  } else {
    Txt_Estrattore_Mano.setText("Automatico");
    Txt_Estrattore_Mano.Set_background_color_bco(16904);
  }
  if (v_mano == true) {
    Txt_Ventilatore_Mano.setText("Manuale");
    Txt_Ventilatore_Mano.Set_background_color_bco(1024);
  } else {
    Txt_Ventilatore_Mano.setText("Automatico");
    Txt_Ventilatore_Mano.Set_background_color_bco(16904);
  }
  if (u_mano == true) {
    Txt_Umidificatore_Mano.setText("Manuale");
    Txt_Umidificatore_Mano.Set_background_color_bco(1024);
  } else {
    Txt_Umidificatore_Mano.setText("Automatico");
    Txt_Umidificatore_Mano.Set_background_color_bco(16904);
  }
}

Buongiorno e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

1 Like

presentazione fatta!!!!! grazie

1 Like

Ciao, benvenuto. Visto che le singole sezioni paiono funzionare e non ho visto nel codice particolari cicli che possano bloccare l'esecuzione in determinati punti credo che qualche dettaglio maggiore sia utile per diagnosticare la problematica. "Alcuni pulsanti non funzionano più": Non funzionano sin dall'avvio o il loro funzionamento si interrompe dopo alcune operazioni? Le operazioni che portano al blocco sono sempre le solite? Quando si "blocca" si bloccano solo quei pulsanti e il resto funziona o non funziona più nulla?
Poi qualche consiglio "non richiesto":
Cerca di sostituire le variabili tipo t,e,v con qualcosa di parlante, aiuta te a leggere il codice e anche noi. In più tra tre mesi rischi di non ricordare bene a cosa servono e perdere quindi tempo.
Altra cosa da fare (secondo me) è quella di evitare di scrivere sempre ad ogni ciclo di loop tutte le informazioni sul display. Se un dato non è cambiato non aggiornare il display, il programma sarà più reattivo nell'esecuzione e il display non avrà eventuali sfarfallamenti fastidiosi.

Ciao, grazie mille innanzitutto dei consigli.
Allora singolarmente si funziona tutto come deve.
Quando unisco tutti i cicli insieme le variabili che leggo dai sensori esterni(luce, umidità e temperatura) funzionano correttamente.
I pulsanti invece (quelli che inviano i dati dal display all’arduino) non vanno.
O meglio, funzionano ma magari devo premerli X volte per farlo comunicare.
A volte dopo ripetuti click il tutto funziona, a volte invece no.
Quello che non capisco è perché gli stessi cicli caricati singolarmente funzionano alla perfezione, e i pulsanti che inviano i dati oppure i pulsanti che abilitano il funzionamento manuale degli attuatori sono super reattivi e non sbagliano nemmeno un click.

Io punterei il dito contro la funzione Leggi. Che a discapito del suo nome... scrive di continuo i valori sul display e probabilmente satura il buffer seriale (o di Arduino o del Nextion o entrambe) e quindi ti perdi gli eventi dei pulsanti.
Prova a commentare tutte le istruzioni della funzione Leggi e vedere se la situazione migliora o se addirittura si risolve. Se così fosse hai la risposta che cercavi. Alla fine è un po' quello che sospettavo quanto ho visto la funzione e che mi ha portato a suggerire di rendere il programma più reattivo

Ciao, grazie mille dell'aiuto.

ho risolto aggiungendo 2 pulsanti.
un pulsante per la lettura dei parametri impatti in arduino (ex funzione "Leggi") e siccome il problema persisteva ho aggiunto un ulteriore pulsante sulla schermata dei manuali dove qui scrivevo costantemente nei campi di testo di ogni attuatore se erano impostati in automatico o manuale, ora invece i campi di testo vengono scritti solo premendo l'apposito pulsante.

Il tutto gira come un fulmine!!!!! :stuck_out_tongue_winking_eye:

fabpolli grazie ancora!!!!! al prossimo progetto. :wave: