Interessato a capire il funzionamento dei vecchi display per cellulari ho acquistato per pochi euro un Display LCD Nokia 5110 con cui effettuare alcune prove di visualizzazione grafica, utilizzo di apposite librerie, ecc... approfittandone anche per testare contestualmente il noto sensore DHT11 per il rilevamento di Temeratura e Umidità nell'ambiente circostante.
Il progetto realizzato non è niente di particolarmente complicato, in pratica sul display LCD Nokia 5110 appare il logo di www.michelepisani.it decodificato dal formato bitmap al fine di essere gestito dalla libreria U8Glib. Successivamente sull'LCD viene mostrato il valore di temperatura ed umidità presente nell'ambiente rilevato dal sensore DHT11. Il potenziometro gestisce l'aumento e la diminuzione della retroilluminazione del display LCD.
La parte più ostica è stata quella di ottenere un'immagine bitmap adatta alla conversione e farla digerire dalla libraria.
Di seguito alcuni consigli che possono farvi risparmiare tempo nella realizzazione di un progetto simile:
- La scheda tecnica del display LCD, in rete ce ne sono diverse, non sempre è effettivamente calzante con il dispositivo ovvero la sequenza dei pin non corrisponde sempre a quella reale pertanto il rischio è quello di collegare apparentemente i vari pin in modo corretto e ritrovarsi con un display acceso ma che non visualizza alcun carattere o che regola solo la retroilluminazione. Nel mio caso i pin si trovano in questo ordine (gestire pertanto i vari collegamenti dello sketch, che trovate poco sotto, in base alla sequenza di tali pin del proprio LCD):
RST | CE | DC | DIN | CLK | VCC | Light | GND
- La libreria U8Glib la potete scaricare al seguente link: https://github.com/olikraus/u8glib.
La relativa documentazione la trovate qui: https://github.com/olikraus/u8glib/wiki/userreference.
- Per la creazione di un'immagine BitMap adatta alla decodifica e visualizzazione sul Display LCD seguite i seguente passaggi (io ho usato Photoshop ma va bene qualsiasi altro programma di editing di immagini):
Dal menù: Image > Mode > Grayscale;
Sempre dal menù: Image > Mode > Bitmap;
Scegliere 'OK nella finestra che si aprirà, dopodiché nella successiva finestra modificare la risoluzione a 96ppi ed il metodo a '50% Threshold' in modo da avere le eventuali curve agli angoli meno squadrate;
Aquesto punto "Salva come..." e scegliere BMP che darà come sola opzione di scelta 1 bit e salvare l'immagine.
- Per la decodifica dell'immagine BitMap ci sono diversi tool online, quello che suggerisco e che ho utilizzato per il mio progetto è il seguente: https://marlinfw.org/tools/u8glib/converter.html (U8Glib bitmap converter).
Di seguito un'immagine esplicativa all'uso dello strumento:
Fig. 1 - Arduino - U8Glib bitmap converter
- Per chi avesse bisogno della libreria per il sensore DHT11 può fare riferimento al seguente link:
https://github.com/adafruit/DHT-sensor-library.
Di seguito lo schema elettrico del progetto:
Fig. 2 - Schema per Arduino - Display LCD Nokia 5110 con sensore DHT11 per il rilevamento di temperatura ed umidità
Ed ecco lo sketch:
#include "U8glib.h"
#include "dht.h"
#define dht_apin A1
dht DHT;
U8GLIB_PCD8544 u8g(4, 5, 7, 6, 8); // CLK=4, DIN=5, CE=7, DC=6, RST=8
const uint8_t michelepisani_bitmap[] U8G_PROGMEM = {
0x00, 0x3c, 0x00, 0x0f, 0x80, 0x00, 0x07, 0x00, 0x00,
0x01, 0xff, 0x80, 0x7f, 0xe0, 0x00, 0xff, 0xf0, 0x00,
0x07, 0xff, 0xe0, 0xff, 0xf0, 0x03, 0xff, 0xfe, 0x00,
0x0f, 0xff, 0xf3, 0xff, 0xf8, 0x0f, 0xff, 0xff, 0x00,
0x1f, 0xff, 0xf3, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0x80,
0x3f, 0x83, 0xff, 0xf0, 0x7e, 0x3f, 0xc0, 0x1f, 0xe0,
0x3f, 0x00, 0xff, 0xc0, 0x3e, 0x7f, 0x01, 0xc7, 0xe0,
0x7e, 0x00, 0x7f, 0x80, 0x1f, 0x7c, 0x01, 0xf3, 0xf0,
0x7c, 0x00, 0x3f, 0x80, 0x1f, 0x78, 0x01, 0xfd, 0xf8,
0xf8, 0x00, 0x3f, 0x00, 0x0f, 0xf0, 0x01, 0xfe, 0xfc,
0xf8, 0x00, 0x1f, 0x00, 0x0f, 0xe0, 0x01, 0xff, 0x7c,
0xf8, 0x00, 0x1f, 0x00, 0x0f, 0xe0, 0x01, 0xff, 0x3e,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0xc0, 0x01, 0xff, 0xbe,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x80, 0x01, 0xff, 0x9f,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x80, 0x01, 0xff, 0xdf,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x80, 0x01, 0xff, 0xdf,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x80, 0x01, 0xff, 0xdf,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x80, 0x01, 0xff, 0xdf,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x1f,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x9f, 0xfd, 0xff, 0xdf,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x9f, 0xfd, 0xff, 0xdf,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x8f, 0xfd, 0xff, 0xdf,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x8f, 0xfd, 0xff, 0x9e,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0xe7, 0xfd, 0xff, 0xbe,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0xe7, 0xfd, 0xff, 0x3c,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0xf3, 0xfd, 0xfe, 0x7c,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0xf1, 0xfd, 0xfc, 0xf8,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0xf8, 0x7d, 0xf9, 0xf8,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0xfe, 0x3d, 0xe3, 0xf0,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0xbf, 0x00, 0x0f, 0xe0,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0xbf, 0xe0, 0x7f, 0xc0,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x8f, 0xff, 0xff, 0x80,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x87, 0xff, 0xfe, 0x00,
0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x81, 0xff, 0xf8, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x3f, 0xc0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00,
0x00, 0x80, 0x80, 0x20, 0x0f, 0x80, 0x10, 0x00, 0x08,
0x6c, 0x18, 0xe3, 0x26, 0x0f, 0x81, 0x83, 0x18, 0xc0,
0xfe, 0xbc, 0xf4, 0xa9, 0x0f, 0x83, 0xd7, 0x79, 0xe8,
0x92, 0xa0, 0x97, 0xaf, 0x0f, 0x82, 0x54, 0x29, 0x28,
0x92, 0xa0, 0x94, 0x28, 0x0f, 0x82, 0x53, 0x29, 0x28,
0x92, 0xbc, 0x97, 0xaf, 0x0f, 0x83, 0xd7, 0x3d, 0x28,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x82, 0x00, 0x00, 0x00,
};
const uint8_t degree_bitmap[] U8G_PROGMEM = {
0b01110,
0b01010,
0b01110,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
bool show_logo = true;
int loop_delay = 5000;
void setup(void) {
}
void loop(void) {
DHT.read11(dht_apin); // Acquisisce i dati dal sensore DHT11
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
show_logo = false;
delay(loop_delay); // Mostro il logo per 5 secondi dopodiché aggiorno ogni 2 secondi i dati acquisiti dal sensore DHT11
loop_delay = 2000;
}
void draw(void) {
if (show_logo) {
u8g.drawBitmapP( 6, 0, 9, 47, michelepisani_bitmap); // Inserisco l'immagine bitmap del logo di www.michelepisani.it | MAX SCREEN NOKIA 5110 = 84x48
}
if(!show_logo) {
u8g.setFont(u8g_font_profont22); // seleziono il font e la relativa dimensione
u8g.drawStr(0, 20, "T: "); // Inserisco la stringa in posizione X, Y
u8g.drawStr(0, 40, "H: ");
u8g.setPrintPos(32, 20); // Mi posiziono in X, Y
u8g.print(DHT.temperature, 0); // Mostro la temperatura rilevata dal sensore DHT11
u8g.drawBitmapP( 55, 6, 1, 8, degree_bitmap);
u8g.drawStr(63, 20, "C ");
u8g.setPrintPos(32, 40);
u8g.print(DHT.humidity, 0); // Mostro l'umidità rilevata dal sensore DHT11
u8g.drawStr(60, 40, "% ");
}
}
Nel video una breve dimostrazione del funzionamento del progetto:
Per consigli, suggerimenti o chiarimenti sentitevi liberi di lasciare un commento!
Nessuno ha ancora commentato questo articolo, fallo tu per primo!
Scrivi un Commento