Diferencia entre revisiones de «time t»

De ArduWiki
Saltar a: navegación, buscar
(Ejemplo 2)
(Vea también)
 
(No se muestran 24 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
== Descripcion ==
 
== 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.
+
'''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 [https://www.unixtimestamp.com Unix Time Stamp].
  
 
== Sintaxis ==
 
== Sintaxis ==
Línea 13: Línea 13:
 
== Funciones ==
 
== Funciones ==
 
{|class="wikitable"
 
{|class="wikitable"
!Metodo!!Descripcion!!Ejemplo
+
|+Funciones disponibles para time_t
 +
!Función!!Descripción!!Ejemplo
 
|-
 
|-
|now()||Almacena la hora actual en tiempo UNIX||time_t t = now();
+
|[[now()]]||Almacena la hora actual en tiempo UNIX||time_t t = now();
 
|-
 
|-
|hour()||Muestra las horas (0~23)||hour(t);
+
|year()||Muestra el año||year();
 
|-
 
|-
|minute()||Muestra los minutos (0~59)||minute(t);
+
|month()||Muestra el mes (1~12)||month();
 
|-
 
|-
|second()||Muestra los segundos (0~59)||second(t);
+
|monthStr()||Nombre del mes (January, February, March, April, May, June, July...)||monthStr(month());
 
|-
 
|-
|millis()||Muestra los milisegundos (0~999)||millis(t);
+
|monthShortStr()||Nombre corto del mes (Jan, Feb, Mar, Dic) ||monthShortStr(month());
 
|-
 
|-
|day()||Muetsra el dia (1~31)||day(t);
+
|day()||Muetsra el dia (1~31)||day();
 
|-
 
|-
|weekday()||Muestra dia de la semana (1=domingo) (1~7)||weekday(t);
+
|weekday()||Muestra dia de la semana (1=domingo) (1~7)||weekday();
 
|-
 
|-
|month()||Muestra el mes (1~12)||mont(t);
+
|dayStr()||Nombre del dia (Sunday, Monday, Tuesday, Wenesday, Thursday, Friday, Saturday)||dayStr(weekday());
 
|-
 
|-
|year()||Muestra el año||year(t);
+
|dayShortStr()||Nombre corto del dia (Sun, Mon, Tue, Wen, Thu, Fri, Sat)||dayShortStr(weekday());
 
|-
 
|-
|hourFormat12()||Formatea a 12 horas||
+
|hour()||Muestra las horas (0~23)||hour();
 
|-
 
|-
|isAM()||Devuelve verdadero por la mañana||isAM(t)
+
|minute()||Muestra los minutos (0~59)||minute();
 
|-
 
|-
|isPM()||Devuelve verdadero por la tarde||isPM(t);
+
|second()||Muestra los segundos (0~59)||second();
 
|-
 
|-
|monthStr()||Nombre del mes||monthStr(t);
+
|[[millis()]]||Muestra los milisegundos (0~999)||millis();
 
|-
 
|-
|monthShortStr()||Nombre del mes corto||monthShortStr(t);
+
|hourFormat12()||Formatea a 12 horas||
 
|-
 
|-
|dayStr()||Nombre del dia||dayStr(t);
+
|isAM()||Devuelve verdadero por la mañana||isAM()
 
|-
 
|-
|dayShortStr()||Nombre del dia corto||dayShortStr(t);
+
|isPM()||Devuelve verdadero por la tarde||isPM();
 
|-
 
|-
|setTime()||Establece fecha-hora. Puede ser en segundos o hr,min,sec,dia,mes,año.||setTime(0,0,0,14,7,2018);
+
|[[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);
+
|[[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||
 
|-
 
|-
|setSyncProvider()||Establecer proveedor de hora externa||
+
|[[setSyncInterval()]]||Establecer el número de segundos entre re-sincronizaciones||
 
|-
 
|-
|setSyncInterval()||Establecer el número de segundos entre re-sincronizaciones||
+
|[[timeStatus()]]||Indica si el tiempo se sincronizado recientemente. Devuelve: timeNotSet/timeNeedSync/timeSet||
 
|}
 
|}
  
 
== Comentarios ==
 
== 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.  
+
* La libreria [https://github.com/PaulStoffregen/Time TimeLib.h] agrega la funcionalidad de reloj a Arduino 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.
 
* 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 ==
 
== 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á.
+
* Tenga en cuenta que NO se requiere un parámetro para las funciones basicas. Sin embargo como el reloj sigue funcionando la demora en mostrar la hora no sera la misma si capturamos el tiempo en una variable del tipo time_t y la introducimos en las funciones.
 +
* Un caso especial son las funciones de texto que requeriran incluir un valor o función para determinar su valor: dayStr(week(t)), dayShortStr(week(t)), monthStr(month()) y monthShortStr(month()).
  
 
== Ejemplo 1 ==
 
== Ejemplo 1 ==
Línea 90: Línea 92:
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
 
#include <TimeLib.h>
 
#include <TimeLib.h>
 
 
#define TIME_HEADER  "T"  //Encabezado de mensaje de sincronizacion
 
#define TIME_HEADER  "T"  //Encabezado de mensaje de sincronizacion
#define TIME_REQUEST  7    //Caracter campana ASCII requerido para mensaje de sincronizacion
 
  
 
void setup()  {
 
void setup()  {
 
   Serial.begin(9600);
 
   Serial.begin(9600);
   while (!Serial);   //Solo se requiere para Leonardo
+
   while (!Serial);       //Solo se requiere para Leonardo
 
   pinMode(13, OUTPUT);
 
   pinMode(13, OUTPUT);
  setSyncProvider(requestSync);    //set function to call when sync required
 
 
   Serial.println("Esperando mensaje de sincronizacion");
 
   Serial.println("Esperando mensaje de sincronizacion");
 
}
 
}
Línea 104: Línea 103:
 
void loop(){     
 
void loop(){     
 
   if (Serial.available()) {
 
   if (Serial.available()) {
       processSyncMessage();
+
       sincro();
  }
 
  if (timeStatus()!= timeNotSet) {
 
      digitalClockDisplay(); 
 
 
   }
 
   }
 
   if (timeStatus() == timeSet) {
 
   if (timeStatus() == timeSet) {
       digitalWrite(13, HIGH);      //Sincronizados
+
      pantalla();                  //Muestra fecha hora
 +
       digitalWrite(13, HIGH);      //Sincronizado
 
   }else{
 
   }else{
       digitalWrite(13, LOW);      //Requiere sincronizacion
+
       digitalWrite(13, LOW);      //Requiere sincronizar
 
   }
 
   }
 
   delay(1000);
 
   delay(1000);
 
}
 
}
  
void digitalClockDisplay(){
+
void sincro() {
 +
  if (Serial.find(TIME_HEADER)) {
 +
      unsigned long pctime = Serial.parseInt();
 +
      if (pctime >= 1357041600) {      //Verifica valides de fecha-hora (mayor a 1-ENE-2013)
 +
        setTime(pctime);              //Sincroniza reloj Arduino con fecha-hora recivida por puerto serie
 +
      }
 +
  }
 +
}
 +
 
 +
void pantalla(){
 
   Serial.print(year());  
 
   Serial.print(year());  
   Serial.print("-");
+
   Serial.print('-');
 
   Serial.print(month());
 
   Serial.print(month());
   Serial.print("-");
+
   Serial.print('-');
 
   Serial.print(day());
 
   Serial.print(day());
   Serial.print(" ");
+
   Serial.print(' ');
 
   Serial.print(hour());
 
   Serial.print(hour());
   Serial.print(":");
+
   printDigito(minute());
  printDigits(minute());
+
   printDigito(second());
   Serial.print(":");
 
  printDigits(second());
 
 
   Serial.println();
 
   Serial.println();
 
}
 
}
  
void printDigits(int digits){
+
void printDigito(int dig){
   Serial.print(":");
+
   Serial.print(':');
   if (digits < 10){
+
   if (dig < 10){
 
       Serial.print('0');
 
       Serial.print('0');
 
   }
 
   }
   Serial.print(digits);
+
   Serial.print(dig);
}
 
 
 
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]].
 
 
<syntaxhighlight lang="c++">
 
DateTime hoy = rtc.noy();
 
time_t unix = hoy.unixtime();
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Línea 231: Línea 211:
 
       }
 
       }
 
   }
 
   }
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 4 ==
 +
Mostramos las cadenas de dia y mes. Recuerde que no es opcional el parametro.
 +
 +
<syntaxhighlight lang="c++">
 +
#include <TimeLib.h>
 +
void setup(){
 +
  Serial.begin(9600);
 +
  for (byte n=1; n<=7; n++){
 +
      Serial.print(dayStr(n));
 +
      Serial.print(" - ");
 +
      Serial.println(dayShortStr(n));
 +
  }
 +
  Serial.println("-------");
 +
  for (byte n=1; n<=12; n++){
 +
      Serial.print(monthStr(n));
 +
      Serial.print(" - ");
 +
      Serial.println(monthShortStr(n));
 +
  }
 +
}
 +
void loop(){
 +
  //Nada
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== Vea también ==
 
== Vea también ==
* [[Datetime]]
+
<categorytree mode=all>Libreria Time</categorytree>
* [[tmElements_t]]
 
* [[Fecha y hora]]
 
  
 
== Referencias ==
 
== Referencias ==
 
* [https://playground.arduino.cc/Code/Time Guia de referencia Arduino]
 
* [https://playground.arduino.cc/Code/Time Guia de referencia Arduino]
 +
* [https://github.com/PaulStoffregen/Time TimeLib.h] - Paul Stoffregen
 +
* [https://github.com/adafruit/RTClib RTClib.h] - Adafruit
  
[[Category:Variables]]
+
[[Category:Libreria Time]]

Revisión actual del 00:03 6 may 2019

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 Unix Time Stamp.

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

Funciones disponibles para time_t
Función Descripción Ejemplo
now() Almacena la hora actual en tiempo UNIX time_t t = now();
year() Muestra el año year();
month() Muestra el mes (1~12) month();
monthStr() Nombre del mes (January, February, March, April, May, June, July...) monthStr(month());
monthShortStr() Nombre corto del mes (Jan, Feb, Mar, Dic) monthShortStr(month());
day() Muetsra el dia (1~31) day();
weekday() Muestra dia de la semana (1=domingo) (1~7) weekday();
dayStr() Nombre del dia (Sunday, Monday, Tuesday, Wenesday, Thursday, Friday, Saturday) dayStr(weekday());
dayShortStr() Nombre corto del dia (Sun, Mon, Tue, Wen, Thu, Fri, Sat) dayShortStr(weekday());
hour() Muestra las horas (0~23) hour();
minute() Muestra los minutos (0~59) minute();
second() Muestra los segundos (0~59) second();
millis() Muestra los milisegundos (0~999) millis();
hourFormat12() Formatea a 12 horas
isAM() Devuelve verdadero por la mañana isAM()
isPM() Devuelve verdadero por la tarde isPM();
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);
setSyncProvider() Establecer proveedor de hora externa
setSyncInterval() Establecer el número de segundos entre re-sincronizaciones
timeStatus() Indica si el tiempo se sincronizado recientemente. Devuelve: timeNotSet/timeNeedSync/timeSet

Comentarios

  • La libreria TimeLib.h agrega la funcionalidad de reloj a Arduino 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 NO se requiere un parámetro para las funciones basicas. Sin embargo como el reloj sigue funcionando la demora en mostrar la hora no sera la misma si capturamos el tiempo en una variable del tipo time_t y la introducimos en las funciones.
  • Un caso especial son las funciones de texto que requeriran incluir un valor o función para determinar su valor: dayStr(week(t)), dayShortStr(week(t)), monthStr(month()) y monthShortStr(month()).

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

void setup()  {
   Serial.begin(9600);
   while (!Serial);        //Solo se requiere para Leonardo
   pinMode(13, OUTPUT);
   Serial.println("Esperando mensaje de sincronizacion");
}

void loop(){    
   if (Serial.available()) {
      sincro();
   }
   if (timeStatus() == timeSet) {
      pantalla();                  //Muestra fecha hora
      digitalWrite(13, HIGH);      //Sincronizado
   }else{
      digitalWrite(13, LOW);       //Requiere sincronizar
   }
   delay(1000);
}

void sincro() {
   if (Serial.find(TIME_HEADER)) {
      unsigned long pctime = Serial.parseInt();
      if (pctime >= 1357041600) {       //Verifica valides de fecha-hora (mayor a 1-ENE-2013)
         setTime(pctime);               //Sincroniza reloj Arduino con fecha-hora recivida por puerto serie
      }
   }
}

void pantalla(){
   Serial.print(year()); 
   Serial.print('-');
   Serial.print(month());
   Serial.print('-');
   Serial.print(day());
   Serial.print(' ');
   Serial.print(hour());
   printDigito(minute());
   printDigito(second());
   Serial.println();
}

void printDigito(int dig){
   Serial.print(':');
   if (dig < 10){
      Serial.print('0');
   }
   Serial.print(dig);
}

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
      }
   }
}

Ejemplo 4

Mostramos las cadenas de dia y mes. Recuerde que no es opcional el parametro.

#include <TimeLib.h>
void setup(){
   Serial.begin(9600);
   for (byte n=1; n<=7; n++){
      Serial.print(dayStr(n));
      Serial.print(" - ");
      Serial.println(dayShortStr(n));
   }
   Serial.println("-------");
   for (byte n=1; n<=12; n++){
      Serial.print(monthStr(n));
      Serial.print(" - ");
      Serial.println(monthShortStr(n));
   }
}
void loop(){
   //Nada
}

Vea también


Referencias