После прочтения вашего поста и всех комментариев, я думаю, я знаю, что вы хотите. Вы просто хотите, чтобы цикл продолжался без остановки в этой функции во время задержки, верно?
millis () не спит или не задерживается, он просто дает вам время в миллисекундах, поскольку Arduino работает.
Итак, вы можете просто добавить это к своему коду, и он будет работать:
uint8_t level[] = {0, 28, 48, 60, 64}; //levels 0 to 4
unsigned long lastTime = 0; // << add this
uint8_t start_point = 0; // << move here
void update_leds(uint16_t wait, uint8_t led_num) {
if(start_point >= led_num) return;
if(millis() - lastTime > wait) { // << add this
//uint8_t start_point;
lastTime = millis(); // << add this
//for (uint8_t i = start_point; i < led_num; i++) {
strip.setPixelColor(start_point, strip.Color(0, 0, 255));
strip.show();
//delay(wait); // << remove this
//}
start_point++;
}
}
void level_up(uint8_t led_num) {
if (led_num == level[1]) start_point = 0; //up from level 0 to 1
if (led_num == level[2]) start_point = 28; //up from level 1 to 2
if (led_num == level[3]) start_point = 48; //up from level 2 to 3
if (led_num == level[4]) start_point = 60; //...
}
изменить время ожидания с uint8_t на uint16_t, поскольку 255 может быть слишком мало.
Теперь вы можете вызывать эту функцию много раз, но светодиоды обновляются только по истечении времени ожидания.
Существует только одна проблема: если внутри вашего цикла есть другие задержки, возможно,светодиоды обновляются на несколько миллисекунд позже, чем ожидалось ... Если вы понимаете, о чем я.
Редактировать: иногда вы также хотите получать уведомления об обновлении светодиодов. Таким образом, вы можете вернуть bool, чтобы сказать, обновила ли функция светодиоды или нет (может быть, вам это нужно в цикле, чтобы проверить, выровнялся ли он.