Diferencia entre revisiones de «Fecha y hora»

De ArduWiki
Saltar a: navegación, buscar
(Ejemplo 2)
(Ejemplo 2)
Línea 170: Línea 170:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
{{Nota|Pon atención a la función de usuario '''printFecha()''' que es muy interesante}}
+
{{Nota|Pon atención a la funciónes de usuario: '''ponFecha() y '''printFecha()''' que son muy interesantes.}}
  
 
== Vea también ==
 
== Vea también ==

Revisión del 15:57 23 mar 2019

Arduino tiene algunas funciones que manejan directamente los temporizadores y tienen usos diversos. Pero recuerda que Arduino no tiene un temporizador permanente como si es el modulo RTC asi que no puede saber la fecha y hora. Todos sus temporizadores se resetean al desconectar la energía.

Tiempos

En Arduino tenemos algunas funciones que detienen la ejecución del boceto.

Nota: Tenga mucho cuidado ya que durante ese tiempo el uC no hace nada mas que esterar se cumpla el retardo.


  • delay() Pausa el programa por la cantidad de milisegundos especificado como parámetro. No devuelve nada.
  • delayMicrosecons() Pausa el programa por la cantidad de mcrosegundos especificado como parámetro. No devuelve nada.

Nota: Si bien es fácil crear un LED parpadeante con la funcion delay() y muchos bocetos lo usan, también es usado como antirrebote de pulsadores, el uso de delay() en un boceto tiene inconvenientes importantes. Ninguna otra lectura o manipulacion de de puerto, cálculos matemáticos puede ejecutarse durante la función de retardo, por lo que, en efecto, detiene la mayoría de otras actividades. Para obtener enfoques alternativos para controlar el tiempo consulte:


  • millis() - Devuelve la cantidad de milisegundos desde que la placa Arduino comenzó a ejecutar el programa actual.
  • micros() - Devuelve la cantidad de microsegundos desde que la placa Arduino comenzó a ejecutar el programa actual.

Fecha y hora

Los temporizadores internos de Arduino son de corto plazo. Pero que hacer cuando requerimos por ejemplo poner fecha y hora en nuestro tabulado de datos de sensores (datalogger) para un análisis posterior ? Estas funciones están disponibles si añades la librería estándar de Arduino TimeLib.h.

Lo primero que hace la librería TimeLib.h es definir un tipo especial de variable que llamamos time_t de 32 bits, que es la base de todo, porque almacena valores de tiempo en un formato especial calculado como el número de segundos transcurridos desde el 1-ENE-1970, llamada fecha Unix.

Metodo Descripción rango
milles() Milisegundos 0~999
second() Segundos 0~59
minute() Minutos 0~59
hour() Hora 0~23
day() Numero de dia 1~31
dayStr(day()) Nombre de dia
dayShortStr(day()) Nombre de dia
weekday() Dia de la semana 1~7 (1=domingo)
month() Numero de mes 1~12
monthStr(month()) Nombre de mes
monthShort(month()) Nombre de mes
year() Año 4 digitos
hourFormat12() Pone en formato 12 horas 0~11
isAM() AM Verdadero por la mañana
isPM() PM Verdadero por la tarde
now() Tiempos Unix Segundos desde 1-ENE-1970

Nota: Fantástico ya tenemos creada nuestra variable del tipo time_h con la hora actual según nuestro Arduino... pero espera no que Arduino no sabia la fecha ni hora ? exacto lo que acabas de obtener es un porquería y hay que arreglar al Arduino.


Poner fecha

Esta es la función que nos permite decirle al Arduino en que dia y hora estamos.

setTime(ss);     //Numero de segundos desde 1-ENE-1970
setTime(hh,mm,ss,dia,mes,año);  //hora, minuto,segundo dia, mes, año

Crear matriz fecha

Otra tipo de dato interesante es el tmElements_t que nos permite asignar cada uno de los elementos por separado como si te tratara de un conjunto de métodos asi:

tmElements_t tx;
tx.Second = Segundos; (0~59)
tx.Minute = Minuto; (0~59)
tx.Hour = Hora; (0~23)
tx.Day = Dia; (1~31)
tx.Month = Mes; (1~12)
tx.Tear = Año; (0~99) diferencia desde 1970.

Ejemplo 1

Fijamos una fecha y hora y mostramos cada segundo.

#include <TimeLib.h>
void setup(){
   Serial.begin(115200);
   setTime(8,0,0,14,7,2018); //14-JUL-2018 08:00:00
}
void loop(){
   time_t t = now();
   if (hour(t) < 10){
      Serial.print("0");
   }
   Serial.print(hour(t));
   Serial.print(":");
   if (minute(t) < 10){
      Serial.print("0");
   }
   Serial.print(minute(t));
   Serial.print(":");
   if (second(t) < 10){
      Serial.print("0");
   }
   Serial.println(second(t));
   delay(1000);
}

Ejemplo 2

Calcular la diferencia entre dos fechas. Por ejemplo del 6-NOV al 13-NOV del 2018. Respuesta: 0 años, 0 meses, 7 dias, 20 horas, 28 minutos, 0 segundos.

#include <TimeLib.h>
time_t t0,t1,dif;
void setup(){
   Serial.begin(115200);
   t0 = ponFecha(2018, 11, 6, 20, 17, 0);   //6-NOV-2018 20:17:00
   printFecha(t0);
   t1 = ponFecha(2018, 11, 13, 16, 45, 0);  //13-NOV-2018 16:45:00
   printFecha(t1);
   Serial.println("--------------------------------------------------");
   dif =  t1 - t0;
   Serial.print(String(year(dif)-1970) + " años, " + String(month(dif)-1) + " meses, ");
   Serial.print(String(day(dif)) + " dias, " + String(hour(dif)) + " horas ");
   Serial.println(String(minute(dif)) + " minutos, " + String(second(dif)) + " segundos.");
   Serial.println("---------------------------------------------------");
}
time_t ponFecha(int y, int m, int d, int hh, int mm, int ss){  
   tmElements_t f;
   f.Second = ss;
   f.Minute = mm;
   f.Hour = hh;
   f.Day = d;
   f.Month = m;
   f.Year = y - 1970 ; 
   return makeTime(f);     //Crea tiempo Unix
}
void printFecha(time_t  t){
   if (day(t) < 10){
       Serial.print("0");
   }
   Serial.print(day(t));    //dia
   Serial.print("-");
   if (month(t) < 10){
      Serial.print("0");
   }
   Serial.print(month(t));  //mes
   Serial.print("-");
   Serial.print(year(t));   //año
   Serial.print(" ");
   if (hour(t) < 10){
      Serial.print("0");
   }
   Serial.print(hour(t));   //hora
   Serial.print(":");
   if (minute(t) < 10){
      Serial.print("0");
   }
   Serial.print(minute(t));  //minutos
   Serial.print(":");
   if (second(t) < 10){
      Serial.print("0");
   }
   Serial.println(second(t));  //segundos
}
void loop(){
   //Nada
}

Nota: Pon atención a la funciónes de usuario: ponFecha() y printFecha() que son muy interesantes.


Vea también

Referencias