Вы находитесь на странице: 1из 29

Tutorial Mdulo

Display Nokia 5110


MAR 27, 2014BY PORTALDOARDUINOI N DISPLAYS
Tutorial Mdulo Display Nokia 5110 para Arduino
Ol pessoal tudo bem? Hoje vamos falar do Display Nokia
5110, na verdade vamos falar do Mdulo que vem
contendo um display do Nokia 5110, e mais
especificamente do mdulo azul, existe tambm um
mdulo vermelho, mas o mesmo funciona com 3.3V e o
azul funciona com 5V, assim o mdulo vermelho requer
uma limitao na alimentao, mas fora isso creio que o
cdigo que ser apresentado, tambm funcionaria com o
mdulo vermelho, mas o teste s foi feito com o azul.
Veja os mdulos:

Mdulo Vermelho e Azul
Porque usar?
Bom, voc pode estar se perguntando por que usar este
Mdulo em vez de usar o tradicional Display LCD 162?
Ou at mesmo a verso Shield do Display 162? Este
ltimo at vem com um teclado (com 6 teclas). Tudo
depende, se voc acha que as duas linhas e os 16
caracteres em cada linha do LCD 162 so suficientes
para o seu projeto, no existe razo para usar o Display
Nokia 5110, at porque ele mais caro que o 162
normal, e est mais ou menos na mesma faixa de preo da
verso Shield com teclado do display 162.

O display LCD 162 convencional e a sua verso Shield com teclado.
Mas caso voc precise de algum tipo de edio de texto,
como aumentar o tamanho da fonte, ou efeitos como
inverter a cor do texto (o texto fica branco e fundo fica
preto), fazer desenhos simples, como crculos, retngulos,
tringulos, e at mesmo alguns bitmaps monocromticos
(como por exemplos os mostrados nas duas primeiras
imagens deste post), o Mdulo Display Nokia 5110
ideal!
Este tutorial ser um pouco grande (mas no muito
complicado), ento seja forte e no desista no meio do
caminho!!
Bibliotecas
Agora que foi feito as devidas apresentaes e
justificativas, vamos para a parte prtica. Primeiramente
vamos adicionar a biblioteca, que na verdade so duas.
Baixe a biblioteca principal aqui e a biblioteca
grfica aqui. Crie uma pasta chamada PCD8544 na pasta
libraries, que se localiza na pasta de instalao do Arduino
em seu Sistema Operacional, descompacte o contedo das
duas bibliotecas baixadas na pasta PCD8544, sim, o
contedo das duas bibliotecas baixadas vo ficar na pasta
PCD8544, assim a primeira parte est concluda.
Possveis erros na compilao e no Upload
Agora inicie a IDE do Arduino e v a Files/Arquivo,
depois em Examples/Exemplos, em seguida em PCD8544
e por ltimo em pcdtest, e ento tente compilar o exemplo,
caso acontea o seguinte erro:

pcdtest.pde:38:46: error: variable logo16_glcd_bmp must be const in order to be put into read-only section by means of
__attribute__((progmem))

V na seguinte linha:
static unsigned char PROGMEM logo16_glcd_bmp[] =
Troque a linha acima por:
const unsigned char PROGMEM logo16_glcd_bmp[] =
Tente compilar o exemplo novamente, no Windows se sua
verso da IDE do Arduino for a 1.05 provvel que
acontea outro erro:

C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp: In constructor RobotControl::RobotControl():
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: LCD_CS was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: DC_LCD was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:8: error: RST_LCD was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp: In member function void RobotControl::begin():
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: MUXA was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: MUXB was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: MUXC was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:18: error: MUXD was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:19: error: MUX_IN was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:22: error: BUZZ was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Robot_Control\ArduinoRobot.cpp:25: error: Serial1 was not declared in this scope


Erro de conflito com a biblioteca Robot Control.
Este erro ocorreu por causa de conflito com a biblioteca
Robot_Control, o compilador tentar utilizar esta biblioteca
em vez de usar a PCD8544, e o erro gerado. Pesquisando
sobre o problema, as informaes encontradas dizem que
o mesmo s acontece na verso 1.05 da IDE do Arduino, e
que na verso 1.04 tudo acontece sem problemas. E qual
seria a soluo? A primeira soluo seria voltar para a IDE
1.04. A segunda soluo seria remover a pasta
Robot_Control da pasta Libraries, que por sua vez fica na
pasta de instalao do Arduino. Ns utilizamos a segunda
opo como descrito abaixo.
No Windows 8 o caminho da pasta libraries :
C:/Program Files (x86)/Arduino/libraries , provvel que
no Windows 7 deva ser o mesmo caminho, ou bem
parecido.
Basta simplesmente mover (recortar de uma pasta e colar
em outra) a pasta Robot_Control do caminho C:/Program
Files (x86)/Arduino/libraries para o caminho C:/Program
Files (x86)/Arduino/ , assim quando voc precisar da
biblioteca Robot_Control ela estar em um lugar de fcil
acesso. Depois desta operao a compilao e o upload
ocorreram normalmente no Windows.
No Ubuntu 13.10 aps o primeiro erro, a compilao
ocorreu normalmente, um erro muito parecido com o erro
acima aconteceu no momento do Upload, foi gerado o
seguinte erro:

Robot_Control/keyboard.cpp: In member function int8_t RobotControl::keyboardRead()
Robot_Control/keyboard.cpp:31:42: error: KEY was not declared in this scope

Erro de conflito com a biblioteca Robot Control.
A causa do problema a mesma citada no caso do
Windows, o compilador tenta utilizar a biblioteca
Robot_Control em vez de usar a PCD8544, e isto costuma
acontecer na verso 1.05 da IDE do Arduino, as solues
so as mesmas, voltar para a IDE 1.04 ou mover a pasta
Robot_Control da pasta libraries do Arduino, no Ubuntu
13.10 o caminho da pata libraries :
/usr/share/arduino/libraries , voc precisar de permisso
de super usurio (sudo) para mover a pasta para outro
local, ou seja voc ter de usar o terminal, assim voc
deve mover a pasta citada do caminho
/usr/share/arduino/libraries para o caminho
/usr/share/arduino/ , deste modo a pasta Robot_Control
ficar em um lugar de fcil acesso quando for preciso
utiliz-la novamente.
Aps o procedimento descrito acima, a compilao e o
Upload ocorrer normalmente e agora j podemos seguir
para a montagem na protoboard.
Montagem do circuito
Para montagem deste projeto voc ir precisar:
01 Arduino Uno ou Mega 2560
01 Protobard
01 Mdulo Display Nokia 5110
10 Jumpers (fios)
O circuito ficar assim:

Montagem do circuito na protoboard.
A ligao dos pinos ficou assim:
- Pino 12 do Arduino ligado no Pino 1 (RST) do display
(fio azul na imagem acima).
- Pino 11 do Arduino ligado no Pino 2 (CE) do display (fio
amarelo).
- Pino 10 do Arduino ligado no Pino 3 (DC) do display
(fio verde).
- Pino 9 do Arduino ligado no Pino 4 (Din) do display (fio
laranja).
- Pino 8 do Arduino Ligado no Pino 5 (Clk) do display (fio
cinza).
Os pinos VCC e BL (backligth) do display esto ligados
no VCC do Arduino (fios vermelhos) e o pino GND do
display est ligado ao pino GND Arduino (fios pretos).
Exibindo textos
O primeiro exemplo de cdigo ser para exibir texto, e
testar as possibilidades de formatao:

//Teste de exibio e formatao de texto no Mdulo Display Nokia 5110
//www.portaldoarduino.com.br
#include <Adafruit_GFX.h> //incluindo a biblioteca grfica
#include <Adafruit_PCD8544.h> //incluindo a biblioteca principal

// pin 8 - Serial clock out (SCLK)
// pin 9 - Serial data out (DIN)
// pin 10 - Data/Command select (D/C)
// pin 11 - LCD chip select (CS/CE)
// pin 12 - LCD reset (RST)

//definindo os pinos
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);

void setup() {
Serial.begin(9600); // iniciando a porta seria com uma taxa de 9600 baude rate

display.begin();
display.setContrast(15); //Ajusta o contraste do display , este valor pode no ser o ideal para
seu display, faa vrios teste at encontrar a melhor configurao
display.clearDisplay(); //Apaga o buffer e o display

display.setTextSize(1); //Seta o tamanho do texto
display.println("portal"); // exibe a palavra 'portal' no display

display.setTextSize(3); //Seta o tamanho do texto
display.setCursor(25, 5); //Seta a posio do cursor, o primeiro nmero em relao a posio
na horizontal (eixo X) e o segunto a vertical (eixo y)
display.println("do");

display.setTextSize(1); //Seta o tamanho do texto
display.setTextColor(WHITE, BLACK); //Inverte as cores do texto, o funco fica preto, e as
letras ficam brancas
display.setCursor( 42, 28); //Seta a posio do cursor
display.println("arduino");

display.setTextSize(2); //Seta o tamanho do texto
display.setTextColor(BLACK, WHITE); //Voltando com o texto para o padro (fundo branco,
texto preto), sem essa linha o texto abaixo tambm seria exibido invertido
display.setCursor( 0, 35); //Seta a posio do cursor
display.println(".com.br");
display.display();
}
void loop()
{
}
O resultado para este cdigo pode ser visto na imagem
abaixo:

Ai est, exibimos texto em trs tamanhos diferentes,
exibimos com formatao invertida e cada palavra um
uma posio diferente no display, o cdigo est bem
comentado (talvez at demais) e nesses comentrios esto
todas as instrues para fazer mudanas de tamanho,
posio e formatao.
OBS.:
Uma observao interessante a funo
display.setContrast() , foi feito testes em dois Mdulos
Display Nokia 5110 que eram idnticos (azul, mesma
alimentao, pinagem) que foram comprados juntos, e o
valor ideal de contraste para cada um foi diferente. Ento
se, ao compilar e fazer o upload deste exemplo, acontecer
de seu display ficar todo branco, todo preto, com a tela
borrada ou com letras bem claras, provvel que voc
precise ajustar o valor do contraste (infelizmente ter de
ser por tentativa e erro), antes de procurar algum erro no
cdigo ou na montagem do circuito.

Desenhando Linhas
Agora vamos desenhar linhas, para isto temos de ter em
mente que este display possui uma resoluo de 8448
pixels, este um dado importante a partir de agora. Para
desenhar as linhas usaremos a seguinte funo:
display.drawLine(int Xo, int Yo, int X1, int Y1, int cor);
Onde Xo e Yo representam o ponto inical da linha, X1 e
Y1 representam o ponto final da linha, e a por ltimo a cor
da linha, que pode ser 0 para branco e 1 para preto.
Por exemplo:
display.drawLine(0, 0, 83, 47, 1);
A funo acima desenha uma linha que comea no canto
superior esquerdo do display e termina no canto inferior
direito, ser uma linha que cruzar todo o display na
diagonal. Algo parecido com a imagem abaixo:

No display a linha ficar toda preta, na imagem foi
destacado com preto o primeiro e o ltimo pixel para ficar
claro onde a linha comea e onde ela termina.
Vamos ao cdigo de exemplo que tudo ficar mais fcil de
entender:

//Teste para desenhar linhas no Mdulo Display Nokia 5110
//www.portaldoarduino.com.br
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
void setup() {
Serial.begin(9600);
display.begin();// inicializa o display
display.setContrast(20); //Ajusta o contraste do display
display.clearDisplay(); //Apaga o buffer e o display

/* desenhando uma linha diagonal que comea no canto superior
esquerdo e termina no canto inferior direito
*/
display.drawLine(0, 0, 84, 48, 1);
display.display();
delay(2000);
/* desenhando uma linha diagonal que comea no canto superior
direito e termina no canto inferior esquerdo
*/
display.drawLine(84, 0, 0, 48, 1);
display.display();
delay(2000);
// desenhando uma linha vertical que no centro do display
display.drawLine(0, 24, 84, 24, 1);
display.display();
delay(2000);
//desenhando uma linha horizontal no centro do display
display.drawLine(42, 0, 42, 48, 1);
display.display();
}
void loop()
{
}
O resultado ser o seguinte:

Todas as linhas do exemplo cruzam o display totalmente,
mas voc pode fazer linhas de qualquer tamanho, mas
claro que ter de respeitar o a resoluo de 8448 pixels.
Desenhando retngulos
possvel desenhar dois tipos de retngulos, um exibindo
apenas as linhas de contorno e outro totalmente
preenchido, o procedimento semelhante ao para desenhar
linhas e so usadas as seguintes funes:
display.drawRect(int Xo, int Yo, int largura, int altura, 1);
display.fillRect(int Xo, int Yo, int largura, int altura, 1);
Onde Xo e Yo representam a coordenada da posio do
topo esquerdo do retngulo, que ser desenhado a partir
dessa posio, depois informada a largura e altura, e por
ltimo a cor, onde 0 branco e 1 preto. A primeira
funo iria desenhar um retngulo e exibir apenas as
linhas de contorno e a segunda iria preencher o retngulo
totalmente de preto. Exemplo:
display.drawRect(5, 5, 70, 30, 1);
O resultado da funo acima seria algo como:

Onde a distncia de Xo at a borda lateral esquerda do
display seria 5 pixels, e a distncia de Yo at a borda
superior do display tambm seria 5 pixels.
Vamos ao cdigo de exemplo:
//Teste para desenhar retangulos no Mdulo Display Nokia 5110
//www.portaldoarduino.com.br
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
void setup() {
Serial.begin(9600);
display.begin();
display.setContrast(18); //Ajusta o contraste do display
display.clearDisplay();
//desenhando retngulos
display.drawRect(5, 5, 70, 40, 1); // desenhando retngulo sem preenchimento
display.drawRect(7, 7, 65, 35, 1);
display.drawRect(9, 9, 60, 30, 1);
display.fillRect(11, 11, 55, 25, 1); //desenhando retngulo com o interior preenchido (preto)
display.fillRect(20, 19, 30, 10, 0); //desenhando retngulo com o interior preenchido (branco)
display.display();
}
void loop()
{
}
O resultado deste cdigo :

Desenhando Crculos
Agora a vez dos crculos, assim como os retngulos eles
podem ser exibidos apenas com a linha de contorno ou
totalmente preenchidos, as funes que desenham crculos
so:
display.drawCircle( int Xo, int Yo, int raio, int cor);
display.fillCircle( int Xo, int Yo, int raio, int cor);
A primeira exibe crculos apenas com a linha de contorno
e a segunda exibe crculos totalmente preenchidos. Onde
Xo e Yo so as coordenadas do centro do crculo, depois
informado o raio, e por ltimo a cor, novamente 0 para
branco e 1 para preto. A imagem abaixo ilustra o que foi
dito:

Vamos ao cdigo de exemplo:
//Teste para desenhar circulos no Mdulo Display Nokia 5110
//www.portaldoarduino.com.br
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
void setup() {
Serial.begin(9600);
display.begin();
display.setContrast(16.5); //Ajusta o contraste do display
display.clearDisplay();
display.drawCircle( 42, 24, 20, 1);// desenhando um circulo com centro em Xo = 42 e Yo = 24
e raio de 20 pixels
display.drawCircle( 42, 24, 15, 1);// desenhando um circulo com centro em Xo = 42 e Yo = 24
e raio de 15 pixels
display.fillCircle(42, 24, 10, 1);//circulo preenchido de preto
display.fillCircle(42, 24, 3, 0); //circulo preencido de branco
display.display();
}
void loop()
{
}
O resultado :

Desenhando tringulos
Agora a vez dos tringulos, o esquema bem parecido
com os retngulos e crculos, mas aqui ser necessrio
informar 7 nmeros , os seis primeiros so as coordenadas
dos 3 vrtices do tringulo e o ltimo a cor, a funo a
seguinte:
display.drawTriangle( int Xo, int Yo, int X1, int Y1, int
X2, int Y2, int cor);
display.fillTriangle( int Xo, int Yo, int X1, int Y1, int X2,
int Y2, int cor);
A imagem abaixo simula o resultado da funo:

A primeira funo desenha tringulos exibindo apenas as
linhas de contorno e o segundo desenha tringulos
preenchidos.
Segue o cdigo de exemplo:
//Teste para desenhar tringulos no Mdulo Display Nokia 5110
//www.portaldoarduino.com.br
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
void setup() {
Serial.begin(9600);
display.begin();
display.setContrast(15); //Ajusta o contraste do display
display.clearDisplay();
display.drawTriangle( 42, 0, 0, 43, 83, 43, 1);//desenha triangulo exibindo apenas as linha de
contorno
display.drawTriangle( 42, 5, 8, 38, 75, 38, 1);//desenha triangulo exibindo apenas as linha de
contorno
display.fillTriangle( 42, 10, 16, 33, 67, 33, 1);//desenha triangulo preenchido de preto
display.fillTriangle( 42, 20, 30, 25, 53, 25, 0);//desenha triangulo preenchido de branco
display.display();
}
void loop()
{
}
O resultado do cdigo :

Pronto j podem desenhar tringulos vontade!
Desenhando bitmaps
Agora vamos ver uma das funes mais legais da
biblioteca, a funo de desenhar bitmaps. Como exemplo
para esta parte vamos desenhar a logo deste blog.
Como a tela do display tem a resoluo de 8448 pixels, a
imagem tem de ser deste tamanho ou menor, ento se a
imagem que voc deseja exibir for maior, e normalmente
ela ser, ser preciso redimensionar. E como o display
monocromtico, temos de converter a imagem para preto e
branco, para fazer estas duas coisas pode ser usado o
editor de imagem de sua preferncia, como o Photoshop
por exemplo. Para redimensionar at o Paint serve, basta
abrirv a imagem no Paint, clicar em redimensionar e trocar
a escala de porcentagem para pixel, desmarcar o checkbox
de manter a proporo da imagem, e inserir as medidas
desejadas para a imagem, sempre respeitando a resoluo
da tela do display (8448 px).

Para transformar a imagem em preto e branco podemos
usar o Photoshop, abra a imagem, clique em Imagem,
depois em Adjustments e por ltimo em Black & White.

Na janela que ir abrir, ajustes todas as tonalidades para o
mnimo:

Por fim, salve a imagem no formato bmp, e depois escolha
a opo de 8 bits. A logo do site redimensionada e em
preto e branco ficou assim:

Depois precisaremos de um programa para obter o cdigo
bmp da imagem em hexadecimal, no site da Adafruit eles
recomendam o LCDAssistant , mas em todos os testes
feitos ele no gerou o cdigo correto, e a imagem
produzida pelo cdigo gerado por ele, era totalmente
desfigurada. O programa que funcionou corretamente foi o
LCD Image Converter, que pode ser baixado aqui,
infelizmente s foi encontrado verso para Windows desse
programa.
Abra o LCD Image Converter, v a file e depois em open,
mude o tipo de arquivo de xml para images (como mostra
a imagem abaixo), e abra o arquivo bmp com a imagem
em preto e branco que foi feita nos pargrafos anteriores:

Depois clique em options e em seguida em conversion:

O programa tem um pequeno bug, ele inverte as cores do
bitmap, ou seja, onde preto vira branco e onde branco
vira preto, mas basta clicar no check box inverse, o
problema resolvido e o cdigo gerado ir representar a
imagem sem inverter as cores. Para gerar o cdigo em
hexa da imagem, basta clicar em show preview, como
mostrado na imagem abaixo:

Assim ser exibida uma janela como esta:

Na esquerda possvel ver como a imagem ser exibida
no display, e na direita tem um extenso cdigo em hexa,
copie este cdigo para um bloco de notas, gedit ou
quaquer outro editor de textos.
Agora vamos falar do cdigo do programa que desenha
um bitmap. A funo usada a seguinte:
display.drawBitmap(int x, int y, char[] *bitmap, int
largura, int altura, int color);
Onde int x e int y indicam as coordenadas da posio onde
o bitmap comear a ser desenhado. O char[] *bitmap o
nome da varivel que contm o cdigo em hexa do
bitmap, int largura e int altura representam as dimenses
da imagem, e por ltimo a cor, onde 0 branco e 1 preto
(padro).
Mas antes de chamar a funo temos de declar a varivel
bitmap, assim:
const unsigned char PROGMEM bitmat[] = { cole aqui
todo o cdigo em hexa};
Podemos dizer que a varivel um vetor de char, a funo
PROGMEM tambm necessria, ela usada para alocar
os dados do bitmap na memria do programa, mais
detalhes sobre esta funo podem ser vistos aqui.
Finalmente o cdigo ficou assim:
//Teste para desenhar um bitmap no Mdulo Display Nokia 5110
//www.portaldoarduino.com.br

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);
//declarando o bitmap com o cdigo em hexa
const unsigned char PROGMEM logoPortalArduino [] =
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xf0,
0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xf0,
0xff, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x37, 0xff, 0xff, 0xf0,
0xff, 0xfe, 0x1f, 0xff, 0xfe, 0xff, 0xff, 0x07, 0xff, 0xff, 0xf0,
0xff, 0xfc, 0x0f, 0xf3, 0xfe, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xf0,
0xfa, 0xfc, 0xe6, 0x83, 0x8e, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xf0,
0xf8, 0x19, 0xf2, 0x33, 0x26, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xf0,
0xf9, 0xcb, 0xf2, 0x77, 0xe6, 0xfc, 0xf8, 0x3f, 0xff, 0xff, 0xf0,
0xf9, 0xcb, 0xf2, 0xf7, 0x06, 0xfe, 0xe0, 0x3f, 0xff, 0xff, 0xf0,
0xf9, 0x99, 0xf6, 0x73, 0x76, 0xfc, 0xcc, 0x7f, 0xff, 0xff, 0xf0,
0xf8, 0x3c, 0xe6, 0xf6, 0x66, 0xe0, 0x9f, 0x7f, 0xff, 0xff, 0xf0,
0xf9, 0xfc, 0x0e, 0x71, 0x16, 0xcc, 0xbf, 0x3f, 0xff, 0xff, 0xf0,
0xf9, 0xff, 0xbf, 0xff, 0xff, 0xdc, 0xb3, 0x3f, 0xff, 0xff, 0xf0,
0xf9, 0xff, 0xff, 0xff, 0xff, 0xce, 0x9f, 0x3f, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0x9e, 0x7f, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xc0, 0x7f, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xbf, 0xf7, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xbf, 0xf7, 0xff, 0x07, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0x9f, 0xff, 0xfe, 0x73, 0xff, 0xff, 0xff, 0xf0,
0xff, 0x83, 0x08, 0x33, 0x36, 0x0c, 0xf8, 0x00, 0x8f, 0xff, 0xf0,
0xff, 0xbb, 0x3b, 0x33, 0x36, 0x64, 0xd8, 0x04, 0x87, 0xff, 0xf0,
0xff, 0xe3, 0x73, 0xb3, 0x36, 0x65, 0xc8, 0x04, 0x03, 0xff, 0xf0,
0xff, 0x9b, 0x33, 0xb3, 0x36, 0x64, 0xf8, 0x03, 0x1d, 0xff, 0xf0,
0xff, 0xb3, 0x7b, 0x93, 0x36, 0x66, 0x73, 0xfb, 0xfd, 0xff, 0xf0,
0xff, 0x83, 0x38, 0x38, 0x36, 0x66, 0x07, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0};
void setup() {
Serial.begin(9600);
display.begin();
display.setContrast(22); //Ajusta o contraste do display
display.clearDisplay(); //Apaga o buffer e o display
// desenhando o bitmap
display.drawBitmap(0, 0, logoPortalArduino, 84, 48, 1);
display.display();
}
void loop()
{
}
O resultado do cdigo foi:

E quando no foi marcado o check box invert no LCD
Image Convert o resultado foi:

Fazendo animaes
A biblioteca usada no possui nenhuma funo especfica
para animao, mas usando as funes que foram vistas
anteriormente possvel criar animaes, inclusive com os
bitmaps (como visto no exemplo que vem na biblioteca, o
pcdtest ), mas neste exemplo faremos uma animao
simples com um crculo, depois vocs podem usar a
criatividade para fazer outros tipos de animaes mais
elaboradas.
O exemplo a seguir far um crculo atravessar a tela
horizontalmente da esquerda para direita, depois ir
atravessar verticalmente de cima para baixo, depois
horizontalmente da direita para esquerda at a metade da
tela, depois verticalmente de baixo para cima at a metade
da tela, depois da direta para esquerda novamente e por
fim, verticalmente de baixo para cima, voltando assim ao
ponto de incio. A imagem abaixo exemplifica o
movimento que o crculo far:

O cdigo ficar assim:
//Teste de animao com o Display Nokia 5110
//www.portaldoarduino.com.br

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);

//o circulo ter um raio de 10px assim inicializaremos o mesmo na posio X = 10 e Y = 10
int posX = 10;
int posY = 10;

void setup() {
Serial.begin(9600);
display.begin();
display.setContrast(45); //Ajusta o contraste do display
display.clearDisplay();
display.display();
}

void loop()
{
atravessaTelaDaEsquerdaParaDireita();
atravessaTelaDeCimaParaBaixo();
atravessaMetadeTelaDireitaParaEsquerda();
atravessaAteMetadeDaTelaBaixoParaCima();
atravessaTelaDireitaParaEsquerda();
atravessaTelaDeBaixoParaCima();
}

//atravessa a tela horizontamente da esquerda para direita
void atravessaTelaDaEsquerdaParaDireita(){
for (posX; posX < (display.width() - 11); posX++){ // largura da tela menos 11 porque o raio
do circulo 10 e mais um de margem de segurana
delay(200);
display.fillCircle(posX, posY, 10, 1);//circulo preenchido de preto
display.display();
display.clearDisplay();
}
}

//atravessa a tela verticalmente de cima para baixo
void atravessaTelaDeCimaParaBaixo(){
for(posY; posY < (display.height() - 11); posY++){ // altura da tela menos 11 porque o raio do
circulo 10 e mais um de margem de segurana
delay(200);
display.fillCircle(posX, posY, 10, 1);//circulo preenchido de preto
display.display();
display.clearDisplay();
}
}

//atravessa horizontalmente at a metada da tela da direita para esquerda
void atravessaMetadeTelaDireitaParaEsquerda(){
for (posX; posX > (display.width() / 2); posX--){
delay(200);
display.fillCircle(posX, posY, 10, 1);//circulo preenchido de preto
display.display();
display.clearDisplay();
}
}

//atrevesa verticalmente de baixo para cima at a metade da tela
void atravessaAteMetadeDaTelaBaixoParaCima(){
for(posY; posY > (display.height() / 2); posY--){
delay(200);
display.fillCircle(posX, posY, 10, 1);//circulo preenchido de preto
display.display();
display.clearDisplay();
}
}

//atravessa a tela horizontamente da direita para esquerda
void atravessaTelaDireitaParaEsquerda(){
for (posX; posX > 10; posX--){ // posio X maior que dez porque este o valor do raio
delay(200);
display.fillCircle(posX, posY, 10, 1);//circulo preenchido de preto
display.display();
display.clearDisplay();
}
}

//atravessa a tela verticalmente de baixo para cima
void atravessaTelaDeBaixoParaCima(){
for(posY; posY > 10; posY--){ // posio Y maior que dez porque este o valor do raio

delay(200);
display.fillCircle(posX, posY, 10, 1);//circulo preenchido de preto
display.display();
display.clearDisplay();
}
}


O resultado pode ser visto no vdeo (tosco rsrs) abaixo:


Vocs podem mudar a ordem de chamada das funes
para ver o que acontece, podem tentar fazer este exemplo
com retngulos, tringulos e at os bitmaps com as
devidas adaptaes claro, basta usar a criatividade.
Fazendo o tutorial deste display, lembrei-me do antigo
jogo da cobrinha (Snake) dos celulares antigos da Nokia, e
percebi que com o Arduino e este display possvel faze-
lo, algum ai se habilita?
Referncias
Adafruit
ArduinoLabs
Bom pessoal este tutorial ficou bem grandinho, mas acaba
por aqui. Dvidas, crticas, sugestes s enviar e-mail.
Portal do Arduino.
contato@portaldoarduino.com.br