Функция millis в Arduino играет важную роль при реализации многозадачности в программе. На нашем web сайте опубликовано множество проектов на Arduino, использующих функцию millis(), в которых необходимо производить отсчет времени. Рассмотрим применение команды millis() в Ардуино для управления временем и, как использовать millis без задержки delay в скетче на примере мигающего светодиода.
СОДЕРЖАНИЕ ►
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- светодиод и резистор
- макетная плата
- коннекторы
Дополнительные материалы на эту тему:
Функция millis в Arduino возвращает количество миллисекунд, прошедших с момента запуска программы. Счетчик времени обнуляется, когда значение переменной unsigned long переполняется (примерно через 50 дней). Функция millis в языке Arduino позволяет микроконтроллеру быть многозадачным, поскольку выполнение программы не останавливается, а другие операции могут выполняться параллельно.
Функция millis() в языке Ардуино

Для мигания светодиодом или какой-нибудь периодически выполняемой задачи обычно используется функция delay, однако эта команда останавливает выполнение программы и плата Arduino не может выполнять другие операции. Чтобы преодолеть этот существенный недостаток у плат Ардуино функцию delay заменяют на функцию millis. Таким образом, происходит создание многозадачности микроконтроллера Ардуино.
Многозадачность в Arduino с помощью millis

Когда вы используете функцию delay в программе, выполнение всех команд останавливается на заданное количество миллисекунд. В этом заключается основное различие между millis() и delay(). При подключении датчиков необходимо получать непрерывные данные, поэтому функция задержки заменяется на millis. В примере с мигающим светодиодом мы сделаем задержку (паузу) с помощью millis без delay.
Скетч мигание светодиодом без delay на Ардуино
#define LED 13
unsigned long timer;
boolean ledState = 0;
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
timer = millis();
}
void loop() {
if (millis() - timer > 1000) {
ledState=!ledState; // меняем состояние светодиода
digitalWrite(LED, ledState);
timer = millis();
}
Serial.print("Time: ");
Serial.println(timer);
}
Заключение. Команда Arduino millis не останавливает выполнение программы, а начинает отсчет с начала счетчика миллисекунд. В отличие от этой функции, delay и delayMicroseconds останавливают выполнение программы на заданное количество миллисекунд или микросекунд соответственно. Применение той или иной паузы для микроконтроллера, т.е. многозадачность Arduino Uno зависит от поставленной задачи.
