display LCD i2c 20x4 lampeggia anche senza lcd.clear()

Ciao ragazzi,
il dipslay si trova a 10 metri da arduino e uso queste schede per il suo corretto funzionamento:

Extender i2c

ho notato che al variare del delay che si trova nella parte del codice postato sotto il lampeggio dei led SCL e SDA che si trovano sulla schedina nel link aumentano o diminuiscono in funzione del valore che imposto… è normale? è normale anche che senza delay i led lampeggiano ugualmente?

come mai non riesco ad annullare questo fastidiosissimo lampeggio del display anche togliendo lcd.clear?

grazie

allego la parte di codice che uso per aggiornare il display:

lcd.createChar(3, GOCCIA_1);

  lcd.setCursor(0, 1);

  lcd.write(3);

    if (misurazione > 999) {
    lcd.setCursor(1, 1);
    lcd.print(misurazione);
  }
  else
  {
    lcd.setCursor(1, 1);
    lcd.print("    ");
    lcd.setCursor(1, 1);
    lcd.print(misurazione);
  }


  lcd.setCursor(10, 0);

  lcd.print("G");

  if (Rotations <= 9) {
      lcd.setCursor(11, 0);
        lcd.print("  ");
        lcd.setCursor(11, 0);
        lcd.print(Rotations);
        }
      else
      {
       lcd.setCursor(11, 0);
        lcd.print(Rotations);
       }


  lcd.setCursor(5, 0);

  lcd.print("km/h");

   if (WindSpeed >= 10.00) {
    lcd.setCursor(0, 0);
    lcd.print(WindSpeed, 2);
    }
    else
  {
    lcd.setCursor(0, 0);
    lcd.print("     ");
    lcd.setCursor(0, 0);
    lcd.print(WindSpeed, 2);
  }

  if (Tpercepita8 >= 10.00) {
      lcd.setCursor(14, 0);
      lcd.print(Tpercepita8, 2);
    }
    else
    {
      lcd.setCursor(14, 0);
      lcd.print("    ");
      lcd.setCursor(14, 0);
      lcd.print(Tpercepita8, 2);
    }


  

  lcd.print("C");

  lcd.createChar(1, frecciasu_1);

  lcd.createChar(2, frecciagiu_2);

  lcd.setCursor(3, 2);

  if (arrotolaTendeGRANDESX == true && srotolaTendeGRANDESX == false) {

    lcd.write(1);

  }

  else if (arrotolaTendeGRANDESX == false && srotolaTendeGRANDESX == true) {

    lcd.write(2);

  }

  else if (arrotolaTendeGRANDESX == false && srotolaTendeGRANDESX == false) {

    lcd.print(" ");

  }

  lcd.setCursor(8, 2);

  if (arrotolaTendeGRANDECENTRO == true && srotolaTendeGRANDECENTRO == false) {

    lcd.write(1);

  }

  else if (arrotolaTendeGRANDECENTRO == false && srotolaTendeGRANDECENTRO == true) {

    lcd.write(2);

  }

  else if (arrotolaTendeGRANDECENTRO == false && srotolaTendeGRANDECENTRO == false) {

    lcd.print(" ");

  }

  lcd.setCursor(13, 2);

  if (arrotolaTendaPICCOLA == true && srotolaTendaPICCOLA == false) {

    lcd.write(1);

  }

  else if (arrotolaTendaPICCOLA == false && srotolaTendaPICCOLA == true) {

    lcd.write(2);

  }

  else if (arrotolaTendaPICCOLA == false && srotolaTendaPICCOLA == false) {

    lcd.print(" ");

  }

  lcd.setCursor(0, 3);

  if (stato_pulsanteSX == 0 ) {

    lcd.print("+");

  }

  else if (stato_pulsanteSX == 1 ) {

    lcd.print("-");

  }

  lcd.createChar(4, Taperta_1A);

  lcd.createChar(5, Taperta_1B);

  lcd.createChar(6, Tchiusa_1A);

  lcd.createChar(7, Tchiusa_1B);

  if (attivaz_chiusuraGRANDESX == 0 && attivaz_aperturaGRANDESX == 1 ) {

    lcd.setCursor(1, 3);

    lcd.write(4);

    lcd.setCursor(2, 3);

    lcd.write(5);

  }

  else if (attivaz_chiusuraGRANDESX == 1 && attivaz_aperturaGRANDESX == 0 ) {

    lcd.setCursor(1, 3);

    lcd.write(6);

    lcd.setCursor(2, 3);

    lcd.write(7);

  }

  else if (attivaz_chiusuraGRANDESX == 0 && attivaz_aperturaGRANDESX == 0 ) {

    lcd.setCursor(1, 3);

    lcd.print(" ");

    lcd.setCursor(2, 3);

    lcd.print(" ");

  }

  else if (attivaz_chiusuraGRANDESX == 1 && attivaz_aperturaGRANDESX == 1 ) {

    lcd.setCursor(1, 3);

    lcd.write(1);

    lcd.setCursor(2, 3);

    lcd.write(2);

  }

  if ( ((millis()-startingTimeGRANDESX)/60000) < 25) {
lcd.setCursor(1, 2);
lcd.print("  ");
lcd.setCursor(1, 2);
lcd.print((25 - (millis()-startingTimeGRANDESX)/60000));
}
else
{
lcd.setCursor(1, 2);
lcd.print(" ");
}


  lcd.setCursor(0, 2);

  if (SUPERAMENTOLIMITESX == true ) {

    lcd.print("*");

  }

  else if (SUPERAMENTOLIMITESX == false ) {

    lcd.print(" ");

  }

  lcd.setCursor(3, 3);

  lcd.print(count_chiusureSX);

  lcd.setCursor(5, 3);

  if (stato_pulsanteCENTRO == 0 ) {

    lcd.print("+");

  }

  else if (stato_pulsanteCENTRO == 1 ) {

    lcd.print("-");

  }

  if (attivaz_chiusuraGRANDECENTRO == 0 && attivaz_aperturaGRANDECENTRO == 1 ) {

    lcd.setCursor(6, 3);

    lcd.write(4);

    lcd.setCursor(7, 3);

    lcd.write(5);

  }

  else if (attivaz_chiusuraGRANDECENTRO == 1 && attivaz_aperturaGRANDECENTRO == 0 ) {

    lcd.setCursor(6, 3);

    lcd.write(6);

    lcd.setCursor(7, 3);

    lcd.write(7);

  }

  else if (attivaz_chiusuraGRANDECENTRO == 0 && attivaz_aperturaGRANDECENTRO == 0 ) {

    lcd.setCursor(6, 3);

    lcd.print(" ");

    lcd.setCursor(7, 3);

    lcd.print(" ");

  }

  else if (attivaz_chiusuraGRANDECENTRO == 1 && attivaz_aperturaGRANDECENTRO == 1 ) {

    lcd.setCursor(6, 3);

    lcd.write(1);

    lcd.setCursor(7, 3);

    lcd.write(2);

  }

  if ( ((millis()-startingTimeGRANDECENTRO)/60000) < 24) {
  lcd.setCursor(6, 2);
lcd.print("  ");
lcd.setCursor(6, 2);
lcd.print((24 - (millis()-startingTimeGRANDECENTRO)/60000));
}
else
{
lcd.setCursor(6, 2);
lcd.print(" ");
}


  lcd.setCursor(5, 2);

  if (SUPERAMENTOLIMITECENTRO == true ) {

    lcd.print("*");

  }

  else if (SUPERAMENTOLIMITECENTRO == false ) {

    lcd.print(" ");

  }

  lcd.setCursor(8, 3);

  lcd.print(count_chiusureCENTRO);

  lcd.setCursor(10, 3);

  if (stato_pulsantePICCOLA == 0 ) {

    lcd.print("+");

  }

  else if (stato_pulsantePICCOLA == 1 ) {

    lcd.print("-");

  }

  if (attivaz_chiusuraPICCOLA == 0 && attivaz_aperturaPICCOLA == 1 ) {

    lcd.setCursor(11, 3);

    lcd.write(4);

    lcd.setCursor(12, 3);

    lcd.write(5);

  }

  else if (attivaz_chiusuraPICCOLA == 1 && attivaz_aperturaPICCOLA == 0 ) {

    lcd.setCursor(11, 3);

    lcd.write(6);

    lcd.setCursor(12, 3);

    lcd.write(7);

  }

  else if (attivaz_chiusuraPICCOLA == 0 && attivaz_aperturaPICCOLA == 0 ) {

    lcd.setCursor(11, 3);

    lcd.print(" ");

    lcd.setCursor(12, 3);

    lcd.print(" ");

  }

  else if (attivaz_chiusuraPICCOLA == 1 && attivaz_aperturaPICCOLA == 1 ) {

    lcd.setCursor(11, 3);

    lcd.write(1);

    lcd.setCursor(12, 3);

    lcd.write(2);

  }

 if ( ((millis()-startingTimePICCOLA)/60000) < 20) {
  lcd.setCursor(11, 2);
lcd.print("  ");
lcd.setCursor(11, 2);
lcd.print((20 - (millis()-startingTimePICCOLA)/60000));
}
else
{
lcd.setCursor(11, 2);
lcd.print(" ");
}    


  lcd.setCursor(10, 2);

  if (SUPERAMENTOLIMITEPICCOLA == true ) {

    lcd.print("*");

  }

  else if (SUPERAMENTOLIMITEPICCOLA == false ) {

    lcd.print(" ");

  }

  lcd.setCursor(13, 3);

  lcd.print(count_chiusurePICCOLA);

  if (statoverificapioggia == true && (((millis() - startingTimePIOGGIA) / 60000) < 3)) {

    lcd.setCursor(9, 1);

    lcd.print(sogliapioggia);

  }
else
{
 lcd.setCursor(9, 1);

    lcd.print("    ");
}

  

  lcd.setCursor(19, 1);

  if (statoconnessione == 0) {

    lcd.print(" ");

  }

  else if (statoconnessione == 1 ) {

    lcd.print("W");

  }

  if (verificaanomalia == true && controlloeffettuato == false) {

    if (misurazione >= 300 && misurazione <= 700) {

      lcd.setCursor(16, 3);

      lcd.print("FALSO+");

    }
    else 
  {
    lcd.setCursor(16, 3);

      lcd.print("      ");
  }

  }
  
  

  if (pioggia4 == true && verificaanomalia == true) {

    lcd.setCursor(16, 3);

    lcd.print("BLOCCO");
    

 }

  lcd.setCursor(6, 1);

  if (statoverificapioggia == true && pioggiaconfermata == false) {

    lcd.print("*");

  }

  else if (statoverificapioggia == false && pioggiaconfermata == true) {

    lcd.print("V");

  }

  else if (statoverificapioggia == false && pioggiaconfermata == false) {

    lcd.print(" ");

  }

  if ( ((millis() - startingTimePIOGGIA) / 60000) < 3) {

    lcd.setCursor(7, 1);

    lcd.print((3 - (millis() - startingTimePIOGGIA) / 60000));

  }

  else

  {

    lcd.setCursor(7, 1);

    lcd.print(" ");

  }

  delay(1000);

}

La gestione del display LCD è sempre qualcosa di particolare. Infatti la schermata "classica", cioè quella programmata con più facilità, viene "rinfrescata" ad ogni ciclo di programma. L'uso di lcd.clear può peggiorare il lampeggio perchè prima di scrivere esegue un ciclo di pulitura del LCD.

Una tecnica per eliminare lo sfarfallio è quella di tenere fissi i campi descrittivi (tipo "Km/h" del tuo programma, per esempio) e cioè riscriverli il meno possibile. Altra tecnica è scrivere i valori solo se sono cambiati. Altra ancora è non scrivere degli spazi " " e poi scriverci sopra il valore, come fai tu, anche se in alcuni casi di valori numerici può servire perche il numero di caratteri è diminuito (come quando un valore passa da 10 a 9 hai un carattere che devi "pulire", ma ci sono altri metodi). E ancora, fare un refresh delle schermate non troppo rapido ma solo dopo aver letto dei valori più volte, averne fatto una media e averli poi passati al LCD.

Dice che lampeggiano i LED... (? ? ?...)

I led dell'extender lampeggiano proprio perchè c'è un refresh continuo del LCD. Se vuole fare una prova con il programma "HELLO WORD" tutto sul setup () e non sul loop () non dovrebbero lampeggiare più.

simosere: ..... come mai non riesco ad annullare questo fastidiosissimo lampeggio del display anche togliendo lcd.clear? ....

Poi il lampeggio del DISPLAY avviene di conseguenza.

grazie steve... tutto chiaro!!!! :)