22 de mayo de 2026 · 9 min
Reloj despertador con Arduino: RTC DS3231, pantalla OLED y cero excusas
Un reloj que no se atrasa ni con cortes de luz, con alarma, botón de posponer y la pantalla OLED que le da cara de producto terminado. El proyecto perfecto para regalar (o regalarte).
Este es el proyecto que más se termina usando todos los días de los que salen de esta serie. Un reloj de mesa con la hora siempre exacta (el DS3231 pierde menos de un minuto por año), alarma configurable y botón de posponer. Y como queda bien terminado, es el clásico regalo de electrónico para la familia.
Por qué hace falta un RTC
El Arduino puede contar el tiempo con millis(), pero se resetea con cada corte de luz y deriva varios segundos por día. El DS3231 es un reloj de tiempo real con cristal compensado por temperatura y pila de respaldo: se corta la luz, vuelve, y la hora sigue perfecta. Por eso es el RTC que recomendamos siempre sobre el DS1307 más viejo.
Lista de compra
| Componente | Cantidad | Para qué |
|---|---|---|
| Arduino Nano | 1 | El cerebro |
| RTC DS3231 | 1 | La hora exacta (trae pila) |
| OLED SSD1306 128x64 I2C | 1 | La pantalla |
| Buzzer activo 5V | 1 | La alarma |
| Pulsadores | 2 | Posponer / apagar |
| Cables dupont H-H | 1 juego | Conexionado |
Conexionado
El RTC y la OLED son ambos I2C: comparten los mismos dos cables.
- DS3231 y OLED: SDA → A4 · SCL → A5 · VCC → 5V · GND → GND
- Buzzer: (+) → pin 8 · (−) → GND
- Botón “posponer”: pin 2 → botón → GND (usamos pull-up interno)
- Botón “apagar alarma”: pin 3 → botón → GND
El código
Librerías: RTClib, Adafruit SSD1306 y Adafruit GFX.
#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_SSD1306.h>
RTC_DS3231 rtc;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
// Tu alarma:
const int ALARMA_HORA = 6;
const int ALARMA_MIN = 45;
const int POSPONER_MIN = 5;
const int PIN_BUZZER = 8, PIN_POSPONER = 2, PIN_APAGAR = 3;
bool sonando = false;
bool disparadaHoy = false;
int posponerHasta = -1; // minuto absoluto del dia, -1 = sin posponer
void setup() {
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_POSPONER, INPUT_PULLUP);
pinMode(PIN_APAGAR, INPUT_PULLUP);
rtc.begin();
// Descomentar UNA vez para poner en hora, cargar, y volver a comentar:
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.setTextColor(SSD1306_WHITE);
}
void loop() {
DateTime t = rtc.now();
int minutoDia = t.hour() * 60 + t.minute();
int minutoAlarma = ALARMA_HORA * 60 + ALARMA_MIN;
// reset del "ya sono hoy" pasada la medianoche
if (minutoDia == 0) disparadaHoy = false;
// disparo por alarma programada o por posposicion cumplida
bool horaDeSonar = (minutoDia == minutoAlarma && !disparadaHoy) ||
(posponerHasta >= 0 && minutoDia >= posponerHasta);
if (horaDeSonar && !sonando) {
sonando = true;
disparadaHoy = true;
posponerHasta = -1;
}
if (sonando) {
// bip intermitente
digitalWrite(PIN_BUZZER, (millis() / 400) % 2);
if (digitalRead(PIN_POSPONER) == LOW) {
sonando = false;
digitalWrite(PIN_BUZZER, LOW);
posponerHasta = minutoDia + POSPONER_MIN;
}
if (digitalRead(PIN_APAGAR) == LOW) {
sonando = false;
digitalWrite(PIN_BUZZER, LOW);
}
}
// pantalla
char linea[20];
oled.clearDisplay();
oled.setTextSize(3);
oled.setCursor(4, 18);
snprintf(linea, sizeof(linea), "%02d:%02d", t.hour(), t.minute());
oled.print(linea);
oled.setTextSize(1);
oled.setCursor(4, 52);
snprintf(linea, sizeof(linea), "%02d/%02d/%04d AL %02d:%02d",
t.day(), t.month(), t.year(), ALARMA_HORA, ALARMA_MIN);
oled.print(linea);
if (sonando) { oled.setCursor(100, 4); oled.print("((*))"); }
oled.display();
delay(150);
}
El detalle de la puesta en hora
La línea rtc.adjust(...) toma la fecha y hora de tu PC al momento de compilar. El procedimiento correcto: descomentarla, cargar el sketch, volver a comentarla y cargar de nuevo. Si la dejás activa, cada reinicio “retrocede” el reloj a la hora de aquella compilación — el error más repetido con RTCs.
Errores comunes
- Pantalla negra: dirección I2C. La mayoría de las OLED usan
0x3C; si no arranca, probá0x3D. - La hora se pierde al desenchufar: pila del DS3231 agotada o con la lengüeta aislante puesta de fábrica (revisala, pasa seguido).
- Botones que “rebotan”: si posponer se dispara solo, agregá un
delay(200)tras leer el botón, o soldá un capacitor de 100 nF en paralelo. - Buzzer que suena flojo: los pasivos necesitan
tone(); el activo que linkeamos suena solo con HIGH. Si compraste otro, revisá cuál tenés.
Para llevarlo más lejos
- Agregá un DHT22 y mostrá temperatura y humedad en la pantalla — reloj + estación en uno.
- Un tercer pulsador + menú en pantalla para cambiar la alarma sin recompilar.
- Gabinete: una cajita de MDF cortado a láser o impresa en 3D lo convierte en regalo serio.
Los componentes
Nano, DS3231, OLED, buzzer y pulsadores: todo en electronicabyp.com.ar y envío a toda Argentina. ¿Consultas del armado? WhatsApp y te ayudamos.
¿Necesitás los componentes de esta guía? Los encontrás en electronicabyp.com.ar — hacemos envíos a toda Argentina. Para cotizaciones por cantidad, escribinos por WhatsApp.