Помогите в написании NTP клиента
- Войдите на сайт для отправки комментариев
Доброго времени суток!
Пытаюсь реализовать NTP клиент для ардуино. В стандартном примере реализована возможность получения только времени, мне нужна еще и дата, месяц год.
В переменную unsigned long secsSince1900 кладем количество секунд прошедших с 1 января 1900 г.
затем вычисляем год:
uint16_t cYear = secsSince1900 / 31556952UL + 1900;
31556952 - таково точное количество секунд в году, который равен 365,2425 суток (Григорианский календарь). Тут я могу ошибаться по количеству секунд в году, ибо в некоторых источниках указано 31 556 926, незнаю по какой формуле они расчитывали данное значение. У меня вроде правильно расчитывается.
Далее месяц, тут уже сложнее. Думаю вначале необходимо расчитать количество дней, прошедших с начала текущего года, а потом уже по условию вычислить текущий месяц, например 60 - это февраль в високосном году :)
byte cDate = (secsSince1900 % 31556952UL) / 86400;
86400 - количество секунд в сутках. Вот тут я похоже ошибся, только не пойму в чем. Получаю значение на 2 дня меньше текущего, т.е. сегодня 27, а получаю 25. 1 день скорректируется 29 февряля, ибо текущий год високосный, но куда петерял еще один день, не понимаю. Возможно дело в том, что в сутках не ровно 24 часа, а чуть больше. Или же дело в 2000 году. По правилам високосным годом является год, делящейся без остатка на 4, но не делящийся на 100. начиная с 1900 года под эти параметры попадает только 2000 год. Я не помню, был ли он високосным?
Да, хотел добавить, может есть стандартная библиотека под ардуино, я что то не нашел
Не проще ли поставить/подключить часы с автономным питанием и интерфейсом по I2C базе чипа DS1302,DS 1307, DS3231 ?
Там требуется только начальная установка даты и времени.
И еще, если мне не изменет память, встроенного таймера хватает на сколько там суток, затем он переполняется и счет миллисекунд начинается сначала.
https://www.arduino.cc/en/Reference/RTC
Уже обсуждалось, почитайте http://arduino.ru/forum/obshchii/ntp-po-udp
Да, я это знаю, использую модуль DS1302, но поскольку таких устройств с десяток и работать они должны годами, хотелось бы подстраховаться от сильного расхождениия времени и севшей батарейки. Думал это сделать с помощью сервера времени, но оказалось это не так то просто. Если никто не сможет подсказать по данному вопросу, придется последовать вашему совету.