Display lcd sfarfalla

Ciao a tutti, ho un piccolo problema. Ho realizzato un programma che per il momento gestisce un display lcd (20x4) i2c e due pulsanti; i pulsanti (up e down) hanno lo scopo di incrementare o decrementare una variabile che viene istantaneamente visualizzata sul display. Ho fatto in modo che il display venga aggiornato ogni 100 millisecondi, di più non si può altrimenti si nota il ritardo tra la pressione del pulsante e la visualizzazione del nuovo valore della variabile. Nonostante il ritardo noto che il display tende a sfarfallare (in maniera minima), in particolare dalla seconda riga in poi. Lo sto alimentando da Arduino Mega e l'interfaccia i2c è saldata sul retro del display, quindi penso non ci siano falsi contatti.

Vi posto il codice.

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


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 

// VARIABILI COMUNI PER ANTIRIMBALZO ---------------------------------------------------------
int attesaDebounce = 50;
//-----------------------------------------------------------------------
// PULSANTE UP ---------------------------------------------------------
const int pulsanteUp = 4; //pin
//Variabili per antirimbalzo
int up_pulsanteStato, up_ultimaLettura = LOW;
unsigned long up_ultimoTempoDebounce = 0;
//-----------------------------------------------------------------------
// PULSANTE DOWN ---------------------------------------------------------
const int pulsanteDown = 5; //pin
//Variabili per antirimbalzo
int down_pulsanteStato, down_ultimaLettura = LOW;
unsigned long down_ultimoTempoDebounce = 0;
//-----------------------------------------------------------------------

int variabile = 2;

long dispTempo = millis();

void setup() {
  lcd.begin(20, 4); 

  pinMode(pulsanteUp, INPUT);
  pinMode(pulsanteDown, INPUT);
  Serial.begin(9600);
}

void loop() {
  leggiPulsUp();
  leggiPulsDown();

  if (millis() > dispTempo + 100) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Variabile: ");
    lcd.print(variabile);

    lcd.setCursor(0, 1);
    lcd.print("ciao come va");
    
    dispTempo = millis();
  }

}

void leggiPulsUp() {
  int lettura = digitalRead(pulsanteUp);
  if (lettura != up_ultimaLettura)
    up_ultimoTempoDebounce = millis();
  if ((millis() - up_ultimoTempoDebounce) > attesaDebounce) {
    if (lettura != up_pulsanteStato and lettura == HIGH) {
      variabile++;
    }
    up_pulsanteStato = lettura;
  }
  up_ultimaLettura = lettura;
}

void leggiPulsDown() {
  int lettura = digitalRead(pulsanteDown);
  if (lettura != down_ultimaLettura)
    down_ultimoTempoDebounce = millis();
  if ((millis() - down_ultimoTempoDebounce) > attesaDebounce) {
    if (lettura != down_pulsanteStato and lettura == HIGH) {
      variabile--;
    }
    down_pulsanteStato = lettura;
  }
  down_ultimaLettura = lettura;
}

Avete dei consigli?

ciao Ale_S,

"tralasciando" che anche questa "long dispTempo = millis();" dovrebbe essere unsigned...perchè non aggiorni l'LCD solo se la variabile cambia di stato?...o meglio quando pigi uno dei due pulsanti?
metti nel setup() una schermata di partenza; crea una funzione apposita per aggiornamento LCD ed eseguila solo se il pulsante viene premuto.

EDIT: dopo il .clear() non serve fare .setCursor(0,0)...lo fa la .clear()...almeno con la libreria che uso io

Grazie per la risposta...
Ho capito l'errore... devo aggiornare il display contestualmente al cambiamento di stato della variabile.
Siccome sto realizzando un plastico di una casa domotica, dovrò visualizzare sul display molte informazioni, tra cui lo stato dei punti luce della casa, la temperatura interna e la temperatura che si vuole mantenere nell'ambiente. Chiaramente seguendo il tuo consiglio aggiornerò le singole informazioni solo al momento opportuno. Per esempio contestualmente all'accensione di un punto luce visualizzerò il suo cambio di stato sul display, mantenendo le altre informazioni visualizzate invariate. Potrebbe andare?
La cosa migliore sarebbe creare una funzione generalizzata che sia in grado di gestire il display, ma non penso sia realizzabile...
Spero di essermi spiegato bene...

per fare si può fare...se ne vale la pena dipende quanti/e menù/pagine voi avere nel tuo display e quante volte vuoi richiamare l'aggiornamento sul display.
per esempio una sola videata che mostra 3-4 valori non ne vale la pena...10 videate con 3-4 valori "forse si".
poi la funzione la devi pensare anche in base al tipo di variabile che maneggi...tutte byte o int...semplice; misti byte, int, float etc...già più impegnativa.

if (millis() > dispTempo + 100) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Variabile: ");
    lcd.print(variabile);

    lcd.setCursor(0, 1);
    lcd.print("ciao come va");
   
    dispTempo = millis();
  }

Cancelli ogni 100 milisecondi il Display per riscriverlo di nuovo. Questo crea l' effetto di farfallio.

al posto di cancellare tutto il display cancella la variabile o metti il nuovo valore della variabile e aggiungi dei spazi nel caso che restano delle cifre dalla stampa precedente.
Ciao Uwe

Esatto.
E' lcd.clear che crea lo sfarfallamento dovuto ad una pulizia di tutto il display e poi la sua riscrittura.

Quindi o aggiorni il display solo se cambia il valore, con una apposita funzione, oppure scrivi il valore sulla stessa riga e riempi gli spazi vuoti con dei caratteri 'spazio'

Se il valore è numerico e vuoi l'incolonnamento a destra, dovrai fare delle if se il valore è di un solo carattere oppure di due o di tre e riempire con zero oppure uno o due spazi prima del valore.

Grazie a tutti per i consigli. Domani provo e vi faccio sapere...