Как сделать задержку на Arduino без использования delay() ?

Итак, чем же так плоха функция delay ? Все дело в том, что при использовании delay ход выполнения программы замораживается - не работают прерывания, не выполняется основной цикл программы (loop) - контроллер Ардуино просто висит все это время. В серьезной программе нам требуется постоянная работа, постоянная обработка данных, мгновенная реакция на внешние события.

В качестве замены мы предлагаем использование встроенной функции millis(), которая возвращает количество миллисекунд с момента запуска текущей сессии Arduino (с момента запуска или перезагрузки контроллера).

В первом примере мы будем читать значение с аналогового входа раз в 1 секунду и кидать его на серийный порт:

1 /* Пример 1 - читаем аналоговый вход */  
2 const int interval = 1000; // задаем интервал, через который будет происходить чтение;
3 long LastTime = 0; // служебная переменная, которая будет хранить время последнего запуска;
4 int val = 0; // в эту переменную будем считывать значение с аналогового входа;
5 int AnalogPin = 2;  
6    
7 void setup () { // первичная инициализация
8    Serial.begin(9600); // установка связи по serial порту
9 }  
10    
11 void loop {  
12    if (millis() - LastTime > interval) { // проверяем, прошла ли уже секунда с момента последнего выполнения условия;
13       LastTime = millis(); // переприсваиваем LastTime время текущего запуска;
14       val = analogRead(AnalogPin); // считываем с аналогового входа значение напряжения;
15       Serial.println(val); // выводим его на серийный порт
16    }  
17 }  

Как видите, ничего особенно сложного нет. Обратите внимание, конструкция "millis() + LastTime" недопустима в связи с возможностью переполнения. Кстати millis() обнуляется примерно через 50 дней непрерывной работы контроллера.

В следующем примере попробуем классику - мигание светодиодом без delay():

1 /* Пример 2 - мигаем светодиодом */  
2 const int interval = 1000; // задаем интервал, через который будет происходить чтение;
3 const int LEDpin = 14; // номер выхода, подключенного к светодиоду;
4 long LastTime = 0 // служебная переменная, которая будет хранить время последнего запуска;
5 bool LEDstate = false;  
6    
7 void setup () { // первичная инициализация;
8    pinMode(LEDpin, OUTPUT); // настраиваем режим работы для порта светодиода;
9 }  
10    
11 void loop {  
12    if (millis() - LastTime > interval) { // проверяем, прошла ли уже секунда с момента последнего выполнения условия;
13       LastTime = millis(); // переприсваиваем LastTime время текущего запуска;
14    
15       if (LEDstate == false) {  
16          digitalWrite(LEDpin, LOW);  
17       }  
18       else {  
19          digitalWrite(LEDpin, HIGH);  
20       }  
21       LEDstate = not(LEDstate);  
22    }  
23 }  

Похожие статьи

Нет похожих статей



Анализ сайта Яндекс.Метрика