bclose

Arduino y los relojes RTC

Usando un reloj integrado y batería de respaldo

Objetivos

.

 
    • Presentar los RTC Real Time Clocks.
    • Montar un circuito con un Tiny RTC.
    • Presentar las librerías complemento de Time, llamadas DS1307RTC y TimeAlarms.
    • Argumentos __DATE__ y __TIME__
 

Material requerido.

 

 Tienda EspañaTienda Mexico
Kit Arduino Uno Kit inicio UNOKit inicio UNO
Kit Arduino MEGAKit Inicio MegaKit Inicio Mega

 

Los relojes de tiempo real o RTCs

 

En la sesión anterior, presentamos la nueva librería Time para Arduino. Empezamos utilizando el reloj interno para los ejemplos, porque es una opción que siempre está disponible y además es de precio imbatible.

Pero dijimos que tenía varios problemas evidentes, como eran el hecho de que el reloj interno se reinicia cada 50 días aproximadamente, y además si cortamos la corriente a nuestro Arduino, pone el reloj a 00 y vuelve a empezar desde el 1 de enero de 1970, lo que no mucho.

Necesitamos una solución, que nos permita usar un reloj fiable que se mantenga incluso cuando apagamos Arduino. ¿Y qué ocurre cuando tenemos que resolver un problema electrónico? Pues que hay un fabricante, o varios, que nos suministran un chip para resolverlo.

Uno muy extendido para reloj digital es el DS1307 de Maxim. Por muy poco dinero realiza todas las funciones para llevar un reloj con calendario y solo hay que añadirle una batería externa para que no pierda la hora al perder la corriente. Sus características son:

Chip reloj DS1307
  • RTC: Real Time Clock, o reloj de tiempo real. Que lleva la cuenta de segundos minutos y horas además de día mes y año automáticamente, válido hasta el año 2100.
  • 56 byte de memoria RAM respaldada por una batería exterior, que mantiene la fecha y hora cuando no hay corriente.
  • Detección automática de corte de corriente y cambio a modo batería.
  • Muy bajo consumo, lo que ayuda a que la batería dure entre 5 y 10 años.
  • I2C integrado en el mismo chip.

 

Reloj con bateria RTC clock

Además, es bastante fácil conseguir un reloj con batería montado en una placa y listo para usarse en nuestros proyectos, por unos pocos euros.

En esta sesión vamos a usar uno de estas placas, la Tiny RTC, con el DS1307, montado en un soporte de conexión, con su cristal, una batería de respaldo, y bus I2C, con lo que solo tendremos que conectar unos pocos cables y podremos empezar a jugar con el tema.

 

 

Diagrama de conexión

 

De nuevo la conexión es trivial. Simplemente conectar SDA a Arduino A4 y SCL a A5.


Tiny RTC

Y para la protoboard:

Sesion 55_bb

El pin SQW, es una salida digital del chip DS1307, que nos permite generar una señal cuadrada de frecuencia programable( De1Hz, 4kHz, 8kHz,32kHz) que podemos emplear como base de tiempos para el reloj de cualquier circuito sin necesidad de un cristal adicional de cuarzo y circuito oscilador (Que ya lleva el propio Tiny RTC)..

Por eso, en este caso, como no vamos a usarlo, lo dejamos sin conectar tranquilamente, después de comprobar en la hoja de normas que podemos hacerlo sin problemas.

 

El programa de control

 

En la sesión anterior descargamos e instalamos la nueva librería Time en nuestro IDE.  La ventaja de utilizar una librería coherente es que todas las funciones que vimos en la sesión previa siguen siendo válidas y se usan igual aunque tengamos ahora un reloj diferente.

Basta con que instalemos el modulo correspondiente al nuevo reloj DS1307. Y para ello descargamos e instalamos una nueva librería aquí Libreria DS1307RTC,

Como lo normal cuando instalas un RTC, es que no tenga la hora ajustada, vamos a empezar por ahí. Vamos a ver si el chip ha sido puesto en hora:

#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h>  // La libreria que gestiona el DS1307 RTC para Time

void setup()
   {    Serial.begin(9600);
        while (!Serial) ;  // Solo si usas un Arduino Leonardo
        setSyncProvider(RTC.get);     // Sincronizar con el RTC
        if(timeStatus()!= timeSet)
             Serial.println("Unable to sync with the RTC");
        else
             Serial.println("RTC has set the system time");
   }

Las tres primeras líneas cargan las librerías necesarias. Las dos primeras ya las usamos en la sesión anterior y la correspondiente al DS1307 se debe al RTC que vamos a usar. Fíjate en la línea:

  setSyncProvider(RTC.get);     // Sincronizar con el RTC

Las librerías están escritas de forma que usando setSyncProvider() podemos definir el modelo de reloj que vamos a usar y que todo el resto del programa sea el mismo, independientemente de la base del reloj. No esta mal, es la ventaja de usar unas librerías coherentes.

En el setup hacemos uso de timeStatus () para saber si el reloj está o no en hora.  En caso de que no esté en hora podemos añadir al setup una línea más con setTime () para ajustar el reloj. En mi caso he añadido:

setTime(21,46,00,8,11,2014); // Las 21:45:00 del dia 8 de Nov de 2014

Reemplaza la hora por el valor que corresponda y corre el programa para sincronizar el reloj.

 
  • Asegurate de que corres el setTime una única vez, porque si lo haces repetidamente volverás una y otra vez a poner la misma hora en el reloj interno del DS1307.
  • Cuando hayas ejecutado el programa y la hora sea correcta, simplemente convierte en comentario la línea del setTime.
 
Podemos ya escribir un programa completo que nos de la fecha y la hora en la puerta serie.

Contenido solo disponible para suscriptores. ¡Accede al contenido!

        

La función printDigits, se asegura de que siempre haya dos dígitos en los números correspondientes, añadiendo un cero por delante cuando el número es menor que 10, con lo que tendremos un bonito calendario en la puerta serie.

Calendario con RTC

 

Usando la fecha y hora del compilador.

 

Si estás haciendo pruebas con la librería a deshoras, es frecuente que tengas que recompilar una y otra vez tu código, y si cada vez tienes que poner en hora a mano el reloj, lo normal es que acabes dando alaridos de frustración con el asunto (Si fueras alguien tranquilo es poco probable que estuvierasleyendo esto, tendrías un oficio sensato como contable, o abogado de un ayuntamiento).

Pensando en tus vecinos, el compilador de Arduino, dispone de un par de argumentos que nos informan de la fecha y hora de la última compilación: __DATE__ y __TIME__.

Podemos aprovechar esto para poner en hora el reloj interno corriendo un programita que convierta estos valores a formato fecha time_t y asignarlo al valor del reloj interno.

De este modo, aunque arrastraremos un par de segundos de error, asignaremos una hora razonablemente buena al reloj, sin necesidad de estar recompilando continuamente para ponerlo en hora.

Basta con que corráis este programa y la magia se encargara del resto. Los que no creáis en la magia podeis echar una ojeada al programa, porque aunque contiene algunas instrucciones de C++ que no hemos visto no tendréis mucho problema en seguirlo.

Aquí tenéis el programa de Ajuste automatico de fecha y hora

 

Librería TimeAlarms

 

Existe una librería más, relacionada con la librería Time, llamada TimeAlarms que nos permite definir alarmas en nuestro programa, muy al estilo de la que podemos fijar en un reloj despertador.Cuando una alarma dispara, llama a una función específica que se ejecuta en el momento preestablecido.

Podemos descargar la librería TimeAlarms de aquí TimeAlarms.zip

Dispone de varias funciones que vamos a enumerar aquí:

 Función Descripción
Alarm.alarmRepeat(hours, minutes, seconds, function);Crea una alarma que se repite cada día a la hora especificada y ejecuta la función
Alarm.alarmRepeat(dayofweek, hours, minutes, seconds, function);Crea una alarma que dispara solo el día de la semana especificada a la hora prevista
Alarm.alarmOnce(hours, minutes, seconds, function);Dispara mañana una única vez a la hora fijada y ejecuta la función
Alarm.alarmOnce(dayofweek, hours, minutes, seconds, function); .Dispara una única alarma el próximo día de la semana que le digamos y ejecuta la función
Alarm.timerRepeat(seconds, function);Llamará a la función especificada cada tantos segundos
.timerOnce(seconds, function);Llamará una única vez a la función al cabo de los segundos especificados

Es una librería interesante si tenéis que repetir tareas periódicamente (Como enviar datos a algún sitio) y además nos ofrece uno timers cómodos que se ejecutan de forma programada, sin necesidad de definir interrupciones que podrían interferir con otros funciones.

 
  • La librería TimeAlarm no emplea interrupciones, sino que se apoya en la gestión interna de Time,
  • TimeAlarm necesita ningún hardware o RTC especifico, solo requiere que la librería Time esté cargada.
  • Se pueden definir hasta 6 alarmas, cambiando el header de TiemeAlarm.h
  • No se pueden definir intervalos menores de 1 segundo. Para periodos inferiores se requiere usar una interrupción programada o Timer (que veremos en una sesión posterior)
 

Resumen de la sesión

 

Hoy en nuestro curso arduino hemos aprendido lo siguiente:

 

 

    • Hemos visto cómo usar un RTC con la librería Time. No hay diferencias con usar el reloj interno de Arduino más allá de definir el  setSyncProvider ().
    • Vimos algún ejemplo de cómo poner el reloj en hora con setTime y usando los argumentos del compilador __TIME__ y __DATE__.
    • Presentamos además la librería de TimeAlrms para disparar funciones en alarmas programadas.
 

 

 

 

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(215) Comments

  • Antes de nada gracias por toda la información que nos proporcionas. Al intentar compilar el programa ejemplo que nos muestras obtengo los siguientes errores. ¿Sabéis a que se debe? Gracias de antemano.

    Arduino:1.6.13 (Windows 10), Tarjeta:”Arduino/Genuino Uno”

    In file included from C:\Users\jesus\Documents\Arduino\Prog_55_1\Prog_55_1.ino:4:0:

    C:\Users\jesus\Documents\Arduino\libraries\DS1307RTC/DS1307RTC.h:19:22: error: ‘tmElements_t’ has not been declared

    static bool read(tmElements_t &tm);

    ^

    C:\Users\jesus\Documents\Arduino\libraries\DS1307RTC/DS1307RTC.h:20:23: error: ‘tmElements_t’ has not been declared

    static bool write(tmElements_t &tm);

    ^

    C:\Users\jesus\Documents\Arduino\Prog_55_1\Prog_55_1.ino: In function ‘void setup()’:

    Prog_55_1:12: error: ‘setSyncProvider’ was not declared in this scope

    setSyncProvider(RTC.get); // the function to get the time from the RTC

    ^

    Prog_55_1:14: error: ‘setTime’ was not declared in this scope

    setTime(23,29,00,8,11,2014); // Las 21:45:00 del dia 8 de Nov de 2014

    ^

    Prog_55_1:16: error: ‘timeStatus’ was not declared in this scope

    if (timeStatus() != timeSet)

    ^

    Prog_55_1:16: error: ‘timeSet’ was not declared in this scope

    if (timeStatus() != timeSet)

    ^

    C:\Users\jesus\Documents\Arduino\Prog_55_1\Prog_55_1.ino: In function ‘void digitalClockDisplay()’:

    Prog_55_1:29: error: ‘hour’ was not declared in this scope

    Serial.print(hour());

    ^

    Prog_55_1:30: error: ‘minute’ was not declared in this scope

    printDigits(minute());

    ^

    Prog_55_1:31: error: ‘second’ was not declared in this scope

    printDigits(second());

    ^

    Prog_55_1:33: error: ‘day’ was not declared in this scope

    Serial.print(day());

    ^

    Prog_55_1:35: error: ‘month’ was not declared in this scope

    Serial.print(month());

    ^

    Prog_55_1:37: error: ‘year’ was not declared in this scope

    Serial.print(year());

    ^

    exit status 1
    ‘setSyncProvider’ was not declared in this scope

      • Ivan

      Hola Jesús, parece algún error en la librería. Prueba a desinstalarla y descargarla de nuevo. Un saludo.

      • Admin

      Hola Jesus,

      Parece el tipico problema de una version incorrecta de la libreria. Busca en google la ultima version y veras como se corrige

  • Como el programa es un poco extenso lo explico

    Es un reloj con alarma que utiliza una lcd i2c y un sensor ir para mediante un mando programar el reloj.

    Es sencillo pero la HORA cuando pasa de marcar las 15h alas 16h salta a las 10h tanto en modo automatico como a la hora de programar una hora por ejemplo las 19h.
    Creo que tiene que ver con la libreria o con la lectura del byte bien pero estoy atascado si me pudieseis ayudar os lo agradeceria.

      • Admin

      Hola Salvador, es preferible que los programas largos los postees en el foro donde otras personas puedan comprobar y ayudarte con el codigo ¿Vale?

      Un saludo

    • Ivan

    Hola Salvador, sin ver la programación no sé muy bien qué decirte…

  • Hola me marca un error al compilar la libreria me dice que no se ha definido year cuando ocupo la libreria “Time.h”

      • Admin

      Hola Yair, dame mas pistas ¿como es la linea y el error exactamente?

    • Juan josé smith

    Hola saludos excelente tutorías he aprendido pero en este caso no me compila me sale error de compilación y ya instale muy bien la librería
    setSyncProvider Was not declarared in this scope

      • Ivan

      Hola! Yo desinstalaría la librería y probaría a bajar la ultima versión e instalarla de nuevo. Un saludo.

  • Hola genio! Te cuento que estoy con un proyecto de domotica usando los esp8266 que describiste =D y ahora tengo una duda connel rtc interno usando la libreria time. Vos decis que el contador se reinicia cada 50 dias por el tipo de variable que se usa para el conteo pero… La libreria es tan mala que no areegla este error? No entiendo por que no se podria corregir por software… Desde ya muchas gracias y me quedo a la espera de la respuestaaa

      • Admin

      Hola Franco, el problema es que los registros de arduino para contar el tiempo con millis() o micros() tienen logicamente un limite de capacidad. Cuando alcanzas el fin se ponene a cero. ¿podria apuntar en una posicion de memoria que me llevo una y seguir contando tan ricamente, pero con un problema: si hay un reset en este momento nos abre cuantas llevaba apuntadas

      Por eso para estar seguro hay que usar un reloj externo con bateria para tener una referencia con garantias

  • Buenas noches e estado configurando mi RTC y tengo un problema por q cada vez que desconecto el arduino el reloj regresa a la hora inicial e probado de todo asta e comprado otro RTC pero el problema sigue

      • Ivan

      Hola Joseph, cada vez que reinicies el RTC cogerá como inicio la hora que hayas puesto en el setTime. Prueba a correr el programa Ajuste automatico de fecha y hora que hay justo al final de la sesión. Un saludo.

  • Hola..

    Oye estoy en un proyecto de automatizaciòn de un timbre, he intentado usar tu ejemplo, al momento de compilar en arduino me marca un mensaje ”
    La Librería no puede usar ambas carpetas ‘src’ y ‘utilidad’. Doble marcado C:\Users\Watashi wa kira dess\Desktop\Programas\Arduino\arduino-nightly\hardware\arduino\avr\libraries\Wire

    Error de compilación”
    Me podrías ayudar te lo agradeceria mucho.

    Gracias.

      • Admin

      No se si el error que te da se debe a que ha localizado mas de una libreria o a que hay un error en la linreria.

      Procura descargarte la ultima version de github y espero que se resuleva tu problema

    • Juan

    hola a todos…amigos es posible crear una aplicacion(android) para programar las horas de toque del timbre, supongo que la comunicacion seria por bluetooth , me gustaria que me ayudaran!!!

      • Admin

      Lamento decirte Juan que no tengo ni idea de como hacer aplicaciones Android

    • Francisco

    hola ya e conseguido el poner la alarma, simplemente cambiando el delay por Alarma.delay, lo que no consigo que me memorice la fecha y hora

      • Admin

      Hola Francisco, tiene toda la pinta de que no hace buen contacto la pila o bien la has puesto al reves

  • Hola Jesus,

    Una pregunta que se me ha pasado antes, durante cuanto tiempo ha estado funcionando tu DS3231 ? Yo tengo pensado que funcione durante al menos 3 años. Es para una instalación que he realizado a un ayuntamiento.

      • Jesús Sánchez

      Hola Juan.

      Armé en protoboard una mini estación Meteo, vamos, mostraba la hora, el día, el año, la temperatura y la humedad. Cuando lo monté la primera vez, actualicé la hora y fecha del RTC y mantenía la estación encendida algunas horas. Luego la apagaba. Al volver a encenderla, la fecha y hora seguian siendo correctas, gracias a la pila que lleva incorporada. Como al inicio del sketch, Arduino le solicita la fecha y la hora actual para mostrarla, no había problema en apagarlo. Así durante un mes o dos, no recuerdo. Luego lo desmonté, pero el RTC sigue con la pila y seguirá (espero) mostrando la fecha y hora actual. La pila debe ser una LIR2032, que es recargable. Las CR2032 no lo son.

      Sería cuestión de montarlo y observar si hay desviación.

      Si es para un proyecto fijo, podrías implementar un sistema externo con pulsadores, un LCD y un pequeño menú para poder actualizar la hora manualmente.

      Yo probaría antes a tenerlo fijo conectado y ver si desvía, siempre que el proyecto no te corra prisa.

      Saludos.

      • Jesús Sánchez

      Hola de nuevo.

      Por curiosidad, he cogido el DS3231 que tenía guardado en un cajón, lo he conectado, y tiene una desviación de 2 segundos desde Enero de 2016, o sea, en 9 meses se ha adelantado apenas unos segundos. Ahora, tambien te digo que puede que no se haya adelantado, pues no recuerdo cuando le programé la hora en su día si le dí algunos segundos de más por el pequeño desfase a la hora de cargar el sketch. Aun así, la exactitud es envidiable.

      Saludos.

  • Muchísimas gracias por la info. Lo sustituiré para poder solventar ese problema. Ahora ha empezar con las nuevas librerias del RTC y demás, jeje.
    Saludos

    • Juan

    Hola,

    Me gustaría plantear una pregunta a ver si ha alguno le ha ocurrido como a mi. Tengo un proyecto tan solo activa y desactiva una bomba. El usuario llega selecciona los litros que quiere y el motor se los suministra, todo ok. Pues bien el equipo se encuentra en Servicio o Fuera de Servicio en determinadas franjas horarias. Es decir, está en Servicio desde las 8:00 hasta las 21:00 H y el resto del tiempo Fuera de Servicio para que no pueda ser activado. El tema es que esta franja horaria la programé con el RTC 8563. El programa pregunta que hora es en el bucle principal, mediante la función comprobar_hora(), que he programado con funciones de la librería RTC8563. Si la hora está dentro de la franja horaria de desactivación lo mantengo en un bucle while hasta que sea la hora de activación.
    La función comprobar_hora () utiliza las funciones que vienen en la librería rtc :
    rtc.getDateTime();
    rtc.getHour();
    rtc.getWeekday();
    rtc.getMinute();
    Ha estado funcionando bien durante un mes y medio pero ahora sufre un retraso de 30 min. Es como si el rtc se hubiera retrasado 30 min. Es como si en cada ciclo fuese acumulando un pequeño retraso. Porque supongo que si hay algún delay en la ejecuación del void loop, para nada afecta al rtc. En fin, estoy un poco perdido con esto.

    Perdón por el rollazo

    void loop() {

    comprobar_hora();

    if (check_flag()==LOW) { // Si la señal de fallo está activa se interrumpe el servicio y se vuelve a condiciones iniciales. Ver check_flag (), interrupcion_servicio () e inicializar_reles().
    interrupcion_servicio();
    inicializar_reles();
    }
    else{
    if (escanear_entradas (pinesEntradas,NUMERO)==HIGH){// Escaneando entradas y solo empiezo el proceso cuando se ha realizado pulsación y no hay ninguna bandera acitva.
    asignar_litros(canal);
    delay(RETRASO); // Retraso antes de activarse la boma
    releOn(BOMBA); // Activo bomba
    if(contar_litros()==HIGH){
    releOff(BOMBA); // Desactivo bomba
    releOn(RESET); // Se resetea la placa ya que tiene un tiempo mayor al del servicio.
    delay(500); // Retraso de 0,5 seg para asegurarnos que la placa se resetea correctamente
    releOff(RESET); // Se desactiva el reset

    }
    else{ // Si no se terminase el contaje de litros, se interrumpe el servicio y se vuelve a condiciones iniciales. Ver contar_litros (), interrupcion_servicio () e inicializar_reles().
    interrupcion_servicio();
    inicializar_reles();
    }
    }
    }

      • Ivan

      Hola Juan, nunca he tenido tanto tiempo encendido un RTC, pero por lo que tengo entendido son muy sensibles a los cambios de temperatura y esto puede llevarles a errores como el que indicas. Si va a estar muccho tiempo funcionando y necesitas que lo haga con cierta precisión tendrías que usar un RTC que tenga a un sensor de temperatura que compense las variaciones de frecuencia como puede ser el DS3231. Un saludote!

      • Jesús Sánchez

      Hola Juan.

      Como comenta Ivan, parece que ese chip no trae compensación de temperatura, que sí trae, por ejemplo, el DS3231. Su hermano pequeño, el DS1307 me llegaba a atrasar hasta varios minutos a la semana. Cuando lo cambié por el DS3231 la hora se mantenía exacta en todo momento. Ni comparación.

      Saludos.

    • Alexander

    Y si quieres colocarle un teclado de configuración 4*4 como haríamos?

      • Admin

      tienes un tuto sobre como manejar los keypads en la seccion de cursp de inicio alex

    • Carlos

    Hola buenas,
    Tengo un problema, cargo el código y establezco la hora, comento la línea del setTime, vuelvo a cargar el programa y la hora mostrada ahora tiene un retraso respecto a la real (unos 6 s). ¿Alguna idea?

      • Ivan

      Si estás usando el programa de ajuste de hora automático es normal arrastrar algunos segundos de error. Y si estás cargando el primero es normal que cada vez que lo cargues se te vaya atrasando a no ser que lo vayas modificando el setTime

    • Martín Smith

    /* ————————————-
    * –GNUinos–> Soluciones Infomticas—
    * –Smith, Martin Rafael—————
    * –San Francisco, Cordoba, Argentina–
    * –www.gnuinos.com.ar—————–
    * –consultas@gnuinos.com.ar———–
    *
    * –TIMBRE PABLO VI V1.0—————
    *
    * Agradecimiento a PROMETEC.NET——–
    */

    #include
    #include
    #include

    #include
    DS3231 rtc(SDA, SCL); // Inicializar RTC DS3231 (En Arduino Nano A4=SDA y A5=SCL)

    #include “TM1637.h”
    #define CLK 3 //Pines para TM1637 (Display)
    #define DIO 2 //Pines para TM1637 (Display)
    TM1637 tm1637(CLK,DIO); //Asignacin de pines para TM1637

    int botonHora=4;
    int botonMinuto=5;
    int timbreInterno=9; //buzzer 5v para pruebas

    int salida1=10; //Salida Relee 1
    int salida2=11; //Salida Relee 2

    boolean estado=0; //Estado de los Relee
    boolean puntos=0; //Estados del separador de horas y minutos —> “:”

    Time tiempo;

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

    pinMode(salida1, OUTPUT);
    pinMode(salida2, OUTPUT);
    pinMode(timbreInterno, OUTPUT);
    digitalWrite(salida1, !estado);
    digitalWrite(salida2, !estado);

    pinMode(botonHora,INPUT_PULLUP);
    pinMode(botonMinuto,INPUT_PULLUP);

    tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
    tm1637.init();

    rtc.begin();

    // Desactivar comentarios si es necesario setear hora y/o fecha del Reloj
    // rtc.setDOW(THURSDAY); // Dia de la Semana
    // rtc.setTime(16, 10, 49); // Hora 16:10:49 (formato de 24hs)
    // rtc.setDate(16, 7, 2016); // Fecha 16 de Julio de 2016

    tiempo = rtc.getTime();
    setTime(tiempo.hour,tiempo.min,tiempo.sec,tiempo.mon,tiempo.date,tiempo.year);
    //Serial.println(String(tiempo.date, DEC) +”/”+ String(tiempo.mon, DEC) +”/”+ String(tiempo.year, DEC));
    Serial.println(rtc.getDateStr());

    Alarm.alarmRepeat(7,30,0, timbreLargo);
    Alarm.alarmRepeat(8,10,0, timbreCorto);
    Alarm.alarmRepeat(8,50,0, timbreLargo);
    Alarm.alarmRepeat(9,00,0, timbreLargo);
    Alarm.alarmRepeat(9,40,0, timbreCorto);
    Alarm.alarmRepeat(10,20,0, timbreLargo);
    Alarm.alarmRepeat(10,30,0, timbreLargo);
    Alarm.alarmRepeat(11,10,0, timbreCorto);
    Alarm.alarmRepeat(11,50,0, timbreLargo);
    Alarm.alarmRepeat(11,55,0, timbreLargo);
    Alarm.alarmRepeat(12,35,0, timbreCorto);
    Alarm.alarmRepeat(13,15,0, timbreLargo);
    //Alarm.timerRepeat(15, timbreLargo); // Alarma Cada 15 Segundos
    //Alarm.timerOnce(10, timbreLargo); // Prueba Timbre largo a los 10 Segundos
    //Alarm.timerOnce(3, timbreCorto); // Prueba Timbre Corto a los 3 Segundos
    }

    void loop(){
    Alarm.delay(500); // Espera medio segundo para alternar separador de hora y minutos

    if (puntos==1) { // Acciones que se realizan cada 1 Segundo
    if (digitalRead(4)==0) {
    if (hour()==23) {rtc.setTime(0,minute(),0);}
    else {rtc.setTime(hour()+1,minute(),0);}}

    else if (digitalRead(5)==0) {
    if (minute()==59) {rtc.setTime(hour(),0,0);}
    else {rtc.setTime(hour(),minute()+1,0);}}

    tiempo = rtc.getTime();
    setTime(tiempo.hour,tiempo.min,tiempo.sec,tiempo.mon,tiempo.date,tiempo.year);
    digitalClockDisplay();
    }

    CalculaDigitos(hour(), minute());
    } //Fin Loop

    void CalculaDigitos(int hora, int minutos)
    {
    int Digit0 = hora / 10 ;
    int Digit1 = hora % 10 ;
    int Digit2 = minutos / 10 ;
    int Digit3 = minutos % 10 ;

    tm1637.display(0,Digit0);
    tm1637.display(1,Digit1);
    tm1637.display(2,Digit2);
    tm1637.display(3,Digit3);
    tm1637.point(puntos);
    puntos=!puntos;

    }

    void timbreLargo(){ //Activa la salida1 por 5 Segundos
    digitalClockDisplay();
    Serial.println(“Timbre Largo”);
    digitalWrite(salida1, estado);
    tone(timbreInterno, 500);
    Alarm.delay(5000);
    noTone(timbreInterno);
    digitalWrite(salida1, !estado);
    }

    void timbreCorto(){ //Activa la salida1 durante dos ciclos de 1 segundo
    digitalClockDisplay();
    Serial.println(“Timbre Corto”);
    digitalWrite(salida1, estado);
    tone(timbreInterno, 500);
    Alarm.delay(1000);
    noTone(timbreInterno);
    digitalWrite(salida1, !estado);
    Alarm.delay(1000);
    tone(timbreInterno, 500);
    digitalWrite(salida1, estado);
    Alarm.delay(1000);
    noTone(timbreInterno);
    digitalWrite(salida1, !estado);
    }

    void probarTimbre(){ //Prueba Salida1 y Salida2 por 1 segundo
    Serial.println(“Probando Timbre..”);
    digitalWrite(salida1, estado);
    Alarm.delay(1000);
    tone(timbreInterno, 500);
    digitalWrite(salida1, !estado);
    digitalWrite(salida2, estado);
    Alarm.delay(1000);
    noTone(timbreInterno);
    digitalWrite(salida2, !estado);
    }

    void digitalClockDisplay()
    {
    Serial.print(hour());
    printDigits(minute());
    printDigits(second());
    Serial.println();
    }

    void printDigits(int digits)
    {
    Serial.print(“:”);
    if(digits < 10)
    Serial.print('0');
    Serial.print(digits);
    }

    • Martín Smith

    Guillermo, acabo de terminar una alarma escolar con los mismos componentes que mencionas… Ahora la estoy probando y parece funcionar Correctamente… En breve (no estoy en casa) subiré el código comentado…

  • Una vez mas, felicitaciones por el Blog es realmente genial! queria hacerte una consulta, yo necesito conectarle un RTC a un sistema que estoy implementando pero en el mismo uso el sensor BH1750 que tambien utiliza la comunicacion I2C y las entradas A4 Y A5. queria consultarte si hay alguna fomra de conectar los dos y que puedan funcionar ambos correctamente. Saludos

      • Admin

      Hola Miguel.

      Naturalmente que hay modo. EL I2C es un bus pensado para conectar multiples elementos a un bus compartido y el truco es incluir la direccion de cada elemento (Que tiene que ser diferente claro) a las ordenes de uso.

      Llevo ya un tiempo con un tutorial asi pendiente, asi que a ver si me lo apunto y en este verano que tendre tiempo, le damos caña

      • Excelente! muchas gracis por tu repsuesta, ya investigare como hacerlo

  • Hola!
    Tengo un problema con el tiny RTC. Cuando conecto SDA parece que el arduino MEGA se queda colgado. Hasta ahora ha estado funcionando, pero ahora en vez de tenerlo en una protoboard, lo he soldado a una placa perforada es cuando ha dejado de funcionar.
    He hecho la prueba de poner el SDA del MEGA a GND y se queda bloqueado también. ¿Está el RTC en corto?. ¿Me lo he cargado?
    Gracias!!!!

  • Buenas tardes,

    Estoy usando el modulo DS1302 muy parecido al DS1307,

    Compo puedo saber que hora tengo guardada en el modulo RTC?

      • Admin

      Hola Beny, Me temo que nunca he usado ese modulo por o que nopuede opinar

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login