#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// Definir el tiempo del hardware
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
// Definir el numero de dispositivos por cada display
#define NUM_DEVICES_1 4 //Numero de matrizes en el primer display
#define NUM_DEVICES_2 4 //Numero de matrizes en el segundo display
#define NUM_DEVICES_3 4 //Numero de matrizes en el tercer display
// Pines de control para cada display
#define CS_PIN_1 10 //CS para Display 1 (temas)
#define CS_PIN_2 9 //CS para Display 2 (letra)
#define CS_PIN_3 8 //CS para Display 3 (temporizador)
// Pines para botones y LEDs
#define BUTTON_1_PIN 2
#define BUTTON_2_PIN 3
#define LED_1_PIN 4
#define LED_2_PIN 5
// Instancia para los objetos de cada display
MD_Parola display1 = MD_Parola(HARDWARE_TYPE, CS_PIN_1, NUM_DEVICES_1);
MD_Parola display2 = MD_Parola(HARDWARE_TYPE, CS_PIN_2, NUM_DEVICES_2);
MD_Parola display3 = MD_Parola(HARDWARE_TYPE, CS_PIN_3, NUM_DEVICES_3);
char* temas[] = {"Nombre", "Ciudad", "Pelicula", "Cancion", "Color", "Flor-fruto", "Animal"};
char letras[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int timer = 9;
bool gameActive = true; // Bandera para controlar el juego
void setup() {
// Iniciar cada display
display1.begin();
display2.begin();
display3.begin();
// Configurar el brillo
display1.setIntensity(5);
display2.setIntensity(5);
display3.setIntensity(5);
// Limpiar cada display
display1.displayClear();
display2.displayClear();
display3.displayClear();
// Configurar botones como entrada con resistencias pull-up
pinMode(BUTTON_1_PIN, INPUT_PULLUP);
pinMode(BUTTON_2_PIN, INPUT_PULLUP);
// Configurar LEDs como salida
pinMode(LED_1_PIN, OUTPUT);
pinMode(LED_2_PIN, OUTPUT);
digitalWrite(LED_1_PIN, LOW);
digitalWrite(LED_2_PIN, LOW);
}
void loop() {
if (gameActive) {
// Mostrar información en displays
mostrarTemaAleatorio();
mostrarLetraAleatoria();
iniciarTemporizador();
// Detectar qué botón se presiona primero
detectarGanador();
} else {
delay(100); // Evitar bucles innecesarios
}
}
void mostrarTemaAleatorio() {
int temaIndex = random(0, 7);
display1.setTextAlignment(PA_CENTER);
display1.print(temas[temaIndex]);
delay(2000); // Esperar 2 segundos
}
void mostrarLetraAleatoria() {
char letra = letras[random(0, 26)];
display2.setTextAlignment(PA_CENTER);
display2.print(letra);
delay(2000); // Esperar 2 segundos
}
void iniciarTemporizador() {
for (timer = 9; timer >= 0; timer--) {
display3.setTextAlignment(PA_CENTER);
display3.print(timer);
delay(1000); // Esperar 1 segundo por cada cuenta regresiva
if (!gameActive) break; // Detener temporizador si se presiona un botón
}
}
void detectarGanador() {
if (digitalRead(BUTTON_1_PIN) == LOW) {
// Botón 1 presionado
gameActive = false;
digitalWrite(LED_1_PIN, HIGH);
displayGanador(1);
} else if (digitalRead(BUTTON_2_PIN) == LOW) {
// Botón 2 presionado
gameActive = false;
digitalWrite(LED_2_PIN, HIGH);
displayGanador(2);
}
}
void displayGanador(int jugador) {
display3.displayClear();
display3.setTextAlignment(PA_CENTER);
display3.print("Jugador " + String(jugador));
delay(3000); // Mostrar por 3 segundos
reiniciarDisplays();
}
void reiniciarDisplays() {
display1.displayClear();
display2.displayClear();
display3.displayClear();
gameActive = true;
digitalWrite(LED_1_PIN, LOW);
digitalWrite(LED_2_PIN, LOW);
}