Apa cara terbaik untuk mengonversi antara tanggal, jam, menit, detik ke stempel waktu Unix dalam milidetik di Arduino? Saya perlu melakukan konversi ini, karena saya menggunakan RTC (tanggal, jam, menit, detik, dll.) Dan mengomunikasikan stempel waktu Unix melalui BLE
Saya menemukan beberapa potongan kode secara online, tetapi belum mengujinya secara ekstensif.
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;
Dan untuk mengonversi ke stempel waktu Unix:
unsigned long epoch = (((year/4*(365*4+1)+days[year%4][month]+dayOfMonth)*24+hour)*60+minute)*60+second;
Apakah ada perpustakaan di Arduino yang mengimplementasikan ini? Saya akan mengutamakan keandalan daripada ukuran program.
Menurut saya, dua library yang paling sering digunakan adalah Adafruit RTClib dan pjrc.com TimeLib. Keduanya memiliki fungsi untuk mengonversi zaman, dan keduanya dapat diandalkan. Tetapi keduanya tidak memiliki zona waktu dan DaylightSavingTime. Saya rasa Anda akan menemukan pjrc.com TimeLib sedikit lebih cocok untuk menangani waktu zaman (yang merupakan 32-bit unsigned long yang didefinisikan sebagai 'time_t ').
Ada cara standar untuk melakukan konversi tersebut dalam C, yaitu
melalui fungsi-fungsi yang didefinisikan dalam <time.h>
. API ini menjadi standar,
Anda dapat mengujinya di komputer Anda. Versi terbaru dari avr-libc
mendukung hal ini: lihat time.h di avr-libc. Fungsi-fungsi ini dapat menangani
waktu lokal jika Anda menyediakan sebuah fungsi yang mengimplementasikan aturan DST: lihat
set_dst()
. Contoh-contoh disediakan untuk aturan AS dan Uni Eropa.
Kompiler c yang cukup baik akan memiliki satu set tipe dan rutinitas yang berhubungan dengan waktu untuk menangani hal ini. Lihat manual kompiler Anda untuk informasi lebih spesifik.
Sebagai tambahan, berlawanan dengan kebijaksanaan konvensional, Anda tidak memerlukan sebuah etc untuk melacak waktu. Pengatur waktu lama yang bagus ditambah kode Anda sudah cukup.