Cronómetro Digital con Arduino y Display TM1637

El mundo de la electrónica y la programación ofrece un sinfín de posibilidades para crear dispositivos útiles y educativos. Uno de los proyectos más populares para principiantes y entusiastas es el cronómetro digital, una herramienta fundamental que permite medir intervalos de tiempo con precisión. En este detallado artículo, exploraremos cómo construir un cronómetro funcional utilizando un microcontrolador Arduino, un compacto y eficiente display de 4 dígitos y 7 segmentos con driver TM1637, y un par de botones pulsadores para controlar su operación.



🔩Funcionamiento

Antes de sumergirnos en los componentes y el código, es crucial comprender los elementos clave de este proyecto.

Arduino: El Cerebro del Proyecto

El Arduino (en sus diversas placas como el Arduino UNO, Nano o Mega) es la plataforma de prototipado electrónico de código abierto que actúa como el cerebro de nuestro cronómetro. Su microcontrolador es el encargado de:

  • Leer el estado de los botones pulsadores.
  • Calcular el tiempo transcurrido, generalmente utilizando la función interna millis() que registra el tiempo en milisegundos desde que se inició la placa.
  • Controlar y enviar los datos de tiempo al display TM1637.

El uso de millis() en lugar de la función delay() es crucial. Mientras que delay() detiene por completo la ejecución del código, millis() permite que el programa siga ejecutándose y revise periódicamente si ha pasado el tiempo necesario, asegurando una respuesta fluida a las pulsaciones de los botones.

Display TM1637: El Visualizador Compacto

El módulo TM1637 es un display LED de 4 dígitos y 7 segmentos que ha ganado gran popularidad debido a su simplicidad. A diferencia de los displays de 7 segmentos tradicionales que requieren muchos pines de control (uno por segmento y dígito), el TM1637 integra el circuito integrado controlador TM1637, lo que le permite ser manejado a través de tan solo dos pines digitales del Arduino:

  • CLK (Clock/Reloj): Define el tiempo de sincronización de la comunicación serial.
  • DIO (Data I/O/Datos): Pin de entrada/salida de datos.

Este sistema de comunicación serial simplificado libera valiosos pines en el Arduino para otros usos, como nuestros botones pulsadores.

PINES del TM1637

Pin del TM1637ProtocoloFunción
GNDAlimentaciónTierra
VCCAlimentaciónAlimentación Positiva
DIOComunicación SerialEntrada/Salida de Datos
CLKComunicación SerialReloj (Clock)

El TM1637 utiliza un protocolo de comunicación serial síncrono basado en los dos pines CLK y DIO, similar a, pero no compatible con, el protocolo I2C o SPI estándar.

AspectoDetalle
Tipo de ComunicaciónSerial Síncrona (Two-Wire Bus)
Flujo de DatosLa comunicación es bidireccional (tanto el microcontrolador como el chip pueden enviar/recibir datos), pero típicamente el microcontrolador solo escribe (envía) datos para mostrar.
Secuencia de TransmisiónLa transmisión siempre comienza con una condición de inicio y termina con una condición de parada.
Condición de InicioOcurre cuando el pin DIO pasa de HIGH a LOW mientras el pin CLK se mantiene HIGH.
Transferencia de DatosLos datos se transfieren bit por bit, con el bit menos significativo (LSB) primero. El estado del pin DIO se muestrea en el flanco ascendente o descendente del pin CLK.
Condición de ParadaOcurre cuando el pin DIO pasa de LOW a HIGH mientras el pin CLK se mantiene HIGH.
Reconocimiento (ACK)Después de cada byte (8 bits) de datos enviado por el microcontrolador, el chip TM1637 debe responder tirando del pin DIO a LOW durante un pulso de reloj (ACK).

🔨Componentes

ComponenteCantidadEspecificaciónFunción
Placa Arduino1Arduino Uno, Nano, etc.Control de componentes(cerebro)
Display 7 segmentos1TM1637Mostrar información
Botón2PushActivar/detener cronometro
Resistencia210kΩPull-down para el botón
Cables de conexiónnUnir los componentes


🔌Conexiones

Conexión LCD 16×2 con I2C

TM1637 PinArduino Pin
GNDGND
VCC5V
DIOD3
CLKD2

Conexión del botón(Configuración Pull-Down):

Arduino PinArduino Pin
5vPin 4 (con resistencia de 10kΩ a GND)
5vPin 5 (con resistencia de 10kΩ a GND)

Para asegurar una lectura digital estable, los pulsadores se conectan en configuración Pull-Down: un extremo a 5V, el otro extremo al Pin Digital (2) y Digital (3) de Arduino y, crucialmente, una resistencia de 10kΩ entre ese mismo pin digital y GND. Esto garantiza que el pin digital lea un estado LOW cuando el botón está abierto y HIGH (5V) solo cuando es presionado.


0️⃣Código

El código es la parte más importante, ya que implementa la lógica del cronómetro, incluyendo la gestión del tiempo y el manejo de los estados de los botones.

Se comienza incluyendo la librería TM1637Display.h y definiendo los pines de conexión.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <TM1637Display.h> // Se incluye la librería para el display.

// Definición de pines para el display (CLK y DIO)
#define CLK 2
#define DIO 3

// Definición de pines para los botones
#define PIN_INICIO_PAUSA 4
#define PIN_REINICIO 5

// Inicialización del objeto display
TM1637Display display(CLK, DIO);

// Constantes para el separador (el punto central o colon)
// 0x80 es el valor para encender el punto central
const uint8_t COLON = 0x80;

// Variables de estado del cronómetro
bool estaCorriendo = false;
unsigned long tiempoInicio = 0; // Almacena el tiempo cuando el cronómetro se inicia o reanuda.
unsigned long tiempoPausado = 0; // Almacena el tiempo acumulado cuando está en pausa.
unsigned long tiempoActual = 0; // Almacena el tiempo total transcurrido (en milisegundos).

// Variables para el Anti-Rebote (Debouncing) de los botones
unsigned long ultimaPulsacion = 0;
const long retardoAntiRebote = 200; // 200 milisegundos de retardo.

void setup() {
  // Inicialización de pines de botones como entrada con pull-down externo
  pinMode(PIN_INICIO_PAUSA, INPUT);
  pinMode(PIN_REINICIO, INPUT);

  // Inicialización del display
  display.setBrightness(0x0a); // Ajusta el brillo (0x00 a 0x0f)
  display.clear(); // Limpia el display
  
  // Establece el tiempo inicial en 00:00
  mostrarTiempo(0); 
}

void loop() {
  // 1. **Actualización del tiempo**
  if (estaCorriendo) {
    // Si está corriendo, el tiempo actual es el tiempo que ha pasado desde el inicio
    // más el tiempo acumulado antes de la última pausa.
    tiempoActual = tiempoPausado + (millis() - tiempoInicio);
    mostrarTiempo(tiempoActual);
  }

  // 2. **Lectura y lógica del botón INICIO/PAUSA**
  if (digitalRead(PIN_INICIO_PAUSA) == HIGH) {
    if (millis() - ultimaPulsacion > retardoAntiRebote) {
      ultimaPulsacion = millis();
      
      if (estaCorriendo) {
        // Lógica de PAUSA
        estaCorriendo = false;
        tiempoPausado = tiempoActual; // Guarda el tiempo actual acumulado
      } else {
        // Lógica de INICIO/REANUDAR
        estaCorriendo = true;
        tiempoInicio = millis(); // Guarda el nuevo tiempo de inicio
      }
    }
  }

  // 3. **Lectura y lógica del botón REINICIO**
  if (digitalRead(PIN_REINICIO) == HIGH) {
    if (millis() - ultimaPulsacion > retardoAntiRebote) {
      ultimaPulsacion = millis();

      // Detener y Reiniciar a cero
      estaCorriendo = false;
      tiempoPausado = 0;
      tiempoActual = 0;
      mostrarTiempo(0);
    }
  }
}

void mostrarTiempo(unsigned long ms) {
  // Convertir milisegundos a segundos y minutos
  unsigned long segundosTotales = ms / 1000;
  int minutos = (segundosTotales / 60) % 100; // Hasta 99 minutos
  int segundos = segundosTotales % 60; // Hasta 59 segundos

  // Convertir a formato de 4 dígitos MMSS
  int mmss = minutos * 100 + segundos;

  // Mostrar el número con el punto central encendido (colon)
  display.showNumberDecEx(mmss, COLON, true, 4, 0); 
}


🖌️Diseños


🎬Videos


📑Conclusión

El proyecto del cronómetro digital, basado en Arduino y el display TM1637, constituye un ejercicio fundamental y sumamente gratificante en el campo de la electrónica y la programación.

Hemos demostrado que, con tan solo un microcontrolador (el cerebro), un visualizador eficiente de dos hilos de comunicación (el TM1637) y dos simples pulsadores (la interfaz de usuario), es posible construir un dispositivo que mide el tiempo con la precisión requerida para muchas aplicaciones.

Los puntos clave de aprendizaje son:

  • Eficiencia del Hardware: La elección del módulo TM1637 simplifica drásticamente el cableado y la programación, liberando pines del Arduino para futuras expansiones.
  • Lógica de Tiempo: La correcta implementación de la función millis() para gestionar el cronometraje y el estado del sistema (estaCorriendo, tiempoPausado) es crucial para un funcionamiento no bloqueante y una respuesta inmediata a los botones.
  • Robustez: La inclusión de técnicas de anti-rebote (debouncing) en el código asegura que la interacción del usuario sea fiable, transformando un interruptor físico imperfecto en una entrada digital estable.

En resumen, este cronómetro no es solo un reloj; es una plataforma de aprendizaje que solidifica los conocimientos sobre la gestión de entradas y salidas digitales, la comunicación serial y la manipulación precisa del tiempo en un entorno de microcontroladores. Su éxito radica en la combinación armoniosa de simplicidad en el montaje y sofisticación en la lógica de programación.


Deja un comentario

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

Carrito de compra