Aiuto - Nokia 1100 lcd PCF8814 libreria "pechurc"

Buon giorno a tutti,
ho giá postato qualcosa di simile nel sito inglese, ma, ahimé senza risposta da 2-3 giorni, per cui, lo faccio anche qui, in italiano (gli italiani sono sempre I piú efficienti, mi raccomando non mi deludete :wink: ).
Ho installato e sto utilizzando la libreria di pechurc per far funzionare un display LCD Nokia 1100 che ho smontato da un vecchio cell. Funziona, solamente che, quando utilizzo il metodo “void drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color);” contenuto nel file “Nokia2.h”, al posto di visualizzarmi l´immagine bitmap, mi visualizza tutta la sequenza di caratteri contenuti in “NokiaChars.h”. Potrebbe gentilmente qualcuno di voi aiutarmi a capire da cosa dipende tutto ció?

Evidentemente, c´é qualcosa che non vá nella descrizione del metodo drawBitmap all´interno del file “Nokia2.cpp”, che qui riporto:

void LCD::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) {
for (int16_t j=0; j<h; j++) {
for (int16_t i=0; i<w; i++ ) {
if (pgm_read_byte(bitmap + i + (j/8)*w) & _BV(j%8)) {
drawPixel(x+i, y+j, color);
}
}
}
}

Potrebbe essere un problema all´interno del metodo sopracitato, oppure potrebbe essere un problema del metodo in esso contenuto, ovvero “drawPixel”? (riportato sotto)

void LCD::drawPixel (int16_t x, int16_t y, uint16_t color) {
if ((x < 0) || (x >= LCD_X) || (y < 0) || (y >= LCD_Y))
return;

if (color)
LCDCache[x+ (y/8)*LCD_X] |= _BV(y%8);
else
LCDCache[x+ (y/8)*LCD_X] &= ~_BV(y%8);

UpdateBox(x,y,x,y);
}

oppure un problema in “UpdateBox”? (qui sotto…)

void LCD::UpdateBox (int xmin, int ymin, int xmax, int ymax) {
if (xmin < xUpdateMin) xUpdateMin = xmin;
if (xmax > xUpdateMax) xUpdateMax = xmax;
if (ymin < yUpdateMin) yUpdateMin = ymin;
if (ymax > yUpdateMax) yUpdateMax = ymax;
}

Non essendo esperto di programmazione, ma semplice utente di librerie, mi rivolgo al forum, con la speranza di trovare aiuto.

Ho giá avuto un problema con un altro metodo, ovvero “setTextSize”

void LCD::setTextSize(uint8_t s) {
textsize = (s > 0) ? s : 1;
}

Il problema era, il tizio aveva dimenticato la posizione delle parentesi tonde nel metodo “drawChar”, lá dove dice:

fillRect(x+(isize), y+(jsize), size, size, color);

doveva invece essere

fillRect((x+i)*size, (y+j)*size, size, size, color);

Grazie in anticipo per il support tecnico.

svato1979: Buon giorno a tutti, ho giá postato qualcosa di simile nel sito inglese, ma, ahimé senza risposta da 2-3 giorni, per cui, lo faccio anche qui, in italiano (gli italiani sono sempre I piú efficienti, mi raccomando non mi deludete ;) ).

Già ... peccato che la cosa sia [u]PROIBITA[/u] dal REGOLAMENTO, punto 13, "il cross-posting è proibito ([u]anche tra lingue divers[/u]e)" ...

Inoltre, cortesemente, visto che non lo hai ancora fatto, ti prego di presentarti QUI ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato regolamento (che, evidentemente, non avevi letto).

Grazie.

Guglielmo

EDIT: Come da richiesta dell'utente, il post nella sezione inglese è stato eliminato e questo viene riaperto.

gpb01: Grazie.

Guglielmo

EDIT: Come da richiesta dell'utente, il post nella sezione inglese è stato eliminato e questo viene riaperto.

Grazie mille a te Guglielmo, spero di trovare una soluzione al mio problema. Prometto di presentarmi nella sezione delle presentazioni personali per descrivere chi sono ecc.. Ancora scusa per l´inconveniente.

Brutalmente, prova a forzare i bit dell'immagine tutti a uno, sostituisci questo:

if (pgm_read_byte(bitmap + i + (j/8)*w) & _BV(j%8)) {

con:

if (1) {

P.S. Non avendo il display è difficile fare dei test

nid69ita: con:

if (1) {

P.S. Non avendo il display è difficile fare dei test

Percepisco che sia un problema di difficile risoluzione, cosí, a distanza. Si, é tutto OK, lo schermo esce tutto nero se ci metto if (1). Io non riesco assolutamente ad interpretare il codice di questa persona che ha realizzato la libreria, tra l´altro anche molto brava a fondere diverse librerie per realizzarla. Tu ti chiederai: perché non ne usi 1 altra? perché questa é l´unica, dove, oltre che poter visualizzare i bitmap (pare sia potenzialmente possibile farlo) mi permette di scalare i valori numerici per vederli piú grandi. Ne ho provate anche altre, ma nessuna mi permetteva di fare entrambe le cose. ce n´é anche qualöcusa di qualche russo, che, peró, non funzionano. Non volendomi studiare tutto troppo approfonditamente, ci ho rinunciato, ed ho ripiegato le mie speranze nel forum, nella speranza che qualcuno di vpoi potesse aiutarmi, magari qualcuno ci ha giá fatto esperienza con Nokia 1100 per Arduino.

Con if(1) in pratica tutti i bit sono "pieni", quindi immagine nera. Direi che il problema è in quella if() con pgm_read_byte Tieni conto che la pgm_read_byte credo sia cambiata tra i vari IDE (versioni) e non mi pare quella lib sia molto aggiornata (è vecchia di 4 anni). Oppure in quel if c'e' un errore di calcolo.

P.S. però... ma tu come la usi/richiami la DrawBitmap? Sicuro di usarla nel modo corretto ? Posta il tuo sketch !!

Innanzitutto grazie mille per le tue risposte, apprezzo davvero.

nid69ita:
Direi che il problema è in quella if() con pgm_read_byte

Si, confermerei che sia proprio lá dentro il problema.

nid69ita:
Tieni conto che la pgm_read_byte credo sia cambiata tra i vari IDE (versioni) e non mi pare quella lib sia molto aggiornata (è vecchia di 4 anni).
Oppure in quel if c’e’ un errore di calcolo.

Si, é vecchia questa libreria. Conosci qualche sostituto della funzione “pgm_read_byte” che io possa provare?

nid69ita:
P.S. però… ma tu come la usi/richiami la DrawBitmap? Sicuro di usarla nel modo corretto ?
Posta il tuo sketch !!

La drawBitmap penso di richiamarla bene. Ecco il mio sketch:

#include <Nokia2.h>

LCD Display = LCD();

//CREATE A SPLASH SCREEN IMAGE
static const byte Bitmap [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x20, 0xE0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xFC, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0,
0xE0, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0x8C, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF0, 0xE0, 0xC0, 0xC0, 0xC0, 0xE0, 0xF0,
0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F, 0x0F, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x7F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0xC0, 0xC0, 0xE0, 0xF0, 0xF0, 0xF8, 0x78, 0x18, 0x08,
0x08, 0x18, 0x38, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x01, 0x01, 0x03, 0x07, 0x0F,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF0, 0xE0, 0xF0, 0xF0, 0xF8, 0xE0, 0x80, 0x00,
0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x01,
0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFC, 0xF0, 0x00, 0x00,
0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x07, 0x07, 0x00,
0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x07, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x80,
0x00, 0x00, 0x00, 0x02, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF8,
0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFF, 0xFF, 0x3F, 0x0F, 0x00, 0x00,
0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xF0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFE, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x01, 0x03, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F,
0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x01, 0x80, 0x80, 0xC0, 0xE0, 0xF0,
0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x07, 0x03, 0x01, 0x03, 0x07, 0x0F,
0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8,
0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x38, 0x10, 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, 0x07, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x07, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x39, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup()
{

Display.Setup();
Serial.begin(9600);
Display.Update();
Display.Clear();
}

void loop()
{
Display.drawBitmap(0,0,Bitmap,96,68,1);
//Display.setTextSize(10);
//Display.drawPixel(0,0,1);
Display.Update();
}

Questa é l´immagine di ció che sono riuscito ad ottenere fino ad adesso utilizzando questa libreria.
E´ un orologio/calendario, senza l´ausilio di nessun RTC, con annesso altimetro_termometro_igrometro (BME280). Sarebbe bello se, all´avvio dell´"orologio", ci fosse anche un´icona simbolica,Bitmap, cosí come ha fatto l´utente che ha creato il "thinkerwatch. Se solo si riuscisse a capire come modificare questa benedetta libreria.

Prova a cambiare la dichiarazione della tua bitmap in:

static const byte Bitmap [] PROGMEM = {

Comunque il mio consiglio è di cambiare libreria. u8glib permette di scalare le dimensioni del display, e anche di usare font grandi a volontà.

SukkoPera: Prova a cambiare la dichiarazione della tua bitmap in:

static const byte Bitmap [] PROGMEM = {

Grazie mille del consiglio. Mi esce una pseudo immagine, anche io ero su quella strada, ma purtroppo, non va.

SukkoPera: Comunque il mio consiglio è di cambiare libreria. u8glib permette di scalare le dimensioni del display, e anche di usare font grandi a volontà.

Ho appena provato la pcf8812 di u8glib, ma non vá, apparte che non resco a capire quel MOSI che sia, sarebbe SDA? io ho i seguenti piedini: SCLK, SDA, XCS e XRES.

In questo post dice che la libreria 8812 potrebbe anche andare bene per il 8814, che sarebbe il mio caso. Ma non vá. Mi sapresti aiutare?

Perdonami, avevo letto 5110, mentre tu stai usando un 1100, che non avevo mai sentito prima :(. Purtroppo pare che u8glib non supporti tale LCD.

Tornando alla vecchia libreria, sei sicuro che la tua immagine sia codificata bene? Quel PROGMEM ci vuole di fisso, cosa intendi per pseudo-immagine?

EUREKA!!! ha funzionato… era quel benedetto PROGMEM che mancava, ed in piú era l´immagine scalata male, nella dichiarazione : Display.drawBitmap.
Sopra era cosí:
Display.drawBitmap(0,0,Bitmap,96,68,1);

mentre invece doveva essere 64x64

Grazie infinite. Spero possa servire a qualcuno.

ecco il listato definitivo, funzionante!!

#include <Nokia2.h>

LCD Display = LCD();

//CREATE A SPLASH SCREEN IMAGE

static const byte Bitmap [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x20, 0xE0, 0xF0, 0xF0, 0xF8, 0xF8, 0xF8, 0xFC, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0,
0xE0, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC, 0x8C, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xF0, 0xF0, 0xE0, 0xC0, 0xC0, 0xC0, 0xE0, 0xF0,
0xF8, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0F, 0x0F, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x7F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0xC0, 0xC0, 0xE0, 0xF0, 0xF0, 0xF8, 0x78, 0x18, 0x08,
0x08, 0x18, 0x38, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 0x01, 0x01, 0x03, 0x07, 0x0F,
0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0xF0, 0xE0, 0xF0, 0xF0, 0xF8, 0xE0, 0x80, 0x00,
0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x01,
0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFC, 0xF0, 0x00, 0x00,
0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x0F, 0x07, 0x07, 0x00,
0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x07, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x80,
0x00, 0x00, 0x00, 0x02, 0x1F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF8, 0xF8,
0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFF, 0xFF, 0x3F, 0x0F, 0x00, 0x00,
0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xF0, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFE, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x01, 0x03, 0x03, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F,
0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x07, 0x03, 0x01, 0x80, 0x80, 0xC0, 0xE0, 0xF0,
0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x07, 0x03, 0x01, 0x03, 0x07, 0x0F,
0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF8,
0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xFC, 0xFC, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0x7F, 0x7F, 0x3F, 0x3F,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x38, 0x10, 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, 0x07, 0x07, 0x0F, 0x0F, 0x1F, 0x1F, 0x1F, 0x07, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x39, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void setup()
{

Display.Setup();
Serial.begin(9600);
Display.Update();
Display.Clear();
}

void loop()
{
Display.drawBitmap(0,0,Bitmap,64,64,1);
//Display.setTextSize(10);
//Display.drawPixel(0,0,1);
Display.Update();
}

Bene, ma ora @gpb01 ti farà a pezzi per il tuo mancato utilizzo dei tag code :D.

Sciaguraaaaaaaaaaaaaaaaaaaaaaaaa!!

;D ;D ;D

SukkoPera:
Bene, ma ora @gpb01 ti farà a pezzi per il tuo mancato utilizzo dei tag code :D.

State calmi, l´ho modificato :slight_smile:
In allegato un´altra imagine del display funzionante…

arduino

@svato1979: ti ricordo che in conformità al regolamento, punto 7, devi editare TUTTI i tuoi post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo