millis arduino, delay без delay. millis примеры

millis arduino, delay без delay. millis примеры

В этом обучающем примере я покажу как используя функцию millis работать со светодиодами одновременно и не ждать пока Ардуино выполнит одну операцию и перейдёт к следующей.

Millis против Delay.

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

Сначала разберёмся что же такое delay().
А это всего лишь пауза, но не в работе скетча когда можно в это время сделать что-нибудь другое. Delay практически парализует Ардуину останавливая почти все процессы.
Во время delay вы не сможете сделать почти ничего.

Рассмотрим пример.
Допустим у меня 4 светодиода и кнопка. И я хочу включать светодиоды в такой последовательности.
Первый включается на 1 секунду, потом гаснет на полсекунды, второй должен зажечься на 3 секунды и погаснуть на полсекунды, а третий должен гореть 6 секунд, затем погаснуть на полсекунды и снова зажечься на 6 секунд. А ещё я должен управлять четвёртым светодиодом включая и выключая его от кнопки.

Вроде ничего сложного, но используя delay() у вас это не получится. Потому что сначала загорится первый светодиод, затем он погаснет и только потом загорится второй. За ним третий и только потом вы сможете управлять кнопкой и включить 4 светодиод, и то не факт что у вас это получится.  

Посмотрим на примере.
На количество светодиодов не смотрите, я взял макетную плату из одного из своих уроков про то как увеличить количество выходов используя сдвиговый регистр.
Сначала загорелся первый светодиод, затем погас и через пол-секунды загорелся второй. Погорел 3 секунды, затем погас на пол-секунды. И последним загорелся третий светодиод, который горел 6 секунды, затем погас. И никак эту последовательность не нарушить. Например, нельзя управлять вторым или третьим светодиодом, пока до них не дошла очередь. И это я ещё не коснулся кнопки.

Для того чтобы от нажатия кнопки загорелся светодиод, необходимо чтобы сработал обработчик кнопки и поймал сигнал нажатия кнопки, то есть переход от высокого сигнала к низкому. И даже если он и получит сигнал, то для того чтобы светодиод отключился должна пройти такая же команда с переходом от низкого сигнала к высокому. Как видите я кнопку давно отпустил, а светодиод всё ещё светится.

Вывод.
Delay можно использовать только с простыми скетчами, где не надо выполнять одновременно несколько операций и все операции идут одна за другой. Я не скрываю, что сам использую delay очень часто в своих примерах, и для большинства из них это оправдано своей простотой и решением.
Для продвинутых проектов лучше всего использовать функцию millis(). Эта функция возвращает количество миллисекунд  прошедших с момента подачи питания на плату Ардуино. И не важно что делает ваша программа миллисекунды отсчитывают время постоянно. Есть правда одна проблемма – это перепеолнение. При наступлении 49 дней непрерывной работы функция обнулится и начнёт отсчёт заново. Откуда взялась эта цифра. Всё просто, 32 битная беззнаковая переменная long int может хранить не более 4 с небольшим миллиардов, а в 49 сутках столько миллисекунд, вот это и предел значения.

Это самый простой пример использования millis(). В начале мы создаём переменную для хранения миллисекунд. Дальше мы пишем условие, что если количество миллисекунд минус созданная переменная, а по умолчанию она равно нулю, больше чем 5000 миллисекунд, то условие верно и мы в него проваливаемся.
Первым делом мы присваиваем значение текущее значение миллисекунд нашей переменной, а затем выводим это значение в монитор порта. Так как значения в миллисекундах, то надо перевести его в секунды. Делаем это разделив на 1000, так как в 1 секунде, 1000 миллисекунд.
Думаю, что это просто и всем всё понятно. Переходим дальше.

Теперь помигаем светодиодами, а то какой это пример без мигания. В первом примере будем мигать всего одним светодиодом.
Этот пример чуть сложнее, но не на столько чтобы его не понять. Светодиод я подключил к 12 выводу Ардуино и сделал две переменных. В первой я буду хранить время когда светодиод будет гореть, а во второй когда он будет в выключенном состоянии.
Для начала сделаем так, что светодиод будет гореть 1 секунду, затем погаснет на секунду и снова загорится.
Для того чтобы изменить время свечения и время в котором он находится в выключенном состоянии надо всего лишь изменить эти 2 переменные. Теперь он  включен и выключен 3 секунды.
Вроде ничего сложного. Ну и для закрепления изменим ещё раз значения. Пусть он горит 1 секунду и не горит пол-секунды.

Поехали дальше.
Теперь помигаем двумя светодиодами. Здесь так же ничего сложного, просто копируем часть кода и единичку меняем на двойку.
Теперь, если вы хотите изменить время работы, то вам надо отредактировать 4 значения. Это паузы для работы и не работы у каждого из двух светодиодов. Для начала, что бы проверить правильность работы сделаем, что бы оба светодиода работали одинаково, и горели и выключались одновременно, по одной секунде.
Изменим значения. Первый светодиод будет гореть 3 секунды, а второй 6 секунд. Пауза выключения у обоих будет одинаковая, по 1 секунде.
В общем, здесь тоже ничего сложного. Теперь настало время для более сложного примера. Это мигание тремя светодиодами, а четвёртым будем управлять кнопкой. И всё это не должно тормозить и мешать друг другу.
Сначала посмотрим скетч. К двум предыдущим светодиодам я добавил ещё два, а ещё добавил кнопку, которую подключил ко входу 8 Ардуино.
Установил режимы работы для трёх светодиодов, так как четвёртым будем управлять кнопкой. Объявил кнопку входом и подтянул её внутренней подтяжкой к плюсу питания. Это значит что при не нажатой кнопке, на входе будет высокий уровень, а при нажатии он станет низким.
По аналогии с прошлым примером, скопировал код и заменил двойки на тройки. Ну и сделал условие для работы с кнопкой. Если на кнопке высокий уровень, то есть кнопка не нажата, то светодиод не светится. В противном случаем светодиод будет гореть.

Теперь посмотрим как это работает в живую.
При подаче питания все светодиоды не горят. За это отвечают переменные ledstate. Затем, согласно установленному режиму, светодиоды будут работать с определёнными паузами. Но это уже не delay паузы и они не тормозят Ардуину и спокойно могут сосуществовать друг с другом.

Помните, в начале при нажатии кнопки светодиод не загорался пока до него не дойдёт очередь. Теперь это не так. В любой момент, при нажатии кнопки она включает светодиод, а при отпускании светодиод гаснет.

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