Converta de e para Unix Timestamp

8

Qual é a melhor maneira de converter entre data, horas, min e segundos para carimbo de data e hora do Unix em milissegundos no Arduino? Preciso ter essa conversão, pois estou usando o RTC (data, horas, min, segundos etc.) e comunicando o carimbo de data e hora do Unix pelo BLE

Encontrei um trecho de código online, mas ainda não o testei extensivamente.

  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;

E para converter em carimbo de data / hora do Unix:

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

Existe alguma biblioteca no Arduino que implementa isso? Eu trocaria a confiabilidade pelo tamanho do programa.

Dzung Nguyen
fonte

Respostas:

7

Eu acho que as duas bibliotecas mais usadas são o Adafruit RTClib e o pjrc.com TimeLib . Ambos têm funções para converter a época e são confiáveis. Mas ambos não têm o fuso horário e o DaylightSavingTime. Acho que você acha o TimeLib do pjrc.com apenas um pouco mais adequado para lidar com o tempo da época (que é um sinal não assinado de 32 bits definido como 'time_t').

Mínimo
fonte
+1 para TimeLib. Eu o uso o tempo todo para registros de data e hora unix.
Majenko
3

Existe uma maneira padrão de fazer essas conversões em C, que é através das funções definidas em <time.h>. Como essa API é padrão, você pode testá-la no seu computador. Versões recentes do avr-libc suportam isso: consulte time.h no avr-libc . Essas funções podem lidar com a hora local se você fornecer uma função implementando as regras de horário de verão: consulte set_dst(). Exemplos são fornecidos para as regras dos EUA e da UE.

Edgar Bonet
fonte
Impressionante, eu não sabia que o 'time.h' com o fuso horário e também o horário de verão foram incluídos no Arduino. Obrigado. Para conectar um chip RTC com esse sistema de tempo, infelizmente, não é bom. A cada segundo um system_tick () deve ser chamado. Eu só fico com o TimeLib do pjrc.com por enquanto.
Jot
@ Jot Isso não está totalmente correto. Você pode usar um RTC para definir o relógio interno do Arduino e, em seguida, chamar o relógio interno para obter as informações de tempo necessárias ... Nesse caso, o RTC é apenas um relógio com bateria que é usado OCASIONALMENTE ... uma vez por reinicialização e possivelmente a cada semana ou duas para correção de desvio.
Michael Sims
0

Aqui está um exemplo para converter segundos (hora do Unix) em Data e 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
fonte
-6

Qualquer compilador c decente teria um conjunto de tipos e rotinas relacionadas ao tempo para lidar com isso. Consulte o manual do compiker para obter mais detalhes.

Btw, ao contrário da sabedoria convencional, você não precisa de um etc para acompanhar o tempo. Qualquer bom temporizador mais antigo, mais o seu código, serve.

dannyf
fonte
4
A maioria dos Arduinos possui um ressonador de cerâmica e é, portanto, inadequada para qualquer tipo de cronometragem. Daí a necessidade de um RTC. O "bom temporizador mais antigo" pode fazer o trabalho somente se você tiver um Arduino com relógio de cristal.
Edgar Bonet
2
BTW, "Consulte o manual do compiker" não é realmente uma resposta.
Edgar Bonet