Construa um Jogo da Cobrinha em Matriz LED 16x16 com Arduino UNO
Componentes e Materiais
| Componente | Quantidade | Observações |
|---|---|---|
| Arduino UNO | 1 | |
| Matriz de Pixel RGB NeoPixel NeoMatrix 16x16 | 1 | Não tenho certeza sobre este. Comprei minha matriz no Aliexpress. Link: https://ali.pub/4wxs2s |
| Fios jumpers (genéricos) | 1 | |
| Joystick analógico (genérico) | 1 | |
| Protoboard (genérica) | 1 |
Sobre o Projeto
Olá! Estou aprendendo as possibilidades do Arduino. E decidi copiar o clássico jogo da cobrinha do meu antigo Nokia. Aqui está.
Usei matriz LED 16x16, joystick e Arduino UNO. Não foi fácil porque cada LED é conectado consistentemente. Então, a lógica de movimento é um pouco complicada.
Aqui você controla o personagem da cobrinha. Coma comida saborosa, cresça e morra. O código do programa está pronto para atualizações.
Divirta-se e aproveite. Se gostou, não pense duas vezes em se inscrever no meu YouTube e Instagram :) Eles estão em russo, mas vou fazer legendas em breve.



Código
Código (C/C++)
#include // configurações da matriz
#define NUM_LEDS 256
#define DATA_PIN 3
#define BRIGHTNESS 8
// configurações do joystick
#define pinX A2 // eixo X do joystick
#define pinY A1 // eixo Y do joystick
#define swPin 2 // botão do joystick
int snake[256]; // array de elementos da cobrinha
int snakeSize = 2; // tamanho real da cobrinha
int snakeSpeed = 500;
int row; // número da linha
int col; // número da coluna
int lastDirection = 135; // direção inicial
int i, newDirection, OlddX = 1, OlddY, f;
int red, green, blue, fred, fgreen, fblue; // cores
CRGB leds[NUM_LEDS];
void setup() {
red = random(0, 255);
green = random(0, 255);
blue = random(0, 255);
fred = random(127, 255);
fgreen = random(127, 255);
fblue = random(127, 255);
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(swPin, INPUT);
digitalWrite(swPin, HIGH);
FastLED.addLeds(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
for(i = 0; i <= 255; i++) {
snake[i] = 0;
}
for(i = 0; i <= snakeSize; i++) {
snake[i] = lastDirection + i;
}
f = random(0, 255);
FastLED.show();
}
int Snakedirection(int last, int dX, int dY) {
dX = map(dX, 0, 1000, -1, 1);
dY = map(dY, 0, 1000, -1, 1);
if(dX == 0 && dY == 0 && OlddX != dX) {
dX = OlddX;
}
if(dY == 0 && dX == 0 && OlddY != dY) {
dY = OlddY;
}
int newDirection = last;
if(dX != 0) { // movimento na direção X
if (row & 1) {
if(col == 0 && dX == 1) { newDirection = last - 15; }
else if(col == 15 && dX == -1) { newDirection = last + 15; }
else newDirection = last + dX; // par
} else {
if(col == 0 && dX == 1) { newDirection = last + 15; }
else if(col == 15 && dX == -1) { newDirection = last - 15; }
else newDirection = last - dX; // ímpar
}
}
if(dY < 0) { // movimento na direção Y PARA BAIXO
if(row == 15 && dY == -1) { newDirection = col; }
else if (row & 1) { newDirection = last + (col * 2) + 1; } // par
else { newDirection = last + (16 - col - 1) + (16 - col); } // ímpar
}
if(dY > 0) { // movimento na direção Y PARA CIMA
if(row == 0 && dY == 1) { newDirection = 255 - col; }
else if (row & 1) { newDirection = last - (last - 16 * row) - (16 - col); } // par
else { newDirection = last - (col * 2) - 1; } // ímpar
}
OlddX = dX;
OlddY = dY;
return newDirection;
}
int snakeMove(int snakeDirection) {
for(i = 0; i <= 255; i++) {
if(snake[i] == snakeDirection) {
death();
}
}
FastLED.clear();
for(i = snakeSize; i >= 1; i--) {
snake[i] = snake[i-1];
}
snake[0] = snakeDirection;
for(i = 0; i <= 255; i++) {
if(snake[i]) {
leds[snake[i]].setRGB(red, green, blue);
}
}
FastLED.show();
row = (int)(snakeDirection / 16); // número da linha
if (row & 1) {
col = (row + 1) * 16 - snakeDirection - 1;
} else {
col = snakeDirection - row * 16;
}
return snakeDirection;
}
void food(int eaten) {
if(eaten == f) {
snakeSize++;
f = random(0, 255);
red = fred;
green = fgreen;
blue = fblue;
fred = random(0, 255);
fgreen = random(0, 255);
fblue = random(0, 255);
snakeSpeed = snakeSpeed / 1.1;
} else {
leds[f].setRGB(fred, fgreen, fblue);
FastLED.show();
}
}
void death() {
snakeSize = 2;
snakeSpeed = 500;
red = 255;
green = 0;
blue = 0;
}
void color(boolean sw) {
if(!sw) {
red = random(0, 255);
green = random(0, 255);
blue = random(0, 255);
}
}
void loop() {
color(digitalRead(swPin));
newDirection = Snakedirection(lastDirection, analogRead(pinX), analogRead(pinY));
lastDirection = snakeMove(newDirection);
food(newDirection);
delay(snakeSpeed);
}
Esquemáticos

Processo de manufatura
- Controle USB para Jogos DIY com Arduino – Construa Seu Próprio Gamepad de Alto Desempenho
- Construa um Console Pong 24×16 LED com Arduino Nano e MAX7219
- Construa um Jogo Tetris com Arduino Nano em Matriz LED 16×8 DIY
- Controlar um LED via Bluetooth com Arduino – Guia DIY Simples
- Display Interativo de Matriz LED na Porta com Sensor PIR – Saudação de Férias Arduino
- Construa um Robô Quadrúpede Inteligente com Arduino: Guia Passo a Passo
- Pixel Chaser: Jogo LED Interativo de Um Toque com Arduino Nano
- Relógio Flip Arduino com Matriz LED 8×8 – Projeto DIY de Relógio em Tempo Real
- Misturador de Cores RGB com Arduino – Projeto DIY para Iniciantes
- Controlando Matriz de LED 8×8 com Arduino Uno: Guia Passo a Passo