Ottimizzazione di lcd.print

E' un po' di tempo che ci giro intorno però adesso vorrei delle conferme e, se pensate l'idea non sia male, anche degli aiuti.

Parto dalla semplice istruzione: lcd.print ("abcdefg"); oppure lcd.print (XYZ);
Se la inseriamo nel nostro programma questa istruzione verra eseguita ad ogni ciclo rinfrescando qualcosa che comunque è già stato scritto nel ciclo precedente.
Se il valore è uguale al ciclo precedente la scrittura (e l'utilizzo di CPU) è inutile (e se guardate in controluce vedrete anche lo sfarfallio del lcd), se il valore è cambiato la scrittura è necessaria.

Sui diversi metodi di come vedere se c'è qualcosa di utile da scrivere sul LCD pensavo a questo:

  • ho uno schermo 20x4 (20 caratteri (x) per quattro righe (y) che devo riempire)
  • devo comporre PRIMA le quattro righe da scrivere e le scrivo a display solo se sono diverse dalle righe precedenti.
  • le devo preventivamente analizzare con IF sulle stesse stringhe della schermata precedente

Il ragionamento è sufficiente per una riga LCD, perché le altre seguono lo stesso principio.

Avrò quindi 4 stringhe da scrivere sullo schermo: dentro queste stringhe ci possono essere caratteri descrittivi oppure valori di variabili.

Ora, il ragionamento lo faccio sulla stringa nr. 0 (y0 dello schermo)

  • Come compongo una sola stringa chiamata, per esempio STRINGA0, con caratteri descrittivi e valori di variabili tali da arrivare a 20 caratteri?
  • come eseguo la if tra stringa precedente e stringa attuale (pensavo ad un 21esimo carattere che è la somma dei 20 caratteri e faccio la IF solo sul 21esimo).

Una volta eseguito il controllo non mi resta, semplicemente, che fare lcd.print solo della stringa diversa dalla precedente...

Se ho due schermate (la Main e la Setup, per esempio) avrò 8 stringhe, e via di seguito...

Ha senso la cosa?

... forse, e ripeto forse, sarebbe più interessante farlo a livello di driver.

Il controller ti permette la lettura della memoria display; confrontando ciò che si riceve da scrivere sul display con quello che c'è già scritto, magari si potrebbe aggiornare SOLO ciò che è cambiato o non fare nulla se non è cambiato nulla :wink:

Guglielmo

Ma se tu scrivi il programma, lo saprai se e quando stai modificando un valore.
Metti dei flag booleani e scrivi solo se sono true.
Hai l'indicazione di un valore che stampi alla riga 2 colonna 7, lo leggi da un sensore, fai aggiornoval3 = (oldval != newval) e quando devi andare a scrivere sul display fai un if aggiornoval3 scrivi alle coordinate 2,7 il nuovo valore.

paulus1969:
Ma se tu scrivi il programma, lo saprai se e quando stai modificando un valore ...

... mi piace molto di più fatto a livello "driver" che non a livello "utente" ! :slight_smile:

Guglielmo

gpb01:
... forse, e ripeto forse, sarebbe più interessante farlo a livello di driver.

Il controller ti permette la lettura della memoria display; confrontando ciò che si riceve da scrivere sul display con quello che c'è già scritto, magari si potrebbe aggiornare SOLO ciò che è cambiato o non fare nulla se non è cambiato nulla :wink:

Guglielmo

Sí il HD44780 Ti permette di leggere il contenuto della memoria "video" ma quasi sempre il pin R/W del display si mette a massa per risparmiare pin.

Anch io sono per la soluzione di paulus1969.

Ciao Uwe

Secondo i casi, faccio in un modo o nell'altro o più d'uno insieme:

  1. Scrivo qualcosa solo se l'ho cambiata o se so che è/può essere cambiata, lasciando attentamente spazi prima e/o dopo per coprire scritte precedenti se possono essere più lunghe

  2. Aggiorno il display una volta al secondo o mezzo secondo:

if(millis()-t1>999) {lcd.print(... ... .. ); t1=millis();}
  1. In loop brevissimi per l'inserimento di valori tramite encoder (e non me ne importa niente di bloccare tutto durante le impostazioni) aggiorno continuamente e basta. :slight_smile:

Una cosa che non faccio mai (salvo quando scrivo una pagina completamente diversa) è cancellare e poi scrivere, perché le scritte sul display sfarfallerebbero.

uwefed:
Sí il HD44780 Ti permette di leggere il contenuto della memoria "video" ma quasi sempre il pin R/W del display si mette a massa per risparmiare pin.

Con le attuali interfaccie I2C, se fossero fatte cose si deve, non sarebbe un problema :wink:

Guglielmo

Sarebbe solo da capire come leggere, senza necessariamente avere un driver, la memoria video del HD44780...

Il problema mi era nato volendo usare, per una schermata di setup, il cursore lampeggiante: voi lo avete mai fatto? Ecco, a causa di questi continui refresh, il cursore NON lampeggia (perché nel momento del lampeggio c'è un refresh video, anche senza clear dello schermo, oppure lampeggia strano...

Mi sono sempre chiesto se il cursore lampeggiante per l'immissione si facesse con una funzione apposita del display oppure sostituendolo periodicamente al carattere.

Avevo già aperto un post sul discorso CURSORE LAMPEGGIANTE, ma non aveva avuto molto seguito...

Questo.

Mi sa che bisogna per forza alternare la visualizzazione del carattere e quella della sottolineatura o del rettangolo nero tramite un

if((millis()-t1)%2<500) {[trattino]; t1=millis();}