Diferencia entre revisiones de «time t»
De ArduWiki
(→Ejemplo 1) |
(→Ejemplo 2) |
||
Línea 86: | Línea 86: | ||
== Ejemplo 2 == | == Ejemplo 2 == | ||
+ | En este ejemplo podemos enviar la fecha-hora por consola serie. Para convertir Unix Time te recomiendo [https://www.unixtimestamp.com/ usar esto]. Ejemplo: T1552204800 = 2019-MAR-10 8:00:00 | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | #include <TimeLib.h> | ||
+ | |||
+ | #define TIME_HEADER "T" //Encabezado de mensaje de sincronizacion | ||
+ | #define TIME_REQUEST 7 //Caracter campana ASCII requerido para mensaje de sincronizacion | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | while (!Serial); //Solo se requiere para Leonardo | ||
+ | pinMode(13, OUTPUT); | ||
+ | setSyncProvider(requestSync); //set function to call when sync required | ||
+ | Serial.println("Esperando mensaje de sincronizacion"); | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | if (Serial.available()) { | ||
+ | processSyncMessage(); | ||
+ | } | ||
+ | if (timeStatus()!= timeNotSet) { | ||
+ | digitalClockDisplay(); | ||
+ | } | ||
+ | if (timeStatus() == timeSet) { | ||
+ | digitalWrite(13, HIGH); //Sincronizados | ||
+ | }else{ | ||
+ | digitalWrite(13, LOW); //Requiere sincronizacion | ||
+ | } | ||
+ | delay(1000); | ||
+ | } | ||
+ | |||
+ | void digitalClockDisplay(){ | ||
+ | Serial.print(year()); | ||
+ | Serial.print("-"); | ||
+ | Serial.print(month()); | ||
+ | Serial.print("-"); | ||
+ | Serial.print(day()); | ||
+ | Serial.print(" "); | ||
+ | Serial.print(hour()); | ||
+ | Serial.print(":"); | ||
+ | printDigits(minute()); | ||
+ | Serial.print(":"); | ||
+ | printDigits(second()); | ||
+ | Serial.println(); | ||
+ | } | ||
+ | |||
+ | void printDigits(int digits){ | ||
+ | Serial.print(":"); | ||
+ | if (digits < 10){ | ||
+ | Serial.print('0'); | ||
+ | } | ||
+ | Serial.print(digits); | ||
+ | } | ||
+ | |||
+ | void processSyncMessage() { | ||
+ | unsigned long pctime; | ||
+ | const unsigned long DEFAULT_TIME = 1357041600; //2013-1-1 | ||
+ | if (Serial.find(TIME_HEADER)) { | ||
+ | pctime = Serial.parseInt(); | ||
+ | if (pctime >= DEFAULT_TIME) { //check the integer is a valid time (mayor a 1-ENE-2013) | ||
+ | setTime(pctime); //Sync Arduino clock to the time received on the serial port | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | time_t requestSync(){ | ||
+ | Serial.write(TIME_REQUEST); | ||
+ | return 0; // the time will be sent later in response to serial mesg | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Ejemplo 3 == | ||
Si usas la libreria RTClib.h tendras disponible la clase [[DateTime]]. | Si usas la libreria RTClib.h tendras disponible la clase [[DateTime]]. | ||
Revisión del 21:48 22 mar 2019
Contenido
Descripcion
time_t es un tipo unsigned long de 4 byte (32 bits) usado para almacenar los segundos transcurridos desde el 1-ENE-1970 o también llamada fecha Unix.
Sintaxis
time_t variable [= valor];
Parámetros
- variable
- Nombre de la variable que definiras.
- valor
- Numero del tipo TimeStamp de UNIX. Numero tipo unsigned long.
Funciones
Metodo | Descripcion | Ejemplo |
---|---|---|
now() | Almacena la hora actual en tiempo UNIX | time_t t = now(); |
hour() | Muestra las horas (0~23) | hour(t); |
minute() | Muestra los minutos (0~59) | minute(t); |
second() | Muestra los segundos (0~59) | second(t); |
millis() | Muestra los milisegundos (0~999) | millis(t); |
day() | Muetsra el dia (1~31) | day(t); |
weekday() | Muestra dia de la semana (1=domingo) (1~7) | weekday(t); |
month() | Muestra el mes (1~12) | mont(t); |
year() | Muestra el año | year(t); |
hourFormat12() | Formatea a 12 horas | |
isAM() | Devuelve verdadero por la mañana | isAM(t) |
isPM() | Devuelve verdadero por la tarde | isPM(t); |
monthStr() | Nombre del mes | monthStr(t); |
monthShortStr() | Nombre del mes corto | monthShortStr(t); |
dayStr() | Nombre del dia | dayStr(t); |
dayShortStr() | Nombre del dia corto | dayShortStr(t); |
setTime() | Establece fecha-hora. Puede ser en segundos o hr,min,sec,dia,mes,año. | setTime(0,0,0,14,7,2018); |
adjustTime() | Ajusta la fecha-hora del sistema agregando un valor | adjustTime(3600); |
timeStatus() | Indica si el tiempo se sincronizado recientemente. Devuelve: timeNotSet/timeNeedSync/timeSet | |
setSyncProvider() | Establecer proveedor de hora externa | |
setSyncInterval() | Establecer el número de segundos entre re-sincronizaciones |
Comentarios
- La libreria TimeLib.h agrega la funcionalidad de reloj a Arduino con o sin hardware externo. Permite que un boceto obtenga la hora y la fecha como: segundo, minuto, hora, día, mes y año.
- También proporciona tiempo time_t estándar, por lo que los tiempos transcurridos se pueden calcular fácilmente y los valores de tiempo se pueden compartir en diferentes plataformas.
Advertencias
- Tenga en cuenta que se requiere un parámetro para estas funciones de cadena. El argumento NO es la marca de tiempo, por ejemplo, time_t, pero debe ser algo así como month(t). Entonces monthStr(month(t)) o dayStr(day(t)) funcionará.
Ejemplo 1
En este ejemplo incluimos la fecha hora 2018-7-14 10:0:0 y mostramos su avance cada 1350 milisegundos.
#include <TimeLib.h>
void setup(){
Serial.begin(9600);
setTime(10,0,0,14,7,2018); //h,min,seg,dia,mes,año
}
void loop(){
time_t t=now();
Serial.print(hour(t));
Serial.print(":");
Serial.print(minute(t));
Serial.print(":");
Serial.println(second(t));
delay(1350);
}
Ejemplo 2
En este ejemplo podemos enviar la fecha-hora por consola serie. Para convertir Unix Time te recomiendo usar esto. Ejemplo: T1552204800 = 2019-MAR-10 8:00:00
#include <TimeLib.h>
#define TIME_HEADER "T" //Encabezado de mensaje de sincronizacion
#define TIME_REQUEST 7 //Caracter campana ASCII requerido para mensaje de sincronizacion
void setup() {
Serial.begin(9600);
while (!Serial); //Solo se requiere para Leonardo
pinMode(13, OUTPUT);
setSyncProvider(requestSync); //set function to call when sync required
Serial.println("Esperando mensaje de sincronizacion");
}
void loop(){
if (Serial.available()) {
processSyncMessage();
}
if (timeStatus()!= timeNotSet) {
digitalClockDisplay();
}
if (timeStatus() == timeSet) {
digitalWrite(13, HIGH); //Sincronizados
}else{
digitalWrite(13, LOW); //Requiere sincronizacion
}
delay(1000);
}
void digitalClockDisplay(){
Serial.print(year());
Serial.print("-");
Serial.print(month());
Serial.print("-");
Serial.print(day());
Serial.print(" ");
Serial.print(hour());
Serial.print(":");
printDigits(minute());
Serial.print(":");
printDigits(second());
Serial.println();
}
void printDigits(int digits){
Serial.print(":");
if (digits < 10){
Serial.print('0');
}
Serial.print(digits);
}
void processSyncMessage() {
unsigned long pctime;
const unsigned long DEFAULT_TIME = 1357041600; //2013-1-1
if (Serial.find(TIME_HEADER)) {
pctime = Serial.parseInt();
if (pctime >= DEFAULT_TIME) { //check the integer is a valid time (mayor a 1-ENE-2013)
setTime(pctime); //Sync Arduino clock to the time received on the serial port
}
}
}
time_t requestSync(){
Serial.write(TIME_REQUEST);
return 0; // the time will be sent later in response to serial mesg
}
Ejemplo 3
Si usas la libreria RTClib.h tendras disponible la clase DateTime.
DateTime hoy = rtc.noy();
time_t unix = hoy.unixtime();
Ejemplo 3
Con este ejemplo Arduino espera que se envíe desde el monitor un tiempo UNIX del formato T1531526400 (2018-7-14 0:0:0).
#include <TimeLib.h>
void setup(){
Serial.begin(9600);
pinMode(13, OUTPUT);
Serial.println("Esperando tiempo UNIX por puerto serie");
}
void loop(){
if (Serial.available()) {
sincroniza();
}
if (timeStatus()!= timeNotSet) {
reloj();
}
if (timeStatus() == timeSet) {
digitalWrite(13, HIGH); //Sincronizado
}else{
digitalWrite(13, LOW); //Falta sincronizar
}
delay(1000);
}
void reloj(){
Serial.print(year());
Serial.print("-");
if (month()<10){
Serial.print('0');
}
Serial.print(month());
Serial.print("-");
if (day()<10){
Serial.print('0');
}
Serial.print(day());
Serial.print(" ");
if (hour()<10){
Serial.print('0');
}
Serial.print(hour());
Serial.print(":");
if (minute() < 10){
Serial.print('0');
}
Serial.print(minute());
Serial.print(":");
if (second() < 10){
Serial.print('0');
}
Serial.println(second());
}
void sincroniza() {
const unsigned long DEFAULT_TIME = 1514764800; //1-ENE-2018
if (Serial.find("T")) {
unsigned long pc = Serial.parseInt();
//Controla valides mayor a 1-ENE-2018
if (pc >= DEFAULT_TIME) {
setTime(pc); //Ajusta la fecha-hora
}
}
}