• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как при работе с NTP избежать получения неверного года 1970

Настраиваю систему сбора результатов измерений с четырех плат, размещенных в пределах садового участка. Данные собираю по WiFi с использованием esp-now на одну из плат, на которой размещена флешка SD. Вывод информации на Web в форме файлов, имя которых содержит дату их создания, определяемую по NTP в момент запуска программы. Столкнулся с тем, что при перезапусках программ из сбоев или выключения ПК, к USB которого подключена плата, имя файла оказывается содержит год 1970 вместо правильного. Средства избежать этого не нашел. Ни смена timeservera ни использование конструкции с timeClient.forceUpdate(); надежно не работают. Правильный год и время возникают случайно, и повторить успех не получается. Поделитесь опытом!

Использую также альтернативный сбор посредством писем, посылаемых каждой платой мне на mail.ru Но из-за ограничений размера письма писем получается по 4 в сутки и перенос информации с них в файлы для обработки и анализа достаточно нудная работа. Прием с web значительно проще.
 

CodeNameHawk

Moderator
Команда форума
После подключения к сети, время быстро появляется :
Код:
#include <sys/time.h> // struct timeval
#include <time.h>     // time() ctime()
#include <ESP8266WiFi.h>

// This database is autogenerated from IANA timezone database
//    https://www.iana.org/time-zones
// and can be updated on demand in this repository
#include <TZ.h>
#include <PolledTimeout.h>

// example of a timezone with a variable Daylight-Saving-Time:
// demo: watch automatic time adjustment on Summer/Winter change (DST)
#define MYTZ TZ_Europe_Vilnius

static esp8266::polledTimeout::periodicMs showTimeNow(60000);

static time_t now;

#ifndef STASSID
#define STASSID "XXX"
#define STAPSK "YYY"
#endif

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("\r\nStarting...\r\n");
  // start network
  WiFi.persistent(true);
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);

  Serial.printf("Connecting to %s ", STASSID);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("CONNECTED to WIFI");

  // ----> Here is the ONLY ONE LINE needed in your sketch
  configTime(MYTZ, "pool.ntp.org");

  now = time(nullptr);
  /*  Serial.println();
    Serial.println(ctime(&now));

    struct tm * timeinfo;
    time(&now);
    timeinfo = localtime(&now);
    Serial.println(timeinfo->tm_hour);
    Serial.println(asctime(timeinfo));
  */
}

void loop()
{
  // put your main code here, to run repeatedly:
  now = time(nullptr);
  // Serial.println(ctime(&now));

  char linia[18];
  struct tm *timeinfo;
  timeinfo = localtime(&now);
  if (strftime(linia, 17, "Time %H:%M:%S", timeinfo))
  {
    Serial.println(linia);
  }
  delay(100);
}
 
Что странно! Неудачные случаи начала работы (полученный год 1970) коррелируют со сбоями web. Соответствующий IP не доступен. Если после reset год правильный, то IP доступен и web на экране.
 

CodeNameHawk

Moderator
Команда форума
Кажется я нашел причину частых неудач при получении времени. Я вел отладку большой программы, принимающей данные от других плат в условиях непрерывной работы этих плат. Поступление пакета данных в начальный момент до полного установления нарушало работу принимаемой программы. Выключение внешних источников позволило получать правильное время и работающий web.
 

CodeNameHawk

Moderator
Команда форума
Бывает полезно, перед каждой операцией с сетью, проверить доступна(подключена) ли сеть.
 
В моем случае полезно было бы отключать прием до полного установления. Но не понятно как это сделать. В моем варианте esp-now процедура приема работает независимо от остальной программы.
 
Я сделал, как во флоте "минута тишины". Остановил передачи на 5 минут в конце каждого часа. if(minutes<55)
Правда, об этом трудно не забыть при перестройке приемной части.
 
Сверху Снизу