Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Construa um Jogo da Cobrinha em Matriz LED 16x16 com Arduino UNO

Componentes e Materiais

ComponenteQuantidadeObservações
Arduino UNO1
Matriz de Pixel RGB NeoPixel NeoMatrix 16x161Nã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.

Construa um Jogo da Cobrinha em Matriz LED 16x16 com Arduino UNO
Construa um Jogo da Cobrinha em Matriz LED 16x16 com Arduino UNO
Construa um Jogo da Cobrinha em Matriz LED 16x16 com Arduino UNO

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

Construa um Jogo da Cobrinha em Matriz LED 16x16 com Arduino UNO

Processo de manufatura

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