Diferencia entre revisiones de «time t»

De ArduWiki
Saltar a: navegación, buscar
(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 17:48 22 mar 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 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
      }
   }
}

Vea también

Referencias