Исправлена синхронизация времени при старте без интернета

This commit is contained in:
gunner47
2019-07-16 22:57:17 +03:00
parent 26afb403ba
commit 036ae4cd66
2 changed files with 80 additions and 5 deletions

View File

@@ -1,11 +1,51 @@
#ifdef USE_NTP
#define RESOLVE_INTERVAL (5UL * 60UL * 1000UL) // интервал проверки подключения к интеренету в миллисекундах (5 минут)
// при старте ESP пытается получить точное время от сервера времени в интрнете
// эта попытка длится RESOLVE_TIMEOUT
// если при этом отсутствует подключение к интернету (но есть WiFi подключение),
// модуль будет подвисать на RESOLVE_TIMEOUT каждое срабатывание таймера, т.е., 3 секунды
// чтобы избежать этого, будем пытаться узнать состояние подключения 1 раз в RESOLVE_INTERVAL (5 минут)
// попытки будут продолжаться до первой успешной синхронизации времени
// до этого момента функции будильника работать не будут
// интервал последующих синхронизаций времени определяён в NTP_INTERVAL (30 минут)
// при ошибках повторной синхронизации времени функции будильника отключаться не будут
#define RESOLVE_TIMEOUT (1500UL) // таймаут ожидания подключения к интернету в миллисекундах (1,5 секунды)
uint64_t lastResolveTryMoment = 0UL;
bool timeSynched = false;
bool ntpServerAddressResolved = false;
IPAddress ntpServerIp = {0, 0, 0, 0};
void timeTick()
{
if (ESP_MODE == 1)
{
if (timeTimer.isReady())
{
timeClient.update();
if (!timeSynched)
{
if (millis() - lastResolveTryMoment >= RESOLVE_INTERVAL || lastResolveTryMoment == 0)
{
resolveNtpServerAddress(ntpServerAddressResolved); // пытаемся получить IP адрес сервера времени (тест интернет подключения) до тех пор, пока время не будет успешно синхронизировано
lastResolveTryMoment = millis();
if (!ntpServerAddressResolved)
{
#ifdef GENERAL_DEBUG
Serial.println("Функции будильника отключены до восстановления подключения к интернету");
#endif
}
}
if (!ntpServerAddressResolved)
{
return; // если нет интернет подключения, отключаем будильник до тех пор, пока оно не будет восстановлено
}
}
timeSynched = timeSynched || timeClient.update(); // если время хотя бы один раз было синхронизировано, продолжаем
if (!timeSynched) // если время не было синхронизиировано ни разу, отключаем будильник до тех пор, пока оно не будет синхронизировано
{
return;
}
byte thisDay = timeClient.getDay();
if (thisDay == 0) thisDay = 7; // воскресенье это 0
thisDay--;
@@ -46,4 +86,34 @@ void timeTick()
}
}
}
void resolveNtpServerAddress(bool &ntpServerAddressResolved) // функция проверки подключения к интернету
{
if (ntpServerAddressResolved)
{
return;
}
WiFi.hostByName(NTP_ADDRESS, ntpServerIp, RESOLVE_TIMEOUT);
if (ntpServerIp[0] <= 0)
{
#ifdef GENERAL_DEBUG
if (ntpServerAddressResolved)
{
Serial.println("Подключение к интернету отсутствует");
}
#endif
ntpServerAddressResolved = false;
}
else
{
#ifdef GENERAL_DEBUG
if (!ntpServerAddressResolved)
{
Serial.println("Подключение к интернету установлено");
}
#endif
ntpServerAddressResolved = true;
}
}
#endif USE_NTP