Избавляемся от циклов

Избавляемся от циклов и задержек


Как мигать светодиодом без задержки мы уже обсуждали. А как избавиться от цикла и сделать его асинхронным, чтобы он не блокировал выполнение? Очень просто – цикл заменяется на счётчик и условие. Пусть у нас есть цикл for, выводящий значение счётчика:

for (int i = 0; i < 10; i++) {
  Serial.println(i);
}

Для избавления от цикла нам нужно сделать свою глобальную переменную-счётчик, поместить всё это дело в loop() и самостоятельно увеличивать переменную и проверять условие:

int counter = 0;
void loop() {
  Serial.println(counter);
  counter++;
  if (counter >= 10) counter = 0;
}

И всё. А как быть, если в цикле была задержка? Вот пример

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;  // закольцовываем изменение
  }
  
}

Вот собственно и всё! Вместо переменной цикла i у нас теперь свой глобальный счётчик counter, который бегает от 0 до 30 (в этом примере) с периодом 100 мс.

Видео


Полезные страницы


5/5 - (1 голос)
Подписаться
Уведомить о
guest

3 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии