Convierte ay desde Unix Timestamp

8

¿Cuál es la mejor manera de convertir entre fecha, horas, minutos, segundos a la marca de tiempo Unix en milisegundos en Arduino? Necesito tener esta conversión, ya que estoy usando RTC (fecha, horas, minutos, segundos, etc.) y comunico la marca de tiempo de Unix a través de BLE

Encontré algunos fragmentos de códigos en línea, pero aún no los he probado exhaustivamente.

  byte second = epoch%60; epoch /= 60;
  byte minute = epoch%60; epoch /= 60;
  byte hour   = epoch%24; epoch /= 24;

  unsigned int years = epoch/(365*4+1)*4; epoch %= 365*4+1;
  unsigned int year;
  for (year=3; year>0; year--)
  {
      if (epoch >= days[year][0])
          break;
  }

  unsigned int month;
  for (month=11; month>0; month--)
  {
      if (epoch >= days[year][month])
          break;
  }

  year  = years+year;
  month = month+1;
  unsigned int day   = epoch - days[year][month]+1;

  unsigned int weekday  = (dayOfMonth += month < 3 ? year-- : year - 2, 23*month/9 + dayOfMonth + 4 + year/4- year/100 + year/400)%7;

Y para convertir a la marca de tiempo de Unix:

unsigned long epoch = (((year/4*(365*4+1)+days[year%4][month]+dayOfMonth)*24+hour)*60+minute)*60+second;

¿Hay alguna biblioteca en Arduino que implemente esto? Cambiaría la fiabilidad sobre el tamaño del programa.

Dzung Nguyen
fuente

Respuestas:

7

Creo que las dos bibliotecas más utilizadas son Adafruit RTClib y pjrc.com TimeLib . Ambos tienen funciones para convertir la época, y ambos son confiables. Pero ambos carecen de la zona horaria y del horario de verano. Creo que el TimeLib de pjrc.com es un poco más adecuado para manejar el tiempo de época (que es un tiempo sin signo de 32 bits definido como 'time_t').

Jota
fuente
+1 para TimeLib. Lo uso todo el tiempo para las marcas de tiempo de Unix.
Majenko
3

Hay una forma estándar de hacer esas conversiones en C, que es a través de las funciones definidas en <time.h>. Esta API es estándar, puede probarla en su computadora. Las versiones recientes de avr-libc admiten esto: consulte time.h en avr-libc . Estas funciones pueden manejar la hora local si proporciona una función que implemente las reglas DST: consulte set_dst(). Se proporcionan ejemplos para las normas de EE. UU. Y la UE.

Edgar Bonet
fuente
Impresionante, no sabía que el 'time.h' con la zona horaria y también el horario de verano se incluyeron con el Arduino. Gracias. Lamentablemente, conectar un chip RTC con ese sistema de tiempo no es agradable. Cada segundo se debe llamar a system_tick (). Solo me quedo con pjrc.com TimeLib por ahora.
Jot
@Jot Eso no es del todo correcto. Puede usar un RTC para configurar el reloj interno del Arduino, luego llamar al reloj interno para obtener la información de tiempo necesaria ... RTC en ese caso es simplemente un reloj respaldado por batería que OCASIONALMENTE se usa ... una vez por reinicio y posiblemente cada semana o dos para corrección de deriva.
Michael Sims
0

Aquí hay un ejemplo para convertir segundos (tiempo Unix) a Fecha y hora usando TimeLib.h:

#include <TimeLib.h>

unsigned long offset_days = 3;    // 3 days
unsigned long t_unix_date1, t_unix_date2;

void setup() {
  Serial.begin(115200);
  t_unix_date1 = 1564398600;
  Serial.print("t_unix_date1: ");
  Serial.println(t_unix_date1);
  offset_days = offset_days * 86400;    // convert number of days to seconds
  t_unix_date2 = 1564398600 + offset_days;
  Serial.print("t_unix_date2: ");
  Serial.println(t_unix_date2);
  printf("Date1: %4d-%02d-%02d %02d:%02d:%02d\n", year(t_unix_date1), month(t_unix_date1), day(t_unix_date1), hour(t_unix_date1), minute(t_unix_date1), second(t_unix_date1));
  printf("Date2: %4d-%02d-%02d %02d:%02d:%02d\n", year(t_unix_date2), month(t_unix_date2), day(t_unix_date2), hour(t_unix_date2), minute(t_unix_date2), second(t_unix_date2));
}

void loop() {



}
Ivan
fuente
-6

Cualquier compilador c medio decente tendría un conjunto de tipos y rutinas relacionadas con el tiempo para lidiar con esto. Consulte el manual de su compilador para obtener más detalles.

Por cierto, contrario a la sabiduría convencional, no necesita un etc. para realizar un seguimiento del tiempo. Cualquier buen temporizador anterior más tu código servirá.

dannyf
fuente
44
La mayoría de los Arduinos tienen un resonador de cerámica y, por lo tanto, no son adecuados para cualquier tipo de cronometraje. De ahí la necesidad de un RTC. El "buen temporizador anterior" puede hacer el trabajo solo si tiene un Arduino con reloj de cristal.
Edgar Bonet
2
Por cierto, "Consulte el manual de su compiker" no es realmente una respuesta.
Edgar Bonet