Максимально точно идущие и простые часы-как?

mu_ssina
Offline
Зарегистрирован: 30.08.2013

Всем добрейшего! 

Написал я тут часы одни...Просто часы-под 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;             
            }
         }
      }
     
  }

   
}

 

 

mu_ssina
Offline
Зарегистрирован: 30.08.2013

тьху, вот так надо, опИсался :-B :

void loop() 
{
   timer ();
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

В esp32 есть модуль часов реального времени. Можно припаять точный кварц и настроить. Будет точно, но это не твой уровень.

mu_ssina
Offline
Зарегистрирован: 30.08.2013

rkit пишет:
В esp32 есть модуль часов реального времени. Можно припаять точный кварц и настроить. Будет точно, но это не твой уровень.

Ну видимо придется тогда ограничиться максимально частым обновлением времени с сервера...

rkit
Offline
Зарегистрирован: 23.11.2016

По сути служба реалного времени должна работать от внутреннее генератора с калибровкой по сети, только не знаю, как это все реализовано в ардуино. И это не миллис, а time(), или что там в с стандартное.

mu_ssina
Offline
Зарегистрирован: 30.08.2013

rkit пишет:
По сути служба реалного времени должна работать от внутреннее генератора с калибровкой по сети, только не знаю, как это все реализовано в ардуино. И это не миллис, а time(), или что там в с стандартное.

Да, я уже тоже, когда задумался над точным временем, понял, что это будут дебри те еще... Просто я тут думал вот над чем: ну ок, у меня система не загружена особо - чего там, часы обычные...Ну будет накапливаться ошибка в миллисекунды/десятки/даже сотни миллисекунд за 10 минут(допустим). Это всё неважно-будет ведь обновляться с сервера...

Опять же, когда подумаешь об обновлении - глюки и тормоза сети тоже скажутся. Нет, в данном конкретном случае мне всё равно. Просто получается такая куча допущений, что внутренний цензор рвет волосы. И не только на голове :-D

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Максимально простые часы, 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();
    }

}
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mu_ssina пишет:

Интересно другое: есть у меня подозрение, что они будут идти весьма произвольно и подглючивать. Оно бы конечно и наплевать-учитывая синхронизацию с сервером...Но вот как правильней сделать, на ваш взгляд? ;-)

Если хотите, чтобы часы шли максимально точно, нужно заменить:

      localSeconds = millis();

на

      localSeconds += 1000;

Ну а вообще, IMHO правильнее разделить задачи учета и индикации времени. Т.е. учет времени нужно вести в секундах (например, юникстайм) и только для индикации выделять из этих секунд часы, минуты и секунды в данной минуте.

Logik
Offline
Зарегистрирован: 05.08.2014

mu_ssina пишет:

Всем добрейшего! 

Написал я тут часы одни...Просто часы-под esp32. Каждые 10 минут будут синхронизироваться с мировым сервером времени (для точности) по wifi. Ничего полезного не делают-тупо комнатные часы :-)

Не. Сервера такое не любят, может и забанить.. Делай так. Часы просто типа как написал, но конечно  localSeconds +=1000. И два запроса на сервер с некоторым солидным интервалом.  Дальше по времени которое намерили твои часы  и правильному времени рассчитай коэффициент коррекции. Дальше веди время с учетом этого коэфициента. Периодически, раз в сутки например повторяй определение этого коэффициента.

Реализация NTP для ESP8266 мне не понравилась, делал свое.