18/03/2006
En el mundo de la electrónica y los proyectos DIY, el control preciso del tiempo es fundamental. Ya sea para encender unas luces a una hora determinada, controlar la velocidad de un motor o crear secuencias complejas en tus proyectos de gaming, los temporizadores o 'timers' son una herramienta indispensable. Pero, ¿cómo se programan? ¿Es tan complicado como parece? La respuesta es no, y en esta guía definitiva te llevaremos de la mano desde el concepto más básico hasta la programación avanzada en una de las plataformas más populares: Arduino.

Este artículo está diseñado para resolver todas tus dudas. Si solo quieres saber cómo programar ese temporizador que compraste para el árbol de Navidad, aquí encontrarás la respuesta. Si eres un entusiasta que busca llevar sus proyectos con microcontroladores al siguiente nivel, también estás en el lugar correcto. Prepárate para dominar el tiempo.
¿Qué es un Timer Digital?
Antes de sumergirnos en el código y los botones, es crucial entender qué es un timer digital. En su forma más simple, un timer digital es un dispositivo electrónico que actúa como un interruptor controlado por tiempo. Le dices cuándo encenderse y cuándo apagarse, y él se encarga del resto de forma automática y precisa. Estos dispositivos van desde los sencillos enchufes programables que encontramos en cualquier ferretería hasta los complejos módulos internos de un microcontrolador que operan a velocidades de millonésimas de segundo.
Programando un Timer Digital Comercial: Paso a Paso
Comencemos con el tipo de timer más común, el que se usa para automatizar tareas del hogar. Aunque cada modelo tiene sus particularidades, la lógica de programación suele ser muy similar. Sigue estos pasos generales para configurarlo sin problemas.
- Paso 1: Reseteo y Configuración Inicial. La mayoría de los timers tienen un pequeño botón de 'Reset', a menudo hundido, que necesitarás presionar con un clip o la punta de un bolígrafo para borrar cualquier programación anterior. Una vez reseteado, lo primero es ponerlo en hora. Usando los botones correspondientes ('Clock', 'Hour', 'Minute', 'Day'), ajusta la fecha y hora actuales. Este es un paso vital, ya que toda la programación se basará en este reloj interno.
- Paso 2: Establecer los Programas de Encendido/Apagado. Ahora viene la parte divertida. Los timers permiten configurar múltiples eventos. Busca un botón como 'Program' o 'Timer'. Al presionarlo, la pantalla te mostrará algo como '1 ON'. Aquí es donde defines la hora a la que quieres que se encienda tu dispositivo por primera vez. Ajusta el día (o grupo de días) y la hora. Vuelve a presionar 'Program' y verás '1 OFF'. Ahora, define la hora a la que quieres que se apague. Puedes repetir este proceso para crear múltiples programas (2 ON, 2 OFF, etc.), hasta el límite que permita tu dispositivo (usualmente entre 8 y 20 programas).
- Paso 3: Activar el Modo Automático. Una vez que has introducido todos tus programas, el último paso es poner el timer en modo de funcionamiento. Generalmente, tendrás un botón que cicla entre los modos 'ON' (siempre encendido), 'OFF' (siempre apagado) y 'AUTO'. Para que tu programación funcione, debes dejarlo en modo 'AUTO'. ¡Y listo! Tu dispositivo se encenderá y apagará según lo hayas configurado.
El Siguiente Nivel: Timers en Arduino
Cuando los timers comerciales no son suficientes y necesitas una precisión, velocidad y flexibilidad milimétrica, es hora de entrar en el mundo de los microcontroladores. Arduino es la plataforma ideal para ello. Aquí, un timer no es un aparato externo, sino un componente de hardware interno del microcontrolador que podemos programar para ejecutar tareas en momentos exactos sin detener el resto de nuestro código.

¿Por Qué Usar Timers en Vez de la Función delay()?
Si has programado algo en Arduino, seguro conoces la función delay(). Es útil para pausas sencillas, pero tiene un problema gigantesco: bloquea por completo el microcontrolador. Mientras el delay() está activo, el Arduino no puede hacer absolutamente nada más. No puede leer un sensor, no puede mover un motor, no puede recibir una señal. En cualquier proyecto medianamente complejo, esto es inaceptable. Aquí es donde brillan las interrupciones controladas por timers. Un timer puede correr en segundo plano y, cuando llega al tiempo programado, genera una interrupción que ejecuta una función específica, todo ello mientras tu programa principal sigue funcionando sin detenerse.
Tipos de Timers en las Placas Arduino
No todos los timers son iguales. Dependiendo de la placa Arduino que uses, tendrás a tu disposición diferentes tipos. La principal diferencia radica en su resolución (el tamaño del número que pueden contar).
| Timer | Resolución | Placas Comunes | Uso Típico por el Core de Arduino |
|---|---|---|---|
| Timer0 | 8 bits (0-255) | UNO, Nano, Mega | Funciones delay(), millis(), micros(). No se recomienda modificarlo. |
| Timer1 | 16 bits (0-65535) | UNO, Nano, Mega | Librería Servo. Si no usas servos, es ideal para tus proyectos. |
| Timer2 | 8 bits (0-255) | UNO, Nano, Mega | Función tone(). Disponible si no estás generando sonidos. |
| Timer3, 4, 5 | 16 bits (0-65535) | Mega 2560 | Usados también por la librería Servo, pero ofrecen más opciones. |
Conceptos Clave que Debes Dominar
Para programar los timers directamente, necesitas entender dos conceptos: el prescaler y los registros de comparación.
- Prescaler: El reloj de un Arduino UNO funciona a 16MHz, lo que significa 16 millones de 'ticks' por segundo. Contar a esa velocidad es demasiado rápido para la mayoría de las aplicaciones. El prescaler es un divisor de frecuencia. En lugar de que el contador del timer incremente en cada tick del reloj, podemos decirle que incremente cada 8, 64, 256 o 1024 ticks. Esto nos permite medir intervalos de tiempo mucho más largos y manejables.
- Registros de Comparación: Los registros son pequeñas unidades de memoria dentro del microcontrolador que controlan su comportamiento. Para los timers, el más importante es el Registro de Comparación (
OCRnA). En lugar de esperar a que el contador se desborde (llegue a su máximo y vuelva a cero), podemos poner un valor en este registro. Cuando el contador del timer alcanza el valor que hemos puesto en el registro de comparación, se dispara la interrupción. Esto nos da un control total sobre la frecuencia de nuestros eventos.
Modo CTC: El Secreto de la Precisión
El modo CTC (Clear Timer on Compare Match) es una de las formas más potentes de usar un timer. En este modo, cuando el contador del timer (TCNTn) iguala al valor del registro de comparación (OCRnA), no solo se dispara la interrupción, sino que el contador se resetea automáticamente a cero. Esto crea un ciclo perfecto y constante, ideal para generar ondas, controlar servos o ejecutar tareas a una frecuencia exacta y repetitiva.
Manos al Código: Programando un Timer en Arduino
Veamos cómo implementar esto en un sketch de Arduino. El siguiente ejemplo hará parpadear el LED integrado en la placa (pin 13) cada segundo, usando el Timer1 en modo CTC.

#define ledPin 13 void setup() { pinMode(ledPin, OUTPUT); // --- Configuración del TIMER1 --- cli(); // Deshabilita las interrupciones globales // Resetea los registros de control del Timer1 TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; // Inicializa el contador en 0 // Se necesita una interrupción cada segundo (1Hz). // Frecuencia del reloj = 16,000,000 Hz // Prescaler = 1024 // OCR1A = (16,000,000 / (1024 * 1Hz)) - 1 = 15624 OCR1A = 15624; // Configura el modo CTC (WGM12) TCCR1B |= (1 << WGM12); // Configura el prescaler a 1024 (CS12 y CS10) TCCR1B |= (1 << CS12) | (1 << CS10); // Habilita la interrupción por comparación (OCIE1A) TIMSK1 |= (1 << OCIE1A); sei(); // Habilita las interrupciones globales } void loop() { // El loop principal puede estar haciendo otras tareas. // El parpadeo del LED es totalmente independiente. } // Rutina de Servicio de Interrupción (ISR) para el Timer1 ISR(TIMER1_COMPA_vect) { digitalWrite(ledPin, digitalRead(ledPin) ^ 1); // Invierte el estado del LED }Simplificando el Proceso: La Librería TimerOne
Manipular registros directamente es muy potente, pero puede ser intimidante. Afortunadamente, existen librerías que abstraen toda esa complejidad. Una de las más populares es `TimerOne`. Con ella, configurar una interrupción cada segundo es tan fácil como esto:
#include <TimerOne.h> #define ledPin 13 void setup() { pinMode(ledPin, OUTPUT); Timer1.initialize(1000000); // Inicializa el Timer1 para 1,000,000 microsegundos (1 segundo) Timer1.attachInterrupt(parpadearLED); // Asigna la función 'parpadearLED' a la interrupción } void loop() { // El loop está libre para otras tareas } void parpadearLED() { digitalWrite(ledPin, digitalRead(ledPin) ^ 1); }Preguntas Frecuentes (FAQ)
¿Puedo dañar mi Arduino si configuro mal los timers?
No, es extremadamente improbable. Una mala configuración de los registros del timer no causará daño físico al hardware. Lo peor que puede pasar es que tu programa no se comporte como esperas, que se cuelgue o que funciones como `millis()` dejen de ser precisas.
¿Qué es un 'tick' de reloj?
Es el pulso eléctrico más básico que sincroniza las operaciones de un microprocesador. En un Arduino UNO con un cristal de 16MHz, hay 16 millones de estos ticks cada segundo. Cada instrucción que ejecuta el procesador consume uno o más de estos ticks.
¿Por qué es mala idea usar la función `delay()` en proyectos complejos?
Porque `delay()` es una función de bloqueo. Detiene toda la actividad del procesador durante el tiempo especificado. Si tu proyecto necesita reaccionar a eventos en tiempo real (como pulsar un botón o leer un sensor), `delay()` hará que ignore esos eventos mientras dure la pausa, lo que resulta en un sistema poco receptivo e ineficiente.
¿Todos los timers sirven para generar señales PWM?
No directamente. Los timers son la base para generar señales PWM (Modulación por Ancho de Pulso), pero se requiere una configuración específica de los registros de control y de los pines de salida asociados al timer. La función `analogWrite()` de Arduino utiliza los timers internamente para generar estas señales en los pines marcados con '~'.
Si quieres conocer otros artículos parecidos a Guía Definitiva para Programar Timers Digitales puedes visitar la categoría Juegos.
