Обратная связь 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 года.
@Mark, 👍0
Обсуждение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
Я не совсем уверен, что для этого есть хорошее решение с обычной библиотекой ESP32, поскольку она только проверяет, был ли установлен действительный год, и пользователь уже установил действительный год.
Вы можете попробовать использовать библиотеку NtpClient или аналогичную, чтобы получить время; ее функции выполняют другую проверку и фактически возвращают TRUE или FALSE. В случае успеха вы можете использовать вновь полученное значение времени для обновления RTC ESP32.
Я собираюсь попробовать это решение, надеясь, что платформа ESP32 совместима с этой библиотекой., @Mark
@Mark: Я быстро просмотрел код, и, похоже, он совместим со всеми библиотеками Wi-Fi Arduino-esk. Никаких гарантий, хотя 8-). Интересно, почему кто-то отклонил мой ответ? Ну что ж. Пожалуйста, примите ответ, чтобы вопрос не остался открытым. Конечно, если это сработает и вы действительно примете ответ., @ocrdu
Я поддержал ваш ответ. Чтобы принять один из ответов, я собираюсь проверить их раньше., @Mark
- Как установить RTC в ES32 с помощью NTP-сервера?
- Преобразование в Unix Timestamp и обратно
- Разница между «time_t» и «DateTime»
- Документация ESP32 для "time.h"
- Библиотека времени Arduino и библиотеки RTC
- ESP32 секунды от эпохи
- Как найти разницу между двумя timestamp
- Установить время настенных часов или изменить смещение GMT без ntp-сервера?
Из любопытства: почему время устанавливается вручную при запуске, когда вы все равно будете обновлять его с помощью NTP?, @ocrdu
Потому что, если NTP недоступен (т. Е. Нет подключения Wi-Fi), система в любом случае должна начать операции. Пользователь может установить значение даты и времени по умолчанию для этого сценария., @Mark