цифровая электроника
вычислительная техника
встраиваемые системы

 

Многозадачность Arduino с помощью функции millis

Автор: Mike(admin) от 12-10-2017, 06:35

Если вы хотите «поставить на паузу» микроконтроллер, то достаточно лишь ввести инструкцию задержки delay в нужном месте программы. Но это становится настоящим препятствием, когда вы пытаетесь делать другие вещи, например, отслеживать нажатие кнопки. В этом случае необходимо реализовывать своеобразную многозадачность.


Многозадачность Arduino

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


Следует понимать, что функция delay приостанавливает выполнение вашей программы Arduino, делая ее неспособной делать что-либо еще в этот период времени. Вместо того, чтобы приостанавливать всю нашу программу в течение определенного времени, мы научимся подсчитывать, сколько времени прошло до завершения действия. Это, конечно же, осуществляется с помощью функции millis() и нескольких переменных друзьями для хранения наших данных. Чтобы все было легко в понимании, мы начнем с первого обучающего скетча под названием «Blink», но в данном случае будем мигать светодиодом без задержки.


Начало этой программы такое же как и у любой другой стандартной программы для Arduino. Сначала идет объявление всех нужных переменных и линий ввода/вывода (например, линии 13 для светодиода). Здесь нам также потребуется переменная типа integer для хранения текущего состояния светодиода. Она будет установлена в LOW, поскольку начальное состояние светодиода – выключено. Затем объявим переменную «previousMillis» типа «unsigned long». В отличие от «int» длинные переменные без знака представляют собой 32 бита, это нужно для переменных, значение которых может стать очень большим – как потенциальное время, которое мы можем ожидать, до тех пор, пока не будет предпринято действие. Переменная previousMillis будет использоваться для хранения времени, когда последний раз мигал светодиод. Есть также тип «const long», он тоже 32-разрядный, но он не меняет значение, то есть это для констант (в данном случае для константы interval). Мы установим его на 1000 и используем в качестве времени паузы, измеряемого в миллисекундах.



const int ledPin =  13;      // определяем вывод светодиода

// Variables will change :
int ledState = LOW;             // ledState используется для определения состояния светодиода

unsigned long previousMillis = 0;        // сохранит время, когда последний раз обновлялся светодиод

// constants won't change :
const long interval = 1000;           // интервал мигания в мимлисекундах

void setup() {
  // настройка линии 13 выхода
  pinMode(ledPin, OUTPUT);
}

Затем мы переходим в бесконечный цикл. Помните, что вместо задержки мы хотим подсчитать, сколько времени прошло с момента нашего последнего мигания, в нашем случае 1000 мс. Если указанное время прошло, пришло время изменить состояние нашего светодиода.


Во-первых, мы установим беззнаковый длинный (unsigned long) «currentMillis» равный «millis ()», что определяет текущее время в миллисекундах. Это поможет нам выяснить, превысила ли разница между текущим временем и предыдущим временем 1000 мс. Для этого мы говорим: «Если текущее время минус предыдущее время, когда наш светодиод мигал, больше или равно нашему назначенному значению 1000 мс, сохраните время последнего мигания как предыдущее». Это поможет нам вспомнить, сколько времени прошло с момента последнего мигания в следующем обходе цикла. Затем, если состояние светодиода LOW, сделайте его HIGH, иначе сделайте его LOW. Затем с помощью команды digitalWrite выведите текущее состояние на светодиод.



void loop() {

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // сохраняем время последнего изменения состояния светодиода
    previousMillis = currentMillis;

    // если светодиод выключен, то включим его, и наоборот
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // выход на светодиод
    digitalWrite(ledPin, ledState);
  }
}



© digitrode.ru


Теги: Arduino




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий