Reloj RTC con Arduino Nano y DS1307: Cronometraje Preciso
Componentes y materiales
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino Nano R3 | 1 | |
| Módulo Reloj Tiempo Real (RTC) DS1307 | 1 | Mantiene la hora sin alimentación. Fácil interfaz I2C. Librerías disponibles. |
| Display LED 7 segmentos 4 dígitos (Ánodo Común) | 1 | |
| Header hembra fila simple | 3 | |
| Placa perforada (perfboard) | 1 | Para soldar y dejar presentable. Mejor con pistas tipo protoboard. |
| Cables jumpers (genéricos) | 25 | |
| Header macho 40 posiciones 1 fila (0.1") | 1 |
Herramientas necesarias
- Soldador (genérico)
- Multímetro (imprescindible para verificar continuidad de soldaduras y consumo)
Aplicaciones y servicios en línea
- Arduino IDE
- Arduino Fritzing
Sobre el proyecto
Este es un reloj digital realmente simple y fácil de montar creado con el IC RTC DS1307. Muestra la hora en un display de 7 segmentos de 4 dígitos. El código puede modificarse fácilmente para añadir funcionalidades como alarma; solo hace falta imaginación. Fue un peldaño para proyectos más complejos y quería algo vistoso para mi habitación.
Incluyo todos los detalles, incluyendo problemas al soldar en PCB y cómo los resolví.
PASO 1: Componentes
Módulo RTC DS1307
El chip DS1307 mantiene la hora incluso sin alimentación. Interfaz I2C con Arduino (pines A4=SDA, A5=SCL). No usamos el pin DS.
Inconveniente: No es tan preciso como quisiéramos; sufre deriva temporal (time drift) sensible a temperatura.
¡OJO! Conecta bien GND y VCC. En el módulo, VCC está antes que GND. Conectar al revés calienta mucho el chip. Toca la pila de botón al encender y apaga rápido si notas calor.
Registro de Desplazamiento 74HC595
- Clave gracias al multiplexado. Principiantes: no temáis el término, es divertido y útil.
- 16 pines. Usamos dos 74HC595 para el display 4 dígitos 7 segmentos.
- El primero enciende segmentos; el segundo selecciona qué dígito activar.
- El multiplexado conmuta tan rápido que parece que todos los dígitos están encendidos a la vez.
Nota: Me llegaron varios chips defectuosos (pines Q0, Q1, Q3, Q7 fallando). Verificad con multímetro en modo continuidad. Todo es aprendizaje.
Display 7 segmentos 4 dígitos (Ánodo Común)
Display genérico de 12 pines (numeración desde inferior izquierda). Cada dígito muestra 0-9 y punto decimal. Usé el punto decimal del 2º dígito como separador ":" (parpadeante).
Cuidado: Los segmentos a-g no están en orden lineal. Nunca conectar directo a 5V sin resistencias limitadoras.
Conexiones Shift Register → Display:
| Segmento | Pin Display | Pin 74HC595 |
|---|---|---|
| A | 11 | 15 (1er 595) |
| B | 7 | 1 (1er 595) |
| C | 4 | 2 (1er 595) |
| D | 2 | 3 (1er 595) |
| E | 1 | 4 (1er 595) |
| F | 10 | 5 (1er 595) |
| G | 5 | 6 (1er 595) |
| Decimal | 3 | 7 (1er 595) |
| D1 (dígito 1) | 12 | 15 (2do 595) |
| D2 | 9 | 1 (2do 595) |
| D3 | 8 | 2 (2do 595) |
| D4 | 6 | 3 (2do 595) |
Proyecto barato y fácil, requiere paciencia si soldas en PCB (unas 2 horas en protoboard).
Código
Código Principal del Reloj (Arduino)
Usa librería RTC e I2C (Wire). Para display Ánodo Común.
#include <Wire.h>
#include <EEPROM.h>
#include <RTClib.h>
RTC_DS1307 RTC;
int latchPin = 3; // Pin 12 del 595
int dataPin = 4; // Pin 14 del 595
int clockPin = 2; // Pin 11 del 595
int shift = 256;
int units, tens, hundreds, thousands;
const int alarmHour = 17;
const int alarmMinute = 26;
void setup() {
Serial.begin(9600);
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(13, OUTPUT); // LED alarma
Wire.begin();
RTC.begin();
if (!RTC.isrunning()) {
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop() {
DateTime now = RTC.now();
int HOUR = now.hour();
int MINUT = now.minute();
// Descomposición dígitos hora
if (HOUR < 10) { hundreds = HOUR; thousands = 0; }
else { hundreds = HOUR % 10; thousands = HOUR / 10; }
// Descomposición dígitos minutos
if (MINUT <= 9) { units = MINUT; tens = 0; }
else { units = MINUT % 10; tens = MINUT / 10; }
// Multiplexado: envía cada dígito al 74HC595 correspondiente
// (Código repetido para units, tens, hundreds, thousands con shiftOut)
// ... (ver código completo en repositorio)
delay(1); // Persistencia de visión
// Alarma simple en pin 13
if (HOUR == alarmHour && MINUT == alarmMinute) digitalWrite(13, HIGH);
else digitalWrite(13, LOW);
}
Nota: El código completo con todos los switch-case para cada dígito está en el archivo original. Aquí se muestra la estructura principal.
Programa para Poner en Hora (Arduino)
Como el DS1307 deriva, este programa permite ajustar la hora vía Monitor Serie. Conecta el RTC, sube este sketch, abre Monitor Serie y envía comandos (h##, i##, s##, d##, m##, y##, w##, t, a, p, etc.). Luego sube el código principal.
// Incluye librería RealTimeClockDS1307.h (ver abajo)
// Comandos: h=hora, i=minutos, s=segundos, d=día, m=mes, y=año, w=día semana,
// t=toggle 12/24h, a=AM, p=PM, z=start, Z=stop, q=SQW 1Hz, Q=SQW off,
// >reg,val = escribir registro,
Librerías necesarias
Se requieren dos librerías personalizadas que debes instalar en Arduino IDE (Sketch → Incluir librería → Añadir librería .ZIP):
- RealTimeClockDS1307 (carpeta con:
RealTimeClockDS1307.h,RealTimeClockDS1307.cpp,keywords.txt,Readme) - RTClib (fork de JeeLab, compatible con DS1307, DS3231, PCF8523, etc. Carpeta con
RTClib.h,RTClib.cpp,README.md,library.properties)
Ambas librerías permiten control total del DS1307: lectura/escritura de registros, onda cuadrada (SQW), RAM con batería, formato 12/24h, AM/PM, etc.
Esquemático
Esquema del proyecto en Fritzing: 7segmentClock.fzz
Proceso de manufactura
- Fabricación de Tablas de Planchar: Diseño, Materiales y Proceso Productivo
- Reloj de cuco: historia, artesanía y evolución moderna
- Placas de Circuito Impreso: Diseño, Fabricación y Tendencias Futuras
- Construcción y Diseño de Tablas de Surf: De Raíces Polinesias a la Innovación Moderna
- Construcción de un robot con Arduino y Raspberry Pi: Guía paso a paso
- Placa RasPiRobot Board V2: Convierte tu Raspberry Pi en un Controlador de Robot Potente
- Reloj POV con Arduino: Construye una pantalla LED de persistencia de visión
- Reloj de Palabras DIY con Arduino: Construye una Pantalla Elegante en Tiempo Real
- Reloj Espejo Infinito: Elegancia infinita y hora precisa
- Configuración de Motores: Guía Completa de Tipos y Características
- La Importancia de un PCB Impecable