[Risolto] Ciclare 2 schermate su lcd con millis

Buongiorno, ringrazio anticipatamente chi spenderà 5 minuti anche solo per leggere il mio quesito e spero che qualcuno possa darmi una mano.
Il progetto si basa sulla lettura di 4 pin analogici collegati ad alcune resistenze in serie, per cui ogni pin leggerà un valore diverso. Se il cavo è collegato correttamente e quindi il valore letto ricade nei limiti prestabiliti ed indicati all’interno di alcune IF, su lcd 16x2 viene stampato “cavo1 ok” (oppure “fail” se non è corretto) sulla prima riga e “cavo2 ok” (oppure “fail”) nella seconda riga, e l’indicazione rimane a schermo per circa 1 secondo. Poi le indicazioni a schermo vengono cancellate e compaiono le indicazioni di cavo3 e cavo4 analogamente alla prima schermata. Le indicazioni rimangono a schermo per 1 secondo e così via, continuando a ciclare tra la prima e la seconda schermata.
Ora, dato che i cavi possono essere collegati e scollegati durante il ciclo, se uso il delay, ovviamente le indicazioni compaiono con un fastidioso ritardo e pertanto sto cercando di usare millis in modo che “OK” o “FAIL” vengano aggiornate in tempo reale.
Allego il codice che ho scritto (ho cercato di commentare il più possibile e di renderlo più leggibile possibile, ma sono super neofita, quindi se ci sono strafalcioni fatemeli notare).
Sono giorni che cerco di trovare una soluzione e di fare tutti i tentativi che mi vengono in mente…ma proprio non ne vengo a capo, alla fine mi sono arreso per cui, come ultima risorsa chiedo qui.
Grazie a tutti per l’aiuto.
Ecco il codice, scusate ma non riesco ad allineare i commenti a lato nel void loop (*mi sono reso conto che da cellulare risulta illeggibile e quindi ho deciso di eliminare i commenti a lato).

//Librerie
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

//Setup monitor LCD
LiquidCrystal_I2C lcd (0x27, 16, 2);

//Assegnazione PIN analogici
const int cavo1 = A0;
const int cavo2 = A1;
const int cavo3 = A2;
const int cavo4 = A3;

//Assegnazione PIN digitali per LED
const int pinLed1 = 2;
const int pinLed2 = 3;
const int pinLed3 = 4;
const int pinLed4 = 5;
//Variabile valore lettura analogica
int letturacavo1;
int letturacavo2;
int letturacavo3;
int letturacavo4;

//Variabile stato PIN analogico (collegamento corretto-->true)
bool statoCavo1 = false;
bool statoCavo2 = false;
bool statoCavo3 = false;
bool statoCavo4 = false;

unsigned long previousMillis = 0;
unsigned long interval = 5000;

void setup() {

  //Inizializzazione monitor LCD;
  lcd.init();
  lcd.backlight();

  //Inizializzazione PIN analogici
  pinMode(cavo1, INPUT);
  pinMode(cavo2, INPUT);
  pinMode(cavo3, INPUT);
  pinMode(cavo4, INPUT);

  //Inizializzazione PIN digitali LED
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  pinMode(pinLed3, OUTPUT);
  pinMode(pinLed4, OUTPUT);
}

void loop() {

  unsigned long currentMillis = millis();

  //valore lettura PIN analogici
  letturacavo1 = analogRead(cavo1);
  letturacavo2 = analogRead(cavo2);
  letturacavo3 = analogRead(cavo3);
  letturacavo4 = analogRead(cavo4);

  lcd.home();                                          

  if (letturacavo1 >= 1000 && letturacavo1 <= 1023) { 
    lcd.print ("Cavo 1: OK");                        
    digitalWrite (pinLed1, HIGH);                 
    statoCavo1 = true;                               
  }
  else {                                                 
    lcd.print ("Cavo 1: FAIL");                      
    digitalWrite (pinLed1, LOW);                  
    statoCavo1 = false;                             
  }                                                        

  lcd.setCursor (0, 1);                               
  if (letturacavo2 >= 755 && letturacavo2 <= 775) {  
    lcd.print ("Cavo 2: OK");                       
    digitalWrite (pinLed2, HIGH);
    statoCavo2 = true;
  }
  else {                                                   
    lcd.print ("Cavo 2: FAIL");
    digitalWrite (pinLed2, LOW);
    statoCavo2 = false;
  }                                                         

//se sostituisco le seguenti 3 righe con delay funziona
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    lcd.clear();                                          
    
    lcd.home();                                          
    if (letturacavo3 >= 500 && letturacavo3 <= 520) {    
      lcd.print ("Cavo 3: OK");                       
      digitalWrite (pinLed3, HIGH);
      statoCavo3 = true;
    }
    else {                                                 
      lcd.print ("Cavo 3: FAIL");
      digitalWrite (pinLed3, LOW);
      statoCavo3 = false;
    }
    lcd.setCursor(0, 1);                               
    if (letturacavo4 >= 245 && letturacavo4 <= 265) {   
      lcd.print ("Cavo 4: OK");                       
      digitalWrite (pinLed4, HIGH);
      statoCavo4 = true;
    }
    else {                                                  
      lcd.print ("Cavo 4: FAIL");
      digitalWrite (pinLed4, LOW);
      statoCavo4 = false;
    }
  }                                                     
  //se sostituisco le seguenti 3 righe con delay funziona
  if (currentMillis - previousMillis > interval) { 
    previousMillis = currentMillis; 
    lcd.clear();                                           
  }                                              
}                                                            [/td]

Ti rammento che il codice deve essere racchiuso tra i tag CODE e non tra i tag di tabella come avevi fatto tu ...
... per questa volta ho sistemato io, ma ricordatene per il futuro. Grazie.

Guglielmo

ma, guarda, ho anche cercato nel regolamento, ed ho trovato questa immagine che allego e sono rimasto spiazzato perchè era diverso da ciò che vedevo io…non trovavo il tasto giusto…ora ho visto dov’è.
cmq avevo cancellato i commenti a lato perchè mi sembrava illeggibile…o va bene?

Mah … i commenti sono sempre utili, potevi lasciarli :), per il resto …
… i tag CODE sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra.
In pratica, tutto il codice deve trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. :wink:

Guglielmo

I commenti dovrebbero spiegare (se serve e non è già evidente) cosa stai facendo in quel punto del programma, non cosa fa la sintassi C. Quindi commenti come i seguenti sono ridondanti, non aggiungono alcuna informazione a quanto già si capisce dalla riga :wink:

if (letturacavo4 >= 245 && letturacavo4 <= 265) { //se la condizione della IF annidiata è vera.

else {                                            //altrimenti esegue il contrario

Detto ciò, non è più semplice scrivere nella prima riga i numeri 1 2 3 4 e nella seconda lo stato letto dagli ingressi, in modo da non dover ciclare sulle pagine?

Non ti funziona perché tu nel loop, ad ogni ciclo, confronti il valore di cavo uno e due, qualsiasi si il loro stato lo stampi sul display dopodiché verifichi se è trascorso un secondo, pulisci tutto e stampi i cavi tre e quattro. poi il loop ritorna all'inizio e immediatamente stampi di nuovo cavi uno e due.
Il mio suggerimento è sposta anche la scrittura dei cavi uno e due dentro l'if dove confronti millis e aggiungi una variabile che ti dica se devi stampare i primi due cavi o i secondi due.
Prima di uscire dall'if modifichi il valoe della variabile che di indica cosa stampare in modo che un secondo dopo quando entrerai di nuovo nell'if stamparei le altre due coppie.
Fatto questo passeremo ad ottimizzare la cosa perché anche facendo così se sei nella schermata due e lo stato di uno dei due cavi varia dovrai attenere un secondo (o poco meno) prima di visualizzare il nuovo stato.

Grazie Guglielmo e mi scuso x il malinteso.
Per quanto riguarda i commenti, era più una cosa mia in cui cerco di tradurre in italiano quello che scrivo, visto che sono alle prime armi. L'intento nel postarli qui era anche capire se traducevo in maniera corretta visto che cmq il codice non funziona come vorrei. Solo che mi sembrava che incasinassero la buona leggibilità x cui poi li ho tolti del tutto.
Claudio, la tua soluzione sicuramente toglie il problema alla radice, però "esteticamente" preferisco che le informazioni nelle 2 pagine ciclino e che le indicazioni siano scritte per esteso. Questione di gusti...e cmq a prescindere da questo vorrei capire come far ciclare LCD con millis. Per ora, scritto così, lo schermo visualizza la prima pagina. Poi ogni secondo sembra (ma è troppo veloce e non si capisce) che per un attimo stampi la seconda per poi tornare alla prima. In pratica sembra che la prima schermata resti fissa tranne che per un microattimo.
Appena posso in mattinata cerco di modificare seguendo i consigli e vi dico come cambia.

Secondo me si potrebbe risolvere con una macchina a due stati.

  1. Ho la funzione millis() in un if(), che mi calcola l’intervallo di tempo

  2. Trascorso l’intervallo se sono allo stato 1 passo allo stato 2, viceversa se sono al 2 passo all’ uno

  3. Se stato uno stampo i valori dei cavi 1 e 2, se sono allo stato 2 stampo i valori dei cavi 3 e 4

byte stato =1;

unsigned long tempo=0;

long intervallo=5000;

void loop(){

      if(millis()- tempo>= intervallo){

            stato=!stato; // Se è 0 diventa 1, se è 1 diventa 0
            tempo=millis(); // Mi ero dimenticato di aggiornare la variabile correzione :)

     }


    switch(stato){

        case 0:
            // Codice per stampare i valori dei cavi 1 2
            break


        case 1:
             // Codice per stampare i valori dei cavi 3 4
             break;


   }

}

Poi ogni secondo sembra (ma è troppo veloce e non si capisce) che per un attimo stampi la seconda per poi tornare alla prima.

Il tuo codice stampa la prima schermata, attende 5 secondi, stampa la seconda e poi ricomincia subito a stampare la prima schermata. Pe cui non esiste pausa sulla seconda schermata :slight_smile:

Allora intanto ho provato a modificare il codice usando switch. Ho anche ridotto interval a 1000, il 5000 era un errore di digitazione.
Ecco il codice modificato. Ho inserito un Serial.print(stato) per vedere se cambia…ma rimane sempre 0. Infatti lo schermo visualizza sempre la prima schermata.
Ora tento anche un’altra via seguendo il consiglio di fabpolli, sperando di riuscire a tradurre correttamente in codice i suoi consigli.Alcune cose scontate per voi, purtroppo ancora non lo sono anche per me e ci devo ragionare un po’ su…

//Librerie
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

//Setup monitor LCD
LiquidCrystal_I2C lcd (0x27, 16, 2);

//Assegnazione PIN analogici
const int cavo1 = A0;
const int cavo2 = A1;
const int cavo3 = A2;
const int cavo4 = A3;

//Assegnazione PIN digitali per LED
const int pinLed1 = 2;
const int pinLed2 = 3;
const int pinLed3 = 4;
const int pinLed4 = 5;
//Variabile valore lettura analogica
int letturacavo1;
int letturacavo2;
int letturacavo3;
int letturacavo4;

//Variabile stato PIN analogico (collegamento corretto-->true)
bool statoCavo1 = false;
bool statoCavo2 = false;
bool statoCavo3 = false;
bool statoCavo4 = false;

unsigned long previousMillis = 0;
unsigned long interval = 1000;
byte stato=0;

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

  //Inizializzazione monitor LCD;
  lcd.init();
  lcd.backlight();

  //Inizializzazione PIN analogici
  pinMode(cavo1, INPUT);
  pinMode(cavo2, INPUT);
  pinMode(cavo3, INPUT);
  pinMode(cavo4, INPUT);

  //Inizializzazione PIN digitali LED
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  pinMode(pinLed3, OUTPUT);
  pinMode(pinLed4, OUTPUT);
}

void loop() {

  unsigned long currentMillis = millis();

  //valore lettura PIN analogici
  letturacavo1 = analogRead(cavo1);
  letturacavo2 = analogRead(cavo2);
  letturacavo3 = analogRead(cavo3);
  letturacavo4 = analogRead(cavo4);

                                                        
  if (currentMillis - previousMillis > interval) {      
    previousMillis = currentMillis;
    stato!=stato;
  }
  switch (stato){
    
    case 0:
  lcd.home();   
  if (letturacavo1 >= 1000 && letturacavo1 <= 1023) {   
    lcd.print ("Cavo 1: OK");
    digitalWrite (pinLed1, HIGH);
    statoCavo1 = true;
  }
  else {
    lcd.print ("Cavo 1: FAIL");
    digitalWrite (pinLed1, LOW);
    statoCavo1 = false;
  }

  lcd.setCursor (0, 1);
  if (letturacavo2 >= 755 && letturacavo2 <= 775) {
    lcd.print ("Cavo 2: OK");
    digitalWrite (pinLed2, HIGH);
    statoCavo2 = true;
  }
  else {
    lcd.print ("Cavo 2: FAIL");
    digitalWrite (pinLed2, LOW);
    statoCavo2 = false;
  }
  lcd.clear();
  break;
  

  case 1:                                 
    lcd.home();
    if (letturacavo3 >= 500 && letturacavo3 <= 520) {
      lcd.print ("Cavo 3: OK");
      digitalWrite (pinLed3, HIGH);
      statoCavo3 = true;
    }
    else {
      lcd.print ("Cavo 3: FAIL");
      digitalWrite (pinLed3, LOW);
      statoCavo3 = false;
    }
    lcd.setCursor(0, 1);
    if (letturacavo4 >= 245 && letturacavo4 <= 265) {
      lcd.print ("Cavo 4: OK");
      digitalWrite (pinLed4, HIGH);
      statoCavo4 = true;
    }
    else {                                            
      lcd.print ("Cavo 4: FAIL");
      digitalWrite (pinLed4, LOW);
      statoCavo4 = false;
    }
    lcd.clear();
    break;
  }
  Serial.print(stato);
}

Alan18:
Alcune cose scontate per voi, purtroppo ancora non lo sono anche per me e ci devo ragionare un po' su.......

L'obiettivo è proprio quello. Dar arrivare l'utente, che ancora non conosce una cosa, a ragionarci e capirla per poi poterla padroneggiare con la pratica.
Ad ogni modo il suggerimento mio e il tuo attuale codice coincidono (in pratica) non condivido questa strada per il semplice fatto che scrivendo continuamente ad ogni ciclo di loop sul display si va incontro a blocchi, errori di scrittura vari, ecc. pertanto consigliavo di aggiornare il display ogni secondo e non ad ogni ciclo di loop.
Comunque nel tuo codice attuale (che non funziona) l'unico problema è il tipo della variabile (errore già presente nel codcie d'esempio di @torn24) (L'errore doveva essre un'altro). Prova a correggerlo per vederlo funzionare è comunque un allenamento a scovare i bug. io comunque poi andrei verso un aggiornamento "solo quando serve" e "solo di ciò che serve" tradotto: aggiornare solo se un dato cambia e non riscrivere tutto il display ma solo la parte che varia

Ho provato a modificare il tipo della variabile stato da byte ad int, ma il suo valore mi dà costantemente zero. Quindi non è cambiato nulla.
Però se questa strada và incontro ad errori e blocchi, preferisco cambiare approccio e seguire il tuo (fabpolli).
Per ora ho spostato le if di cavo1 e cavo2 dentro la if millis e cavo3 e cavo4 dentro un’altra if millis. E fin qui era un tentativo che avevo già fatto…ma non ho capito come aggiungere una variabile che mi dica se stampare la prima schermata o la seconda…
Qui il codice…anche se non mi spiego perchè così non funziona…e dire che con 2 delay fà proprio quello che voglio…se non fosse bloccante >:(

//Librerie
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

//Setup monitor LCD
LiquidCrystal_I2C lcd (0x27, 16, 2);

//Assegnazione PIN analogici
const int cavo1 = A0;
const int cavo2 = A1;
const int cavo3 = A2;
const int cavo4 = A3;

//Assegnazione PIN digitali per LED
const int pinLed1 = 2;
const int pinLed2 = 3;
const int pinLed3 = 4;
const int pinLed4 = 5;
//Variabile valore lettura analogica
int letturacavo1;
int letturacavo2;
int letturacavo3;
int letturacavo4;

//Variabile stato PIN analogico (collegamento corretto-->true)
bool statoCavo1 = false;
bool statoCavo2 = false;
bool statoCavo3 = false;
bool statoCavo4 = false;

unsigned long previousMillis = 0;
unsigned long interval = 5000;

void setup() {

  //Inizializzazione monitor LCD;
  lcd.init();
  lcd.backlight();

  //Inizializzazione PIN analogici
  pinMode(cavo1, INPUT);
  pinMode(cavo2, INPUT);
  pinMode(cavo3, INPUT);
  pinMode(cavo4, INPUT);

  //Inizializzazione PIN digitali LED
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  pinMode(pinLed3, OUTPUT);
  pinMode(pinLed4, OUTPUT);
}
void loop() {

  unsigned long currentMillis = millis();

  //valore lettura PIN analogici
  letturacavo1 = analogRead(cavo1);
  letturacavo2 = analogRead(cavo2);
  letturacavo3 = analogRead(cavo3);
  letturacavo4 = analogRead(cavo4);

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    lcd.clear();

    lcd.home();
    if (letturacavo1 >= 1000 && letturacavo1 <= 1023) {
      lcd.print ("Cavo 1: OK");
      digitalWrite (pinLed1, HIGH);
      statoCavo1 = true;
    }
    else {
      lcd.print ("Cavo 1: FAIL");
      digitalWrite (pinLed1, LOW);
      statoCavo1 = false;
    }

    lcd.setCursor (0, 1);
    if (letturacavo2 >= 755 && letturacavo2 <= 775) {
      lcd.print ("Cavo 2: OK");
      digitalWrite (pinLed2, HIGH);
      statoCavo2 = true;
    }
    else {
      lcd.print ("Cavo 2: FAIL");
      digitalWrite (pinLed2, LOW);
      statoCavo2 = false;
    }
  }

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    lcd.clear();
    lcd.home();
    if (letturacavo3 >= 500 && letturacavo3 <= 520) {
      lcd.print ("Cavo 3: OK");
      digitalWrite (pinLed3, HIGH);
      statoCavo3 = true;
    }
    else {
      lcd.print ("Cavo 3: FAIL");
      digitalWrite (pinLed3, LOW);
      statoCavo3 = false;
    }
    lcd.setCursor(0, 1);
    if (letturacavo4 >= 245 && letturacavo4 <= 265) {
      lcd.print ("Cavo 4: OK");
      digitalWrite (pinLed4, HIGH);
      statoCavo4 = true;
    }
    else {      
      lcd.print ("Cavo 4: FAIL");
      digitalWrite (pinLed4, LOW);
      statoCavo4 = false;
    }
  }
}

Allora hai creato due if identini, non serve tutto deve stare dentro un singolo if tanto se entra nel rimo entra (entrerebbe) anche nel secondo. Se non fosse che così come hai scritto nel secondo non entrerà mai, nel primo reimposti la previousMillis il resto del ragionamento lo lascio a te.
Discorso aggiungere la variabile, è esattamente come ti ha suggerito torn24, dentro l'if devi verificare (con un if o con uno switch se hai più di due stati possibili (e tu non li hai almeno per ora)) se tale variabile vale zero o uno (o meglio ancora vero o falso) e scrivere in un caso la prima coppia di dati altrimenti scrivere la seconda coppia di dati. Prima di uscire dall'if devi invertire (come è nel suggerimento di torn) il valore della variabile. Adesso una domanda che dovresti porti, qual'èquel tipo di variabile che può avere solo due possibili valori? Se riesci a risponderti a questa domanda dovresti essere a cavallo e riuscire a codificare il tutto.

fabpolli:
Adesso una domanda che dovresti porti, qual'èquel tipo di variabile che può avere solo due possibili valori? Se riesci a risponderti a questa domanda dovresti essere a cavallo e riuscire a codificare il tutto.

bool, true e false...
Ora ragiono un pò su quello che mi hai scritto....e spero di essere davvero a cavallo...

Alan18:
bool, true e false...
Ora ragiono un pò su quello che mi hai scritto....e spero di essere davvero a cavallo...

Correto, dai ci sei quasi, ragiona su se è passato il tempo devo stampare qualcosa, quel qualcosa è o una schermata o l'altra, unisci le informazioni con il suggerimento di torn24 e dovresti riuscire

Bah, non so se mi si stanno confondendo sempre di più le idee…ci sto provando in tutti i modi, ma niente, nonostante mi stia scervellando. Spero di non essermi allontanato dalla soluzione…

//Librerie
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

//Setup monitor LCD
LiquidCrystal_I2C lcd (0x27, 16, 2);

//Assegnazione PIN analogici
const int cavo1 = A0;
const int cavo2 = A1;
const int cavo3 = A2;
const int cavo4 = A3;

//Assegnazione PIN digitali per LED
const int pinLed1 = 2;
const int pinLed2 = 3;
const int pinLed3 = 4;
const int pinLed4 = 5;
//Variabile valore lettura analogica
int letturacavo1;
int letturacavo2;
int letturacavo3;
int letturacavo4;

//Variabile stato PIN analogico (collegamento corretto-->true)
bool statoCavo1 = false;
bool statoCavo2 = false;
bool statoCavo3 = false;
bool statoCavo4 = false;

unsigned long previousMillis = 0;
unsigned long interval = 1000;
bool stato=0;

void setup() {
Serial.begin(9600);
  //Inizializzazione monitor LCD;
  lcd.init();
  lcd.backlight();

  //Inizializzazione PIN analogici
  pinMode(cavo1, INPUT);
  pinMode(cavo2, INPUT);
  pinMode(cavo3, INPUT);
  pinMode(cavo4, INPUT);

  //Inizializzazione PIN digitali LED
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  pinMode(pinLed3, OUTPUT);
  pinMode(pinLed4, OUTPUT);
}
void loop() {

  unsigned long currentMillis = millis();

  //valore lettura PIN analogici
  letturacavo1 = analogRead(cavo1);
  letturacavo2 = analogRead(cavo2);
  letturacavo3 = analogRead(cavo3);
  letturacavo4 = analogRead(cavo4);

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    stato==1;
    
    if (stato=1){
    lcd.clear();
    lcd.home();
    if (letturacavo1 >= 1000 && letturacavo1 <= 1023) {
      lcd.print ("Cavo 1: OK");
      digitalWrite (pinLed1, HIGH);
      statoCavo1 = true;
    }
    else {
      lcd.print ("Cavo 1: FAIL");
      digitalWrite (pinLed1, LOW);
      statoCavo1 = false;
    }

    lcd.setCursor (0, 1);
    if (letturacavo2 >= 755 && letturacavo2 <= 775) {
      lcd.print ("Cavo 2: OK");
      digitalWrite (pinLed2, HIGH);
      statoCavo2 = true;
    }
    else {
      lcd.print ("Cavo 2: FAIL");
      digitalWrite (pinLed2, LOW);
      statoCavo2 = false;
    }
  }
else{
    lcd.clear();
    lcd.home();
    if (letturacavo3 >= 500 && letturacavo3 <= 520) {
      lcd.print ("Cavo 3: OK");
      digitalWrite (pinLed3, HIGH);
      statoCavo3 = true;
    }
    else {
      lcd.print ("Cavo 3: FAIL");
      digitalWrite (pinLed3, LOW);
      statoCavo3 = false;
    }
    lcd.setCursor(0, 1);
    if (letturacavo4 >= 245 && letturacavo4 <= 265) {
      lcd.print ("Cavo 4: OK");
      digitalWrite (pinLed4, HIGH);
      statoCavo4 = true;
    }
    else {      
      lcd.print ("Cavo 4: FAIL");
      digitalWrite (pinLed4, LOW);
      statoCavo4 = false;
    }
  }
}
Serial.println(stato);
}

Due piccoli errori che pregiudicano il risultato.
La struttura è corretta ma abituati fin da subito a formattare il programma (Ctrl+T nell'IDE) prima di postarlo, in realtà anche più spesso, rende tutto leggibile in primis per te e poi per noi :slight_smile:
il primo errore:

if (stato=1){

Questo non è un confronto ma un assegnazione che come risultato da sempre vero quindi entri sempre li e stato varrà sempre uno.
Sei con un booleano lavora con true e false e per evitare questi errori la sintassi consigliata (anche se bruttina da vedere) è

if (TRUE==stato){

In realtà essendo un boolean ti basta:

if (stato){

Secondo errore:

stato==1;

questa non ha proprio senso! un confronto fuori da una struttura di controllo (Es. if) non serve a nulla.
Riguarda l'esempio di torn24 e guarda cosa ti aveva suggerito lui per invertire il valore della variabile stato

fabpolli:
Due piccoli errori che pregiudicano il risultato.
La struttura è corretta ma abituati fin da subito a formattare il programma (Ctrl+T nell’IDE) prima di postarlo, in realtà anche più spesso, rende tutto leggibile in primis per te e poi per noi :slight_smile:

Chiedo scusa, forse mi sono dimenticato di farlo. Io di solito evidenzio tutto, tasto dx, formattazione automatica. Equivale a Ctrl+T?

stato==1;

questa non ha proprio senso! un confronto fuori da una struttura di controllo (Es. if) non serve a nulla.
Riguarda l’esempio di torn24 e guarda cosa ti aveva suggerito lui per invertire il valore della variabile stato
[/quote]

Qui maldestramente il mio intento era dire: se è passato più di un secondo, lo stato è true e quindi stampa la prima pagina, altrimenti stampa la seconda.

Per invertire il valore della variabile stato devo fare stato!=stato; quindi se è true diventa false e viceversa.

Adesso ho corretto la condizione della if “dopo il millis” in (stato) e l’istruzione nella if “del millis” in stato!=stato.
Ora resta fisso sulla seconda pagina…
Il valore di stato è sempre 0.
Dammi coraggio e dimmi che ci sono quasi…

//Librerie
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

//Setup monitor LCD
LiquidCrystal_I2C lcd (0x27, 16, 2);

//Assegnazione PIN analogici
const int cavo1 = A0;
const int cavo2 = A1;
const int cavo3 = A2;
const int cavo4 = A3;

//Assegnazione PIN digitali per LED
const int pinLed1 = 2;
const int pinLed2 = 3;
const int pinLed3 = 4;
const int pinLed4 = 5;
//Variabile valore lettura analogica
int letturacavo1;
int letturacavo2;
int letturacavo3;
int letturacavo4;

//Variabile stato PIN analogico (collegamento corretto-->true)
bool statoCavo1 = false;
bool statoCavo2 = false;
bool statoCavo3 = false;
bool statoCavo4 = false;

unsigned long previousMillis = 0;
unsigned long interval = 1000;
bool stato = false;

void setup() {
  Serial.begin(9600);
  //Inizializzazione monitor LCD;
  lcd.init();
  lcd.backlight();

  //Inizializzazione PIN analogici
  pinMode(cavo1, INPUT);
  pinMode(cavo2, INPUT);
  pinMode(cavo3, INPUT);
  pinMode(cavo4, INPUT);

  //Inizializzazione PIN digitali LED
  pinMode(pinLed1, OUTPUT);
  pinMode(pinLed2, OUTPUT);
  pinMode(pinLed3, OUTPUT);
  pinMode(pinLed4, OUTPUT);
}
void loop() {

  unsigned long currentMillis = millis();

  //valore lettura PIN analogici
  letturacavo1 = analogRead(cavo1);
  letturacavo2 = analogRead(cavo2);
  letturacavo3 = analogRead(cavo3);
  letturacavo4 = analogRead(cavo4);

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    stato != stato;

    if (stato) {
      lcd.clear();
      lcd.home();
      if (letturacavo1 >= 1000 && letturacavo1 <= 1023) {
        lcd.print ("Cavo 1: OK");
        digitalWrite (pinLed1, HIGH);
        statoCavo1 = true;
      }
      else {
        lcd.print ("Cavo 1: FAIL");
        digitalWrite (pinLed1, LOW);
        statoCavo1 = false;
      }

      lcd.setCursor (0, 1);
      if (letturacavo2 >= 755 && letturacavo2 <= 775) {
        lcd.print ("Cavo 2: OK");
        digitalWrite (pinLed2, HIGH);
        statoCavo2 = true;
      }
      else {
        lcd.print ("Cavo 2: FAIL");
        digitalWrite (pinLed2, LOW);
        statoCavo2 = false;
      }
    }
    else {
      lcd.clear();
      lcd.home();
      if (letturacavo3 >= 500 && letturacavo3 <= 520) {
        lcd.print ("Cavo 3: OK");
        digitalWrite (pinLed3, HIGH);
        statoCavo3 = true;
      }
      else {
        lcd.print ("Cavo 3: FAIL");
        digitalWrite (pinLed3, LOW);
        statoCavo3 = false;
      }
      lcd.setCursor(0, 1);
      if (letturacavo4 >= 245 && letturacavo4 <= 265) {
        lcd.print ("Cavo 4: OK");
        digitalWrite (pinLed4, HIGH);
        statoCavo4 = true;
      }
      else {
        lcd.print ("Cavo 4: FAIL");
        digitalWrite (pinLed4, LOW);
        statoCavo4 = false;
      }
    }
  }
  Serial.println(stato);
}

Ho aggiunto stato=!stato prima dell’uscita dall’if come mi avevi suggerito nelle prime risposte e…funziona!!!
Grazie davvero…a voi magari sembra banale, ma a me sembra di aver scalato una montagna. Ma con i vostri consigli, piano piano, ragionando, ci sono arrivato!

Hai trovato l’inghippo da solo ma ormai il pippone l’avevo già scritto quindi lo posto :slight_smile:

Alan18:
Chiedo scusa, forse mi sono dimenticato di farlo. Io di solito evidenzio tutto, tasto dx, formattazione automatica. Equivale a Ctrl+T?

Si

Alan18:
Qui maldestramente il mio intento era dire: se è passato più di un secondo, lo stato è true e quindi stampa la prima pagina, altrimenti stampa la seconda.

Per invertire il valore della variabile stato devo fare stato!=stato; quindi se è true diventa false e viceversa.

Hai un po’ di confusione con l’assegnazione e gli operatori di confronto.
Per assegnare un valore devi fare VARIABILE=QUALCOSA, dove qualcosa può essere un sacco di cose, un valore fisso, una funzione che risorna un valore, un’altra varibile ecc.
Gli operatori di confronto invece servono dentro le strutture di controllo e possono essere ad esempio == (uguale), != (non uguale, diverso da), > maggiore di , < minore di, <= minore o uguale a, ecc.
Nel tuo caso hai solo posizionato male il punto esclamativo.
Come fai fatto tu il compilatore vede stato è diverso da stato, il risultato sarà sempre false ma questo finirà nel nulla più assoluto in quanto questo confronto non viene assegnato a nulla e non viene usato in nessuna struttura di controllo. Quando è lecito usarlo:

pippo = pluto != paperino;  //Paperino è diverso da pluto, metti il risultato in pippo
if(!pippo){} Se pippo è false entra nell'if (perché l'operatore ! nega il valore di pippo)
if(pippo!=pluto){} //Se pippo è diverso da pluto entra nell'if

Tu invece vuoi invertire il valore contenuto in stato, il modo più veloce è quello che ti ha mostrato torn24 che equivale a:

if(stato)
{
  stato=false;
}
else
{
  stato=true;
}