18
sep 2011
28

Reloj en tiempo real, Real Time Clock RTC, para Arduino con Dallas DS1307

Debido a que nuestro Arduino no cuenta con reloj en tiempo real para saber la hora, dia, año, etc. no podremos hacer proyectos como un reloj-despertador con una pantalla LED/LCD, programar tareas a determinadas horas, y por lo que he leído también es necesario para algunos protocolos de comunicación.

Por ello en esta entrada vamos a ver como crear nuestro reloj, si bien estos se encuentran fácilmente en ebay por menos de 10€, he preferido hacerlo a mano debido a que necesito dos unidades y los materiales totales salen más baratos que comprar 2 relojes ya construidos, ademas aprenderemos más que si lo compramos hecho ;)

El primero lo integrare en mi prototype shield junto a un buzzer, un vibrador y dos switch DIP para liberar los pines de todo lo anterior si lo necesitase.
El segundo lo construiré en un PCB aparte para usarlo de forma independiente en cualquier proyecto.

Materiales necesarios para construir 1 unidad:

  • 1 PCB 30*16mm.
  • 4 Pines macho para la conexión entre el PCB y el Arduino.
  • 1 PIC Dallas DS1307  *
  • 1 Cristal de cuarzo de 32.768 kHz.
  • 2 Resistencias de 2200Ω  *
  • 1 Resistencia de 220Ω  *
  • 1 Led *
  • 1 Pila de botón de 3V y su correspondiente portapilas CR1220  *

* Los componentes son en formato SMD.

El Dallas DS1307 es un reloj que nos proporciona la hora, minutos y segundos así como el día, mes y año. Además cuenta con un calendario que le permite ajustar automáticamente la fecha en meses con menos de 31 días o años bisiestos hasta fin de siglo, 2100. También cuenta con una pequeña memoria SRAM de 64 bytes de los cuales los 8 primeros bytes (0×00 – 0×07) son usados por el reloj y el resto como memoria adicional.

El chip se comunica al Arduino mediante el protocolo  de comunicación en serie I²C, este es soportado por el IDE de Arduino y contamos con la librería Wire para ello.

Para realizar el conexionado debemos de hacerlo de la siguiente forma:

PIC DS1307

  • En el pin 1 y 2 del chip conectamos el cristal de cuarzo.
  • En el pin 3 el polo positivo de la pila y en el pin 4 la masa, GND.
  • El pin 5 lo uniremos por un lado a una de las resistencias de 2200Ω  que a su vez se unirá al pin de 5V del Arduino, por el otro lado lo uniremos al 4 pin analógico del Arduino.
  • El pin 6 es parecido, por un lado a la segunda resistencia de 2200Ω y a su vez a los 5V, y por el otro lado al pin 5 analógico.
  • El 7 se puede usar como salida (configurable por software), para por ejemplo tener un segundero luminoso.
    Por un lado lo uniremos a la resistencia de 220Ω y a su vez a los 5v, por el otro lado al led y este a masa.
  • Y el 8º y ultimo pin lo conectaremos a los 5V

El esquema eléctrico seria el siguiente:

Reloj - Protoboard Reloj - Esquema

Protoboard | Esquema y Fotolito (PSD)

Hay que tener en cuenta que  el esquema como el fotolito están pensados para componentes de superficie por lo que de usarlos deberemos usar componentes adecuados, el protoboard  sin embargo si muestra componentes THT.

Durante el montaje me dio por grabarlo con la cámara y así documentar un poco más el proyecto. El primer vídeo muestra el montaje de los componentes y el segundo la puesta en marcha del reloj y prueba mediante conexión serie, en los próximos proyectos mostrare la hora en matrices de leds y/o LCDs.

Y por ultimo el código el cual esta programado para mostrar la hora por el puerto serie. Para hacer funcionar el Led he necesitado usar la librería DS1307.h ya que sin ella no he sabido usarlo, es para lo único que la uso por lo que si se decide prescindir del Led se puede borrar el código señalado.


Entrada con 28 Respuestas

  1. 18 septiembre 2011 a las 11:25 am

    te ha quedado de lujo, felicidades… cuando me tenga que haceru uno ya se donde buscar como hacerlo ;)

    • 18 septiembre 2011 a las 18:30 pm

      Gracias, aunque me tendré que mirar lo de la librería DS1307.h, creo que usándola ira más fino que haciendo los cálculos “a mano”.
      Nos vemos por fc :P

    • 9 noviembre 2012 a las 6:02 am

      Muy útil, voy a implementarlo en una matriz de led

  2. 15 noviembre 2011 a las 3:40 am

    y que pasa si uso otro cristal?

    • 15 noviembre 2011 a las 12:12 pm

      Si usas otro cristal tendrás un reloj que no funcionara en tiempo real, que un minuto no serán 60 segundos, quizás sean 80 segundos o 20 segundos, y un segundo no serán mil milisegundos…

      De hecho los cristales nunca son de la frecuencia exacta que te indican, se aproximaran más o menos pero jamas son exactos, dependiendo de la calidad sera más exacto, y mientras más exacto sea mejor sera la hora, con un buen cristal quizás te atrasa/adelanta un segundo cada año o más, con uno malo quizás pierdes un par de minutos a la semana, al dia, a la hora…

      En resumen, el cristal ha de ser de 32.768 kHz y de calidad.

      Saludos.

  3. 16 marzo 2012 a las 4:22 am

    Hola, antes que nada felicitaciones por tu trabajo, en mi caso compre el circuito ya hecho, lo conecte como indicas y logre obtener los datos en el monitor solo que todos en 0, necesito poner el reloj a la hora y no logro hacerlo, he seguido al pie de la letra tu codigo, tienes algun comentario al respecto. Saludos.

    • 16 marzo 2012 a las 11:12 am

      Si lo tienes todo configurado aunque no lo hayas puesto en hora deberías de ver la hora por defecto, creo que empieza a contar en el año 2000…
      Mira de todas formas en el setup que hayas descomentado las variables que modifican la hora, tienes que grabar el código con las variables descomentadas para poner el reloj en hora y después grabarlo de nuevo con las variables descomentadas para que no se ponga en esa hora cada vez que enciendes el arduino.

      Si has hecho eso se me hace raro que no te funcione, prueba por si acaso lo siguientes:
      De mi código, borra las lineas:

      Y también borra:

      Saludoss

    • 16 marzo 2012 a las 12:32 pm

      Gitesa muchas gracias por responder, todo lo que tu me indicas ya lo he probado, es verdad que me indica hora 00.00 año 2000, si esta leyendo el reloj debería tambien grabar, te cuento que mi profesion es programador de computadoras por lo cual se me hace mas facil entender los codigos, pero en la electronica algo entiendo, me apasiona poder desarrollar proyectos en arduino, este es mi primer proyecto debo activar y desactivar dos switch, dependiendo de la hora y el dia de la semana, ademas debo considerar los festivos de mi pais, esto lo tengo muy claro como hacerlo solo me falta poner el reloj a la hora.

      Saludos desde La Serena-Chile.

    • 16 marzo 2012 a las 12:51 pm
    • 16 marzo 2012 a las 15:40 pm

      Estamos igual pues, yo también soy(seré) programador y en la electrónica se lo básico. Como te comento se me hace raro que no funcione, el código es bastante simple y el modulo que estas usando usa el mismo chip que use yo, vamos es todo igual.

      Puedes probar a usar la librería DS1307.h. En mi caso la use solo para poder usar el pin de salida del ds1307 como segundero con un led. Pero la librería te permite usar el reloj por completo, quizás mi código (que esta basado en otros códigos…) no sea perfecto, seguramente la librería que te comento si lo este. Si aun así no te funcionase prueba con otro Arduino, o quizás el modulo de reloj este en mal estado :-/

      Saludos desde españa ;)

    • 18 marzo 2012 a las 16:04 pm

      Giltesa, colega, no sabes cuanto me sirve tu ayuda, tengo la librería DS1307.h pero no se en que carpeta debo ponerla pues al compilar no la encuentra, sabes donde debo ubicar dicha libreria.

      Mil gracias..

    • 18 marzo 2012 a las 22:49 pm

      En el directorio de instalacion de Arduino tienes una carpeta llamada “libraries”, copias dentro el fichero.h y ya esta.
      Si estas usando linux entones lo tienes en el directorio: /usr/shares/arduino/libraries
      Y a una muy mala, puedes añadir la librería mediante una ruta relativa así:
      #include “DS1307.h” //Y la libraría colocada en el directorio del .pde/.ino

      Saludoss

    • 19 marzo 2012 a las 14:37 pm

      Gitesa nuevamente gracias, sabes que efectivamente tengo el DS1307.h en libraries incluso en una carperta DS1307, pero a pesar de esto no encuentra el archivo y me arroja los siguientes errores:

      sketch_mar19a.cpp:4:20: error: DS1307.h: No such file or directory
      sketch_mar19a.cpp: In function ‘void loop()’:
      sketch_mar19a:25: error: ‘RTC’ was not declared in this scope

      Esto es muy extraño, te informo te utilizo Windows 7, Arduino version 0023, necesito programar en encendido/apagado de dos reles, dependiendo de la hora y el día de la semana.

      Saludos

  4. 19 marzo 2012 a las 15:54 pm

    Hola,

    Prueba usando la versión 1.0 del IDE, o a poner la librería DS1307.h con una ruta relativa y no desde las libreras del IDE.

    O a bajarte de nuevo el IDE, quizás se hayan mezclado algunos ficheros y por eso los errores.

    Saludos.

    • 19 marzo 2012 a las 23:14 pm

      Hola, instale la version 1.0 rc2, al parecer ahora si tomo la librería solo que me da otros errores de variables, debe ser que mi archivo DS1307.h fue cambiado, yo lo baje ya no se de donde, si fueses tan amable de enviarme tu archivo, te lo agradezco inmensamente, mi email es berty.cortes@intelsoft.cl.

      Estos son los mensajes de errores de compilacion:.

      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:65: error: ‘boolean’ has not been declared
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:66: error: ‘boolean’ has not been declared
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:67: error: ‘boolean’ has not been declared
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:71: error: ‘byte’ has not been declared
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:72: error: ‘byte’ has not been declared
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:73: error: ‘byte’ has not been declared
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:74: error: ‘byte’ does not name a type
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:75: error: ‘byte’ has not been declared
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:76: error: ‘byte’ does not name a type
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:77: error: ‘byte’ has not been declared
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:77: error: ‘byte’ has not been declared
      C:UsersBertyarduino-1.0-rc2librariesDS1307/DS1307.h:80: error: ‘byte’ does not name a type

    • 20 marzo 2012 a las 0:41 am

      Acabo de probar la librería y si, da muchos problemas tanto en un ide como en el otro. No se cual puede ser la causa.
      Sin embargo tienes otra librería más, es la “RTClib.h”, la acabo de probar con la consola serial y va perfecta, prueba a ver si con esa consigues que funcione el reloj.

      Código: http://www.ladyada.net/learn/breakoutplus/ds1307rtc.html
      Librería: https://github.com/adafruit/RTClib

    • 20 marzo 2012 a las 3:47 am

      Justamente estaba en eso, el compilador funciona perfecto, pero no logro poner la hora y fecha, creo que existe algún problema con el hardware tratare de cambiarlo, Te agradezco tus respuestas.

      Saludos

    • 23 marzo 2012 a las 19:58 pm

      Les informo que solucione el problema de la puesta a la hora del reloj DS1307, resulta que yo estaba utilizando los pines 3 y 4, esto es para Arduino Uno, en mi caso tengo Arduino Mega por lño tanto utilice los pines 20 y 21 SDA y SCL respectivamente y funciona perfecto.

    • 25 marzo 2012 a las 15:16 pm

      Giltesa, necesito hacerte otra consulta, te cuento que yo estoy inscrito en el foro de Arduino pero no logro abrir un nuevo hilo como para hacer consultas, mira se trata que debo preguntar en el programa si el la hora es mayor a las 22:00 debo apagar el pin 1.

      if (Hora = 22) && (Minutos > 0) Aqui poner las instrucciones de apagar pin 1

      Pero resulta que el compilador me arroja error en el if, al parecer es por tipo de datos de las variables que son Byte, entonces debo convertir de Byte a Int, no encuentro como se hace, tienes alguna idea?.

      Saludos cordiales

    • 25 marzo 2012 a las 15:45 pm

      Hola, seria algo asi:

      Saludos.

    • 26 marzo 2012 a las 13:08 pm

      Ahora funciona bien, solo me faltaba utilizar doble = (==) en la setencia if, me parece que se debe al tipo de variable (Byte). Saludos

    • 26 marzo 2012 a las 17:51 pm

      No, el signo de comparación es ese en Arduino (Procesign) y otros muchos lenguajes: C, C++,Java, Javascript, PHP. Solo, de los que conozco, en Ada es un = y no dos, claro que el de asignación no es =, si no :=

      Y todas las condiciones se ponen dentro del paréntesis, nada de poner varios paréntesis y en cada uno de ellos una condición…

      Saludoss

  5. 12 junio 2012 a las 12:45 pm

    Perdonoa por molestarte pero estoy con el relog para arduino y necesito el esquema para plancharlo en placa con su tamaño original no lo tendras por casualidad ,gracoias

    • 12 junio 2012 a las 13:22 pm

      Hola, molestia ninguna!

      Tienes adjunto el fichero PSD, lo abres con el Photoshop y lo tienes listo para imprimir.

      Te podría facilitar también el fichero del esquema pero lo hice con otro programa distinto de eagle, concretamente con Sprint Layout.

      Pero ya te digo que con el PSD debería de poder imprimir el fotolito en el tamaño adecuado. Si tienes cualquier problema solo tienes que preguntar!

      Saludoss

  6. 1 septiembre 2012 a las 14:10 pm

    [...] Reloj en tiempo real DS1307 [...]

  7. 3 mayo 2013 a las 6:45 am

    muy buenas saludos desde el salvador =D necesitaba hacerles algunas consultas mi caso es contrario al de ustedes, el hardware lo manejo a la perfección pero el firmware aun estoy como en un 50% quería saber si me puedes ayudar con algunas pequeñas dudas

    • 3 mayo 2013 a las 6:48 am

      por cierto la librería que utilizo es la misma del compañero bertifox

    • 3 mayo 2013 a las 7:24 am

      Hola,

      Si tienes problemas con la librería yo cree una que hasta ahora me ha ido bien, aunque es para el IDE 0022.
      http://giltesa.com/2012/09/02/libreria-gds1307-para-rtc/

      Si es con algo concreto solo tienes que preguntar, a ver si te puedo ayudar.

      Saludos!

Escriba aquí su comentario


Notificarme los nuevos comentarios por correo electrónico.
Tambien puedes suscribirte sin comentar.