Циклы 7 — Циклы и задержки

Введение

В Arduino часто используется функция delay() для создания пауз. Однако у неё есть существенный недостаток: во время выполнения delay() программа полностью останавливается и не может обрабатывать другие задачи. Это приводит к «зависанию» устройства, если требуется одновременная работа с несколькими процессами.

Почему delay() блокирует выполнение

Функция delay() просто «замораживает» выполнение кода на заданное количество миллисекунд. Пока идёт задержка, микроконтроллер не выполняет никакие другие команды, включая обработку сенсоров, кнопок или других событий.

Как заменить delay() на millis()

Для реализации неблокирующих задержек используется функция millis(), которая возвращает количество миллисекунд с момента старта программы. Сравнивая текущее время с моментом последнего действия, можно выполнять код только тогда, когда прошёл нужный интервал, при этом не блокируя выполнение других задач.

// Пример неблокирующего кода миганияunsigned long previousMillis = 0;const long interval = 1000;void loop() {  unsigned long currentMillis = millis();  if (currentMillis - previousMillis >= interval) {    previousMillis = currentMillis;    // Действие, которое нужно повторять  }}  

Практика

Переписывание мигания с delay на millis

const int ledPin = 13;unsigned long previousMillis = 0;const long interval = 500;void setup() {  pinMode(ledPin, OUTPUT);}void loop() {  unsigned long currentMillis = millis();  if (currentMillis - previousMillis >= interval) {    previousMillis = currentMillis;    digitalWrite(ledPin, !digitalRead(ledPin));  }}  

Одновременное выполнение нескольких действий

const int led1 = 8;const int led2 = 9;const int led3 = 10;unsigned long prev1 = 0, prev2 = 0, prev3 = 0;const long int1 = 300;const long int2 = 500;const long int3 = 700;void setup() {  pinMode(led1, OUTPUT);  pinMode(led2, OUTPUT);  pinMode(led3, OUTPUT);}void loop() {  unsigned long currentMillis = millis();  if (currentMillis - prev1 >= int1) {    prev1 = currentMillis;    digitalWrite(led1, !digitalRead(led1));  }  if (currentMillis - prev2 >= int2) {    prev2 = currentMillis;    digitalWrite(led2, !digitalRead(led2));  }  if (currentMillis - prev3 >= int3) {    prev3 = currentMillis;    digitalWrite(led3, !digitalRead(led3));  }}  

Проект: «Светомузыка»

Три светодиода мигают с разной частотой без блокировок, создавая эффект светомузыки. Такой подход можно расширить, добавив реакцию на музыку через микрофон или датчик звука.

const int redLed = 3;const int greenLed = 4;const int blueLed = 5;unsigned long prevRed = 0, prevGreen = 0, prevBlue = 0;const long redInterval = 200;const long greenInterval = 400;const long blueInterval = 600;void setup() {  pinMode(redLed, OUTPUT);  pinMode(greenLed, OUTPUT);  pinMode(blueLed, OUTPUT);}void loop() {  unsigned long currentMillis = millis();  if (currentMillis - prevRed >= redInterval) {    prevRed = currentMillis;    digitalWrite(redLed, !digitalRead(redLed));  }  if (currentMillis - prevGreen >= greenInterval) {    prevGreen = currentMillis;    digitalWrite(greenLed, !digitalRead(greenLed));  }  if (currentMillis - prevBlue >= blueInterval) {    prevBlue = currentMillis;    digitalWrite(blueLed, !digitalRead(blueLed));  }}  

Заключение

Использование millis() вместо delay() позволяет создавать более сложные и отзывчивые программы. Неблокирующий код — основа многозадачности в Arduino, особенно при работе с датчиками и несколькими исполнительными устройствами одновременно.

Циклы 8 — Оптимизация циклов

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Шестерня для зубчатого ремня на 40 зубьев под ось 8 мм

Шестерня для зубчатого ремня на 40 зубьев под ось 8 мм

Используется для передачи и редукции крутящего момента от двигателя до оси 8 ммКоличество зубьев 40 ..

87.33грн.

Насос погружной 3 ... 6В 120л/ч

Насос погружной 3 ... 6В 120л/ч

Насос жидкостный погружного типа.Используется для полива домашних растений, для миниатюрных фонтанов..

69.82грн.

Разработка печатных плат под заказ — профессиональное проектирование PCB для бизнеса

Разработка печатных плат под заказ — профессиональное проектирование PCB для бизнеса

Разработка печатных плат под заказ — профессиональное проектирование PCB для бизнеса Разработка..

Универсальная плата под микросхемы SOP16 или SSOP16

Универсальная плата под микросхемы SOP16 или SSOP16

Универсальная монтажная плата, позволяет проводить монтаж различных микросхем с поверхностным монтаж..

13.77грн.

Драйвер A4988. Как использовать ENABLE, SLEEP и RESET

Драйвер A4988. Как использовать ENABLE, SLEEP и RESET

Привет, друзья! Давайте обсудим такой важный вопрос при работе с драйвером A4988, как пины разрешени..