Diferencia entre revisiones de «RTC»
De ArduWiki
(→Sintaxis) |
(→Referencias) |
||
(No se muestran 43 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
== Descripción == | == Descripción == | ||
− | La | + | La librería [https://github.com/adafruit/RTClib 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 == | == Placas aplicables == | ||
+ | Todas. | ||
== Sintaxis == | == Sintaxis == | ||
<pre> | <pre> | ||
− | + | //#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" | ||
+ | |+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" | {| class="wikitable" | ||
+ | |+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 | ||
+ | |} | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |+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 == | == 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 == | ||
+ | Si usas la librería '''RTClib.h''' tendrás disponible el método '''.unixtime()''' que es excelente para hacer operaciones con fechas. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | #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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 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++"> | ||
+ | //#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); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Ejemplo 3 == | ||
+ | Este es un reloj con 12 LED que prende un LED cada 5 segundos | ||
− | |||
<syntaxhighlight lang="c++"> | <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> | ||
== 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
Contenido
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:
- DateTime - es un tipo de dato
- TimeSpan() - para manejar intervalos de tiempo
Métodos
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. |
Modo | Frecuencia |
---|---|
SquareWave1Hz | 1 kHz |
SquareWave4Hz | 4.096 kHz |
SquareWave8Hz | 8.192 kHz |
SquareWave32Hz | 32.768 kHz |
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é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
- RTClib - Adafruit
- All Libraries
- Reloj con Arduino - Luis Del Valle
- Reloj y calendario con RTC - Luis Llamas
- Tutorial RTC DS1307 - Naylamp
- Proyecto RTC - Prometec