funzioni varie per GLCD ST7565

io ho questo GLCD 128x64: http://www.robot-italy.com/it/graphic-st7565-negative-lcd-128x64-with-rgb-backlight.html
l'ho provato e va tutto bene, anche se è un po' lento nell'aggiornare le immagini... ora io volevo fare in modo di creare un'immagine a tutto schermo con il mio logo e mi chiedevo se c'era qualche soluzione migliore del disegnarlo pixel per pixel, per esmpio convertendo un file immagine in bianco e nero... voi come fareste?
grazie mille a tutti in anticipo! :wink:

Crei l'immagine con il logo in bianco e nero con la stessa risoluzione del display.
Scrivi un'applicazioncina in processing dove importi l'immagine e analizzi i pixel: dove c'è bianco ti fai restituire 0, dove è nero 1.
Disponi i dati ottenuti manipolandoli come più ti aggrada (byte, bin, hex, ecc) su diversi array. Esporti i dati su serial monitor o su file,
copia/incolla e voilà, il display è sistemato.
C'est bon? Ca va bien? :wink:

si avevo pensato anch'io qualcosa del genere riducendo la risoluzione dell'immagine a 128x64, anche se poi processing non l'ho mai usato e non saprei come fare...
sinceramente speravo che ci fosse qualche SW già fatto, mi piace trovare la pappa pronta :stuck_out_tongue:

Non preoccuparti, analizzare l'immagine è davvero facile, un annetto fa ho fatto questa cosa per un display lcd; funzionava alla grande ma immagina che schifezza di risoluzione su un lcd 16x2 (l'immagine era di soli 80x16 pixel!) :fearful: Ho accantonato il progetto :slight_smile:
Comunque su processing devi usare poche funzioni, vedi loadImage, loadPixels e pixels[]. Se vedi le reference di processing hanno diversi esempi. La parte più rognosa secondo me consiste nell'elaborazione dei dati, alla fine devi codificarli come richiede la libreria che usa il tuo glcd. Se mi ritrovo quello che ho scritto te lo posto per prenderne l'idea.

ok grazie mille, ma sto avendo problemi anche nella riduzione della risoluzione dell'immagine perchè vengono anche delle parti grige e se aumento il contrasto si mescola tutto e non si legge più niente =(
l'immagine sarebbe questa:

bhe se è proprio indispensabile questa immagine e il problema è il grigio potresti modificare la scala di grigi con un programma a parte per poi caricarla ad esempio credo che addirittura paint lo faccia, se però ne hai più di una allora mi dispiace ma non ne ho idea..

no l'immagine è sono quella lì, però mi sto chiedendo come funziona la mappatura in esadecimale, perchè sugli esempi della libreria c'è un piccolo logo 16x16, un fiore dell'adafruit, ed è scritto così:

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, };

perchè è scritto in 32 byte? :cold_sweat:
volevo creare il carattere "Ǝ" visto che non c'è, sarebbe un 7x5, ma non so come scriverlo...
grazie a tutti per l'aiuto :wink:

?R:
no l'immagine è sono quella lì, però mi sto chiedendo come funziona la mappatura in esadecimale, perchè sugli esempi della libreria c'è un piccolo logo 16x16, un fiore dell'adafruit, ed è scritto così:

perchè è scritto in 32 byte? :cold_sweat:

dovrebbe essere che per ad ogni bit di ogni byte corrisponde un pixel acceso/spento sullo schermo, quindi avendo ogni byte 8 bit ed essendo l'immagine 16x16pixel, una riga (o colonna, dipende come funziona la lib) prende due byte, che moltiplicati per il numero di colonne (o righe), fa 32!

dancol90:

?R:
no l'immagine è sono quella lì, però mi sto chiedendo come funziona la mappatura in esadecimale, perchè sugli esempi della libreria c'è un piccolo logo 16x16, un fiore dell'adafruit, ed è scritto così:

perchè è scritto in 32 byte? :cold_sweat:

dovrebbe essere che per ad ogni bit di ogni byte corrisponde un pixel acceso/spento sullo schermo, quindi avendo ogni byte 8 bit ed essendo l'immagine 16x16pixel, una riga (o colonna, dipende come funziona la lib) prende due byte, che moltiplicati per il numero di colonne (o righe), fa 32!

non ne capisco molto il senso, mi sembra che ci siano più dati del necessario... però se è così, come devo fare per creare il carattere "?"?
grazie ancora :wink:

?R:
non ne capisco molto il senso, mi sembra che ci siano più dati del necessario... però se è così, come devo fare per creare il carattere "?"?
grazie ancora :wink:

dati in più non ce ne sono: 16x16pixel fa 256pixel totali, 8bit*32byte totali fa ancora 256, essendo che 1bit=1pixel, i conti tornano :slight_smile:

Per il carattere, devi trattarlo come una bitmap 5x7: disegnalo su paint in bianco e nero, salvalo in bmp 1bpp e dallo in pasto a questo programma
http://en.radzio.dxp.pl/bitmap_converter/
che ti sputerà fuori un'array di byte da usare come bitmap con la lib. Gioca un po' con le impostazioni per trovare quelle giuste per la tua lib! :slight_smile:

dancol90:

?R:
non ne capisco molto il senso, mi sembra che ci siano più dati del necessario... però se è così, come devo fare per creare il carattere "?"?
grazie ancora :wink:

dati in più non ce ne sono: 16x16pixel fa 256pixel totali, 8bit*32byte totali fa ancora 256, essendo che 1bit=1pixel, i conti tornano :slight_smile:

ahn si vero! avevo sbagliato i conti :sweat_smile:

dancol90:
Per il carattere, devi trattarlo come una bitmap 5x7: disegnalo su paint in bianco e nero, salvalo in bmp 1bpp e dallo in pasto a questo programma
Bitmap converter for mono and color LCD displays
che ti sputerà fuori un'array di byte da usare come bitmap con la lib. Gioca un po' con le impostazioni per trovare quelle giuste per la tua lib! :slight_smile:

più tardi provo, grazie mille :wink:

sembra funzionare! :slight_smile: anche se non ho sotto mano il display e quindi non posso provare...
grazie mille! :wink:

sto provando ora, sto provando tutte le combinazioni con il programma che mi hai dato, ma nessuna sembra andare bene :frowning:

?R:
sto provando ora, sto provando tutte le combinazioni con il programma che mi hai dato, ma nessuna sembra andare bene :frowning:

Prova con:

Byte orientation: Vertical
Size: Width=5, Height=7
Include size: no
Size endianness: indifferente, visto che non usi "include size"
Pixel/byte: 7

Dovrebbe funzionare :slight_smile:

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: