funzioni varie per GLCD ST7565

funziona!! :smiley: grazie ancora! :wink:
ma perchè 7 pixel/byte?

?R:
funziona!! :smiley: grazie ancora! :wink:
ma perchè 7 pixel/byte?

Prima di tutto: ogni byte rappresenta una colonna dell'immagine.
Se è più piccola di 8pixel, la libreria usa i primi n bit del byte, con n altezza dell'immagine, ignorando i restanti (nel nostro caso, 1 solo bit non viene considerato)
Se avessimo usato 8px/byte il programma avrebbe riempito anche quei bit in eccesso con le informazione della colonna successiva, sfalsando tutto.
Nel nostro caso, avrebbe messo un pixel della seconda colonna nel primo byte, quindi nel secondo byte avrebbe messo i restanti 6,
e riempito i due bit rimanenti con i primi due pixel della terza colonna, e così via.

Mentre con 7px/byte, forziamo il programma a saltare un bit in ogni byte, permettendoci di avere le colonne allineate correttamente :slight_smile:

ma questo solo se l'immagine è piccola, o no?

?R:
ma questo solo se l'immagine è piccola, o no?

Per come è implementata la lib, si.
Se devi usare immagini più grandi, se vuoi usare quella utility ti conviene farle con altezza multipla di 8 ed usare 8px/byte!

prima però avevo provato con una immagine 74x64 con 8pixel/byte e non andava, faceva sempre una rettangolo con pixel accesi e spenti a caso, magari dopo riprovo meglio...
grazie ancora :wink:

alla fine ho risolto in qualche mniera :slight_smile:
questo è uno dei risultati:

Ciao, mi unisco alla disussione. Anche io possiedo lo stesso display, appena acquistato da robot italy, e volevo togliere il logo Adafruit standard per mettercene uno mio personalizzato.
Sto utilizzando il file dell'esempio della libreria ST7565 "st7565lcd". Ho capito che bisogna andare a modificare l'array:

// a bitmap of a 16x16 fruit icon
static unsigned char __attribute__ ((progmem)) logo16_glcd_bmp[]={
0x30, 0xf0, 0xf0, 0xf0, 0xf0, 0x30, 0xf8, 0xbe, 0x9f, 0xff, 0xf8, 0xc0, 0xc0, 0xc0, 0x80, 0x00, 
0x20, 0x3c, 0x3f, 0x3f, 0x1f, 0x19, 0x1f, 0x7b, 0xfb, 0xfe, 0xfe, 0x07, 0x07, 0x07, 0x03, 0x00, };

Ma qualsiasi cosa metto all'interno dell'array mi fa vedere sempre lo stesso logo Adafruit. Anche se cancello del tutto l'array il logo me lo visualizza sempre..... :fearful:, mi viene il dubbio che non sia memorizzato altrove. Peró tu dici che hai risolto, mi potresti spiegare come hai fatto? I dettagli sono graditi..... :slight_smile:

franhk77:
Ma qualsiasi cosa metto all'interno dell'array mi fa vedere sempre lo stesso logo Adafruit. Anche se cancello del tutto l'array il logo me lo visualizza sempre..... :fearful:, mi viene il dubbio che non sia memorizzato altrove. Peró tu dici che hai risolto, mi potresti spiegare come hai fatto? I dettagli sono graditi..... :slight_smile:

Il logo è scritto direttamente nel buffer quando questo viene dichiarato. Il buffer non è altro che un array che rappresenta tutti i pixel dello schermo, su cui la libreria lavora per poi inviare il tutto al display quando viene dato il comando di refresh. Per cambiare il logo quindi devi quindi andare a modificare la dichiarazione di st7565_buffer in ST7565.cpp, sostituendo con tutti 0x0 (per lo schermo bianco) o con i dati di un'immagine pari alla risoluzione dello schermo. L'importante è che siano in tutto esattamente 1024 elementi.

dancol90:

franhk77:
Ma qualsiasi cosa metto all'interno dell'array mi fa vedere sempre lo stesso logo Adafruit. Anche se cancello del tutto l'array il logo me lo visualizza sempre..... :fearful:, mi viene il dubbio che non sia memorizzato altrove. Peró tu dici che hai risolto, mi potresti spiegare come hai fatto? I dettagli sono graditi..... :slight_smile:

Il logo è scritto direttamente nel buffer quando questo viene dichiarato. Il buffer non è altro che un array che rappresenta tutti i pixel dello schermo, su cui la libreria lavora per poi inviare il tutto al display quando viene dato il comando di refresh. Per cambiare il logo quindi devi quindi andare a modificare la dichiarazione di st7565_buffer in ST7565.cpp, sostituendo con tutti 0x0 (per lo schermo bianco) o con i dati di un'immagine pari alla risoluzione dello schermo. L'importante è che siano in tutto esattamente 1024 elementi.

sono d'accordo, in alternativa per toglierlo proprio puoi fare un clear e display appena dopo il begin, così non apparirà più nessun logo all'inizio :wink:

uhm, come sospettavo! Ma quindi la mia nuova immagine/logo, supponiamo sia questa:

const unsigned char bnwmini [] = {
0x80, 0x00, 0x40, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x49, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x05, 0x7B, 0x7D, 0xF7, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0xFA, 0x17, 0xAF, 0x7F, 0xD6, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x15, 0x4A, 0xBA, 0xF5, 0xAA, 0xB7, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE9, 0x56, 0x6D, 0x5E, 0xF6, 0xA8, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x8A, 0xAB, 0x37, 0xD6, 0x96, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x22, 0x00, 0x49, 0x76, 0x07, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x02, 0x00, 0xC0, 0x36, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x04, 0x00, 0x40, 0x1C, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x04, 0x00, 0x60, 0x14, 0x00, 0x40, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x04, 0x00, 0x80, 0x3C, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x04, 0x04, 0x00, 0x60, 0x14, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x04, 0x04, 0x00, 0x40, 0x78, 0x00, 0xC0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x04, 0x04, 0x2A, 0x20, 0x2E, 0xA8, 0x60, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x08, 0x0C, 0xB7, 0x40, 0x75, 0xFA, 0x94, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0A, 0xA7, 0xC1, 0xB5, 0x5B, 0x55, 0xFF, 0xC2, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x15, 0x5D, 0x75, 0xAF, 0xDD, 0xAB, 0xAB, 0x7B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x42, 0xAF, 0x94, 0xA4, 0x88, 0x10, 0x08, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x10, 0x6A, 0x82, 0x00, 0x20, 0x80, 0x02, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x20, 0x0A, 0x22, 0xA1, 0x28, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x49, 0x00, 0x03, 0x80, 0x01, 0x04, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x49, 0x51, 0x10, 0x68, 0x80, 0x00, 0x40, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x64, 0x41, 0x10, 0x10, 0x42, 0x01, 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x55, 0x25, 0x28, 0x89, 0x04, 0x00, 0x10, 0x00, 0x00, 0x24, 0x90, 0x00, 0x00, 0x00, 0x00,
0x00, 0x40, 0x4A, 0xAA, 0x40, 0x00, 0x20, 0x80, 0x42, 0x49, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00,
0x00, 0x5D, 0x22, 0xAB, 0x55, 0x51, 0x00, 0x08, 0x10, 0x48, 0x24, 0x82, 0x88, 0x00, 0x00, 0x00,
0x00, 0xE5, 0x5D, 0x54, 0xAA, 0x04, 0x24, 0x22, 0x05, 0x12, 0x91, 0x24, 0x30, 0x00, 0x00, 0x00,
0x00, 0xF5, 0x55, 0xB5, 0x55, 0xE9, 0x00, 0xB4, 0xA8, 0x92, 0x14, 0x25, 0x6C, 0x00, 0x00, 0x00,
0x00, 0xCB, 0x6D, 0x56, 0xAA, 0x2A, 0x53, 0x55, 0x12, 0xAA, 0x95, 0xA5, 0xF4, 0x00, 0x00, 0x00,
0x00, 0xF5, 0x55, 0x5A, 0xAB, 0xAB, 0x51, 0xD6, 0xD5, 0x54, 0x80, 0x21, 0x68, 0x00, 0x00, 0x00,
0x01, 0xEB, 0x56, 0xD5, 0x6A, 0x54, 0xAF, 0xFB, 0x28, 0x00, 0x00, 0x0B, 0x80, 0x00, 0x00, 0x00,
0x01, 0xFA, 0xDA, 0xAB, 0x5A, 0xD6, 0xAF, 0x6D, 0x80, 0x01, 0x6F, 0xEA, 0xC0, 0x00, 0x00, 0x00,
0x01, 0xE5, 0x55, 0x6D, 0x55, 0x5A, 0xDB, 0x94, 0x05, 0xFF, 0xFF, 0xBF, 0xCC, 0x00, 0x00, 0x00,
0x01, 0x7A, 0xAA, 0xA5, 0x55, 0x55, 0x6A, 0x86, 0x7E, 0xFE, 0xFD, 0xFE, 0xF8, 0x00, 0x00, 0x00,
0x01, 0xF5, 0x55, 0x55, 0x5F, 0x2A, 0xB6, 0x06, 0xF5, 0xAB, 0xAB, 0x6B, 0x68, 0x00, 0x00, 0x00,
0x00, 0xFA, 0xAA, 0xAA, 0xBF, 0x9B, 0x57, 0xAC, 0xAF, 0x7E, 0xFF, 0x7F, 0xB0, 0x00, 0x00, 0x00,
0x01, 0xBA, 0xAA, 0xAA, 0xFF, 0xCA, 0xBB, 0xF1, 0xFA, 0xDB, 0xAB, 0xDA, 0xA8, 0x00, 0x00, 0x00,
0x00, 0xBE, 0xAA, 0xAA, 0x7F, 0xEA, 0xDA, 0xBA, 0xAF, 0x6E, 0xFE, 0xFF, 0xD0, 0x00, 0x00, 0x00,
0x01, 0xBF, 0x4A, 0xAA, 0xFF, 0xE6, 0xAD, 0xD3, 0x75, 0xDD, 0xAF, 0xB6, 0xE0, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x6A, 0xAA, 0xFF, 0xF3, 0x6D, 0x55, 0xDE, 0xEF, 0xF5, 0xFF, 0x70, 0x00, 0x00, 0x00,
0x00, 0xFE, 0x2A, 0xAA, 0xFF, 0xF5, 0xB6, 0xB7, 0x6D, 0xBA, 0xBF, 0x55, 0xE0, 0x00, 0x00, 0x00,
0x00, 0x7E, 0x16, 0xAA, 0xFF, 0xF9, 0x5A, 0xDB, 0x77, 0xDF, 0xD5, 0xF6, 0xA0, 0x00, 0x00, 0x00,
0x00, 0x7C, 0x03, 0x5B, 0xFD, 0xFD, 0xB7, 0x55, 0xAD, 0x76, 0xFA, 0xBA, 0x90, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xD4, 0xFF, 0xFC, 0xDB, 0xBD, 0xEF, 0x5A, 0xAF, 0xDA, 0xC6, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x35, 0xED, 0xBF, 0x76, 0xEF, 0x73, 0xD7, 0xF5, 0x44, 0x0A, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0F, 0xFE, 0xFF, 0x5F, 0xEB, 0x5A, 0xF5, 0x28, 0x20, 0x60, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0xFB, 0x7D, 0x62, 0x5E, 0xD5, 0x50, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xFF, 0xDF, 0x2B, 0x42, 0x50, 0x00, 0x17, 0xEF, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xEE, 0xDF, 0x00, 0x80, 0x00, 0x17, 0xFD, 0xEF, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFB, 0xFE, 0x00, 0x00, 0x0B, 0xFF, 0x6F, 0x6F, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0x5F, 0xB7, 0x7F, 0xFF, 0x6D, 0xED, 0xAF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF7, 0xDF, 0xFF, 0xEF, 0xFF, 0x77, 0xAF, 0xEE, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xED, 0x7F, 0xFF, 0xFF, 0xF5, 0x6D, 0x7A, 0x08, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x77, 0xFF, 0xFF, 0x00, 0x00, 0xF7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7B, 0xBF, 0xE0, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7D, 0xBF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

La devo mettere nello sketch al posto dell'array esistente oppure la devo inserire nel buffer del file .cpp ?

Ok, funziona.... :stuck_out_tongue_closed_eyes: Grazie!

Ora volevo sapere se é possibile utilizzare nella stessa schermata font di dimensioni diverse.

franhk77:
Ok, funziona.... :stuck_out_tongue_closed_eyes: Grazie!

Ora volevo sapere se é possibile utilizzare nella stessa schermata font di dimensioni diverse.

intendi variare la dimensione del testo? anch'io volevo provare a farlo ma penso che bisogna scrivere il codice tutti i carattari perchè non penso sia previsto dalla libreria... ma non vorrei sbagliarmi...

?R:
intendi variare la dimensione del testo? anch'io volevo provare a farlo ma penso che bisogna scrivere il codice tutti i carattari perchè non penso sia previsto dalla libreria... ma non vorrei sbagliarmi...

Esattamente! La libreria ha un unico tipo di font al suo interno. Un modo è quindi quello di modificarsi la libreria con tanta pazienza, altrimenti si possono trattare i vari caratteri di un eventuale font come bitmap e gestire dallo sketch la visualizzazione in ordine di questi in base alla stringa...in ogni caso un lavoro non da pochi minuti, ma comunque fattibile. :slight_smile:

ho un'altra domanda, sto creando un menu e volevo fare che nella riga selezionata il testo apparisse a colori invertiti, ma non vedo la possibilità di farlo con la libreria... c'è qualche modo "semplice" per fare ciò o dovrei riscrivere tutte le lettere?
grazie

?R:
ho un'altra domanda, sto creando un menu e volevo fare che nella riga selezionata il testo apparisse a colori invertiti, ma non vedo la possibilità di farlo con la libreria... c'è qualche modo "semplice" per fare ciò o dovrei riscrivere tutte le lettere?
grazie

la libreria di suo mi pare non lo faccia, ma potresti modificarla, sostituendo la funzione drawchar in ST7565.cpp con:

void ST7565::drawchar(uint8_t x, uint8_t line, char c, uint8_t color) {
  for (uint8_t i =0; i<5; i++ ) {
    st7565_buffer[x + (line*128) ] = pgm_read_byte(font+(c*5)+i) ^ (color ? 0x00 : 0xFF);
    x++;
  }

  updateBoundingBox(x, line*8, x+5, line*8 + 8);
}

se color è 0, disegna il carattere in nero su sfondo bianco (con nero intendo pixel acceso, bianco spento),
se color è 1, disegna in bianco su sfondo nero (in poche parole disegna in negativo)

non l'ho provato questo codice ma dovrebbe funzionare...sappimi dire.

Ah, ricordati di modificare la dichiarazione di drawchar anche in ST7565.h :slight_smile:

dancol90:

?R:
ho un'altra domanda, sto creando un menu e volevo fare che nella riga selezionata il testo apparisse a colori invertiti, ma non vedo la possibilità di farlo con la libreria... c'è qualche modo "semplice" per fare ciò o dovrei riscrivere tutte le lettere?
grazie

la libreria di suo mi pare non lo faccia, ma potresti modificarla, sostituendo la funzione drawchar in ST7565.cpp con:

void ST7565::drawchar(uint8_t x, uint8_t line, char c, uint8_t color) {

for (uint8_t i =0; i<5; i++ ) {
    st7565_buffer[x + (line128) ] = pgm_read_byte(font+(c5)+i) ^ (color ? 0x00 : 0xFF);
    x++;
  }

updateBoundingBox(x, line8, x+5, line8 + 8);
}




se color è 0, disegna il carattere in nero su sfondo bianco (con nero intendo pixel acceso, bianco spento), 
se color è 1, disegna in bianco su sfondo nero (in poche parole disegna in negativo)

non l'ho provato questo codice ma dovrebbe funzionare...sappimi dire.


Ah, ricordati di modificare la dichiarazione di drawchar anche in ST7565.h :)

bella idea! :wink: grazie mille! appena lo provo ti so dire :wink:

allora lo sto provando adesso, ho dovuto cambiare anche i metodi drawstring e drawstring_P che si basavano sul drawsrting, poi ho invertito il tuo programma il bianco con il nero perchè mi pareva più logico :stuck_out_tongue:
comunque non funziona bene perchè scrivendo con la drawstring lascia una riga verticale di pixel "vuoti" tra un carattere e l'altro (nella foto allegata ho provato a scrivere hello world! in negativo)... stavo pensando di modificare la parte del drawstring facendogli mettere una riga sopra il carattere e una fila di pixel prima del carattere... cosa ne pensi?

sto pensando meglio a come poter fare e mi accorgo che è difficile mettere una riga sopra il carattere perchè va a ad occupare lo spazio della riga prima... mentre la riga di pixel prima del carattere è più fattibile

l'ho fatto mettendo una riga prima del carattere, adesso è molto più leggibile, adesso faccio qualche ulteriore prova poi metto il codice e una foto :wink:

eccoli allegati :slight_smile:

volevo fare la stessa cosa anche con il metodo drawbitmap, ovvero andare a modificare la parte del my_setpixel:

void ST7565::my_setpixel(uint8_t x, uint8_t y, uint8_t color) {
  if ((x >= LCDWIDTH) || (y >= LCDHEIGHT))
    return;

  // x is which column
  if (color) 
    st7565_buffer[x+ (y/8)*128] |= _BV(7-(y%8));  
  else
    st7565_buffer[x+ (y/8)*128] &= ~_BV(7-(y%8)); 
}

perchè se ho un'immagine e voglio farla in negativo non mi basta scrivere BLACK o WHITE, è che se modifico questa parte dopo potrei avere problemi disegnando le forme...

ST7565.cpp (17.5 KB)