Обратная связь ESP32 от NTP

Базовый пример для ESP32 NTP очень груб:

void setup()
{
  Serial.begin(115200);
  
  // подключение к Wi-Fi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println(" CONNECTED");
  
  //инициализируйте и получите время
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();

  // отключите Wi-Fi, так как он больше не нужен
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

Но это ничего не говорит об успехе операции. Мне нужно знать, смог ли он обновить время с сервера NTP... есть ли способ узнать это?

Я не могу полагаться на временную структуру, потому что я должен инициализировать ее вручную при запуске, скажем, в 00:00 1 января 2020 года.

, 👍0

Обсуждение

Из любопытства: почему время устанавливается вручную при запуске, когда вы все равно будете обновлять его с помощью NTP?, @ocrdu

Потому что, если NTP недоступен (т. Е. Нет подключения Wi-Fi), система в любом случае должна начать операции. Пользователь может установить значение даты и времени по умолчанию для этого сценария., @Mark


2 ответа


2

Вы следовали этому руководству?

https://lastminuteengineers.com/esp32-ntp-server-date-time-tutorial /

Функция printLocalTime(); выполняет все, что вы просите.

void printLocalTime()
{
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

GetLocalTimeвозвращает false при сбое. Пусть printLocalTime сделает то же самое.

boolean printLocalTime()
{
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return false;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
  return true;
}

Теперь функция печати сообщает вам, произошел ли сбой (возвращает false) или нет (возвращает true).

,

Пожалуйста, посмотрите на реализацию GetLocalTime(). Он просто проверяет, соответствует ли год, если < 2016. Но я сказал, что при включении питания я устанавливаю текущее время на определенное значение (например, 1/1/2020). Так что я не могу полагаться на это. Мне нужно знать, был ли NTP в порядке или произошел сбой., @Mark

@Mark Извините, я совершенно неправильно понял вашу проблему. Я также интерпретировал код совершенно неправильно. Мой ответ не соответствует вашему вопросу. Теперь я изучил код Arduino ESP, и, вероятно, есть шанс узнать, было ли время ранее установлено вызовом NTP-сервера. Но на самом деле у меня нет времени оценивать это. Я изменю свой ответ, как только смогу немного разобраться. Подсказка: sntp_sync_status_t sntp_get_sync_status(void); в arduino-esp32/tools/sdk/include/lwip/sntp.h В любом случае ответ, который дал ocrdu, стоит попробовать, и он должен быть принятым ответом, если он работает., @Peter Paul Kiefer


0

Я не совсем уверен, что для этого есть хорошее решение с обычной библиотекой ESP32, поскольку она только проверяет, был ли установлен действительный год, и пользователь уже установил действительный год.

Вы можете попробовать использовать библиотеку NtpClient или аналогичную, чтобы получить время; ее функции выполняют другую проверку и фактически возвращают TRUE или FALSE. В случае успеха вы можете использовать вновь полученное значение времени для обновления RTC ESP32.

,

Я собираюсь попробовать это решение, надеясь, что платформа ESP32 совместима с этой библиотекой., @Mark

@Mark: Я быстро просмотрел код, и, похоже, он совместим со всеми библиотеками Wi-Fi Arduino-esk. Никаких гарантий, хотя 8-). Интересно, почему кто-то отклонил мой ответ? Ну что ж. Пожалуйста, примите ответ, чтобы вопрос не остался открытым. Конечно, если это сработает и вы действительно примете ответ., @ocrdu

Я поддержал ваш ответ. Чтобы принять один из ответов, я собираюсь проверить их раньше., @Mark