Замена цикла с delay на millis()
Очень часто в примерах используется delay(), и это несомненно очень плохо: построить на основе такого примера серьёзный проект практически невозможно. Одним из частых и критичных моментов являются циклы с delay(), это может касаться каких то эффектов со светодиодами, адресными светодиодными лентами, и прочими действиями со счётчиком:
for (int i = 0; i < 30; i++) {
// например, зажигаем i-ый светодиод
delay(100);
}
Как переписать такой цикл, чтобы он не блокировал выполнение кода? Очень просто: нужно избавиться и от цикла, и от delay. Введём таймер на millis(), и будем работать по нему:
int counter = 0; // замена i
uint32_t timer = 0; // переменная таймера
#define T_PERIOD 100 // период переключения
void loop() {
if (millis() - timer >= T_PERIOD) { // таймер на millis()
timer = millis(); // сброс
// действие с counter - наш i-ый светодиод например
counter++; // прибавляем счётчик
if (counter > 30) counter = 0; // закольцовываем изменение
}
}
Очень часто в примерах используется delay(), и это несомненно очень плохо: построить на основе такого примера серьёзный проект практически невозможно. Одним из частых и критичных моментов являются циклы с delay(), это может касаться каких то эффектов со светодиодами, адресными светодиодными лентами, и прочими действиями со счётчиком:
for (int i = 0; i < 30; i++) {
// например, зажигаем i-ый светодиод
delay(100);
}
Как переписать такой цикл, чтобы он не блокировал выполнение кода? Очень просто: нужно избавиться и от цикла, и от delay. Введём таймер на millis(), и будем работать по нему:
int counter = 0; // замена i
uint32_t timer = 0; // переменная таймера
#define T_PERIOD 100 // период переключения
void loop() {
if (millis() - timer >= T_PERIOD) { // таймер на millis()
timer = millis(); // сброс
// действие с counter - наш i-ый светодиод например
counter++; // прибавляем счётчик
if (counter > 30) counter = 0; // закольцовываем изменение
}
}
Комментариев нет:
Отправить комментарий