Control de Marcador Deportivo vía Bluetooth con ESP32 y Aplicación Android

Objetivo

Implementar un sistema de marcador deportivo controlado mediante una aplicación Android vía Bluetooth, utilizando una ESP32 y mostrando los resultados en una pantalla LCD.

Materiales necesarios

  • ESP32

  • Módulo Bluetooth HC-05 o similar (o usar Bluetooth integrado de ESP32)

  • Pantalla LCD I2C 16×2

  • 5 pulsadores (o menos si se simplifica)

  • Protoboard y cables

  • Smartphone Android

  • IDE Arduino

Parte 1: Modificación del Código para Incluir Bluetooth

cpp
#include <LiquidCrystal_I2C.h>
#include <BluetoothSerial.h>

// Configuración LCD 16x2 con dirección I2C 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Objeto Bluetooth
BluetoothSerial SerialBT;

// Definición de pines para los botones
const int btn_up_team1 = 25;    // Incrementa equipo 1
const int btn_down_team1 = 26;  // Decrementa equipo 1
const int btn_up_team2 = 27;    // Incrementa equipo 2
const int btn_down_team2 = 14;  // Decrementa equipo 2
const int btn_reset = 12;       // 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();
  
  // Inicializar Bluetooth
  SerialBT.begin("MarcadorDeportivo"); // Nombre del dispositivo Bluetooth
  Serial.begin(115200);
  
  // Mostrar encabezados iniciales
  updateDisplay();
}

void loop() {
  // Manejar comandos Bluetooth
  if (SerialBT.available()) {
    char command = SerialBT.read();
    handleBluetoothCommand(command);
  }

  // Manejar botones con debounce
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // Botón incrementar equipo 1
    if (digitalRead(btn_up_team1) == LOW) {
      score_team1++;
      updateDisplay();
      sendScores();
      lastDebounceTime = millis();
    }
    
    // Botón decrementar equipo 1
    if (digitalRead(btn_down_team1) == LOW && score_team1 > 0) {
      score_team1--;
      updateDisplay();
      sendScores();
      lastDebounceTime = millis();
    }
    
    // Botón incrementar equipo 2
    if (digitalRead(btn_up_team2) == LOW) {
      score_team2++;
      updateDisplay();
      sendScores();
      lastDebounceTime = millis();
    }
    
    // Botón decrementar equipo 2
    if (digitalRead(btn_down_team2) == LOW && score_team2 > 0) {
      score_team2--;
      updateDisplay();
      sendScores();
      lastDebounceTime = millis();
    }
    
    // Botón resetear marcador
    if (digitalRead(btn_reset) == LOW) {
      score_team1 = 0;
      score_team2 = 0;
      updateDisplay();
      sendScores();
      lastDebounceTime = millis();
    }
  }
}

void handleBluetoothCommand(char command) {
  switch(command) {
    case 'A': // Incrementar equipo A
      score_team1++;
      break;
    case 'a': // Decrementar equipo A
      if(score_team1 > 0) score_team1--;
      break;
    case 'B': // Incrementar equipo B
      score_team2++;
      break;
    case 'b': // Decrementar equipo B
      if(score_team2 > 0) score_team2--;
      break;
    case 'R': // Resetear
      score_team1 = 0;
      score_team2 = 0;
      break;
    case 'S': // Solicitar estado actual
      break;
  }
  updateDisplay();
  sendScores();
}

void sendScores() {
  SerialBT.print("A:");
  SerialBT.print(score_team1);
  SerialBT.print(",B:");
  SerialBT.println(score_team2);
}

void updateDisplay() {
  char scoreStr[10];
  lcd.clear();
  
  // Mostrar nombres de equipos
  lcd.setCursor(0, 0);
  lcd.print("Equipo A:");
  lcd.setCursor(8, 0);
  lcd.print("Equipo B:");
  
  // Mostrar puntuaciones
  lcd.setCursor(2,1);
  sprintf(scoreStr, "%02d", score_team1);
  lcd.print(scoreStr);
  lcd.setCursor(10, 1);
  lcd.print(score_team2);
}

Parte 2: Desarrollo de la Aplicación Android

Puedes crear una aplicación Android simple usando MIT App Inventor (https://appinventor.mit.edu/) con los siguientes componentes:

  1. Interfaz de usuario:

    • 2 Etiquetas para mostrar los marcadores

    • 4 Botones (A+, A-, B+, B-)

    • 1 Botón de Reset

    • Lista de dispositivos Bluetooth emparejados

    • Botón de conexión

  2. Funcionalidad Bluetooth:

    • Conectar al dispositivo «MarcadorDeportivo»

    • Enviar comandos (‘A’, ‘a’, ‘B’, ‘b’, ‘R’)

    • Recibir actualizaciones de marcador

Parte 3: Pruebas y Validación

  1. Pruebas físicas:

    • Verificar que los botones incrementen/decrementen correctamente

    • Confirmar que el LCD muestra los valores correctos

  2. Pruebas Bluetooth:

    • Emparejar el dispositivo desde el teléfono

    • Verificar que los comandos desde la app modifican el marcador

    • Confirmar que los cambios físicos se reflejan en la app

Parte 4: Mejoras Opcionales

  1. Agregar temporizador

  2. Implementar historial de puntuaciones

  3. Añadir sonidos para cambios de marcador

  4. Implementar cambio de nombres de equipos

  5. Agregar indicador visual de conexión Bluetooth

Evaluación

  1. Funcionamiento correcto del hardware (30%)

  2. Comunicación Bluetooth estable (30%)

  3. Aplicación Android funcional (20%)

  4. Documentación y presentación (20%)

Entregables

  1. Código Arduino completo

  2. Archivo .aia de la aplicación Android

  3. Video demostrativo del funcionamiento

  4. Breve informe con:

    • Diagrama de conexiones

    • Explicación del código

    • Problemas encontrados y soluciones

Deja una respuesta

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