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.

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.

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
- Comunicación I2C: La librería Wire maneja el protocolo I2C.
beginTransmission()inicia una escritura,write()pone en cola los datos,endTransmission()los envía.requestFrom()lee bytes de un esclavo. - Formato BCD: El DS1307 almacena la hora en BCD, donde cada nibble representa un dígito decimal. La función
bcdToDec()lo convierte. - Direccionamiento de Registros: Se accede a los registros internos del DS1307 escribiendo primero la dirección del registro y luego leyendo o escribiendo datos.
- Enmascaramiento de Bits: El bit superior del registro de segundos (CH) indica la parada del reloj; lo enmascaramos con
& 0x7F. Los bits superiores del registro de horas indican el modo de 12/24 horas; los enmascaramos con& 0x3F.
Errores Comunes y Consejos de Depuración
- Dirección I2C Incorrecta: Asegúrate de que la dirección sea 0x68 (7 bits). Si usas una dirección de 8 bits, desplázala a la izquierda en 1.
- Faltan Resistencias de Pull-up: En hardware real, las líneas I2C necesitan resistencias de pull-up. En Velxio, se simulan internamente.
- El Monitor Serie no se Muestra: Asegúrate de que la velocidad de baudios coincida (9600). Haz clic en el icono del Monitor Serie en la barra de herramientas del editor.

- Errores de Compilación: Verifica que hayas incluido
Wire.h. El código no usa librerías externas. - El RTC no Responde: Si ves “Error: No se pudo leer el RTC”, la comunicación I2C puede haber fallado. Verifica la dirección y el cableado.
Extensiones Sugeridas
- Establecer la Hora: Añade código para configurar la hora del DS1307 mediante entrada Serie.
- Mostrar en LCD: Usa un LCD I2C para mostrar la hora.
- Función de Alarma: Implementa una alarma usando los registros de alarma del DS1307.
- Registro de Datos: Guarda marcas de tiempo en EEPROM o una tarjeta SD.
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

¡Feliz simulación!