Как убрать delay?

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
48
2
Есть такой код

C++:
void getEpoch() // function to get NTP time
{
WiFi.begin(ssid, password); // wait for Wi-Fi connect
while (WiFi.status() != WL_CONNECTED) delay(500);
epoch = 0;
for (int i=0; i<5; i++) // five attempts to access NTP
{
delay(500); // delay between Wi-Fi connect
dateTime = NTP.getNTPtime(0, 1); // and sourcing NTP data
if(dateTime.valid)
{
epoch = dateTime.epochTime; // NTP Epoch time obtained
i = 5; // stop attempting connect to NTP
}
}
WiFi.disconnect(true); // disconnect Wi-Fi connection
WiFi.mode(WIFI_OFF); // switch off Wi-Fi connection
setTime(epoch); // set internal clock to Epoch time
}
Необходимо, оставив функционал, избавиться от delay. Т.е. никаких задержек. Но при этом выдерживается тайминг на попытки подключения к вай-фай, и количество попыток подключения к серверу. Подкиньте идею, пожалуйста.
В loop происходит постоянный вызов getEpoch.
 

EugeneFrol

★✩✩✩✩✩✩
17 Апр 2024
103
12
51
C++:
// Глобальные переменные
unsigned long tsEpoch = millis();
unsigned long tsWifi = 0, tsNTP = 0;
int i = 0;    // Число попыток

void getEpoch(){ // function to get NTP time
    if(millis() - tsEpoch > 60 * 60 * 1000){    // Каждый час
        WiFi.begin(ssid, password);            // Включаем WiFi
        tsEpoch = millis();
        tsWifi = millis();                    // Ждем подключения
    }

    if(tsWifi > 0){    // WiFi ждет подключение
        if(WiFi.status() == WL_CONNECTED){  // Если WiFi подключен
            i = 5; tsNTP = millis() - 500; tsWifi = 0; // Сделаем 5 попыток    к NTP
        }else{
            if(millis() - tsWifi > 500){    // Вышло время ожидания подключения
                WiFi.mode(WIFI_OFF); tsWifi = 0; // switch off Wi-Fi connection
            }
        }
    }
    
    if(tsNTP > 0){    // Ожидание очередной попытки
        if(i < 5){        // Попытки еще есть
            if(millis() - tsNTP > 500){        // Пришло время сделать очередную попытку
                dateTime = NTP.getNTPtime(0, 1); // and sourcing NTP data
                if(dateTime.valid){
                    epoch = dateTime.epochTime; i = 0; // NTP Epoch time obtained
                }else{ i--; tsNTP = millis(); }    // Иначе повторим очередную через 500мс
            }
        }else{    // Попытки закончились
            tsNTP = 0;                             // Попыток больше не будет
            WiFi.disconnect(true);                // Отключаемся
            WiFi.mode(WIFI_OFF);                 // switch off Wi-Fi connection
            setTime(epoch); // set internal clock to Epoch time
        }
    }
}
 

bort707

★★★★★★★
21 Сен 2020
3,525
1,008
Необходимо, оставив функционал, избавиться от delay.
В этом коде нет никакого смысла избавляться от делея, потому что вы все равно в это время ничего не делаете. Тут надо всю концепцию вашей функции менять, иначе оставьте как есть.