Diferencia entre revisiones de «RTC»

De ArduWiki
Saltar a: navegación, buscar
(Descripción)
(Referencias)
 
(No se muestran 40 ediciones intermedias del mismo usuario)
Línea 3: Línea 3:
  
 
== Placas aplicables ==
 
== Placas aplicables ==
 +
Todas.
  
 
== Sintaxis ==
 
== Sintaxis ==
 
<pre>
 
<pre>
DateTime variable (año,mes,dia,hora,min,seg);
+
//#include <Wire.h>  //Solo si usas reloj fisico
 +
#include <RTClib.h>
 +
RTC_Millis rtc;    //Reloj por software que usa millis()
 +
RTC_Micros rtc;    //Reloj por software que usa micros()
 +
//RTC_DS1307 rtc;  //Reloj con DS1307
 +
//RTC_DS3231 rtc;  //Reloj con DS3231
 +
//RTC_PCF8523 rtc;   //Reloj con PCF8523
 
</pre>
 
</pre>
  
Línea 17: Línea 24:
 
;min:2 digitos de los minutos entre 0~59.
 
;min:2 digitos de los minutos entre 0~59.
 
;seg:2 digitos de los segundos entre 0~59.
 
;seg:2 digitos de los segundos entre 0~59.
 +
 +
== Clases ==
 +
Esta librería maneja dos clases:
 +
* [[DateTime]] - es un tipo de dato
 +
* [[TimeSpan()]] - para manejar intervalos de tiempo
  
 
== Métodos ==
 
== Métodos ==
 
{| class="wikitable"
 
{| class="wikitable"
|+Metodos disponibles libreria RTClib.h
+
|+Métodos disponibles libreria RTClib.h
 +
|-
 +
! Método !! Descripción
 +
|-
 +
| .now() || Toma de fecha y hora actual.
 +
|-
 +
| .adjust() || Ajustar fecha y hora
 +
|-
 +
| .isrunning() || Devuelve verdadero si esta ajustada la fecha hora.
 +
|-
 +
| .readSqwPinMode() || Leer el modo. OFF, ON, SquareWave1Hz, SquareWave4kHz, SquareWave8kHz o SquareWave32kHz.
 +
|-
 +
| .writeSqwPinMode(modo) || Escribir modo.
 +
|}
 +
 
 +
{| class="wikitable"
 +
|+Modos de sqwPinMode()
 +
|-
 +
! Modo !! Frecuencia
 +
|-
 +
| SquareWave1Hz || 1 kHz
 +
|-
 +
| SquareWave4Hz || 4.096 kHz
 +
|-
 +
| SquareWave8Hz || 8.192 kHz
 +
|-
 +
| SquareWave32Hz || 32.768 kHz
 +
|}
 +
 
 +
{| class="wikitable"
 +
|+Métodos disponibles clase DateTime
 
|-
 
|-
 
! Método !! Descripción
 
! Método !! Descripción
 
|-
 
|-
| year() || Año
+
| .year() || Año
 
|-
 
|-
| month() || Mes (1~12)
+
| .month() || Mes (1~12)
 
|-
 
|-
| day() || Dia (1~31)
+
| .day() || Dia (1~31)
 
|-
 
|-
| hour() || Horas (0~23)
+
| .hour() || Horas (0~23)
 
|-
 
|-
| minute() || Minutos (0~59)
+
| .minute() || Minutos (0~59)
 
|-
 
|-
| second() || Segundos (0~59)
+
| .second() || Segundos (0~59)
 
|-
 
|-
| dayOfWeek() || Dia de la semana (0~6)
+
| .dayOfTheWeek() || Dia de la semana (0=domingo)
 
|-
 
|-
| begin() ||  
+
| .secondstime() || Segundos desde 1-ENE-2000
 
|-
 
|-
| now() ||  
+
| .unixtime() || Segundos desde 1-ENE-1970
 
|-
 
|-
| secondstime() ||  
+
| .timestamp() || Formato "2020-01-01T08:00:00
 +
|}
 +
 
 +
{| class="wikitable"
 +
|+Métodos clase TimeSpan
 +
|-
 +
! Método !! Descripción
 
|-
 
|-
| unixtime() ||  
+
| .days() || Dias (1~31)
 
|-
 
|-
| adjust() ||  
+
| .hours() || Horas (0~23)
 
|-
 
|-
| isrunning() ||  
+
| .minutes() || Minutos (0~59)
 
|-
 
|-
| readSqwPinMode() ||  
+
| .seconds() || Segundos (0~59)
 
|-
 
|-
| writeSqwPinMode() ||  
+
| .totalsecons() || Segundos totales
 
|}
 
|}
  
 
== Comentarios ==
 
== Comentarios ==
 +
* Accionar una alarma a las 8 am de cada lunes.
 +
<pre>
 +
DateTime t = now();
 +
if (t.hour() == 8 && t.dayOfTheWeek() = 2){
 +
  //Lo necesario
 +
}
 +
</pre>
 +
 +
* Accionar una alarma cada 45 min (2 700 seg).
 +
<pre>
 +
DateTime t = now();
 +
if (t.unixtime()%2700 == 0){
 +
  //Lo necesario
 +
}
 +
</pre>
  
 
== Advertencias ==
 
== Advertencias ==
 +
Nada.
  
 
== Ejemplo 1 ==
 
== Ejemplo 1 ==
Línea 63: Línea 127:
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
 +
#include <RTClib.h>
 
DateTime t0 (2018,7,14,8,0,0);          //2018-7-14 8:00:00
 
DateTime t0 (2018,7,14,8,0,0);          //2018-7-14 8:00:00
 
//Calculos 1
 
//Calculos 1
Línea 84: Línea 149:
  
 
== Ejemplo 2 ==
 
== Ejemplo 2 ==
 +
Muestra por el monitor serie: año, mes, dia, dia de la semana, hora, minutos y segundos, luego el tiempo Unix y finalmente calcula una fecha futura dentro de: 7 dias, 12 horas, 30 minutos y 6 segundos.
 +
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
#include <Wire.h>
+
//#include <Wire.h>   //Solo si usas reloj fisico
 
#include <RTClib.h>
 
#include <RTClib.h>
  
Línea 97: Línea 164:
 
   Serial.begin(57600);
 
   Serial.begin(57600);
 
   //Para setear RTC con fecha y hora cuando se compila
 
   //Para setear RTC con fecha y hora cuando se compila
   rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
+
   rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
 
   //Para setear RTC a 21-MAR-2019 8:00:00
 
   //Para setear RTC a 21-MAR-2019 8:00:00
 
   //rtc.adjust(DateTime(2019, 3, 21, 8, 0, 0));
 
   //rtc.adjust(DateTime(2019, 3, 21, 8, 0, 0));
Línea 111: Línea 178:
 
     Serial.print(hoy.day());
 
     Serial.print(hoy.day());
 
     Serial.print(" (");
 
     Serial.print(" (");
     Serial.print(diaSemana[now.dayOfTheWeek()]);
+
     Serial.print(diaSemana[hoy.dayOfTheWeek()]);
 
     Serial.print(") ");
 
     Serial.print(") ");
 
     Serial.print(hoy.hour());
 
     Serial.print(hoy.hour());
Línea 130: Línea 197:
 
     DateTime futuro (hoy + TimeSpan(7,12,30,6));
 
     DateTime futuro (hoy + TimeSpan(7,12,30,6));
 
      
 
      
     Serial.print("Fecha furura: ");
+
     Serial.print("Fecha futura: ");
 
     Serial.print(futuro.year());
 
     Serial.print(futuro.year());
 
     Serial.print('-');
 
     Serial.print('-');
Línea 146: Línea 213:
 
     Serial.println();
 
     Serial.println();
 
     delay(3000);
 
     delay(3000);
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 3 ==
 +
Este es un reloj con 12 LED que prende un LED cada 5 segundos
 +
 +
<syntaxhighlight lang="c++">
 +
#include <RTClib.h>
 +
RTC_Millis rtc;
 +
const byte led[12] = {13,2,3,4,5,6,7,8,9,10,11,12};
 +
 +
void setup() {
 +
  Serial.begin(9600);                         
 +
  rtc.adjust(DateTime(__DATE__, __TIME__));
 +
  for (byte i=0; i<12; i++){
 +
      pinMode(led[i], OUTPUT);
 +
  }
 +
}
 +
 +
void loop() {
 +
  DateTime hoy = rtc.now();
 +
  if (hoy.unixtime()%5 == 0){
 +
      for (byte i=0; i<12; i++){
 +
        digitalWrite(led[i], LOW);
 +
      }
 +
      byte hora = hoy.second()/5;
 +
      digitalWrite(led[hora], HIGH);
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 4 ==
 +
Este es un reloj con LCD y dos pulsadores para corregir la hora. Uno adelante y el otro retrocede.
 +
 +
<syntaxhighlight lang="c++">
 +
#include <LiquidCrystal.h>
 +
#include <RTClib.h>
 +
 +
RTC_Millis rtc;
 +
DateTime t;
 +
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
 +
 +
void setup() {
 +
  lcd.begin(16, 2);
 +
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
 +
  pinMode(2, INPUT_PULLUP);  //Avanza
 +
  pinMode(3, INPUT_PULLUP);  //Retrocede
 +
  lcd.setCursor(2,0);
 +
  lcd.print("Hora actual");
 +
}
 +
 +
void loop() {   
 +
  t = rtc.now();
 +
  disp();
 +
  //Ajusta hora
 +
  if (digitalRead(2) == LOW){
 +
      rtc.adjust(t.unixtime()+1);
 +
      delay(100);
 +
  }
 +
  if (digitalRead(3) == LOW){
 +
      rtc.adjust(t.unixtime()-1);
 +
      delay(100);
 +
  }
 +
}
 +
 +
void disp(){
 +
  lcd.setCursor(4,1);
 +
     
 +
  if (t.hour() < 10) lcd.print("0");
 +
  lcd.print(t.hour());
 +
  lcd.print(":");
 +
     
 +
  if (t.minute()< 10) lcd.print("0");
 +
  lcd.print(t.minute());
 +
  lcd.print(":");
 +
 +
  if (t.second() < 10) lcd.print("0");
 +
  lcd.print(t.second());
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
Línea 151: Línea 296:
 
== Vea también ==
 
== Vea también ==
 
<categorytree mode=all>Librerias</categorytree>
 
<categorytree mode=all>Librerias</categorytree>
 +
<categorytree mode=all>Libreria RTC</categorytree>
  
 
== Referencias ==
 
== Referencias ==
* [https://github.com/adafruit/RTClib Adafruit]
+
* [https://github.com/adafruit/RTClib RTClib] - Adafruit
 
* [https://www.arduinolibraries.info/libraries All Libraries]
 
* [https://www.arduinolibraries.info/libraries All Libraries]
 +
* [https://programarfacil.com/blog/arduino-blog/reloj-con-arduino-rtc/ Reloj con Arduino] - Luis Del Valle
 +
* [https://www.luisllamas.es/reloj-y-calendario-en-arduino-con-los-rtc-ds1307-y-ds3231/ Reloj y calendario con RTC] - Luis Llamas
 +
* [https://naylampmechatronics.com/blog/category/page/2.html Tutorial RTC DS1307] - Naylamp
 +
* [https://www.prometec.net/members/avrsanfer/activity/2182/ Proyecto RTC] - Prometec
  
 
[[Category:Librerias]]
 
[[Category:Librerias]]
 +
[[Category:Libreria RTC]]

Revisión actual del 22:37 23 ene 2020

Descripción

La librería RTClib.h de Adafruit que permite trabajar con un reloj por software (RTC_Millis) y algunos relojes físicos como RTC_DS1307, RTC_DS3231 y PCF8523.

Placas aplicables

Todas.

Sintaxis

//#include <Wire.h>  //Solo si usas reloj fisico
#include <RTClib.h>
RTC_Millis rtc;     //Reloj por software que usa millis()
RTC_Micros rtc;     //Reloj por software que usa micros()
//RTC_DS1307 rtc;   //Reloj con DS1307
//RTC_DS3231 rtc;   //Reloj con DS3231
//RTC_PCF8523 rtc;   //Reloj con PCF8523

Parámetros

variable
Nombre de la variable a crear.
año
4 digitos del año.
mes
2 digitos del mes entre 1~12.
dia
2 digitos del dia entre 1~31.
hora
2 digitos de la hora entre 0~23.
min
2 digitos de los minutos entre 0~59.
seg
2 digitos de los segundos entre 0~59.

Clases

Esta librería maneja dos clases:

Métodos

Métodos disponibles libreria RTClib.h
Método Descripción
.now() Toma de fecha y hora actual.
.adjust() Ajustar fecha y hora
.isrunning() Devuelve verdadero si esta ajustada la fecha hora.
.readSqwPinMode() Leer el modo. OFF, ON, SquareWave1Hz, SquareWave4kHz, SquareWave8kHz o SquareWave32kHz.
.writeSqwPinMode(modo) Escribir modo.
Modos de sqwPinMode()
Modo Frecuencia
SquareWave1Hz 1 kHz
SquareWave4Hz 4.096 kHz
SquareWave8Hz 8.192 kHz
SquareWave32Hz 32.768 kHz
Métodos disponibles clase DateTime
Método Descripción
.year() Año
.month() Mes (1~12)
.day() Dia (1~31)
.hour() Horas (0~23)
.minute() Minutos (0~59)
.second() Segundos (0~59)
.dayOfTheWeek() Dia de la semana (0=domingo)
.secondstime() Segundos desde 1-ENE-2000
.unixtime() Segundos desde 1-ENE-1970
.timestamp() Formato "2020-01-01T08:00:00
Métodos clase TimeSpan
Método Descripción
.days() Dias (1~31)
.hours() Horas (0~23)
.minutes() Minutos (0~59)
.seconds() Segundos (0~59)
.totalsecons() Segundos totales

Comentarios

  • Accionar una alarma a las 8 am de cada lunes.
DateTime t = now();
if (t.hour() == 8 && t.dayOfTheWeek() = 2){
  //Lo necesario
}
  • Accionar una alarma cada 45 min (2 700 seg).
DateTime t = now();
if (t.unixtime()%2700 == 0){
  //Lo necesario
}

Advertencias

Nada.

Ejemplo 1

Si usas la librería RTClib.h tendrás disponible el método .unixtime() que es excelente para hacer operaciones con fechas.

#include <RTClib.h>
DateTime t0 (2018,7,14,8,0,0);           //2018-7-14 8:00:00
//Calculos 1
DateTime t1 = t0 + TimeSpan(0,1,0,0);    //Añadir una hora
DateTime t2 = t0 + TimeSpan(1,0,0,0);    //Añadir un dia
DateTime t3 = t0 - TimeSpan(7,0,0,0);    //Restar una semana
//Calculos 2
DateTime unix = t0.unixtime();           //1531555200
DateTime t1 (t0.unixtime() + 3600);      //Añadir una hora
DateTime t2 (t0.unixtime() + 86400L);    //Añadir un dia
DateTime t3 (t0.unixtime() - 7*86400L);  //Restar una semana
//Mostrar
Serial.print(t0.unixtime());             //1531555200
Serial.print(t0.year());                 //2018
Serial.print(t0.month());                //7
Serial.print(t0.day());                  //14
Serial.print(t0.hour());                 //8
Serial.print(t0.minute());               //0
Serial.print(t0.second());               //0

Ejemplo 2

Muestra por el monitor serie: año, mes, dia, dia de la semana, hora, minutos y segundos, luego el tiempo Unix y finalmente calcula una fecha futura dentro de: 7 dias, 12 horas, 30 minutos y 6 segundos.

//#include <Wire.h>   //Solo si usas reloj fisico
#include <RTClib.h>

RTC_Millis rtc;     //Reloj por software
//RTC_DS1307 rtc;   //Reloj con DS1307
//RTC_DS3231 rtc;   //Reloj con DS3231

char diaSemana[7][12] = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"};

void setup () {
   Serial.begin(57600);
   //Para setear RTC con fecha y hora cuando se compila
   rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
   //Para setear RTC a 21-MAR-2019 8:00:00
   //rtc.adjust(DateTime(2019, 3, 21, 8, 0, 0));
}

void loop () {
    DateTime hoy = rtc.now();
    
    Serial.print(hoy.year());
    Serial.print('-');
    Serial.print(hoy.month());
    Serial.print('-');
    Serial.print(hoy.day());
    Serial.print(" (");
    Serial.print(diaSemana[hoy.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(hoy.hour());
    Serial.print(':');
    Serial.print(hoy.minute());
    Serial.print(':');
    Serial.println(hoy.second());
    
    Serial.print("Desde 1-ENE-1970 = ");

    Serial.print("Segundos = ");
    Serial.println(hoy.unixtime());

    Serial.print("Dias = ");
    Serial.println(hoy.unixtime() / 86400L);
    
    //calcula fecha dentro de 7 dias, 12 horas, 30 minutos y 6 segundos
    DateTime futuro (hoy + TimeSpan(7,12,30,6));
    
    Serial.print("Fecha futura: ");
    Serial.print(futuro.year());
    Serial.print('-');
    Serial.print(futuro.month());
    Serial.print('-');
    Serial.print(futuro.day());
    Serial.print(' ');
    Serial.print(futuro.hour());
    Serial.print(':');
    Serial.print(futuro.minute());
    Serial.print(':');
    Serial.print(futuro.second());
    Serial.println();
    
    Serial.println();
    delay(3000);
}

Ejemplo 3

Este es un reloj con 12 LED que prende un LED cada 5 segundos

#include <RTClib.h>
RTC_Millis rtc;
const byte led[12] = {13,2,3,4,5,6,7,8,9,10,11,12};

void setup() { 
   Serial.begin(9600);                           
   rtc.adjust(DateTime(__DATE__, __TIME__));
   for (byte i=0; i<12; i++){
      pinMode(led[i], OUTPUT);
   }
}

void loop() {
   DateTime hoy = rtc.now();
   if (hoy.unixtime()%5 == 0){
      for (byte i=0; i<12; i++){
         digitalWrite(led[i], LOW);
      }
      byte hora = hoy.second()/5;
      digitalWrite(led[hora], HIGH);
   }
}

Ejemplo 4

Este es un reloj con LCD y dos pulsadores para corregir la hora. Uno adelante y el otro retrocede.

#include <LiquidCrystal.h>
#include <RTClib.h>

RTC_Millis rtc;
DateTime t;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() {
   lcd.begin(16, 2);
   rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   pinMode(2, INPUT_PULLUP);  //Avanza
   pinMode(3, INPUT_PULLUP);  //Retrocede
   lcd.setCursor(2,0);
   lcd.print("Hora actual");
}

void loop() {     
   t = rtc.now();
   disp();
   //Ajusta hora
   if (digitalRead(2) == LOW){
      rtc.adjust(t.unixtime()+1);
      delay(100);
   }
   if (digitalRead(3) == LOW){
      rtc.adjust(t.unixtime()-1);
      delay(100);
   }
}

void disp(){
   lcd.setCursor(4,1);
      
   if (t.hour() < 10) lcd.print("0");
   lcd.print(t.hour());
   lcd.print(":");
      
   if (t.minute()< 10) lcd.print("0");
   lcd.print(t.minute());
   lcd.print(":");

   if (t.second() < 10) lcd.print("0");
   lcd.print(t.second());
}

Vea también


Referencias