Максимально точно идущие и простые часы-как?
- Войдите на сайт для отправки комментариев
Вс, 11/07/2021 - 00:11
Всем добрейшего!
Написал я тут часы одни...Просто часы-под esp32. Каждые 10 минут будут синхронизироваться с мировым сервером времени (для точности) по wifi. Ничего полезного не делают-тупо комнатные часы :-)
Интересно другое: есть у меня подозрение, что они будут идти весьма произвольно и подглючивать. Оно бы конечно и наплевать-учитывая синхронизацию с сервером...Но вот как правильней сделать, на ваш взгляд? ;-)
Опять же повторюсь -ничего полезного и критичного не делают. Просто интересный момент(для меня)- хотелось бы узнать мнение народа, по этому поводу....
Вот такой колхозец от меня:
void loop()
{
void timer ();
}
void timer ()// функция-таймер. По сути - обычные часы
{
if ( (millis()-localSeconds)>=1000 )//при некотором подтормаживании
//системы-тут могут быть проблемы-
//тогда надо будет реализовать иначе
{
localSeconds = millis();
if (seconds<59)
{
seconds = seconds+1;
}
else if (seconds==59)//можно и без else if - это просто для наглядности
{
seconds = 0;
if (minutes<59)
{
minutes = minutes+1;
}
else if (minutes==59)//можно и без else if - это просто для наглядности
{
minutes = 0;
if (hours<12)
{
hours = hours + 1;
}
else if (hours==12)//можно и без else if - это просто для наглядности
{
hours = 1;
}
}
}
}
}
тьху, вот так надо, опИсался :-B :
void loop() { timer (); }В esp32 есть модуль часов реального времени. Можно припаять точный кварц и настроить. Будет точно, но это не твой уровень.
Ну видимо придется тогда ограничиться максимально частым обновлением времени с сервера...
По сути служба реалного времени должна работать от внутреннее генератора с калибровкой по сети, только не знаю, как это все реализовано в ардуино. И это не миллис, а time(), или что там в с стандартное.
Да, я уже тоже, когда задумался над точным временем, понял, что это будут дебри те еще... Просто я тут думал вот над чем: ну ок, у меня система не загружена особо - чего там, часы обычные...Ну будет накапливаться ошибка в миллисекунды/десятки/даже сотни миллисекунд за 10 минут(допустим). Это всё неважно-будет ведь обновляться с сервера...
Опять же, когда подумаешь об обновлении - глюки и тормоза сети тоже скажутся. Нет, в данном конкретном случае мне всё равно. Просто получается такая куча допущений, что внутренний цензор рвет волосы. И не только на голове :-D
Максимально простые часы, 720 байт размером.
/* Name: DumbClock Author: DtS */ #include <time.h> tm CurrentTime; void setup() { CurrentTime.tm_hour = atoi(&__TIME__[0]); CurrentTime.tm_min = atoi(&__TIME__[3]); CurrentTime.tm_sec = atoi(&__TIME__[6]); } void Tick(void) { if (++CurrentTime.tm_sec < 60) return; CurrentTime.tm_sec = 0; if (++CurrentTime.tm_min < 60) return; CurrentTime.tm_min = 0; if (++CurrentTime.tm_hour < 24) return; CurrentTime.tm_hour = 0; } void loop() { static uint32_t lastMillis = 0; uint32_t now = millis(); if (now - lastMillis >= 1000) { lastMillis = now; Tick(); } }Интересно другое: есть у меня подозрение, что они будут идти весьма произвольно и подглючивать. Оно бы конечно и наплевать-учитывая синхронизацию с сервером...Но вот как правильней сделать, на ваш взгляд? ;-)
Если хотите, чтобы часы шли максимально точно, нужно заменить:
localSeconds = millis();
на
localSeconds += 1000;
Ну а вообще, IMHO правильнее разделить задачи учета и индикации времени. Т.е. учет времени нужно вести в секундах (например, юникстайм) и только для индикации выделять из этих секунд часы, минуты и секунды в данной минуте.
Всем добрейшего!
Написал я тут часы одни...Просто часы-под esp32. Каждые 10 минут будут синхронизироваться с мировым сервером времени (для точности) по wifi. Ничего полезного не делают-тупо комнатные часы :-)
Не. Сервера такое не любят, может и забанить.. Делай так. Часы просто типа как написал, но конечно localSeconds +=1000. И два запроса на сервер с некоторым солидным интервалом. Дальше по времени которое намерили твои часы и правильному времени рассчитай коэффициент коррекции. Дальше веди время с учетом этого коэфициента. Периодически, раз в сутки например повторяй определение этого коэффициента.
Реализация NTP для ESP8266 мне не понравилась, делал свое.