Control de Marcador Deportivo con ESP32 y LCD 16×2 I2C

Objetivos

  • Implementar un sistema de marcador deportivo para dos equipos

  • Controlar los puntos mediante pulsadores

  • Visualizar el marcador en una pantalla LCD 16×2 con interfaz I2C

  • Aprender a manejar entradas digitales y displays con el ESP32

Materiales necesarios

  1. Placa ESP32

  2. Módulo LCD 16×2 con interfaz I2C

  3. 5 pulsadores (push buttons)

  4. Protoboard y cables de conexión

  5. Fuente de alimentación para el ESP32

Desarrollo

Circuito

  • Conectar el módulo I2C a los pines SDA (normalmente GPIO21) y SCL (normalmente GPIO22) del ESP32

  • Conectar los 5 pulsadores:

    • 2 para incrementar/decrementar puntos del Equipo 1

    • 2 para incrementar/decrementar puntos del Equipo 2

    • 1 para resetear el marcador

  • Usar resistencias pull-up internas del ESP32

Código mejorado y comentado


#include <LiquidCrystal_I2C.h>
// Configuración LCD 16×2 con dirección I2C 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definición de pines para los botones
const int btn_up_team1 = 33;    // Incrementa equipo 1
const int btn_down_team1 = 25;  // Decrementa equipo 1
const int btn_up_team2 = 26;    // Incrementa equipo 2
const int btn_down_team2 = 27;  // Decrementa equipo 2
const int btn_reset = 14;       // 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;  // tiempo en milisegundos
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 LCD
  lcd.init();
  lcd.backlight();
  // 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 la pantalla LCD
void updateDisplay() {
  lcd.clear();
  // Mostrar nombres de equipos
  lcd.setCursor(0, 0);
  lcd.print(«Equipo A:»);
  lcd.setCursor(0, 1);
  lcd.print(«Equipo B:»);
  // Mostrar puntuaciones
  lcd.setCursor(10, 0);
  lcd.print(score_team1);
  lcd.setCursor(10, 1);
  lcd.print(score_team2);
}

Mejoras implementadas

  1. Control de rebote (debounce): Evita incrementos múltiples por un solo press del botón

  2. Protección contra valores negativos: No permite que los marcadores sean menores que cero

  3. Función separada para actualizar display: Mejora la modularidad del código

  4. Nombres de variables más descriptivos: Facilita el mantenimiento del código

  5. Mensajes más claros en el display: Mejor organización visual de la información

Funcionamiento

  1. Al iniciar, el display muestra «Equipo A: 0» y «Equipo B: 0»

  2. Los primeros dos botones controlan el marcador del Equipo A (incrementar/decrementar)

  3. Los siguientes dos botones controlan el marcador del Equipo B (incrementar/decrementar)

  4. El quinto botón resetea ambos marcadores a cero

  5. El sistema evita que los marcadores sean negativos

Esta práctica permite comprender el manejo de entradas digitales, el control de displays LCD y la programación básica de microcontroladores, siendo útil para aplicaciones deportivas o de control de puntuaciones en general.

Deja una respuesta

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