/**
* Exemplo de Animação com Display Nokia 5110 usando PCD8544
*
* Este exemplo cria uma animação de jogo espacial simples com uma nave
* que pode ser controlada usando potenciômetros.
*
* Conexões:
* Display Nokia 5110 -> Arduino
* RST -> Pino 12
* CE/SCE -> Pino 11
* DC -> Pino 10
* DIN/MOSI -> Pino 9
* CLK/SCLK -> Pino 8
* VCC -> 3.3V
* BL -> 3.3V com resistor de 330 ohm (ou ajustável)
* GND -> GND
*
* Potenciômetro X -> A0
* Potenciômetro Y -> A1
* Botão de disparo -> Pino 2
*/
#include <PCD8544.h>
// Inicializa a biblioteca com os pinos
static PCD8544 display;
// Variáveis do jogo
int naveX = 42; // Posição inicial X da nave
int naveY = 40; // Posição inicial Y da nave
int velX = 0; // Velocidade X
int velY = 0; // Velocidade Y
boolean tiro = false; // Estado do tiro
int tiroX = 0; // Posição X do tiro
int tiroY = 0; // Posição Y do tiro
// Inimigos
#define NUM_INIMIGOS 3
int inimigoX[NUM_INIMIGOS];
int inimigoY[NUM_INIMIGOS];
boolean inimigoVivo[NUM_INIMIGOS];
// Pontuação
int pontos = 0;
// Bitmaps
static const byte PROGMEM nave[] = {
B00100,
B01110,
B01110,
B11111,
B11111
};
static const byte PROGMEM inimigo[] = {
B10001,
B01110,
B11111,
B01110,
B10001
};
void setup() {
// Inicializa o display
display.begin(84, 48);
display.setContrast(60); // Ajuste de contraste (0-127)
// Configura o botão de tiro
pinMode(2, INPUT_PULLUP);
// Inicializa posições dos inimigos
for (int i = 0; i < NUM_INIMIGOS; i++) {
inimigoX[i] = random(10, 70);
inimigoY[i] = random(5, 20);
inimigoVivo[i] = true;
}
// Splash screen
display.clearDisplay();
display.setCursor(0, 0);
display.println(F("SPACE GAME"));
display.println(F("------------"));
display.println(F("Use potenc."));
display.println(F("para mover"));
display.println(F("e o botao"));
display.println(F("para atirar!"));
display.display();
delay(3000);
}
void loop() {
// Limpa o display
display.clearDisplay();
// Lê os potenciômetros para controlar a nave
int potX = analogRead(A0);
int potY = analogRead(A1);
// Mapeia valores para velocidade (-2 a 2)
velX = map(potX, 0, 1023, -2, 2);
velY = map(potY, 0, 1023, -2, 2);
// Atualiza posição da nave
naveX += velX;
naveY += velY;
// Limita a posição às bordas da tela
naveX = constrain(naveX, 0, 83 - 5);
naveY = constrain(naveY, 0, 47 - 5);
// Verifica o disparo
if (digitalRead(2) == LOW && !tiro) {
tiro = true;
tiroX = naveX + 2; // Centro da nave
tiroY = naveY - 2;
}
// Atualiza posição do tiro
if (tiro) {
tiroY -= 3; // Velocidade do tiro
// Desenha o tiro
display.drawPixel(tiroX, tiroY, BLACK);
display.drawPixel(tiroX, tiroY+1, BLACK);
// Verifica se o tiro saiu da tela
if (tiroY < 0) {
tiro = false;
}
// Verifica colisão com inimigos
for (int i = 0; i < NUM_INIMIGOS; i++) {
if (inimigoVivo[i]) {
if (tiroX >= inimigoX[i] && tiroX < inimigoX[i] + 5 &&
tiroY >= inimigoY[i] && tiroY < inimigoY[i] + 5) {
inimigoVivo[i] = false;
tiro = false;
pontos += 10;
// Reposiciona o inimigo depois de um tempo
delay(100);
inimigoX[i] = random(10, 70);
inimigoY[i] = random(5, 20);
inimigoVivo[i] = true;
}
}
}
}
// Desenha a nave
for (int i = 0; i < 5; i++) {
byte linha = pgm_read_byte(&nave[i]);
for (int j = 0; j < 5; j++) {
if (linha & (1 << (4 - j))) {
display.drawPixel(naveX + j, naveY + i, BLACK);
}
}
}
// Desenha inimigos
for (int i = 0; i < NUM_INIMIGOS; i++) {
if (inimigoVivo[i]) {
for (int j = 0; j < 5; j++) {
byte linha = pgm_read_byte(&inimigo[j]);
for (int k = 0; k < 5; k++) {
if (linha & (1 << (4 - k))) {
display.drawPixel(inimigoX[i] + k, inimigoY[i] + j, BLACK);
}
}
}
// Move o inimigo em padrão de onda
inimigoX[i] += sin(millis() / 1000.0 + i) * 1.5;
}
}
// Mostra pontuação
display.setCursor(0, 0);
display.print("P:");
display.print(pontos);
// Atualiza o display
display.display();
delay(50); // Pequeno atraso para estabilizar a animação
}
Loading
nokia-5110
nokia-5110