Вы не должны вообще спать, а просто вызывать свою функцию через 5 секунд, в функции цикла. Примерно так (не проверено):
unsigned long start_time = 0;
bool call5sFunct_executed = false;
void meInit()
{
if (total > 20) total = 20;
value = EEPROM.read(1);
Serial.begin(115200);
Serial.setTimeout(10);
loadSettings(true);
buildMe();
initFirst();
// You cannot call it here, but in loop()
// call5sFunct();
// ...do other functions here immediatelly without 5s delay...
}
void call5sFunct()
{
DEBUG_PRINTLN("I am back again");
}
void loop()
{
unsigned long loop_time = millis();
if (!call5sFunct_executed && (loop_time - start_time >= 5000))
{
call5sFunct();
call5sFunct_executed = true;
}
// .... the rest of your loop function ...
}
Однако этот шаблон должен широко использоваться для программирования микроконтроллеров. Было бы действительно неудобно и подвержено ошибкам писать такой код, но важно, чтобы вы поняли.
Есть много библиотек, которые облегчают реализацию асинхронных операций на Arduino, скрывая этот механизм. Например, взгляните на TaskScheduler .
Google для "Arduino асинхронных функций", и вы найдете много альтернатив.