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