• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как задать локальное время без модуля и NTP-Сервера?

Mоnk

Member
Смотри TZ.h в исходниках Arduino ESP8266.
Видел. Применять не стал.
Чтоб применить TZ, нужно воспользоваться
Не спорю. Я просто ставил эксперимент.
шаг 1. При загрузке получаем время Четверг 1 Январь 1970 8:0:0
шаг 2. Подключаем вафлю, конфигурим СНТП configTime(3 * 3600, 0, "pool.ntp.org");, получаем правильное время Понедельник 4 Январь 2021 23:6:2
шаг 3. Вводим вручную дату-время, видим допустим Четверг 17 Декабрь 2020 18:15:57. Ждем, когда от СНТП прилетит правильное время.
Понимаем, что полученное в результате время на три часа отстает. Курим мануал, вносим изменения, выражаем мнение...
 

Mоnk

Member
в ардуино есть функция sntp_getreachability()
Посмотрю. Просто в нелюбимой Вами битлотеке (которая кстати входит в состав стандартных Ардуино.сс) есть примочка timeStatus(), которая весьма сильно помогает понять, получено ли время по СНТП?
 

Mоnk

Member
В общем не нашел ничего лучше (последняя строка).
C++:
  time_t rawtime;                   // Переменная для системного времени
  struct tm * timeinfo;             // Указатель на структуру с локальным временем
  time (&rawtime);                  // Считываем системное время
  timeinfo = localtime (&rawtime);  // Преобразуем системное время в локальное

  secondDS    = timeinfo -> tm_sec + 1;
  minuteDS    = timeinfo -> tm_min;
  hourDS      = timeinfo -> tm_hour;
  dayOfWeek   = timeinfo -> tm_wday + 1;
  dayOfMonth  = timeinfo -> tm_mday;
  monthDS     = timeinfo -> tm_mon + 1;
  yearDS      = (timeinfo -> tm_year + 1900) % 2000;
  NTPtimeGet  = timeinfo -> tm_year == 70 ? false : true;
 

enjoynering

Well-known member
Можно и так, но у меня нормально работает sntp_getreachability().

После загрузки ESP8266 в течении 5 секунд проверяю sntp_getreachability(). Как только возврвщает true, можно показывать время. Работает замечательно. Можете проверить тут.
 

Mоnk

Member
Почитал RFC 5905, много думал...
Насколько понял суть вопроса, обмен пакетами состоялся. Чем больше, тем лучше. То есть сдвиг sntp_getreachability больше нуля. А все, что больше нуля - это true. А вот все ли пакеты куда надо долетели?
 

enjoynering

Well-known member
немножко не правильно sntp_getreachability показывает, что хотябу один из 8 пакетов ПРИЛИТЕЛ от SNTP сервера
 

enjoynering

Well-known member
вот кусок из стандарта

Next, the 8-bit p.reach shift register in the poll process described
in Section 13 is used to determine whether the server is reachable
and the data are fresh. The register is shifted left by one bit when
a packet is sent and the rightmost bit is set to zero. As valid
packets arrive, the rightmost bit is set to one. If the register
contains any nonzero bits, the server is considered reachable
;
otherwise, it is unreachable.
 

enjoynering

Well-known member
вот переписал согласно стандарту

Код:
  /* wait for NTP server connection */
  if (WiFi.status() == WL_CONNECTED)
  {
    while (((sntp_getreachability(0) & 0x7) == 0) || (timeOut > 0))
    {
      timeOut--;

      delay(1000);
    }
  }
 

enjoynering

Well-known member
нет лучше вот так (проверяем, что послали пакет и приняли пакет)

Код:
  /* wait for NTP server connection */
  if (WiFi.status() == WL_CONNECTED)
  {
    while (((sntp_getreachability(0) & 0x03) == 0) || (timeOut > 0))
    {
      timeOut--;

      delay(1000);
    }
  }
 

enjoynering

Well-known member
почему-то (timeOut > 0) внутри wile() не работает. вот мой полностью рабочий вариант

Код:
  /* wait for NTP server connection */
  if (WiFi.status() == WL_CONNECTED)
  {
    while ((sntp_getreachability(0) & 0x01) != 0x01)
    {
      if (timeOut-- < 0) return;

      delay(1000);
    }

    Serial.printf_P(PSTR("packet from NTP server http://%s received\n"), ntpConfig.timeServer0.c_str());
  }
 
Сверху Снизу