• Система автоматизации с открытым исходным кодом на базе 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)
Правда, об этом трудно не забыть при перестройке приемной части.
 
Сверху Снизу