Módulos de reloj RTC Dallas DS1307 y DS3231

Al igual que en la anterior estación, uno de los módulos interesantes que puede tener es sin duda un reloj ya que nos permite saber en que momento se produjo el cambio de los demás sensores, es decir, en que momento la temperatura aumento, o hubo lluvia, etc.

Hay muchos modelos de relojes para elegir, en mi caso por el momento me había estado decantando por el Dallas DS1307 que ya había usado tanto para construir un modulo como para la estación anterior. Sin embargo ese reloj, tanto los que monte yo como los módulos comprados por internet, tiene el problema de que la hora se va adelantando poco a poco, esto es debido, en principio, a los campos de temperatura que afectan al oscilador y hace que la frecuencia varié lo suficiente para que dos o tres semanas después se haya adelantado la hora 5 minutos.

Por ello para la nueva estación tengo previsto montar otro tipo de reloj, concretamente un Dallas DS3231 que en un mismo encapsulado tiene en su interior el reloj, el oscilador y un sensor de temperatura para compensar las variaciones climáticas. De este modo el reloj es mucho mas preciso y no tendremos que estar pendientes de actualizar la hora.

Los chips de reloj que he mencionado podemos encontrarlos montados en módulos de muchos fabricantes distintos, en los de la foto se puede apreciar como el modulo del DS1307 (blanco) tiene 2 chips, uno es el reloj y otro es una memoria EEPROM, en el caso del DS3231 no tiene ese segundo chip aunque si hay una zona en el PCB para soldarlo. La utilidad de este chip es simplemente para que podamos guardar datos en él, aunque también se puede usar la propia EEPROM del Arduino para lo mismo.

Ambos módulos funcionan a 5V, emplean el protocolo de comunicación I2C y usan la dirección 0x68 para conectarse. Cabe decir que aunque el DS3231 tenga sensor de temperatura su refresco es bastante lento tardando al rededor de un minuto en refrescar, aunque eso si, el valor  que se obtiene es el correcto.

En cuanto a su uso por comodidad es recomendable usar una librería para leer y escribir los datos. En su día cree una librería para el DS1307 ya que las que encontré no me gustaban, y aprovechando el nuevo modulo la he actualizado para darle soporte. Esta  disponible desde aquí.

Para terminar adjunto el nuevo ejemplo que trae la librería, ahora con impresión de la temperatura solo para el DS3231:

Y este es el resultado por pantalla:

ds3231-ide

15 comentarios en “Módulos de reloj RTC Dallas DS1307 y DS3231”

  1. Hola, gracias por los tutoriales, he probado tu libreria para modulo reloj rtc ds1307 y el cambio de hora invierno verano no lo realiza si no reseteo el arduino, ya que cuando veo la hora y fecha justo antes del cambio de hora por el serial monitor no cambia hasta que reseteo el arduino.

    1. Hola,

      Se cambia instantáneamente, como puedes ver en el vídeo, pero para que funcione es necesario leer datos al menos 1 vez por hora, ya que es en cada lectura cuando se comprueba si ya es el momento de hacer la actualización, o no. En el caso de serlo se modifica la hora en el RTC y después se devuelven los datos actualizados.

      Saludos.

    2. gracias por tu rapida respuesta, se realiza la lectura cada segundo por el serial monitor, ¿no se actualiza asi?.
      estoy intentando montar un reloj astronomico para alumbrado publico, he bajado el skech de crepuscular encontrado en la web, cuando he probado el modulo tiny rtc1307 se adelanta 25 seg por dia y eso aun cambiando el cristal de cuarzo de un reloj, he pedido el rtc3231 para probarlo.
      ajustare el desfase de segundos con codigo.
      haciendo el cambio de hora por codigo si que me lo cambia automaticamente pero si no tengo conectado el arduino no se si lo realizara (si hay un corte de luz). seguire probando. llevo una semana con pruebas del rtc.

  2. Hola a todos. Tengo el DS1307 y evidentemente adelanta un minuto en cuestión de 10 días. ¿Es posible ajustar por software ese minuto, por ejemplo restándolo? Lo tengo conectado a un Nano pero no está todo el día encendido, sino que lo hago a ratos para ver como va (con un LCD 1602 y un LM35DZ), pero no sé como crear un algoritmo que para que reste ese minuto o más, pues a medida que corren los días el adelanto será mayor.

    Gracias y saludos.

    1. compra el rtc3231 que no retrasa, yo ya lo he probado. yo hice el ajuste del retraso con un if, por ejemplo si hora=23 y minuto=01 entones minuto=0, en el caso de que sea 1 minuto diario

    2. Gracias Carlos. Terminaré por comprar el DS3231 más adelante. 1 minuto en una semana es una hora al año, con lo que la desviación es alta. Si no me equivoco, adelanta 8.5 segundos al día, pero tendría que tener en cuenta que cuando vaya a cambiar al siguente minuto, ya no puedo restar sólo segundos, sino retrasar también un minuto… buff.
      Probaré mientras a ver que logro, pero creo que terminaré por el de precisión.

      Gracias por la respuesta.

      Saludos.

  3. Hola. Muy buena información. Como hago para que de una hora determinada a otra hora poner una salida digital en valor alto

  4. No tengotcomo comprobarlo, pero el defecto de adelantar uno su cinco minutos por mes es consistcons con el uso de de un cristal para una capacidad de carga de 6 pf en un circuito que tiene 12 pf (ver app note 58 de Dallas)

  5. El único parche que cabe intentar para no tirarlo es poner en serie con cada pata del cristal un condensador de 27 pf cada uno (27+27+12.5 en serie dan 6 pf) y ver qué pasa, si es que arranca el oscilador …..

  6. se que es un post muy antiguo pero al ver que tienes libreria propia lo mismo me puedes ayudar.
    me interesa al momento de settear la hora inicial en el reloj, poder cambiar la zona horaria dinámicamente, es decir hay alguna manera de extraer la zona horaria o de decirle que lo configure en otro uso horario que no sea el del pc pc que carha el sketch? no se si me acabo de explicar.
    un saludo y gracias.
    Pd. estoy usando un tiny rtc para las pruebas que sustituire por un ds3231 para el proyecto final

    1. Hola Carlos,
      Pues no he probado a que el Arduino se configure mediante el PC, pero entiendo que si lo que quieres es poder configurar la hora independientemente del PC puedes hacerlo mediante unos botones y una pantalla desde el propio Arduino, te creas un menú de ajuste de ahora y así podrás cambiar la zona horaria (la hora).

      Saludos.

  7. Hola, muy interesante el blog y ante que nada feliz año nuevo.

    Estoy haciendo un código en arduino de un proyecto de «secadero de salame», estoy usando el módulo rtcds3231 y un LCD 20×4. El proceso de secado se realiza en dos fases o ciclos; en el primero son 2 días (con temperatura y humedad en las dos fases), y en el segundo 15 (eso después con algún menú voy a cambiar la cantidad de días en cada fase).
    Ahora bien lo que quiero es saber como se hace para sumar o restar días usando la librería de este módulo; necesito que me aparezcan en la pantalla por ejemplo:
    Fase: 1 o 2 (de acuerdo a la cantidad días, si son 1 o 2 días quedaría en Fase: 1, pasando lo 2 días Fase: 2)
    Dias: X (la cantidad de días que van pasando desde que se inicia el proceso) .

    Después tendré que hacer el menú, pero eso es otro tema…

    Saludos…

Escriba aquí su comentario