Volver

Reloj RTC I2C con DS1307 en Velxio

Introducción

¿Alguna vez has querido añadir un reloj en tiempo real a tu proyecto Arduino pero no tenías el hardware a mano? Con Velxio, puedes simular un RTC I2C (DS1307) directamente en tu navegador. En este tutorial, construiremos un lector I2C sencillo que obtiene la hora y fecha actuales de un DS1307 virtual y las imprime en el Monitor Serie. No se necesitan librerías externas, solo la librería Wire incorporada.

Diagrama del circuito i2c-rtc-read en el lienzo del simulador Velxio

Recorrido del Circuito

Este ejemplo es notablemente simple porque el DS1307 ya está integrado en la placa Arduino Uno virtual. No hay componentes externos ni cables que añadir. El bus I2C (SDA en A4, SCL en A5) está conectado internamente al DS1307 en la dirección 0x68. El único componente es el propio Arduino Uno.

Selector de componentes de Velxio explorando piezas por categoría

Para empezar, abre el editor de Velxio y selecciona un Arduino Uno desde el selector de componentes. El DS1307 está integrado en el entorno de simulación, por lo que no necesitas añadirlo por separado. El circuito está listo para funcionar.

Recorrido del Código

Desglosemos el código paso a paso.

Inclusión y Definición

#include <Wire.h>

#define DS1307_ADDR 0x68

Incluimos la librería Wire para la comunicación I2C y definimos la dirección I2C del DS1307 como 0x68.

Conversión de BCD a Decimal

byte bcdToDec(byte val) {
  return ((val >> 4) * 10) + (val & 0x0F);
}

El DS1307 almacena los valores de tiempo en formato Decimal Codificado en Binario (BCD). Esta función auxiliar convierte un byte BCD a un número decimal normal.

Configuración

void setup() {
  Wire.begin();
  Serial.begin(9600);

  Serial.println("===========================");
  Serial.println("  Lector RTC DS1307 (I2C)");
  Serial.println("===========================");
  Serial.println();
}

Inicializamos el bus I2C y la comunicación Serie a 9600 baudios. Luego imprimimos un encabezado.

Bucle

void loop() {
  // Establecer el puntero de registro a 0 (segundos)
  Wire.beginTransmission(DS1307_ADDR);
  Wire.write(0x00);
  Wire.endTransmission();

  // Solicitar 7 bytes: seg, min, hr, ds, fecha, mes, año
  Wire.requestFrom(DS1307_ADDR, 7);

  if (Wire.available() >= 7) {
    byte sec   = bcdToDec(Wire.read() & 0x7F);
    byte min   = bcdToDec(Wire.read());
    byte hr    = bcdToDec(Wire.read() & 0x3F);
    byte ds    = bcdToDec(Wire.read());
    byte fecha = bcdToDec(Wire.read());
    byte mes   = bcdToDec(Wire.read());
    byte año   = bcdToDec(Wire.read());

    // Imprimir hora formateada
    Serial.print("Hora: ");
    if (hr < 10) Serial.print("0");
    Serial.print(hr);
    Serial.print(":");
    if (min < 10) Serial.print("0");
    Serial.print(min);
    Serial.print(":");
    if (sec < 10) Serial.print("0");
    Serial.print(sec);

    Serial.print("  Fecha: ");
    if (fecha < 10) Serial.print("0");
    Serial.print(fecha);
    Serial.print("/");
    if (mes < 10) Serial.print("0");
    Serial.print(mes);
    Serial.print("/20");
    if (año < 10) Serial.print("0");
    Serial.println(año);
  } else {
    Serial.println("Error: No se pudo leer el RTC");
  }

  delay(1000);
}

En el bucle, primero establecemos el puntero de registro del DS1307 a 0 (registro de segundos) enviando un solo byte 0x00. Luego solicitamos 7 bytes del RTC. El DS1307 devuelve segundos, minutos, horas, día de la semana, fecha, mes y año en BCD. Enmascaramos el bit superior de los segundos (el bit 7 es el indicador de parada del reloj) y los dos bits superiores de las horas (los bits 6-7 son el modo/AM-PM). Después de la conversión, imprimimos la hora y la fecha con ceros a la izquierda. Si hay menos de 7 bytes disponibles, imprimimos un error. Finalmente, esperamos 1 segundo.

Conceptos Clave

Errores Comunes y Consejos de Depuración

Barra de herramientas del editor de Velxio con controles de compilación y ejecución

Extensiones Sugeridas

Pruébalo Tú Mismo

¿Listo para verlo en acción? Abre el ejemplo en vivo en Velxio y pulsa el botón Ejecutar. Verás la hora actualizándose cada segundo en el Monitor Serie.

Abrir el Lector RTC I2C en Velxio

Barra de herramientas del lienzo de Velxio sobre la ventana de simulación

¡Feliz simulación!


Compartir en:
David Montero

Escrito por

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Artículos relacionados


Artículo anterior
Lectura/Escritura de EEPROM I2C con Arduino: Guía Completa
Artículo siguiente
Escáner I2C con Arduino: Encuentra todos los dispositivos en el bus