Juego con la Matriz de LEDS

En 4º de ESO de Tecnología hemos creado un juego con Arduino, que usa la matriz de LEDs para representarlo. Consiste en atrapar un led parpadeante fijo con otro led móvil que manejas con el acelerómetro.

Hemos usado el Arduino Basic Shield de Kiwibot y la Librería de la Matriz de LEDs

El juego funciona con un tiempo límite; el LED fijo cada vez va parpadeando más rápido hasta que se termina el juego y muestra la puntuación.

Antes de empezar el juego se produce una cuenta atrás mediante una interrupción, y si quieres reiniciar el juego, solo tienes que pulsar el botón derecho, y de nuevo empezará la cuenta atrás y el juego.

Tienes treinta segundos para una partida. El récord es 24, ¡Atrévete a superarlo!

/* JUEGO MATRIZ DE LEDS
Juego con la matriz de LEDS
Pixel movil con el acelerometro
Pixel fijo parpadeante random
El juego consiste en capturar con el pixel movil el pixel fijo
Desarrollado por Carlos Pumar
Abril de 2015
*/

#include <Matriz.h>   // Incluimos la libreria
Matriz matriz (6, 9, 5);   // pines datos, latch y reloj

int puntuacion = 0; //Variable donde se acumula la puntuacion
int contador = 1; //Variable utilizada para la interrupción
int numero = 0; //Variable utilizada para imprimir los numeros

// Conexion de pines
const int xaccelPin = A2;  // pin acelerometro x
const int yaccelPin = A3;  // pin acelerometro y
const int zumbadorPin = 10; // pin zumbador

//Valor sensor acelerometro
int xaccelValue = 0;
int yaccelValue = 0;

// Coordenadas pixel movil
int filaMovil = 1;
int columnaMovil = 1;

// Coordenadas pixel fijo parpadeante
int filaFijo = 0;
int columnaFijo = 0;

// variables relacionadas con el tiempo
unsigned long previousMillis = 0;  // vble para tiempo para parpadeo
unsigned long tiempoAnterior = 0; // vble para tiempo para mover pixel
unsigned long currentMillis = 0;  // vble para almacenar tiempo actual
long interval = 500;   // intervalo de parpadeo
int state = 0;    // estado del pixel parpadeante

void setup() {

  pinMode(zumbadorPin, OUTPUT);  // se declara zumbador como salida
  // random para pixel parpadeante
  randomSeed(analogRead(A0));  // semilla para inicializar el random
  filaFijo = random (1, 6);    // valor para fila
  columnaFijo = random (1, 8);    // valor para columna
  attachInterrupt(1, suma, FALLING); //interrupcion en el digital 3
}

// funcion que enciende los pixeles
void encenderpixels() {
  // si el tiempo transcurrido es mayor que el intervalo
  if (currentMillis - previousMillis >= interval) {
    // actualiza la vble previousMillis
    previousMillis = currentMillis;
    // cambia el estado
    interval = interval-5;
    //el intervalo de parpadeo del led fijo cada vez es menor
    if (state == 0) state = 1;
    else state = 0;
  }
  // Si el estado es cero enciende el pixel fijo y el movil
  if (state == 0) {
    matriz.printPixel(filaMovil, columnaMovil);
    matriz.printPixel(filaFijo, columnaFijo);
  }
  // si el estado es uno apaga el pixel fijo
  else {
    matriz.cleanMatrix();
    matriz.printPixel(filaMovil, columnaMovil);
  }
}
// funcion que mueve el pixel por la matriz de leds
void moverpixel() {
  yaccelValue = analogRead (yaccelPin);
  xaccelValue = analogRead (xaccelPin);

//si el acelerometro esta girado hacia la derecha se le suma 1 a la columna
  if (xaccelValue <= 280) {
    columnaMovil = columnaMovil + 1;
  }
//si el acelerometro esta girado hacia la izquierda se le resta 1 a la columna
  if (xaccelValue >= 350) {
    columnaMovil = columnaMovil - 1;
  }
//si el acelerometro esta girado hacia la alante se le suma 1 a la columna
  if (yaccelValue <= 280) {
    filaMovil = filaMovil - 1;
  }
  //si el acelerometro esta girado hacia la atras se le suma 1 a la columna
  if (yaccelValue >= 350) {
    filaMovil = filaMovil + 1;
  }
 //si la fila es menor que uno se fija a uno
  if (filaMovil < 1) {
    filaMovil = 1;
  }
//si la fila es mayor que cinco se fija a cinco
  if (filaMovil > 5) {
    filaMovil = 5;
  }
//si la columna es menor que uno se fija a uno
  if (columnaMovil < 1) {
    columnaMovil = 1;
  }
  //si la columna es mayor que siete se fija a siete
  if (columnaMovil > 7) {
    columnaMovil = 7;
  }
}

void empezar() { //cuenta atras
  for (numero = 3; numero > 0; numero--) {
    matriz.printNumber(numero, 1);  //imprimimos un nomero durante 1 segundo
  }
}
void loop() {
//la posicion donde empieza el led movil
  filaMovil = 3;
  columnaMovil = 4;
//la velocidad inicial con la que parpadea el led fijo  
  interval = 500;
  empezar();
  puntuacion=0;
  contador = 0;
  
  while (contador == 0) {
    currentMillis = millis(); // lectura del tiempo actual
    encenderpixels();      // enciende los pixels
    // Solo mueve el movil cada 200ms
    if (currentMillis - tiempoAnterior > 200) {
      moverpixel();
      tiempoAnterior = currentMillis;
    }
    // Deteccion de si coinciden pixel movil y fijo
    if ( filaFijo == filaMovil && columnaFijo == columnaMovil) {
      matriz.cleanMatrix();
      puntuacion ++;
      // zumbador avisando de que lo has conseguido
      digitalWrite(zumbadorPin, HIGH);
      delay(150);
      digitalWrite(zumbadorPin, LOW);
      // Nuevas coordenadas i,j para pixel fijo
      filaFijo = random (1, 6);
      columnaFijo = random (1, 8);
    }
    if (interval <= 50) {
    matriz.printNumber(puntuacion); //Numero a imprimir (0-99)
    delay(500);
    //Numero a imprimir (0-99) y tiempo que estara mostrandose en segundos
    matriz.printNumber(puntuacion, 1);
    delay(500);
    matriz.printNumber(puntuacion, 1.63);
    }
  }
}


//interrupcion que hace que el juego empiece de nuevo
void suma() {
//cuando se produce la interrupcion contador aumenta en 1
  contador ++;
//si es mayor que uno se fija a 0
  if (contador > 1) {
    contador = 0;
  }
  contador = 1;
}

Realizado por Carlos Pumar

Deja un comentario