Как убрать delay?

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
49
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
13
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 > 0){        // Попытки еще есть
            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
        }
    }
}
 
Изменено:
  • Лойс +1
Реакции: Esteriman

bort707

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

bort707

★★★★★★★
21 Сен 2020
3,529
1,008
должна ведь идти индикация и опрос энкодера
Для этого недостаточно переписать только саму функцию, нужно переписывать основной код, который ее вызывает. Обработку числа вызовов функции нужно перенести в основной код.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,386
1,347
Москва
Тут ситуация такая. В примерах подключение к вифи идет в сетапе, т.е. разово при старте, в делеях там большого вреда. Но избавится от них можно просто убрав цикл.
У меня где то в проекте так расписано: в сетапе стартуте подключение к вифи.
В цикле луп примерно так: если подключено к вифи, то делать следующее. иначе в остальных случаях выполняется то , что не требует вифи.
 

Esteriman

✩✩✩✩✩✩✩
4 Июн 2025
49
2
Немного доработал код предложенный EugeneFrol, пострался избавиться от глобальных переменных, следуя принципам ООП. Этот код работает, проверено.

C++:
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <NTPtimeESP.h>
#include <TimeLib.h>

#define FIRST_ON 1
#define TICK 0

const char* ssid = "***";
const char* password = "***";

NTPtime NTP("uk.pool.ntp.org"); // UK server pool for NTPtime
strDateTime dateTime;
unsigned long epoch;
uint32_t t0=millis(), t1, t2=millis();

void setup() {
    Serial.begin(115200);
    t1 = millis();
}

void loop() {
    uint32_t epoch;
    if (millis()-t2 > 500) {
        t2 = millis();
        if (millis()-t1 < 5000) epoch = getEpoch(FIRST_ON);
        else epoch = getEpoch(TICK);
        if (epoch != 0) setTime(epoch);
        else Serial.println("Error get NTP-time");
        if (millis()-t0 > 30 * 1000) {
            t0 = millis();
            Serial.print(hour()); Serial.print(":");
            Serial.print(minute()); Serial.print(":");
            Serial.println(second());
            Serial.print(day()); Serial.print(".");
            Serial.print(month()); Serial.print(".");
            Serial.println(year());
        }
    }
}

uint32_t getEpoch(uint8_t tt) { // function to get NTP time
    static unsigned long tsEpoch=millis();
    static unsigned long tsWifi, tsNTP;
    static int i = 0;    // Число попыток
    uint32_t timeRep, epoch;
    static bool tsStart=true, tsConnect=false;
    epoch = 0;
    if (tt != FIRST_ON) timeRep = 60 * 60 * 24 * 1000; // каждые 24 часа
    else timeRep = 0; // первое включение
    if ((millis() - tsEpoch > timeRep) && tsStart) {
        WiFi.begin(ssid, password);            // Включаем WiFi
        Serial.println("Wi-Fi begin...");
        tsEpoch = millis();
        tsWifi = millis() - 500;                    // Ждем подключения
        tsStart = false;
        tsNTP = 0;
    }
    if (!tsConnect) {
        if (tsWifi > 0) {    // WiFi ждет подключение
            if (WiFi.status() == WL_CONNECTED) {   // Если WiFi подключен
                Serial.println("Wi-Fi connected.");
                tsConnect = true;
                i = 5; tsNTP = millis() - 500; tsWifi = 0; // Сделаем 5 попыток    к NTP
            }
            else {
                if (millis() - tsWifi > 5000) {    // Вышло время ожидания подключения
                    tsStart = true;
                    tsConnect = false;
                    WiFi.mode(WIFI_OFF); // switch off Wi-Fi connection
                    //Serial.println("Wi-Fi don't connected.");
                }
            }
        }
    }
    if (tsNTP > 0) {    // Ожидание очередной попытки
        if (i > 0) {        // Попытки еще есть
            Serial.print("Try to connect NTP "); Serial.println(6-i);
            if (millis() - tsNTP > 500) {        // Пришло время сделать очередную попытку
                dateTime = NTP.getNTPtime(0, 1); // and sourcing NTP data
                if (dateTime.valid) {
                    Serial.println("NTP successfully connected.");
                    epoch = dateTime.epochTime; i = 0; // NTP Epoch time obtained
                }
                else { i--; tsNTP = millis(); }    // Иначе повторим
            }
        }
        else {    // Попытки закончились
            tsNTP = 0;                             // Попыток больше не будет
            i = 0;
            WiFi.disconnect(true);                // Отключаемся
            Serial.println("Switch off Wi-Fi connection.");
            WiFi.mode(WIFI_OFF);                 // switch off Wi-Fi connection
            tsConnect = false;
            tsStart = true;
        }
    }
    return epoch;
}
 

Вложения