Campo Minado com RGB WS8212 e Arduino

Neste post vamos apresentar para você como montar um game simples, usando o modulo Led RGB endereçável WS8212.
Se você ainda não conhece este modulo e gostaria de entender como ele funciona, clique no link abaixo, nós fizemos a apresentação deste modulo que é muito versátil e fácil de usar.
Material:
Ideia Básica do Jogo
O jogo é inspirado no campo minado, jogo que fez muito sucesso do Windows XP até o Windows 7. Você precisa ir escolhendo casa a casa e torcer para não acertar a casa bomba. Montando com 1 modulo, temos então 16 casas (o modulo possui 16 LEDs), e vamos usar 2 botões para fazer a navegação do cursor e um botão para confirmar (selecionar) a casa e revelar se ali havia uma bomba escondida ou não.
Montagem
A montagem está seguindo o que foi programado na IDE do Arduino, lembre se de se alterar a posição de algum componente, realizar a alteração no código.
Vamos agora apresentar o código. Lembrando que caso você ainda não saiba qual biblioteca usar ou como fazer a ligação deste modulo, que você pode consultar, nosso post anterior.
Este Código está disponível em nosso GitHub, justamente com a biblioteca usada.
#include <Adafruit_NeoPixel.h> #define PIN 7 #define NUMLED 16 #define botao1 A0 #define botao2 A1 #define enter A4 Adafruit_NeoPixel pixels(NUMLED, PIN, NEO_GRB + NEO_KHZ800); int ponteiro = 1, bomba = 2,proximo = 0, anterior = 0, confirmado[16], ok = 0, termina = 0, x = 0; // Cria Variaveis int alfa[49] = {0, 0, 0, 0, 200, 200, 0, 0, 200, 200, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 50, 50, 1, 1, 50, 50, 1, 1, 1, 1, 1, 50, 50, 50, 50, 50, 50, 2, 2, 50, 50, 2, 2, 50, 50, 50, 50, 50}; int beta[49] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 350, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 100, 5, 5, 350, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5000}; void animacao() { ponteiro = 0; bomba = random(16); x = 0; pixels.clear(); for(int b =0; b < 16; b++) { confirmado[b] = LOW; } for(int A = 0; A < 49; A++) { x++; if(x == 17) { x = 0; } else if(x == 33) { x = 0; } pixels.setPixelColor(x, pixels.Color(alfa[A],0,0)); pixels.show(); delay(beta[A]); } } void setup() { pinMode(botao1, INPUT_PULLUP); pinMode(botao2, INPUT_PULLUP); pinMode(enter, INPUT_PULLUP); termina = LOW; pixels.begin(); //Inicia comunicação com os LED bomba = random (16); delay(200); } void loop() { anterior = digitalRead(botao2); proximo = digitalRead(botao1); ok = digitalRead(enter); if(ponteiro >= 16) { ponteiro = 0; } else if(0 > ponteiro) { ponteiro = 15; } else if(anterior == LOW) { delay(200); ponteiro--; } else if(proximo == LOW) { delay(200); ponteiro++; } else if(ok == LOW) { if(ponteiro == bomba) { animacao(); } else { delay(200); confirmado[ponteiro] = HIGH; } } for(int i=0; i<16; i++) { if(i == ponteiro) { pixels.setPixelColor(i, pixels.Color(0, 5, 0)); pixels.show(); } else if(confirmado[i] == HIGH) { pixels.setPixelColor(i, pixels.Color(0, 0, 1)); pixels.show(); } else { pixels.setPixelColor(i, pixels.Color(1, 1, 1)); pixels.show(); } delay(10); } }
Explicando o Código
Este código é simples, porém como usa FOR (Trecho de programa que roda em forma de Loop. no qual você pode definir quantas vezes aquela tarefa irá ser executada, antes de retornar a sequencia do programa). para fazer o acionamento dos LEDs, precisa analisar sequencia a sequencia de cada função para que você consiga compreender cada tarefa. Vou explicar algumas pontos que acho importante:
bomba = random(16); – comando Randon, é uma função do Arduino que tem a capacidade de gerar um numero aleatório dentro de faixa definida, neste caso de 0 a 16..
void animacao() – Função que criamos para quando você encontrar em qual casa a bomba está escondida, seguir a sequencia que programamos. Gostaria de aprender mais sobre funções, e como você pode usar para simplificar seu código, vou te explicar no proximo post:
Veja como ficou nosso game:

caso você ainda ficado com alguma duvida , deixe nos comentários que vamos te responder.
Escrito por: Venâncio Miranda
Revisado por: Jefferson Proesi