Crie Animações e Jogos Envolventes em LCD com Arduino UNO
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino UNO | 1 |
| LCD Alfanumérico 16x2 | 1 |
Aplicativos
- Arduino IDE
Sobre o Projeto
Este tutorial ensina os fundamentos de animação em displays LCD 16x2 com Arduino, extensível a outras dimensões. Aborda fiação, escrita básica, texto rolante, caracteres personalizados, animação de seta e um jogo simples estilo arcade.
Fiação do LCD
Conforme diagrama Fritzing. Conexões principais:
- VSS (pino 1) → +5V (rail positivo)
- VDD (pino 2) → GND (rail negativo)
- VO (pino 3, contraste) → cursor do potenciômetro (laterais nos rails)
- RS (pino 4) → Arduino pino 12
- R/W (pino 5) → GND
- E (pino 6) → Arduino pino 11
- A (pino 15, anode backlight) → +5V via resistor 220 Ω
- K (pino 16, cathode) → GND
- Pinos de dados D4–D7 (pinos 11–14) → Arduino pinos 4, 5, 6, 7 respectivamente.
Teste inicial: Alimente; se a linha inferior acender, o LCD funciona. Ajuste o contraste se necessário.
Explicação do Código Básico
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 4, 5, 6, 7); // rs, e, d4, d5, d6, d7
void setup() {
lcd.begin(16, 2); // 16 colunas, 2 linhas
lcd.setCursor(0, 1); // coluna 0, linha 1 (segunda linha)
lcd.print("Working");
}
void loop() {}
lcd.begin(cols, rows)define dimensões.setCursor(col, row)posiciona cursor (base 0).print()escreve texto na posição do cursor.
Texto Rolante (Scrolling)
O texto desliza da direita para a esquerda, simulando painéis de publicidade.
void setup() { lcd.begin(16,2); }
void loop() {
int n = 15;
char message[] = "scrolling text!";
char *ptr = message;
while (n != -14) {
lcd.clear();
lcd.setCursor(n, 1);
if (n < 0) ptr++;
lcd.print(ptr);
n--;
delay(250);
}
}
O ponteiro ptr avança para manter o texto visível quando parte sai pela esquerda. Ajuste delay para velocidade.
Caracteres Personalizados
Permite criar ícones (ex.: dinossauro) definindo uma matriz 5x8 pixels.
byte dino[] = {
B01110, B01110, B01100, B01111,
B11101, B01010, B01010, B01010
};
void setup() {
lcd.createChar(0, dino); // registra char 0
lcd.begin(16,2);
lcd.setCursor(0,1);
lcd.write(byte(0)); // exibe char personalizado
}
Ferramenta online para criar caracteres: LCD Character Creator.
Animação: Seta Disparada
Três caracteres personalizados (ponta, corpo, cauda) formam uma seta que atravessa a tela.
byte arrowhead[] = { B00001, B00011, B00111, B01111, B00111, B00011, B00001, B00000 };
byte arrowbody[] = { B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000 };
byte arrowtail[] = { B00011, B00111, B11111, B11111, B11111, B00111, B00011, B00000 };
void setup() {
lcd.createChar(0, arrowhead);
lcd.createChar(1, arrowbody);
lcd.createChar(2, arrowtail);
lcd.begin(16,2);
}
void loop() {
int n = 15;
while (n != -1) {
lcd.clear();
lcd.setCursor(0,1);
lcd.write(byte(0));
lcd.write(byte(1));
lcd.write(byte(2));
n--;
delay(50);
}
}
Pode haver um rastro visual da cauda – é normal devido à persistência do LCD.
Jogo LCD: Desvie das Setas
Objetivo: O herói (boneco) fica na linha 1 (índice 1). Setas vêm da direita. Pressione botão (pino 2, interrupção) para pular à linha 0 e evitar colisão. Pontuação incrementa a cada loop.
byte man[] = { B01110, B01110, B00100, B01110, B10101, B00100, B01010, B10001 };
int level = 1; // 0 = linha superior, 1 = linha inferior
int score = 0;
void setup() {
lcd.createChar(0, arrowhead);
lcd.createChar(1, arrowbody);
lcd.createChar(2, arrowtail);
lcd.createChar(3, man);
lcd.begin(16,2);
attachInterrupt(0, buttonin, CHANGE); // pino 2
randomSeed(analogRead(A0));
}
void loop() {
int n = 15;
int rnd = random(15,25);
while (n != -1) {
lcd.clear();
delay(10);
drawman();
lcd.setCursor(n, 1);
if (n == 1 && level == 1) { stopgame(); continue; }
lcd.write(byte(0)); lcd.write(byte(1)); lcd.write(byte(2));
lcd.setCursor(10,0); lcd.print(score);
delay(100 - rnd);
n--;
score++; if (level == 0) score--;
}
}
void drawman() { lcd.setCursor(1, level); lcd.write(byte(3)); }
void buttonin() { level = (digitalRead(2) == LOW) ? 0 : 1; }
void stopgame() {
lcd.clear();
lcd.setCursor(0,0); lcd.print("Game over");
lcd.setCursor(10,0); lcd.print(score);
level = 1; score = 0; n = 15;
delay(3000);
}
Conceitos chave: interrupções (resposta imediata ao botão) e números aleatórios verdadeiros (ruído analógico no pino A0 flutuante).
Código Completo
Dois sketches fornecidos: animação e jogo. Ambos incluem definições de caracteres e lógica de loop.
Esquemático

Processo de manufatura
- Sensores Arduino: Tipos, Aplicações e Projetos do Mundo Real
- Console Portátil DIY com Clone Arduboy – Arduino Micro + OLED SPI
- Construa um Voltímetro Inteligente com Arduino e Smartphone – Projeto DIY Fácil
- Registrador de Temperatura e Umidade com Arduino, DHT11 e Ethernet Shield
- Python 3 para Arduino UNO: Controle de Comandos Fácil e Demo com LED
- Autômatos Celulares em Tempo Real no Arduino com Display OLED 128x64
- Construa um Rádio FM Compacto com Arduino Nano e RDA5807M
- Construa uma Estação Meteorológica Arduino Confiável com Sensores DHT
- Construa um Jogo Arcade Clássico com Arduino, LCD, Buzzer e Joystick
- MKR1000 com DHT22: Monitoramento de Temperatura e Umidade em Tempo Real no Azure