Mantenga la hora exacta usando Real Time Clock (RTC) Deja un comentario

Comparte este Post

La placa Arduino puede mantener el tiempo usando millis (), que se incrementa desde el arranque hasta el apagado, luego comenzará de nuevo. Pero, ¿qué pasaría si necesitáramos mantener el tiempo indefinidamente, independientemente de si la placa está encendida o apagada? ¿Qué pasa si no queremos millis () pero queremos el año, mes, día y hora? ¿Cómo compensamos los años bisiestos?
Sin preocupaciones. Somos afortunados de tener el reloj de tiempo real DS1307 y Adafruit nos ha proporcionado una biblioteca realmente buena para acceder a todas sus características. El módulo requiere una batería CR1225 (u otra) para seguir funcionando incluso cuando desconecta el Arduino.

Preparar

Recuerde descargar e instalar la biblioteca de Adafruit para el RTC que se puede encontrar aquí ( https://github.com/adafruit/RTClib ) Si tiene problemas para instalar la biblioteca, siga nuestro tutorial aquí ( http://runtimeprojects.com/2016/03/arduino-beginners-course-lesson-5-installing-and-using-libraries/ )

El RTC requiere solo 4 pines para conectarlo al Arduino Uno, de la siguiente manera:

  • + 5V -> VCC
  • GND -> GND
  • SCL -> A5
  • SDA -> A4

El SQW es una salida de onda cuadrada y es opcional. La mayoría de nosotros no requiere este pin, así que lo dejaremos de lado por el momento.

El boceto

El siguiente boceto pretende demostrar cómo podemos usar la biblioteca RTC. Publicaremos la fecha y la hora actuales en serie, luego haremos algunos cálculos sobre la fecha y la hora y lo enviaremos de nuevo.

Comencemos por incluir bibliotecas.

#incluir
 #include "RTClib.h"

Las siguientes líneas crean el objeto RTC y crean una lista de días de la semana, en inglés.

RTC_DS1307 rtc;

 char daysOfTheWeek [7] [12] = {"Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"};

El siguiente es la función de configuración. Aquí estamos inicializando el objeto Serial y el objeto RTC.

void setup () {
   Serial.begin (57600);
   if (! rtc.begin ()) {
     Serial.println ("No se pudo encontrar el RTC");
     mientras (1);
   }

   if (! rtc.isrunning ()) {
     Serial.println ("¡RTC NO se está ejecutando!");
    
   } else {
  
     // siguiente línea establece el RTC a la fecha y hora en que se compiló este boceto
     rtc.adjust (DateTime (F (__ DATE__), F (__ TIME__)));
    

     // Esta línea establece el RTC con una fecha y hora explícitas, por ejemplo para establecer
     // 21 de enero de 2014 a las 3 a.m. llamarías:
     // rtc.adjust (DateTime (2014, 1, 21, 3, 0, 0));
   }
 }

Para establecer una hora exacta, usamos el

rtc.adjust (DateTime (F (__ DATE__), F (__ TIME__)));

Esto inicializará el RTC con el tiempo que compila el boceto, obviamente usando la fecha y hora de sus PC.

En la función de bucle hacemos uso del objeto ‘now’ de tipo DateTime para almacenar la hora actual, y luego enviamos la información de fecha requerida al puerto serie.

void loop () {
     DateTime now = rtc.now ();
    
     Serial.print (now.year (), DEC);
     Serial.print ('/');
     Serial.print (now.month (), DEC);
     Serial.print ('/');
     Serial.print (now.day (), DEC);
     Serial.print ("(");
     Serial.print (daysOfTheWeek [now.dayOfTheWeek ()]);
     Serial.print (")";
     Serial.print (now.hour (), DEC);
     Serial.print (':');
     Serial.print (now.minute (), DEC);
     Serial.print (':');
     Serial.print (now.second (), DEC);
     Serial.println ();
    
     Serial.print ("desde la medianoche del 1/1/1970 =");
     Serial.print (now.unixtime ());
     Serial.print ("s =");
     Serial.print (now.unixtime () / 86400L);
     Serial.println ("d");

Podemos hacer más con esta biblioteca. Podemos avanzar y retroceder en el tiempo usando el tipo TimeSpan.

Aquí creamos otra instancia de DateTime llamada ‘future’, con la diferencia de que pasamos el parámetro ‘now’, que es el objeto de fecha y hora actual, y agregamos un lapso de tiempo de 7 días, 2 horas, 30 minutos y 6 segundos a la hora actual. Luego enviamos la fecha y hora futuras al puerto serie.

DateTime futuro (ahora + TimeSpan (7,2,30,6));
    
     Serial.print ("ahora + 7d + 30s:");
     Serial.print (future.year (), DEC);
     Serial.print ('/');
     Serial.print (future.month (), DEC);
     Serial.print ('/');
     Serial.print (future.day (), DEC);
     Serial.print ('');
     Serial.print (future.hour (), DEC);
     Serial.print (':');
     Serial.print (future.minute (), DEC);
     Serial.print (':');
     Serial.print (future.second (), DEC);
     Serial.println ();
    
     Serial.println ();
     retraso (3000);
 }

Eso es cómo usar un RTC DS1307. Otros chipsets pueden funcionar pero no tuvimos experiencia con ningún otro.

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Tenemos un cupón de descuento disponible para vos

Abrir chat
0

Tu carrito