ho scritto il mio primo programma

buongiorno a tutti, come da titolo ho scritto il mio programma, ed sono contento che grazie a qualche
vostro consiglio sono riuscito a farlo funzionare.
ora vi chiedo se secondo voi ho fatto qualche errore. qualche miglioria da fare, il funzionamento e’ ok
questa e’ la parte tx

#include <SPI.h>
#include <RF24.h>
#include <DHT.h>
RF24 myRadio (10, 9);
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
byte addresses[][6] = {"00001" , "00002"};
//------------creo 2 operazioni ogni tot tempo----------
unsigned long ritardo = 500;
unsigned long previousMillis1 = 0; //memorizzerà l'ultima volta che il LED è stato aggiornato
unsigned long interval1 = 1000;  //intervallo a cui lampeggiare (millisecondi)
unsigned long previousMillis2 = 0;
unsigned long interval2 = 5000;
//----------- dati in arrivo----------
struct Ricezione
{
  int accensione; // comando accensione quadro
  int avvio; //comando avvio motorino avviamento
  int id ;
  int tensione  ;
  float ampere = 0;
  char  text[150]  ;
};
struct Ricezione  ricezione;
//------------dati in uscita-----------
struct Data
{
  int mar;     //sensore marcia
  int freno ; //freno a mano
  int cand ;   //candelette
  int secondo;
  int minuto;
  int conf_acc ; //conferma ricevuto comando accensione quadro
  int conf_avv;  //conferma ricevuto comando accensione avviamento
  int conf_cand;         //  dato stato candelette
  float humidithy ;
  float temperature ;
};
struct Data data;

//       ---variabili per timer on/off timer quadro ----
unsigned long oldMillis ;// variabile tempo quadro
#define T_MIN 3000       // tempo di inibizione pulsante
#define T_OFF 20000       // tempo di quadro acceso pulsante
bool Ing_quadro = false;

//           ---variabili per timer avvio----
bool ing_sen = false;
bool Ing_avv = false;
unsigned long motore ;
int button = 0;
bool ing_mar = false;

int secondi = 0;
int minuti = 0;



void setup()
{
  dht.begin();
  Serial.begin(115200);
  pinMode(2, INPUT_PULLUP);  // freno a mano
  pinMode(4, INPUT_PULLUP); // pulsante quadro
  pinMode(8, OUTPUT);   // rele' avviamento
  pinMode(7, OUTPUT);  // led dati
  pinMode(6, OUTPUT); //  rele' quadro
  pinMode(14, INPUT_PULLUP);   //pulsante avviamento
  pinMode(15, INPUT_PULLUP);   //sensore marcia 1
  pinMode(16, INPUT_PULLUP);   //sensore marcia 2
  pinMode(19, INPUT_PULLUP);    // candelette 
  
  myRadio.begin();
  myRadio.setChannel(115);
  myRadio.setPALevel(RF24_PA_MIN);
  myRadio.setDataRate( RF24_250KBPS ) ;
  myRadio.openWritingPipe( addresses[1]);
  myRadio.openReadingPipe(1, addresses[0]);
  digitalWrite(7, HIGH);
  delay(1000);
  digitalWrite(7, LOW);
}

void loop() {

  delay(5);
  myRadio.stopListening();
  myRadio.write(&data, sizeof(data));
  delay(5);
  myRadio.startListening();
  while (myRadio.available()) {
    myRadio.read(&ricezione, sizeof(ricezione));

  }
  data.secondo = secondi;
  data.minuto = minuti;
  // leggo temperatura
  data.humidithy = dht.readHumidity();
  data.temperature = dht.readTemperature();

  lettura();
  trasmissione();
  ricez();
}
void lettura() {

  if (millis() - previousMillis1 > 1000) {
    previousMillis1 = millis(); //save the last time I blinked the LED
    // if the LED is off turn it on and vice-versa:


    secondi = secondi + 1;
    if (secondi == 60) {
      secondi = 0;
      minuti = minuti + 1;
    }
  }
}
void trasmissione() {
  if (myRadio.available()) {
    digitalWrite(7, HIGH);
  }
  if (!myRadio.available()) {
    digitalWrite(7, LOW);
  }

  //check if it's time to print the new value of the counter
  //if (millis() - previousMillis2 > interval2) {
  //  previousMillis2 = millis(); //save the last time I printed on the serial
  //Serial.println(ricezione.avvio);

  //data.id = data.id + 1;
}
void ricez() {
  //----------azoni accensione quadro-------------
  //pin 4  accensione quadro ricezione.accensione comando remoto
  // leggo pin 4 e variabile ricezione.accensione almeno 1 true
  Ing_quadro = (digitalRead(4) == LOW) || (ricezione.accensione == 1);
  // La pressione del pulsante inverte lo stato dell'uscita
  if (Ing_quadro && millis() - oldMillis > T_MIN) {
    oldMillis  = millis();
    // Toogle  (funzione passo passo)
    digitalWrite(6, !digitalRead(6)); //accendo/spengo quadro
  }
  // Dopo secondi t_off spengo comunque il LED (se acceso)
  if ( (millis() - oldMillis > T_OFF) && digitalRead(6)) {
    digitalWrite(6, LOW); //spengo quadro
  }
  if (digitalRead(6) == HIGH) {   //spengo quadro
    (data.conf_acc = 1);     //invio dato lcd
  }
  else {
    (data.conf_acc = 0);     //invio dato lcd
  }
  //-------------- azioni avviamento----------
 
  if (Ing_avv) {  // se tasto // se sensore marcia HIGH
    if  (!ing_mar || digitalRead(2) == HIGH ) {
      digitalWrite(6, LOW);
    }
  }
  if (digitalRead(2) == LOW) { //  leggo freno a mano
    data.freno = 0;        //invio dato lcd
  }
  else {
    data.freno = 1;     //invio dato lcd
  }
 if (ing_mar ==1 ) { //  leggo freno a mano
    data.mar = 0;     //invio dato lcd
  }
  else {
    data.mar = 1;      //invio dato lcd
  }
 
  //pin 14 (A0) pin avvio ricezione.avvio comando remoto avvio
  //se almeno 1 e vera e  true qundi 1
  Ing_avv = (digitalRead(14) == LOW || (ricezione.avvio == 1));
  // associo freno a mano e quadro entrambi vere true
  ing_sen = (digitalRead(2) == LOW && digitalRead(6) == HIGH);
  //associo pin con sensori folle
  ing_mar = (digitalRead(15) == LOW && digitalRead(16) == LOW);

  if (digitalRead(6) == HIGH) { // quadro on
    if (Ing_avv == 1 ) // se tasto
      if  (digitalRead(15) == HIGH || digitalRead(16) == HIGH || digitalRead(2) == HIGH ) {
        // se sensore folle e marcia high
        digitalWrite(6, LOW);  // quadro off
      }
  }
  //associo button con sensori
  // La pressione del pulsante =low
  button = Ing_avv && ing_sen && ing_mar;
  if (button == LOW) {
    //se tutte e 3  sono vere
    digitalWrite(8, LOW);     //avviamento off
    (data.conf_avv = 0);    //invio dato lcd
    //Accendi avviamento con timer
    motore = millis();
  }
  else if ( millis() - motore <= 2000 ) {
    //ricezione.avvio = 0;      //spegni avviamento con timer
    digitalWrite(8, HIGH);     //avviamento on
    (data.conf_avv = 1);   //invio dato lcd
  }
  else {
    digitalWrite(8, LOW);      //avviamento off
    (data.conf_avv = 0);     //invio dato lcd
  }

//-------------- candelette----------||
Serial.println(digitalRead(19));
if ( digitalRead(19) == HIGH){
(data.cand= 1);
}
 else {
(data.cand= 0);
}}

e questa la rx

#include <SPI.h>
#include <RF24.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
RF24 myRadio (10, 9);
byte addresses[][6] = {"00001" , "00002"};


int old_pu_disp = 0; //---memorizza stato  pulsante display

//---variabili per timer on/off timer quadro ----
byte ritardo = 10;//ritardo di spegnimento---
unsigned long inizio = 0;
unsigned long fine = 0;
byte stato = 0;
long milliritardo = (ritardo * 1000);

unsigned long currentMillis = millis();
//---variabili per timer avvio----

unsigned long motore = 0;
#define duratadeltimer 3000


unsigned long previousMillis1 = 0; //memorizzerà l'ultima volta che il LED è stato aggiornato
unsigned long interval1 = 1000;  //intervallo a cui lampeggiare (millisecondi)
long previousMillis2 = 0;
long interval2 = 10000;

int contatore = 0;

//----------- dati in arrivo----------
struct Data
{
  int mar;          //sensore marcia
  int freno;        //freno a mano
   int cand ;   //candelette
  int secondo ;
  int minuto ;
  int conf_acc;  //conferma ricevuto comando accensione quadro
  int conf_avv;  //conferma ricevuto comando accensione avviamento
  int conf_cand;      //  dato stato candelette
  float humidithy ;
  float temperature ;
};
struct Data data;

//------------dati in uscita------------

struct Ricezione
{
  int accensione;    // comando accensione quadro remoto
  int avvio;         // comando avviamento remoto
  int id;
  int tensione  ;
  float ampere = 0;
};
struct Ricezione  ricezione;

void setup()
{
  Serial.begin(115200);
  pinMode (3, INPUT_PULLUP);
  pinMode (2, INPUT) ; //pulsante display
  pinMode(5, OUTPUT);    // led dati
  pinMode(7, INPUT_PULLUP); // pulsante quadro
  pinMode(8, INPUT_PULLUP); // pulsante avvio
  myRadio.begin();
  myRadio.setChannel(115);
  myRadio.setPALevel(RF24_PA_MIN);
  myRadio.setDataRate( RF24_250KBPS ) ;
  myRadio.openWritingPipe( addresses[0]);
  myRadio.openReadingPipe(1, addresses[1]);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print("Umid & temp");
  delay(1000);
  lcd.clear();
  lcd.print("Start.....");
  delay(1000);
  lcd.clear();
}
void loop() {
  delay(5);
  myRadio.startListening();
  if (myRadio.available()) {
    while  (myRadio.available()) {
      myRadio.read(&data, sizeof(data));
    }
    delay(5);
    myRadio.stopListening();
    myRadio.write(&ricezione, sizeof(ricezione));
    inizio = millis();
  }
  rx () ;
  tx () ;
  stampa ();


}


void rx ()  {
  Serial.println(data.conf_avv );


}
void tx ()
//------------quadro-----------

{

  if (digitalRead(7) == LOW) {
    (ricezione.accensione = 1);
  }
  else {
    (ricezione.accensione = 0);
  }
  

  //-----------------avviamento-----------
  if (digitalRead(8) == LOW) {
    ricezione.avvio = 1;       //Accendi avviamento con timer
   // motore = millis() + duratadeltimer;
  }
// } if (millis() > motore) {
    if (digitalRead(8) == HIGH) {
    ricezione.avvio = 0;      //spegni avviamento con timer
 }
}
void stampa() {
  //-----------------display-----------
  if (digitalRead(3) == LOW && old_pu_disp == HIGH) {
    contatore = contatore + 1; //leggi stato pulsante
  }
  if (contatore > 2 ) contatore = 0;
  old_pu_disp = (digitalRead(3));
  switch (contatore)
  {
    case 0:
      if (data.cand == 1) {       // se dato freno e' 0
        lcd.setCursor(8, 1);
        lcd.print("C");
      } else {                    //scrivi F
        lcd.setCursor(8, 1);      //se dato freno non e' 0
        lcd.print(" ");       // non scrivere nie
     }
     if (data.mar == 0) {       // se dato freno e' 0
        lcd.setCursor(6, 1);
        lcd.print("M");
      } else {                    //scrivi F
        lcd.setCursor(6, 1);      //se dato freno non e' 0
        lcd.print(" ");           // non scrivere niente
      }
      if (data.freno == 0) {       // se dato freno e' 0
        lcd.setCursor(6, 0);
        lcd.print("F");
      } else {                    //scrivi F
        lcd.setCursor(6, 0);      //se dato freno non e' 0
        lcd.print(" ");           // non scrivere niente
      }
      if (data.conf_acc == 1) {   // se dato quadro  e' 1
        lcd.setCursor(8, 0);
        lcd.print("Q");           //scrivi q
      }
      else {                      // se dato quadro  e' 0
        lcd.setCursor(8, 0);
        lcd.print(" ");           // non scrivere niente
      }
      if ( data.conf_avv == 1) {  // se dato avviamento  e' 1
        lcd.setCursor(10, 0);
        lcd.print("A");           //scrivi A
      }
      else {                      // se dato avviamento  e' 0
        lcd.setCursor(10, 0);
        lcd.print(" ");           // non scrivere niente
      }
      lcd.setCursor(0, 0);
      lcd.print(data.temperature, 1);
      lcd.print((char)223);
      lcd.setCursor(0, 1);
      lcd.print(data.humidithy, 1);
      lcd.print("%");
      lcd.setCursor(13, 0);
      lcd.print(":");
      if (data.secondo < 10) {
        lcd.setCursor(15, 0);
        lcd.print(data.secondo);
      }
      else {
        lcd.setCursor(14, 0);
        lcd.print(data.secondo);
      }
      if (data.minuto < 10) {
        lcd.setCursor(12, 0);
        lcd.print(data.minuto);
      }
      else {
        lcd.setCursor(11, 0);
        lcd.print(data.minuto);
      }
      if (myRadio.available()) {
        digitalWrite(5, HIGH);
        delay(400);
      }
      else {
        digitalWrite(5, LOW);
        lcd.setCursor(0, 0);
        lcd.print(" comunicazione  ");
        lcd.setCursor(0, 1);
        lcd.print("      persa    ");
        lcd.clear();
      }
      break;
    case 2:

      lcd.clear();
      if (data.freno == 0) {       // se dato freno e' 0
        lcd.setCursor(0, 0);
        lcd.print("Freno OK");
      } else {                    //scrivi F
        lcd.setCursor(0, 0);      //se dato freno non e' 0
        lcd.print("Freno NO");           // non scrivere niente
      }
      if (data.conf_acc == 1) {   // se dato quadro  e' 1
        lcd.setCursor(8, 1);
        lcd.print("Q");           //scrivi q
      }
      else {                      // se dato quadro  e' 0
        lcd.setCursor(8, 1);
        lcd.print(" ");           // non scrivere niente
      }
      if ( data.conf_avv == 1) {  // se dato avviamento  e' 1
        lcd.setCursor(10, 1);
        lcd.print("A");           //scrivi A
      }
      else {                      // se dato avviamento  e' 0
        lcd.setCursor(10, 1);
        lcd.print(" ");           // non scrivere niente
      }
      break;
 }
}

grazie in anticipo

Una rapida occhiata ti potrei dare questi suggerimenti, per la parte trasmissione:
La lettura della temperatura e dell'umidità per i DHT è sconsigliabile eseguirla sempre ad ogni giro di loop, se non ricordo male il produttore scondiglia letture ravvicinate sotto il secondo, con una bella millis() leggi ogni secondo o più, umidità e temperatura ambiente tanto non variano così repentinamente e comunque il sensore ha un suo tempo tecnico per adeguarsi al nuovo stato.
Questo tipo di controlli:

Ing_quadro = (digitalRead(4) == LOW) || (ricezione.accensione == 1);

che va benissimo, se inverti il test lo rendi più veloce nell'esecuzione:

Ing_quadro = (ricezione.accensione == 1 || digitalRead(4) == LOW );

Perchè se la prima parte è vera non viene eseguita la digitalRead che è molto più costosa in termini di tempo d'esecuzione.
Per la parte di ricezione invece si va dal banele uso della funzione F() per spostare le stringhe fisse in flash, es:

lcd.print(" comunicazione  ");
diventa
lcd.print(F(" comunicazione  "));

ma la parte che si potrebeb davvero otimizzare è proprio la scritttura su lcd. Tu la fai ad ogni giro di loop, tale pratica in alcuni casi può portare anche al malfunzionamento del programma sul lungo periodo (a me successe) o difetti di visualizzazione sull'lcd oltre che essere "costosa" in termini di tempo d'esecuzione.
La cosa semplice sarebbe farla ogni N millisecondi ma porta a ritardi di visualizzazione, la strada più corretta da seguire è quela di aggiornare solo la porzione che davvero varia e solo quando varia davvero, tu già lo fai in parte nel case 0 con i posizionamenti, potresti memorizzare in variabili d'appoggio lo stato precedente delle varie cose che stampi e aggiornare l'lcd solo quando queto vario, ovvero ad esempio:

if (data.cand == 1) {       // se dato freno e' 0
        lcd.setCursor(8, 1);
        lcd.print("C");
      } else {                    //scrivi F
        lcd.setCursor(8, 1);      //se dato freno non e' 0
        lcd.print(" ");       // non scrivere nie
     }

può diventare:

if(data.cand != old_data.cand)
{
  lcd.setCursor(8, 1);
  if (data.cand == 1) {       // se dato freno e' 0
        lcd.print("C");
      } else {                    //scrivi F
        lcd.print(" ");       // non scrivere nie
     }
  old_data.cand = data.cand;
}

una sola setcursor e scrittura solo quando serve.
Nel case 1 invece fai una lcd.clear subito dopo aver scritto, non hai il tempo di vederlo!
Nel case 2 fai una lcd clear, controlla se è davvero necessario ripulire sempre tutto lo schermo (costa molto) e applica il suggerimento indicato sopra anche per questi valori.
Ad una prima occhiata altro non mi viene in mente

Comunque per essere il tuo primo programma non è male, hai evitato i soliti problemi dell'uso della classe String e delay() :slight_smile:

grazie dei tuoi preziosi consigli, a forza di leggere vari esempi e domande su come muovermi ,sono riuscito nel mio progetto.
non conoscevo la funzione F(), ora so una cosa in piu’
per creare variabili d’appoggio come si fa?

Sono variabili come le altre, ovvero le definisci come già hai fatto per le variabili che usi solo che le usi come "appoggio" per dati da confrontare e null'altro è solo una convenzione di terminologia che sono solito usare.
Nell'esempio che ho messo sopra praticamente confronto data.qualcosa con old_data.qualcosa, ecco old_data devi definirla esattamente come hai fatto per data.
Per essere sicuri che la prima volta i valori vengano stampati le varibili appoggio devi inizializzarle con un valore che non è lecito aspettarsi in modo che la prima volta che il confronto verrà eseguito

if(data.cand != old_data.cand)

sia sicuramente vero e stamperai il dato, nelle successive iterazioni stamperai se e solo se il valore è cambaito.

quindi creo una float o una int come globale,prima ne set up

no, data è una struttura

struct Data data;

devi definire una variabile dello stesso tipo

struct Data data_appoggio;

se devi confrontare una int si devi definire un’altra di tipo int e così via

ah ok . vedo che riesco a fare....poi ti chiedo....per ora grazie

cosi e’corretto??fatto solo al caso data.conf_cand

#include <SPI.h>
#include <RF24.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
RF24 myRadio (10, 9);
byte addresses[][6] = {"00001" , "00002"};


int old_pu_disp = 0; //---memorizza stato  pulsante display

//---variabili per timer on/off timer quadro ----
byte ritardo = 10;//ritardo di spegnimento---
unsigned long inizio = 0;
unsigned long fine = 0;
byte stato = 0;
long milliritardo = (ritardo * 1000);

unsigned long currentMillis = millis();
//---variabili per timer avvio----

unsigned long motore = 0;
#define duratadeltimer 3000


unsigned long previousMillis1 = 0; //memorizzerà l'ultima volta che il LED è stato aggiornato
unsigned long interval1 = 1000;  //intervallo a cui lampeggiare (millisecondi)
long previousMillis2 = 0;
long interval2 = 10000;

int contatore = 0;

//----------- dati in arrivo----------
struct Data
{
  int mar;          //sensore marcia
  int freno;        //freno a mano
   int cand ;   //candelette
  int secondo ;
  int minuto ;
  int conf_acc;  //conferma ricevuto comando accensione quadro
  int conf_avv;  //conferma ricevuto comando accensione avviamento
  int conf_cand;      //  dato stato candelette
  float humidithy ;
  float temperature ;
};
struct Data data;
//------------dati da confrontare-----------
struct Dati
{
 int conf_acc;  //conferma ricevuto comando accensione quadro
  int conf_avv;  //conferma ricevuto comando accensione avviamento
  int conf_cand;      //  dato stato candelette
};
struct Dati old_data;



//------------dati in uscita------------

struct Ricezione
{
  int accensione;    // comando accensione quadro remoto
  int avvio;         // comando avviamento remoto
  int id;
  int tensione  ;
  float ampere = 0;
};
struct Ricezione  ricezione;

void setup()
{
  Serial.begin(115200);
  pinMode (3, INPUT_PULLUP);
  pinMode (2, INPUT) ; //pulsante display
  pinMode(5, OUTPUT);    // led dati
  pinMode(7, INPUT_PULLUP); // pulsante quadro
  pinMode(8, INPUT_PULLUP); // pulsante avvio
  myRadio.begin();
  myRadio.setChannel(115);
  myRadio.setPALevel(RF24_PA_MIN);
  myRadio.setDataRate( RF24_250KBPS ) ;
  myRadio.openWritingPipe( addresses[0]);
  myRadio.openReadingPipe(1, addresses[1]);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print("Umid & temp");
  delay(1000);
  lcd.clear();
  lcd.print("Start.....");
  delay(1000);
  lcd.clear();
}
void loop() {
  delay(5);
  myRadio.startListening();
  if (myRadio.available()) {
    while  (myRadio.available()) {
      myRadio.read(&data, sizeof(data));
    }
    delay(5);
    myRadio.stopListening();
    myRadio.write(&ricezione, sizeof(ricezione));
    inizio = millis();
  }
  rx () ;
  tx () ;
  stampa ();


}


void rx ()  {
  //Serial.println(data.conf_avv );


}
void tx ()
//------------quadro-----------

{

  if (digitalRead(7) == LOW) {
    (ricezione.accensione = 1);
  }
  else {
    (ricezione.accensione = 0);
  }
  

  //-----------------avviamento-----------
  if (digitalRead(8) == LOW) {
    ricezione.avvio = 1;       //Accendi avviamento con timer
   // motore = millis() + duratadeltimer;
  }
// } if (millis() > motore) {
    if (digitalRead(8) == HIGH) {
    ricezione.avvio = 0;      //spegni avviamento con timer
 }
}
void stampa() {
 Serial.println(old_data.conf_cand);
  //-----------------display-----------
  if (digitalRead(3) == LOW && old_pu_disp == HIGH) {
    contatore = contatore + 1; //leggi stato pulsante
  }
  if (contatore > 2 ) contatore = 0;
  old_pu_disp = (digitalRead(3));
  switch (contatore)
  {
    case 0:
     if(data.conf_cand != old_data.conf_cand)
      {       // se dato freno e' 0
        lcd.setCursor(8, 1);
        if(data.conf_cand==1){
        lcd.print("C");
      } else {                    //scrivi F
        //lcd.setCursor(8, 1);      //se dato freno non e' 0
        lcd.print(" ");       // non scrivere nie
     }
   old_data.conf_cand=  data.conf_cand; 
    }
     if (data.mar == 0) {       // se dato freno e' 0
        lcd.setCursor(6, 1);
        lcd.print("M");
      } else {                    //scrivi F
        lcd.setCursor(6, 1);      //se dato freno non e' 0
        lcd.print(" ");           // non scrivere niente
      }
      if (data.freno == 0) {       // se dato freno e' 0
        lcd.setCursor(6, 0);
        lcd.print("F");
      } else {                    //scrivi F
        lcd.setCursor(6, 0);      //se dato freno non e' 0
        lcd.print(" ");           // non scrivere niente
      }
      if (data.conf_acc == 1) {   // se dato quadro  e' 1
        lcd.setCursor(8, 0);
        lcd.print("Q");           //scrivi q
      }
      else {                      // se dato quadro  e' 0
        lcd.setCursor(8, 0);
        lcd.print(" ");           // non scrivere niente
      }
      if ( data.conf_avv == 1) {  // se dato avviamento  e' 1
        lcd.setCursor(10, 0);
        lcd.print("A");           //scrivi A
      }
      else {                      // se dato avviamento  e' 0
        lcd.setCursor(10, 0);
        lcd.print(" ");           // non scrivere niente
      }
      lcd.setCursor(0, 0);
      lcd.print(data.temperature, 1);
      lcd.print((char)223);
      lcd.setCursor(0, 1);
      lcd.print(data.humidithy, 1);
      lcd.print("%");
      lcd.setCursor(13, 0);
      lcd.print(":");
      if (data.secondo < 10) {
        lcd.setCursor(15, 0);
        lcd.print(data.secondo);
      }
      else {
        lcd.setCursor(14, 0);
        lcd.print(data.secondo);
      }
      if (data.minuto < 10) {
        lcd.setCursor(12, 0);
        lcd.print(data.minuto);
      }
      else {
        lcd.setCursor(11, 0);
        lcd.print(data.minuto);
      }
      if (myRadio.available()) {
        digitalWrite(5, HIGH);
        delay(400);
      }
      else {
        digitalWrite(5, LOW);
        lcd.setCursor(0, 0);
        lcd.print(F(" comunicazione  "));
        lcd.setCursor(0, 1);
        lcd.print(F("      persa    "));
        lcd.clear();
      }
      break;
    case 2:

      lcd.clear();
      if (data.freno == 0) {       // se dato freno e' 0
        lcd.setCursor(0, 0);
        lcd.print("Freno OK");
      } else {                    //scrivi F
        lcd.setCursor(0, 0);      //se dato freno non e' 0
        lcd.print("Freno NO");           // non scrivere niente
      }
      if (data.conf_acc == 1) {   // se dato quadro  e' 1
        lcd.setCursor(8, 1);
        lcd.print("Q");           //scrivi q
      }
      else {                      // se dato quadro  e' 0
        lcd.setCursor(8, 1);
        lcd.print(" ");           // non scrivere niente
      }
      if ( data.conf_avv == 1) {  // se dato avviamento  e' 1
        lcd.setCursor(10, 1);
        lcd.print("A");           //scrivi A
      }
      else {                      // se dato avviamento  e' 0
        lcd.setCursor(10, 1);
        lcd.print(" ");           // non scrivere niente
      }
      break;



  }
}

Si sei sulla strada giusta, non ho capito perché ridefinire una struttura differente anziché riusare quella già definita ma probabile che mi sfugga qualcosa. Ti manca solo inizializzare la struttura di confronto con dati "illeciti" Es conf_cand può valere zero o uno nel setup inizializzi conf_cand della varibile di controllo con 666 o -1 o 2 o quel che ti pare basta che non sia zero o uno in modo che la prima volta entri e stampi sicuramente su display, ovvio che la cosa vale per tutte le varibili getite

ok procedo con le tue correzione e metto il tutto

dovrei aver fatto tutte le correzioni che mi hai detto.
nel case 1 ho messo il lcd.clear perche se viene scritto "comunicazione persa " al ritorno ho i caratteri che rimangono sul lcd.
il case 2 non l ho ancora corretto ma se ho corretto il primo non dovrei avere problemi

#include <SPI.h>
#include <RF24.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
RF24 myRadio (10, 9);
byte addresses[][6] = {"00001" , "00002"};


int old_pu_disp = 0; //---memorizza stato  pulsante display

//---variabili per timer on/off timer quadro ----
byte ritardo = 10;//ritardo di spegnimento---
unsigned long inizio = 0;
unsigned long fine = 0;
byte stato = 0;
long milliritardo = (ritardo * 1000);

unsigned long currentMillis = millis();
//---variabili per timer avvio----

unsigned long motore = 0;
#define duratadeltimer 3000


unsigned long previousMillis1 = 0; //memorizzerà l'ultima volta che il LED è stato aggiornato
unsigned long interval1 = 1000;  //intervallo a cui lampeggiare (millisecondi)
long previousMillis2 = 0;
long interval2 = 10000;

int contatore = 0;

//----------- dati in arrivo----------
struct Data
{
  int mar;          //sensore marcia
  int freno;        //freno a mano
  int cand ;   //candelette
  int secondo ;
  int minuto ;
  int conf_acc;  //conferma ricevuto comando accensione quadro
  int conf_avv;  //conferma ricevuto comando accensione avviamento
  int conf_cand;      //  dato stato candelette
  float humidithy ;
  float temperature ;
};
struct Data data;
//------------dati da confrontare-----------
struct Dati
{
  int mar=2;          //sensore marcia
  int freno=2;
  int conf_acc=2;  //conferma ricevuto comando accensione quadro
  int conf_avv=2;  //conferma ricevuto comando accensione avviamento
  int conf_cand=2;      //  dato stato candelette
};
struct Dati old_data;



//------------dati in uscita------------

struct Ricezione
{
  int accensione;    // comando accensione quadro remoto
  int avvio;         // comando avviamento remoto
  int id;
  int tensione  ;
  float ampere = 0;
};
struct Ricezione  ricezione;

void setup()
{
  Serial.begin(115200);
  pinMode (3, INPUT_PULLUP);
  pinMode (2, INPUT) ; //pulsante display
  pinMode(5, OUTPUT);    // led dati
  pinMode(7, INPUT_PULLUP); // pulsante quadro
  pinMode(8, INPUT_PULLUP); // pulsante avvio
  myRadio.begin();
  myRadio.setChannel(115);
  myRadio.setPALevel(RF24_PA_MIN);
  myRadio.setDataRate( RF24_250KBPS ) ;
  myRadio.openWritingPipe( addresses[0]);
  myRadio.openReadingPipe(1, addresses[1]);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print("Umid & temp");
  delay(1000);
  lcd.clear();
  lcd.print("Start.....");
  delay(1000);
  lcd.clear();
}
void loop() {
  delay(5);
  myRadio.startListening();
  if (myRadio.available()) {
    while  (myRadio.available()) {
      myRadio.read(&data, sizeof(data));
    }
    delay(5);
    myRadio.stopListening();
    myRadio.write(&ricezione, sizeof(ricezione));
    inizio = millis();
  }
  rx () ;
  tx () ;
  stampa ();


}


void rx ()  {
  //Serial.println(data.conf_avv );


}
void tx ()
//------------quadro-----------

{

  if (digitalRead(7) == LOW) {
    (ricezione.accensione = 1);
  }
  else {
    (ricezione.accensione = 0);
  }


  //-----------------avviamento-----------
  if (digitalRead(8) == LOW) {
    ricezione.avvio = 1;       //Accendi avviamento con timer
    // motore = millis() + duratadeltimer;
  }
  // } if (millis() > motore) {
  if (digitalRead(8) == HIGH) {
    ricezione.avvio = 0;      //spegni avviamento con timer
  }
}
void stampa() {
  Serial.println(old_data.conf_cand);
  //-----------------display-----------
  if (digitalRead(3) == LOW && old_pu_disp == HIGH) {
    contatore = contatore + 1; //leggi stato pulsante
  }
  if (contatore > 2 ) contatore = 0;
  old_pu_disp = (digitalRead(3));
  switch (contatore)
  {
    case 0:
      if (data.conf_cand != old_data.conf_cand) {
        lcd.setCursor(8, 1);
        if (data.conf_cand == 1) { // se dato freno e' 1
          lcd.print("C");           //scrivi c
        } else {               //se dato freno non e' 1
          lcd.print(" ");       // non scrivere nie
        }
        old_data.conf_cand =  data.conf_cand;
      }
      if (data.mar != old_data.mar) {
        lcd.setCursor(6, 1);
        if (data.mar == 0) {       // se dato freno e' 0
          lcd.print("M");           //scrivi M
        } else {              //se dato freno non e' 0
          lcd.print(" ");           // non scrivere niente
        }
        old_data.mar !=  data.mar;
      }
      if (data.freno != old_data.freno) {
        lcd.setCursor(6, 0);
        if (data.freno == 0) {       // se dato freno e' 0
          lcd.print("F");            //scrivi F
        } else {                            //se dato freno non e' 0
          lcd.print(" ");             // non scrivere niente
        }
        old_data.freno !=  data.freno;
      }
      if (data.conf_acc != old_data.conf_acc) {
        lcd.setCursor(8, 0);
        if (data.conf_acc == 1) {   // se dato quadro  e' 1
          lcd.print("Q");           //scrivi q
        }
        else {                      // se dato quadro  e' 0
          lcd.print(" ");           // non scrivere niente
        }
        old_data.conf_acc = data.conf_acc;
      }
      if (data.conf_avv != old_data.conf_avv) {
        lcd.setCursor(10, 0);
        if ( data.conf_avv == 1) {  // se dato avviamento  e' 1
          lcd.print("A");           //scrivi A
        }
        else {                      // se dato avviamento  e' 0
          lcd.print(" ");           // non scrivere niente
        }
        old_data.conf_avv = data.conf_avv;
      }
      lcd.setCursor(0, 0);
      lcd.print(data.temperature, 1);
      lcd.print((char)223);
      lcd.setCursor(0, 1);
      lcd.print(data.humidithy, 1);
      lcd.print("%");
      lcd.setCursor(13, 0);
      lcd.print(":");
      if (data.secondo < 10) {
        lcd.setCursor(15, 0);
        lcd.print(data.secondo);
      }
      else {
        lcd.setCursor(14, 0);
        lcd.print(data.secondo);
      }
      if (data.minuto < 10) {
        lcd.setCursor(12, 0);
        lcd.print(data.minuto);
      }
      else {
        lcd.setCursor(11, 0);
        lcd.print(data.minuto);
      }
      if (myRadio.available()) {
        digitalWrite(5, HIGH);
        
      }
      else {
        digitalWrite(5, LOW);
        lcd.setCursor(0, 0);
        lcd.print(F(" comunicazione  "));
        lcd.setCursor(0, 1);
        lcd.print(F("      persa    "));
        lcd.clear();
      }
      break;
    case 2:

      lcd.clear();
      if (data.freno == 0) {       // se dato freno e' 0
        lcd.setCursor(0, 0);
        lcd.print("Freno OK");
      } else {                    //scrivi F
        lcd.setCursor(0, 0);      //se dato freno non e' 0
        lcd.print("Freno NO");           // non scrivere niente
      }
      if (data.conf_acc == 1) {   // se dato quadro  e' 1
        lcd.setCursor(8, 1);
        lcd.print("Q");           //scrivi q
      }
      else {                      // se dato quadro  e' 0
        lcd.setCursor(8, 1);
        lcd.print(" ");           // non scrivere niente
      }
      if ( data.conf_avv == 1) {  // se dato avviamento  e' 1
        lcd.setCursor(10, 1);
        lcd.print("A");           //scrivi A
      }
      else {                      // se dato avviamento  e' 0
        lcd.setCursor(10, 1);
        lcd.print(" ");           // non scrivere niente
      }
      break;



  }
}

ecco fatto ho corretto ,con le variabili di appoggio invece del case ho messo solo un if ed un else.
ho fatto anche 2 variabili di confronto per le 2 schermate del lcd.
ma ho un problema; non variando le variabili ,scusate il giro di parole quando cambio la schermata
non ho nessun dato ,nel momento che agisco per cambiare una variabile eccolo che appare.
dove sbaglio??

dove sto sbagliando?
grazie mille
[code]#include <SPI.h>

#include <RF24.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
RF24 myRadio (10, 9);
byte addresses[][6] = {"00001" , "00002"};
//------------variabili pulsante----------

int old_pu_disp = 0; //---memorizza stato  pulsante display
int contatore = 0;




unsigned long previousMillis1 = 0; //memorizzerà l'ultima volta che il LED è stato aggiornato
unsigned long interval1 = 1000;  //intervallo a cui lampeggiare (millisecondi)
long previousMillis2 = 0;
long interval2 = 10000;



//----------- dati in arrivo----------
struct Data
{
  int mar;          //sensore marcia
  int freno;        //freno a mano
  int cand ;        //candelette
  int secondo ;
  int minuto ;
  int conf_acc;  //conferma ricevuto comando accensione quadro
  int conf_avv;  //conferma ricevuto comando accensione avviamento
  int conf_cand;      //  dato stato candelette
  float humidithy ;
  float temperature ;
};
struct Data data;
//------------dati da confrontare-----------
struct Dati
{
  int mar = 2;
  int freno = 2;
  int conf_acc = 2;
  int conf_avv = 2;
  int conf_cand = 2;
};
struct Dati old_data;
//------------dati in uscita------------
struct Ricezione
{
  int accensione;    // comando accensione quadro remoto
  int avvio;         // comando avviamento remoto
  int id;
  int tensione  ;
  float ampere = 0;
};
struct Ricezione  ricezione;

void setup()
{
  Serial.begin(115200);
  pinMode (3, INPUT_PULLUP);
  pinMode (2, INPUT) ; //pulsante display
  pinMode(5, OUTPUT);    // led dati
  pinMode(7, INPUT_PULLUP); // pulsante quadro
  pinMode(8, INPUT_PULLUP); // pulsante avvio
  myRadio.begin();
  myRadio.setChannel(115);
  myRadio.setPALevel(RF24_PA_MIN);
  myRadio.setDataRate( RF24_250KBPS ) ;
  myRadio.openWritingPipe( addresses[0]);
  myRadio.openReadingPipe(1, addresses[1]);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print("Umid & temp");
  delay(1000);
  lcd.clear();
  lcd.print("Start.....");
  delay(1000);
  lcd.clear();
}
void loop() {
  delay(5);
  myRadio.startListening();
  if (myRadio.available()) {
    while  (myRadio.available()) {
      myRadio.read(&data, sizeof(data));
    }
    delay(5);
    myRadio.stopListening();
    myRadio.write(&ricezione, sizeof(ricezione));
  }
  rx () ;
  tx () ;
  stampa ();
}
void rx ()  {
  //Serial.println(data.conf_avv );
}
void tx ()
//------------quadro-----------
{
  if (digitalRead(7) == LOW) {
    (ricezione.accensione = 1);
  }
  else {
    (ricezione.accensione = 0);
  }
  //-----------------avviamento-----------
  if (digitalRead(8) == LOW) {
    ricezione.avvio = 1;
  }
  if (digitalRead(8) == HIGH) {
    ricezione.avvio = 0;      //spegni avviamento con timer
  }
}
void stampa() {

  //-----------------display-----------
  if (digitalRead(3) == LOW && old_pu_disp == HIGH) {
    contatore = contatore + 1; //leggi stato pulsante
  }
  if (contatore > 2 ) contatore = 0;
  old_pu_disp = (digitalRead(3));
  switch (contatore)
  {
    case 0:
      if (data.conf_cand != old_data.conf_cand) { // se cambia
        lcd.setCursor(8, 1);          // posiziono cursore
        if (data.conf_cand == 1) {    // se dato freno e' 1
          lcd.print("C");             //scrivi C
        } else {                      //se dato freno non e' 1
          lcd.print(" ");             // non scrivere niente
        }
        old_data.conf_cand =  data.conf_cand;
      }
      if (data.mar != old_data.mar) {  // se cambia
        lcd.setCursor(6, 1);          // posiziono cursore
        if (data.mar == 0) {          // se dato freno e' 0
          lcd.print("M");             //scrivi M
        } else {                      //se dato freno non e' 0
          lcd.print(" ");             // non scrivere niente
        }
        old_data.mar !=  data.mar;
      }
      if (data.freno != old_data.freno) { // se cambia
        lcd.setCursor(6, 0);          // posiziono cursore
        if (data.freno == 0) {        // se dato freno e' 0
          lcd.print("F");             //scrivi F
        } else {                      //se dato freno non e' 0
          lcd.print(" ");             // non scrivere niente
        }
        old_data.freno !=  data.freno;
      }
      if (data.conf_acc != old_data.conf_acc) { // se cambia
        lcd.setCursor(8, 0);         // posiziono cursore
        if (data.conf_acc == 1) {    // se dato quadro  e' 1
          lcd.print("Q");            //scrivi q
        }
        else {                       // se dato quadro  e' 0
          lcd.print(" ");            // non scrivere niente
        }
        old_data.conf_acc = data.conf_acc;
      }
      if (data.conf_avv != old_data.conf_avv) {  // se cambia
        lcd.setCursor(10, 0);      // posiziono cursore
        if ( data.conf_avv == 1) { // se dato avviamento  e' 1
          lcd.print("A");          //scrivi A
        }
        else {                      // se dato avviamento  e' 0
          lcd.print(" ");           // non scrivere niente
        }
        old_data.conf_avv = data.conf_avv;
      }
      lcd.setCursor(0, 0);
      lcd.print(data.temperature, 1);
      lcd.print((char)223);
      lcd.setCursor(0, 1);
      lcd.print(data.humidithy, 1);
      lcd.print("%");
      lcd.setCursor(13, 0);
      lcd.print(":");
      if (data.secondo < 10) {
        lcd.setCursor(15, 0);
        lcd.print(data.secondo);
      }
      else {
        lcd.setCursor(14, 0);
        lcd.print(data.secondo);
      }
      if (data.minuto < 10) {
        lcd.setCursor(12, 0);
        lcd.print(data.minuto);
      }
      else {
        lcd.setCursor(11, 0);
        lcd.print(data.minuto);
      }
      if (myRadio.available()) {
        digitalWrite(5, HIGH);

      }
      else {
        digitalWrite(5, LOW);
        lcd.setCursor(0, 0);
        lcd.print(F(" comunicazione  "));
        lcd.setCursor(0, 1);
        lcd.print(F("      persa    "));
        lcd.clear();
      }
      break;
    case 2:

      //lcd.clear();
      if (data.freno != old_data.freno) { // se cambia
        lcd.setCursor(0, 0);          // posiziono cursore
        if (data.freno == 0) {       // se dato freno e' 0
          lcd.print("Freno OK");         //scrivi F
        }
        else {                    //se dato freno non e' 0
          lcd.print("Freno NO");
        }
        old_data.freno !=  data.freno;
      }
      if (data.conf_acc != old_data.conf_acc) { // se cambia
        lcd.setCursor(10, 0);       // posiziono cursore
        if (data.conf_acc == 1) {   // se dato conf_acc e' 1
          lcd.print("ACCESO");           //scrivi q
        }
        else {                      // se dato quadro  e' 0
          lcd.print("SPENTO");           // non scrivere niente
        }
        old_data.conf_acc = data.conf_acc;
      }
      if (data.conf_avv != old_data.conf_avv) {  // se cambia
        lcd.setCursor(0, 1);
        if ( data.conf_avv == 1) {  // se dato avviamento  e' 1
          lcd.print("AVVIO");           //scrivi A
        }
        else {                      // se dato avviamento  e' 0
         lcd.print("     ");           // non scrivere niente
        }
             old_data.conf_avv = data.conf_avv;
      }
        break;



      }
  }

[/code]

nulla ora a questo punto mi sono bloccato

sono riuscito nel risolvere il problema omettendo l’ uso delle variabili per lcd.
ora e corretto secondo voi ci sono altri errori?

#include <SPI.h>
#include <RF24.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
RF24 myRadio (10, 9);
byte addresses[][6] = {"00001" , "00002"};
//------------variabili pulsante----------

int old_pu_disp = 0; //---memorizza stato  pulsante display
int contatore = 0;
unsigned long previousMillis1 = 0; //memorizzerà l'ultima volta che il LED è stato aggiornato
unsigned long interval1 = 1000;  //intervallo a cui lampeggiare (millisecondi)
long previousMillis2 = 0;
long interval2 = 10000;
//----------- dati in arrivo----------
struct Data
{
  int mar;          //sensore marcia
  int freno;        //freno a mano
  int candel ;        //candelette
  int olio ;   //sensore olio
  int secondo ;
  int minuto ;
  int conf_acc;  //conferma ricevuto comando accensione quadro
  int conf_avv;  //conferma ricevuto comando accensione avviamento
  //int cand;      //  dato stato candelette
  float humidithy ;
  float temperature ;
};
struct Data data;
//------------variabili di confronto per lcd-----------

int old_mar = 2;
int old_freno = 2;
int old_conf_acc = 2;
int old_conf_avv = 2;
int old_candel = 2;
int old_olio = 2 ;
int old_mar1 = 2;
int old_freno1 = 2;
int old_conf_acc1 = 2;
int old_conf_avv1 = 2;
int old_candel1 = 2;
int old_olio1 = 2 ;
//------------dati in uscita------------
struct Ricezione
{
  int accensione;    // comando accensione quadro remoto
  int avvio;         // comando avviamento remoto
  int id;
  int tensione  ;
  float ampere = 0;
};
struct Ricezione  ricezione;

void setup()
{
  Serial.begin(115200);
  pinMode (3, INPUT_PULLUP);
  pinMode (2, INPUT) ; //pulsante display
  pinMode(5, OUTPUT);    // led dati
  pinMode(7, INPUT_PULLUP); // pulsante quadro
  pinMode(8, INPUT_PULLUP); // pulsante avvio
  myRadio.begin();
  myRadio.setChannel(115);
  myRadio.setPALevel(RF24_PA_MIN);
  myRadio.setDataRate( RF24_250KBPS ) ;
  myRadio.openWritingPipe( addresses[0]);
  myRadio.openReadingPipe(1, addresses[1]);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print("Umid & temp");
  delay(1000);
  lcd.clear();
  lcd.print("Start.....");
  delay(1000);
  lcd.clear();
}
void loop() {
  delay(5);
  myRadio.startListening();
  if (myRadio.available()) {
    while  (myRadio.available()) {
      myRadio.read(&data, sizeof(data));
    }
    delay(5);
    myRadio.stopListening();
    myRadio.write(&ricezione, sizeof(ricezione));
  }
  if (myRadio.available()) {
    digitalWrite(5, HIGH);

  }
  else {
    digitalWrite(5, LOW);

  }

  tx () ;
  stampa ();
}

void tx ()
//------------quadro-----------
{
  Serial.println(contatore); 
  if (digitalRead(7) == LOW) {
    (ricezione.accensione = 1);
  }
  else {
    (ricezione.accensione = 0);
  }
  //-----------------avviamento-----------
  if (digitalRead(8) == LOW) {
    ricezione.avvio = 1;
  }
  if (digitalRead(8) == HIGH) {
    ricezione.avvio = 0;      //spegni avviamento con timer
  }
}
void stampa() {

  //-----------------display-----------
  if (digitalRead(3) == LOW && old_pu_disp == HIGH) {
    contatore = contatore + 1; //leggi stato pulsante
  }
  if (contatore > 1 ) contatore = 0;{
  old_pu_disp = (digitalRead(3));
 } 
  if (contatore == 0) {

//if (data.olio != old_olio) { // se cambia
      lcd.setCursor(10, 1);          // posiziono cursore
      if (data.olio == 1) {    // se dato freno e' 1
        lcd.print("O");             //scrivi C
      } else {                      //se dato freno non e' 1
        lcd.print(" ");             // non scrivere niente
      }
      //old_olio =  data.olio;
    //}
    
    //if (data.candel != old_candel) { // se cambia
      lcd.setCursor(8, 1);          // posiziono cursore
      if (data.candel == 1) {    // se dato freno e' 1
        lcd.print("C");             //scrivi C
      } else {                      //se dato freno non e' 1
        lcd.print("  ");             // non scrivere niente
      }
      //old_candel =  data.candel;
    //}
    //if (data.mar != old_mar) {  // se cambia
      lcd.setCursor(5, 1);          // posiziono cursore
      if (data.mar == 1) {          // se dato freno e' 0
        lcd.print(" N ");             //scrivi M
      } else {                      //se dato freno non e' 0
        lcd.print("   ");             // non scrivere niente
      }
      //old_mar =  data.mar;
    //}
    //if (data.freno != old_freno) { // se cambia
      lcd.setCursor(5, 0);          // posiziono cursore
      if (data.freno == 1) {        // se dato freno e' 0
        lcd.print(" F ");             //scrivi F
      } else {                      //se dato freno non e' 0
        lcd.print("   ");             // non scrivere niente
      }
      //old_freno =  data.freno;
    //}
    //if (data.conf_acc != old_conf_acc) { // se cambia
      lcd.setCursor(7, 0);         // posiziono cursore
      if (data.conf_acc == 1) {    // se dato quadro  e' 1
        lcd.print(" Q ");            //scrivi q
      }
      else {                       // se dato quadro  e' 0
        lcd.print("   ");            // non scrivere niente
      }
     // old_conf_acc = data.conf_acc;
    //}
    //if (data.conf_avv != old_conf_avv) {  // se cambia
      lcd.setCursor(10, 0);      // posiziono cursore
      if ( data.conf_avv == 1) { // se dato avviamento  e' 1
        lcd.print("A");          //scrivi A
      }
      else {                      // se dato avviamento  e' 0
        lcd.print(" ");           // non scrivere niente
      }
      //old_conf_avv = data.conf_avv;
    //}
    lcd.setCursor(0, 0);
    lcd.print(data.temperature, 1);
    lcd.print((char)223);
    lcd.setCursor(0, 1);
    lcd.print(data.humidithy, 1);
    lcd.print("%");
    lcd.setCursor(13, 0);
    lcd.print(":");
    if (data.secondo < 10) {
      lcd.setCursor(14, 0);
    lcd.print(' ');
      lcd.setCursor(15, 0);
      lcd.print(data.secondo);
    }
    else {
      lcd.setCursor(14, 0);
      lcd.print(data.secondo);
    }
    
    if (data.minuto < 10) {
      lcd.setCursor(11, 0);
    lcd.print(' ');
      lcd.setCursor(12, 0);
      lcd.print(data.minuto);
    }
    else {
      lcd.setCursor(11, 0);
      lcd.print(data.minuto);
    }
    //if (!myRadio.available()) {

      //lcd.setCursor(0, 0);
      //lcd.print(F(" comunicazione  "));
      //lcd.setCursor(0, 1);
      //lcd.print(F("      persa    "));
      //lcd.clear();
    //}//

  }

}

diviso in 2 parti altrimenti non riesco a postarlo

if (contatore == 1) {
   
    //lcd.clear();
    //if (data.freno != old_freno1) { // se cambia
      lcd.setCursor(0, 0);          // posiziono cursore
      if (data.freno == 1) {       // se dato freno e' 0
        lcd.print("PARK OK");         //scrivi F
      }
      else {                    //se dato freno non e' 0
        lcd.print("PARK NO");
      }
      //old_freno1 =  data.freno;
    //}
    //if (data.conf_acc != old_conf_acc1) { // se cambia
      lcd.setCursor(12, 0);       // posiziono cursore
      if (data.conf_acc == 1) {   // se dato conf_acc e' 1
        lcd.print(" ON ");           //scrivi q
      }
      else {                      // se dato quadro  e' 0
        lcd.print(" OFF");           // non scrivere niente
      }
      //old_conf_acc1 = data.conf_acc;
    //}
    //if (data.conf_avv != old_conf_avv1) {  // se cambia
      lcd.setCursor(6, 1);
      if (data.conf_avv == 1) {  // se dato avviamento  e' 1
        lcd.print("AVV");           //scrivi A
      }
      else {                      // se dato avviamento  e' 0
        lcd.print("   ");           // non scrivere niente
      }
      //old_conf_avv1 = data.conf_avv;
    //}
    //if (data.candel != old_candel1) { // se cambia
      lcd.setCursor(8, 0);
      if (data.candel == 1) {  // se dato candel  e' 1
        lcd.print("CAND");               //scrivi A
      }
      else {                    // se dato candel  e' 0
        lcd.print("    ");           // non scrivere niente
      }
      //old_candel1 = data.candel;
    //}
   //if (data.mar != old_mar1) {  // se cambia
      lcd.setCursor(0, 1);          // posiziono cursore
      if (data.mar == 1) {          // se dato freno e' 0
        lcd.print("FOLLE ");             //scrivi M
      } else {                      //se dato freno non e' 0
        lcd.print("MARCIA");             // non scrivere niente
      }
      //old_mar1 =  data.mar1;
 //}
 //if (data.olio != old_olio1) { // se cambia
      lcd.setCursor(9, 1);          // posiziono cursore
      if (data.olio == 1) {    // se dato freno e' 1
        lcd.print("P.OLIO ");             //scrivi P.OLIO
      } else {                      //se dato freno non e' 1
        lcd.print("AVVIATO");         // non scrivere niente
      }
      //old_olio =  data.olio;
    //}
 //}
//Serial.println(data.candel);
 }

Io tornerei alla versione con il case che era già abbastanza sistemata,poi…
Al pari di inizializzare le varibili “old” con valori non valid per stampare per forza al primo giro tu devi stampare per forza quando cambi pagina ti basta applicare la stessa tecnica, ovvero memorizzi il vecchio stato e quando entri in un case aggiungi ai vari if che testano il valore attuale rispetto al precedente un OR se pagina attuale è diverso dalla pagina precedente entra comunque nell’if e stampa i vari valori.
La stampa dei valori se cambiano devi applicarla anche alla temperatura e all’umidità, insomma tutti i valori devono essere sotto if in modo da aggiornare il display se strettamente necessario.

grazie delle tue informazioni.
alla fine ho trovato un lcd 4 x20 in casa ed ho messo quello
correggo il tutto e se non ti crea noia mi dici cosa ti sembra, per ora grazie

Quando lo posti se non ti sta in un unico post allegalo anziché fare due post, e prima di allegarlo o incollarlo nel post premi Ctrl+T nell'IDE in modo da formattarlo che lo rende più leggibile