U8g2.print() o u8g2.drawStr() sovrappongono i testi

Ciao a tutti.. c'è poco da scrivere alla fine, è tutto nel titolo della discussione: sto usando la libreria u8g2 per pilotare un display grafico da 192x64 pixel e, quando vado ad utilizzarlo per stampare frasi, numeri, simboli e variabili del caso, puntualmente utilizzando la stessa posizione vedo sovrapposti i vari dati/parole, e son costretto (per ora, e spero non ancora per molto), ad utilizzare il comando "u8g2.clear()" per pulire completamente il display e scrivere il nuovo valore, causando ovviamente un "lampeggio" del display stesso.
Qualcuno ha dei consigli da darmi o, essendoci già passato, mi sa dire qual è l'errore?

Grazie mille

Cancella solo la parte che andrai a riscrivere, usando ad esempio drawBox().

Ciao, Ale.

Capito, grazie
Quindi non è possibile farlo fare direttamente alla libreria stessa, immagino, giusto?
Per intendersi, come per quanto riguarda i display 16x02 o 20x04 insomma, dove i caratteri sovrascritti vengono completamente aggiornati

Perchè ti spiego... A me "preoccupa" il fatto che, andando ad utilizzare la funzione Clear (e forse anche la funzione drawBox a questo punto, perchè seppur limitata ad una zona specifica del display, alla fin fine farà la stessa cosa), io veda abbastanza marcatamente il fenomeno del "lampeggio", tra la situazione in cui c'è la vecchia scritta, quella in cui vengono spenti i pixel della riga in uso, e quella in cui viene scritta la nuova frase

NO, non è possibile, quelli sono display "grafici" e NON a carattere come i classici LCD e quindi, se prima disegni un qualche cosa (i caratteri che scrivi sono comunque immagini grafiche) devi pulire l'area se ci vuoi disegnare sopra un'altra cosa.

Per evitare il marcato fenomeno del "lampeggio", pulisci SOLO quando devi aggiornare e SOLO l'area interessata (come ti è già stato consigliato). Purtroppo un minimo si vedrà sempre.

Guglielmo

Devi conservare il testo o valore precedente e riscriverlo in nero prima di scrivere quello nuovo.

... che, visivamente, è come pulire l'area dove è il testo, quindi ... fa prima come gli è già stato suggerito. :roll_eyes:

Guglielmo

No: il risultato è perfetto e riscrive solo i punti del carattere. L'ho fatto nel magnetometro. Per riscrivere è sufficiente copiare la riga della scrittura e sostituire WHITE con BLACK e la variabile con quella che contiene il valore precedente.
Notate le righe contenenti BLACK e quelle contenenti WHITE che, in realtà, è ciano o giallo secondo la zona del display:

Non lo metto in dubbio, ma ... ti rendi conto che riscrivere in nero o pulire l'area è la STESSA cosa? Sempre i pixel al nero porti, prima di scrivere una nuova cosa ... :wink:

Guglielmo

Io scrivo solo i punti del carattere, non tutta l'area!

Il che equivale, penso, a metterci meno giusto?
E quindi, mettendoci meno, si presuppone che potenzialmente il tempo impiegato per cancellare e riscrivere sia inferiore a quello che siamo in grado di vedere, rendendoci quindi la visualizzazione del display più fluida
E' così?

Hai provato?

Ciao, Ale.

Sì, dovrebbe essere più veloce. Io l'ho fatto e funziona bene... Solo all'inizio, alla fine del setup, cancello tutta l'area celeste muovendo un rettangolo nero.

Si, per questo ho chiesto a voi..
Ho provato con la funzione "Clear", ora come ora non ho sotto mano il display per poter provare a riscrivere la frase o fare un box vuoto

... scusa eh ... il resto dell'area è già nera ... quindi fa prima un draw a portare tutto a nero una piccola zona che non dovere usare l'indirizzamento a font per disegnare in nero i vari caratteri.

Comunque, per me, fate un po' come vi pare ... :roll_eyes:

Guglielmo

Va bene, perfetto, grazie!
Proverò in questi giorni, tra stasera e domani
Anche perchè ho un altro problema relativo al visualizzare un logo, generato a partire da un'immagine .BMP che ho successivamente convertito in array da questo sito: image2cpp

Pur specificandone le dimensioni in pixel, sia per quanto riguarda l'immagine (che avevo precedentemente ridimensionato) sia per quanto riguarda la funzione "u8g2.drawBitmap();", purtroppo sul display mi vedo "dipingere" tutta quanta l'area disponibile da pixel casuali
Converrà aprire un secondo topic?

Ah ecco, io intendevo se hai provato con drawBox(), che io uso e non mi pare produca effetti indesiderati. Funziona senz'altro anche la soluzione di Datman, ma dubito fortemente che sia più veloce, e di sicuro usa più memoria.

Ciao, Ale.

Proverò entrambe infatti
Sicuramente la seconda alternativa è più "macchinosa", dovendo riscrivere la frase precedente, variabili o meno comprese

La funzione per disegnare un rettangolo è della libreria, non del display, quindi per disegnare un rettangolo "pieno" (di colore o di nero che sia...) la libreria deve inviare ogni singolo punto al display, anziché inviare solo i punti del carattere. No?...

Si, ma i singoli punti del carattere deve andarseli a leggere nella definizione del font, per ogni carattere, calcolare dove metterli e poi trasferirli. Comunque a occhio non credo si possono vedere grandi differenze tra i 2 metodi, e sono entrambi più veloci del clear(), e sopratutto riscrittura di tutto il resto che c'era sul display.

Ciao, Ale.

1 Like