En ciertas ocasiones necesitamos realizar acciones de forma coordinada o a una hora determinada. Es en estos casos cuando necesitamos conocer la fecha y hora actualizada, cosa que podemos hacer con un RTC. Ese dispositivo desconocido para muchos y adorado por otros que permite a nuestro microcontrolador conocer la fecha y la hora en base al área de tiempo en el que te encuentres.
Por ejemplo podemos llegar a necesitar activar un relé a una hora concreta. Imagina despertarte a las 07:00 de la mañana y justo cuando llegues a la cocina acabe de caer a tu taza de la suerte la ultima gota de tu café favorito. Esta es una de las míticas e infinitas aplicaciones para las cuales puedes necesitar un RTC. Así que ya sabes, pon un RTC en tu vida.
Cuando se trata de que el microcontrolador sepa que hora exacta es, podemos recurrir a distintas técnicas, pero la reina indiscutible es usar un reloj de tiempo real.
Podemos conectar un dispositivo a Internet y obtener la hora desde un servidor NTP, sin embargo, el RTC sigue siendo una alternativa muy interesante para aquellos dispositivos que no están conectados. Otra opción puede ser combinar estas dos tecnologías, podemos tener un RTC que una vez al día se sincroniza con un servidor NTP.
Controlar un relé con un RTC
En este caso vamos a ver un ejemplo que nos permitirá activar un pin digital a una hora concreta y desactivarlo a otra hora también definida. Usaremos la librería RTClib.h la cual puedes descargar desde aquí.
La conexión entre el RTC y Arduino se suele realizar por medio de I2C o de SPI.
En el caso del I2C conectaremos el pin SDA del módulo RTC con el pin SDA de Arduino y lo mismo para el SCL.
En caso de usar SPI, las conexiones son idénticas, solo que con los nombres MISO, MOSI, SCK y CS, lo conectaremos siguiendo los nombres.
Las líneas I2C deben estar unidas a Vcc mediante dos resistencias PullUp, sin embargo esto es algo que no te debe preocupar en exceso, probablemente la resistencia PullUp esté ya integrada en el propio módulo del RTC.
Puedes ver el vídeo explicativo y obtener los códigos que uso en el tutorial a continuación.
Código para Arduino
El uso de este tipo de dispositivos de tiempo real en Arduino es muy sencillo ya que a estas alturas, alguien a solucionado el problema creando librerías para ello.
Lo primero será importar las librerías y crear el objeto RTC con el cual accederemos a la información del reloj de tiempo real.
En el setup simplemente inicializamos el RTC y en loop recuperamos los valores de tiempo con el método now y el objeto de tipo DateTime.
Primero creamos el objeto now y lo asociamos con el contenido que devuelve el método now();
Para acceder a la hora usaremos now.hour(), es decir, accedemos al método hour del objeto now. De manera análoga haremos con el resto de valores como con los minutos.
#include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; void setup () { pinMode(13,OUTPUT); Wire.begin(); RTC.begin(); } void loop () { DateTime now = RTC.now(); if(now.hour() == 15 && now.minute() == 01){ digitalWrite(13,HIGH); } else if(now.hour() == 15 && now.minute() == 02){ digitalWrite(13,LOW); } delay(3000); }
hola, si quiseira activar el rele cada 2 minutos como le haría
Saludos.
Hola, buenas tardes.
Este código tendría en cuenta los cambios de horario verano – invierno por ejemplo?
Gracias, me funciono.
hola buenas tardes yo quisiera que el relay se prendiera con el reloj por ejemplo a las 10:00h pero que se apague con sensor de luz o sensor de sonido
Lo conseguiste?
hola,conecte un relay, un rtc con mi arduino, puse todo la programacion como indicas pero me sale al reves, cuando tiene que prender se apaga y cuando se tiene que apagar se prende. Psdt: estoy usando un protoboard
Hola buenas querria saber si puedo programar en un modulo de 4 reles , 4 horarios diferentes ya que cada rele funciona en horas diferentes, es decir:
1 RELE : ELECTROVALVULA DE AGUA
2 RELE: BOMBA DESINFECTANTE
3 RELE: BOMBA AMBIENTADOR
4 RELE : BOMBA LIBRE
FUNCIONAN TODAS DE LUNES A DOMINGO PERO EN DIFERENTES HORARIOS SE TIENEN QUE ACTIVAR.
puedo hacerlo?
Sí, puedes hacerlo. Solo tienes que crear las reglas de comprobación adecuadas para las horas y fechas que quieres conseguir.
hola podrias hacer un ejemplo con esta idea que propone Sergio?
Solo tienes que usar distintas sentencias condicionales if, y programar cada una de ellas a la hora y minuto que quiera que ocurra el evento.
hola!! Queria activar un rele de 22.00H hasta las 23:00H. La siguiente estructura me valdria
if(now.hour() >= 22 && now.hour() <= 23){
digitalWrite(6,HIGH);
}else{digitalWrite(6,LOW);}
Gracias, un saludo
Casi, en este caso es más fácil.
if(now.hour() = 22 ){
digitalWrite(6,HIGH);
}else{digitalWrite(6,LOW);}
Gracias, un saludo
hola habria alguna diferencia de codigo si usamos el rtc ds3132?
Comprueba si puedes usar esta librería con el ds3132.
hola mi intención seria utilizarlo en una pecera, para que a las 7:00 de la mañana encienda la luz de día ( blanca)y al mismo tiempo apague la luz noche(azul) y a las 8:00 de la tarde haga lo contrario, es decir que apague la blanca y encienda la azul, creando asi el efecto dia y noche , seria mejor utilizar una placa de un rele o mejor una de dos?
gracias
Puedes hacerlo con las dos. Hazlo como más cómodo te sientas al hacerlo.
Se puede hacer esto mismo con RTC DS1302?
Sí