Для журнала потребовалось ставить временные метки. Time Stamp самый лучший вариант.
В 4 байта переменной unsigned long влезает полная дата и время. В некоторых источниках указано что, 32-х битная
переменной хватит только до 2038 года. Но не сложно проверить, что если используется без знаковая переменная то
значения 0хFFFFFFFF хватит до 7 февраля 2106 года.
Остается не понятным, почему за точку отсчета выбран 1970 год. Чуть более практичным,
был бы выбор начала эпохи с високосного года 1968 или 1972.
Первый вариант. Конвертирование 32-х битного значения в понятные данные.
Обратный вариант. Конвертация понятный значений в переменную UNIX TIME.
Проверялось здесь
Unix time конвертер
void Value_To_Time_Stamp ( unsigned long value, uint16_t *returned_data, signed int GTM=0 );
void setup() {
Serial.begin (9600);
}
void loop()
{
uint16_t data[7] ={0,};
Value_To_Time_Stamp( 1709613270, data, 0);
Serial.print ("Year : ");
Serial.println (data[0]);
Serial.print ("Month : ");
Serial.println (data[1]);
Serial.print ("Day : ");
Serial.println (data[2]);
Serial.print ("Hours : ");
Serial.println (data[3]);
Serial.print ("Minutes : ");
Serial.println (data[4]);
Serial.print ("Seconds : ");
Serial.println (data[5]);
Serial.print ("Day Number : ");
Serial.println (data[6]);
Serial.println ("------------------------");
delay (15000);
}
void Value_To_Time_Stamp ( unsigned long value, uint16_t *returned_data, signed int GTM )
{
if (GTM >= 0)
{
value = value + (GTM * 3600);
}
else { GTM =~GTM + 1; value = value - (GTM * 3600); }
const unsigned long half_vi_era = 68256000;
const unsigned long one_vi_era = 0x7861F80;
const unsigned long one_year = 0x1E13380;
const unsigned long one_day = 86400;
uint8_t vi_days=0;
uint8_t fake_vi=0;
boolean vi_year=0;
boolean fake_vi_year=0;
unsigned long month_comp = 0x11044C;
unsigned long temp;
vi_days = ((value - half_vi_era) / one_vi_era )+1;
unsigned int years = (value - (vi_days * one_day)) / one_year;
unsigned int i = years + 1970;
if ( ((years + 2) % 4)==0 )
{
vi_year = true;
month_comp = 0x110448;
if ( (!(i%100)) && (!(i%4)) && (i%400) )
{
vi_year = false;
fake_vi_year = true;
month_comp = 0x11044C;
}
}
for ( ; i>2099; i--)
{
if ( (!(i%100)) && (!(i%4)) && (i%400) )
{
fake_vi++;
}
}
if (vi_year || fake_vi_year)
{
if ( (value - (one_vi_era * vi_days) ) >= half_vi_era )
{
vi_days--;
}
}
temp = ( value % ((unsigned long) (one_year * years) + (vi_days * one_day))) / one_day;
if (value <= half_vi_era)
{ fake_vi=0;
temp = value / one_day;
years = temp / 365;
temp = temp - (365 * years);
}
if (fake_vi)
{
int a = temp + fake_vi;
if ( fake_vi_year )
{
a--;
if (a>364)
{ years++;
a = 365-a; }
}
if ( !vi_year )
{
if (a>364)
{ years++;
a = 365-a; }
}
if ( vi_year )
{
if (a>365)
{ years++;
a = 366-a; }
}
temp = a;
}
uint8_t month = 0;
int16_t day;
do {
day=temp;
temp = temp - (31-(month_comp & 0x03));
month_comp = month_comp >> 2;
month++;
} while ( (int16_t)temp >= 0);
returned_data[1] = month;
returned_data[2] = day+1;
returned_data[0] = years + 1970;
temp = value % 604800;
day = temp/86400;
day = day+3;
if (day>6){day = 6-day;
day = ~day;}
day++;
returned_data[6] = day;
value = value % one_day;
returned_data[3] = value / 3600;
value = value % 3600;
returned_data[4] = value / 60;
returned_data[5] = value % 60;
}
Функция чтения Time Stamp 05. 03. 2024г. Nord_Air.
Эта программа является свободным ПО: вы можете распространять и/или модифицировать её
согласно условиям Основной Общественной Лицензии GNU, опубликованной Организацией Свободного Программного Обеспечения,
3-ей версии Лицензии, либо любой последующей версией.