Control de Marcador Deportivo con ESP32 y Módulo LED P10
Objetivos
-
Implementar un sistema de marcador deportivo para dos equipos usando un panel LED P10
-
Controlar los puntos mediante pulsadores
-
Visualizar el marcador en un display LED de gran tamaño
-
Aprender a manejar el módulo P10 con la librería DMD32
Materiales necesarios
-
Placa ESP32
-
Módulo LED P10 (32×16 pixels)
-
5 pulsadores (push buttons)
-
Resistencias de 10kΩ (si no se usa INPUT_PULLUP)
-
Protoboard y cables de conexión
-
Fuente de alimentación adecuada para el panel P10 (5V 2A mínimo)
Conexiones
-
Panel P10:
-
CLK → GPIO18
-
DATA → GPIO23
-
RS (A) → GPIO5
-
OE (B) → GPIO4
-
SS (SCLK) → GPIO15
-
Código mejorado usando DMD32
#include <SPI.h> #include <DMD32.h> #include "fonts/SystemFont5x7.h" // Configuración del panel P10 #define DISPLAYS_ACROSS 1 // Número de paneles en horizontal #define DISPLAYS_DOWN 1 // Número de paneles en vertical DMD32 display(DISPLAYS_ACROSS, DISPLAYS_DOWN); // Definición de pines para los botones const int btn_up_team1 = 34; // Incrementa equipo 1 const int btn_down_team1 = 35; // Decrementa equipo 1 const int btn_up_team2 = 32; // Incrementa equipo 2 const int btn_down_team2 = 25; // Decrementa equipo 2 const int btn_reset = 26; // Resetear marcador // Variables para almacenar los puntos int score_team1 = 0; int score_team2 = 0; // Variables para control de rebote (debounce) unsigned long lastDebounceTime = 0; unsigned long debounceDelay = 200; // Función necesaria para la librería DMD void ScanDMD() { display.scanDisplayBySPI(); } void setup() { // Configurar pines de los botones con pull-up interno pinMode(btn_up_team1, INPUT_PULLUP); pinMode(btn_down_team1, INPUT_PULLUP); pinMode(btn_up_team2, INPUT_PULLUP); pinMode(btn_down_team2, INPUT_PULLUP); pinMode(btn_reset, INPUT_PULLUP); // Inicializar el panel P10 Serial.begin(115200); Timer1.initialize(2000); Timer1.attachInterrupt(ScanDMD); display.clearScreen(true); // Mostrar encabezados iniciales updateDisplay(); } void loop() { // Manejar botones con debounce if ((millis() - lastDebounceTime) > debounceDelay) { // Botón incrementar equipo 1 if (digitalRead(btn_up_team1) == LOW) { score_team1++; updateDisplay(); lastDebounceTime = millis(); } // Botón decrementar equipo 1 (con protección para no tener valores negativos) if (digitalRead(btn_down_team1) == LOW && score_team1 > 0) { score_team1--; updateDisplay(); lastDebounceTime = millis(); } // Botón incrementar equipo 2 if (digitalRead(btn_up_team2) == LOW) { score_team2++; updateDisplay(); lastDebounceTime = millis(); } // Botón decrementar equipo 2 (con protección para no tener valores negativos) if (digitalRead(btn_down_team2) == LOW && score_team2 > 0) { score_team2--; updateDisplay(); lastDebounceTime = millis(); } // Botón resetear marcador if (digitalRead(btn_reset) == LOW) { score_team1 = 0; score_team2 = 0; updateDisplay(); lastDebounceTime = millis(); } } } // Función para actualizar el display P10 void updateDisplay() { display.clearScreen(); // Mostrar nombres de equipos display.drawString(2, 0, "EQUIPO A", 8, GRAPHICS_NORMAL); display.drawString(2, 9, "EQUIPO B", 8, GRAPHICS_NORMAL); // Mostrar puntuaciones (centradas) char scoreStr[10]; // Puntuación equipo A sprintf(scoreStr, "%02d", score_team1); display.drawString(20, 0, scoreStr, 2, GRAPHICS_NORMAL); // Puntuación equipo B sprintf(scoreStr, "%02d", score_team2); display.drawString(20, 9, scoreStr, 2, GRAPHICS_NORMAL); }
Mejoras y características adicionales
-
Visualización en panel grande: Ideal para eventos deportivos con público
-
Texto más grande y legible: Usando todo el espacio del panel P10
-
Formato de 2 dígitos: Muestra «05» en lugar de «5» para mejor alineación
-
Método de actualización optimizado: Limpia solo las áreas necesarias
Instrucciones de instalación
-
Instalar la librería DMD32 en el IDE de Arduino:
-
Descargar de https://github.com/freetronics/DMD32
-
Colocar en la carpeta de librerías del Arduino IDE
-
Reiniciar el IDE
-
-
Cargar el código en el ESP32
-
Conectar el panel P10 según las indicaciones
-
Asegurar una buena fuente de alimentación para el panel LED
Posibles mejoras futuras
-
Añadir temporizador del partido
-
Implementar memorización del marcador en EEPROM
-
Añadir efectos de animación al cambiar el marcador
-
Conectar múltiples paneles P10 para mayor tamaño de visualización
Esta implementación con panel P10 es ideal para eventos deportivos reales donde se necesita visibilidad a distancia, manteniendo la misma funcionalidad básica de control de marcador pero con un display mucho más visible.
