Display 16x2 (displaytech 162b) strano problema visualizzazione (sfarfallio)

Ciao a tutti, sono alle prese con un display 16x2 (displaytech 162b) funziona correttamente, riesco ad utilizzare la libreria senza problemi solo che nella visualizzazione dei caratteri è come se ci sia una sorta di sfarfallio. Il display mostra dei menu comandati tramite pulsanti, e, la cosa strana è che alla pressione dei pulsanti lo sfarfallio va via.. Per rendere meglio l'idea posto un video così vi rendete conto voi stessi! Qualcuno ha avuto un problema simile? Come potrei risolvere?!

Ecco il link per il video:

http://dl.dropbox.com/u/46331756/IMG_0546.mp4

Grazie mille in anticpo!

Senza vedere il codice non so, però secondo me stai facendo un refresh continuo dell'immagine. Cioè stai pulendo e rinviando continuamente i dati all'LCD. Pare proprio l'effetto di un continuo cancella/scrivi.

Lo sfarfallio probabilmente è dovuto allo sketch, da qualche parte visualizzi un dato in continuo refresh.

Caspita si, effettivamente visualizzo dei valori provenienti dai vari sensori e li scrivo ogni volta, solo che una cosa del genere a me serve, perché poi in base al valore visualizzato effettuo delle regolazioni tramite altri pulsanti.. Come potrei risolvere?

Senza cancellare ma solo sovrascrivendo il dato.

Esempio di schermata: LETTURA SENSORE xxxxx

Ecco tu devi sovrascrivere solo su xxxxx lasciando il resto inalterato. Non devi usare continuamente un clear altrimenti sfarfalla tutto. Inoltre metti un delay fra una visualizzazione e l'altra altrimenti ti sfarfalla lo stesso la scritta xxxxx

Consiglio anche di aggiornare il display solo quando necessario: se ad ogni lettura il valore è lo stesso è inutile riscriverlo. Una cosa tipo:

valore = leggiSensore();
if(valore == valorePrecedente)
{
    valorePrecedente = valore;
}
else
{
    aggiornaDisplay(valore);
    valorePrecedente = valore;
}

Però se legge vari sensori ed ogni volta visualizza la lettura di un solo sensore il tuo consiglio non è applicabile. Io quello che faccio e riscrivere completamente le due righe di 16 caratteri, aggiungendo degli spazi per cancellare eventuali stringhe precedenti più lunghe; per il resto segui il consiglio di Leo sul delay.

Michele non é piú veloce posizionare il cursore sul numero da modificare e trasferire solo quello ovviamente con i dovuti spazi per non lasciare numeri in giro. Ciao Uwe

suggerisco di riscrivere tutto lo schermo lcd ogni volta, senza fare il clear (che prende ben 150 ms ed è percepito dall'occhioumano). Usa sprintf e fai il padding con dei blank per cancellare eventuali caratteri preesistenti. Quest rende il display assolutamente "fisso". Giuro :-) Se crei una funzione a hoc la cosa è semplice.

brunialti: suggerisco di riscrivere tutto lo schermo lcd ogni volta, senza fare il clear (che prende ben 150 ms ed è percepito dall'occhioumano). Usa sprintf e fai il padding con dei blank per cancellare eventuali caratteri preesistenti. Quest rende il display assolutamente "fisso". Giuro :-) Se crei una funzione a hoc la cosa è semplice.

credo sia quello che ho suggerito anch'io, Uwe indica una strada più diretta, ma la questione è sempre capire che cosa si scrive. Facciamo un esempio: leggo la temperatura e l'umidità e scrivo 1a riga: temperatura 38°C e 2a riga: umidità 80%; poi leggo pressione atmosferica e velocità del vento e li scrivo sulle stesse due righe @ Uwe: io ho scritto

Però se legge vari sensori ed ogni volta visualizza la lettura di un solo sensore il tuo consiglio non è applicabile.

ed è proprio l'esempio riportato, dove lo posiziono il cursore visto che devo praticamente cambiare tutto? ;)

Esempio, adattato da mio codice (adattamento non testato).
Prima formatta una stringa con i valori di quattro sensori (s1,s2,s3,s4) contenuti in quattro variabili (v1,v2,v3,v4) di tipo int usando un buffer di appoggio scr:

sprintf(scr,“s1=%d s2=%d\ns3=%d s4=%d”,v1,v2,v3,v4);

poi scrivi una bella funzione tipo quella che segue crea due variabili con le dimensione dell’lcd e chiamala passando la variabile scr;
That’s all.

row=2;
col=16;

void drawLcd(char *scr){
  char buf[34];
  int i,j,k;
  for (int i=0,j=0,k=0;(k<row)&&(i<(strlen(scr)+1));i++){
    if((scr[i]==0x0A)||(scr[i]==0)){
      memset(&buf[min(j,col)],' ',col-j);
      buf[col]=0;
      lcd.setCursor(0,k);
      lcd.print(buf);
      j=0;
      k++;
      }
   else{
      buf[j]=scr[i];
      j++;
      }
    if(k==row)
      return;
    }
  }

parametrizza se vuoi e usa per lcd di qualsiasi dimensione (i buffer devono avere dimensioni pari a: row x col +row)