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

  1. Placa ESP32

  2. Módulo LED P10 (32×16 pixels)

  3. 5 pulsadores (push buttons)

  4. Resistencias de 10kΩ (si no se usa INPUT_PULLUP)

  5. Protoboard y cables de conexión

  6. 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

cpp
#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

  1. Visualización en panel grande: Ideal para eventos deportivos con público

  2. Texto más grande y legible: Usando todo el espacio del panel P10

  3. Formato de 2 dígitos: Muestra «05» en lugar de «5» para mejor alineación

  4. Método de actualización optimizado: Limpia solo las áreas necesarias

Instrucciones de instalación

  1. Instalar la librería DMD32 en el IDE de Arduino:

  2. Cargar el código en el ESP32

  3. Conectar el panel P10 según las indicaciones

  4. Asegurar una buena fuente de alimentación para el panel LED

Posibles mejoras futuras

  1. Añadir temporizador del partido

  2. Implementar memorización del marcador en EEPROM

  3. Añadir efectos de animación al cambiar el marcador

  4. 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.

New chat

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *