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).

arduinods3231oledrtcproyectos

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

ComponenteCantidadPara qué
Arduino Nano1El cerebro
RTC DS32311La hora exacta (trae pila)
OLED SSD1306 128x64 I2C1La pantalla
Buzzer activo 5V1La alarma
Pulsadores2Posponer / apagar
Cables dupont H-H1 juegoConexionado

Conexionado

El RTC y la OLED son ambos I2C: comparten los mismos dos cables.

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

  1. Pantalla negra: dirección I2C. La mayoría de las OLED usan 0x3C; si no arranca, probá 0x3D.
  2. La hora se pierde al desenchufar: pila del DS3231 agotada o con la lengüeta aislante puesta de fábrica (revisala, pasa seguido).
  3. 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.
  4. 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

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.