Converti da e verso Unix Timestamp


8

Qual è il modo migliore per convertire tra data, ore, min, secondi in timestamp Unix in millisecondi in Arduino? Devo avere questa conversione, poiché sto usando RTC (data, ore, minuti, secondi ecc.) E sto comunicando il timestamp Unix su BLE

Ho trovato alcuni frammenti di codici online, ma non l'ho ancora testato ampiamente.

  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 per convertire in timestamp Unix:

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

C'è qualche libreria in Arduino che implementa questo? Vorrei compromettere l'affidabilità rispetto alle dimensioni del programma.

Risposte:


7

Penso che le due librerie più utilizzate siano Adafruit RTClib e pjrc.com TimeLib . Entrambi hanno funzioni per convertire l'epoca ed entrambi sono affidabili. Ma entrambi mancano del fuso orario e dell'ora legale. Penso che il TimeLib di pjrc.com sia leggermente più adatto a gestire il tempo dell'epoca (che è un unsigned a 32 bit definito da tempo come 'time_t').


+1 per TimeLib. Lo uso sempre per i timestamp unix.
Majenko

3

C'è un modo standard di fare quelle conversioni in C, che è attraverso le funzioni definite in <time.h>. Essendo questa API standard, puoi provarla sul tuo computer. Le versioni recenti di avr-libc supportano questo: vedere time.h in avr-libc . Queste funzioni possono gestire l'ora locale se si fornisce una funzione che implementa le regole dell'ora legale: vedere set_dst(). Esempi sono forniti per le norme statunitensi e comunitarie.


Fantastico, non sapevo che il "time.h" con fuso orario e l'ora legale fossero inclusi con l'Arduino. Grazie. Collegare un chip RTC con quel sistema temporale non è purtroppo bello. Ogni secondo dovrebbe essere chiamato un system_tick (). Sto solo con il TimeLib pjrc.com per ora.
Jot

@Jot Non è del tutto corretto. È possibile utilizzare un RTC per impostare l'orologio interno di Arduino, quindi chiamare l'orologio interno per le informazioni sul tempo necessarie ... RTC in tal caso è semplicemente un orologio con batteria che viene utilizzato OCCASIONALMENTE ... una volta per riavvio e possibilmente ogni settimana o due per la correzione della deriva.
Michael Sims,

0

Ecco un esempio per convertire i secondi (ora Unix) in Data e ora utilizzando 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() {



}

-6

Qualsiasi compilatore C decente avrebbe una serie di tipi e routine relativi al tempo per far fronte a questo. Consultare il manuale del compiker per ulteriori dettagli.

A proposito, contrariamente alla saggezza convenzionale, non è necessario un ecc per tenere traccia del tempo. Qualsiasi buon vecchio timer più il tuo codice farà.


4
La maggior parte degli Arduinos ha un risonatore in ceramica, quindi non è adatta a qualsiasi tipo di cronometraggio. Quindi la necessità di un RTC. Il "buon vecchio timer" può fare il lavoro solo se si dispone di un Arduino con clock di cristallo.
Edgar Bonet,

2
A proposito, "Consultare il manuale del compiker" non è davvero una risposta.
Edgar Bonet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.