Go Down

Topic: display LCD i2c 20x4 lampeggia anche senza lcd.clear() (Read 145 times) previous topic - next topic

simosere

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:



Code: [Select]
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);

}

steve-cr

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.
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Datman

Dice che lampeggiano i LED... (? ? ?...)
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

steve-cr

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ù.

.....
come mai non riesco ad annullare questo fastidiosissimo lampeggio del display anche togliendo lcd.clear?
....
Poi il lampeggio del DISPLAY avviene di conseguenza.
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

simosere


Go Up