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 паузы и они не тормозят Ардуину и спокойно могут сосуществовать друг с другом.

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

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


Дополнительные материалы по теме.
millis примеры. Видео урок
Пишем свой первый скетч - Урок № 1
Примеры.
Мигание 1 светодиодом
Мигание 3 светодиодами
Мигание светодиодом без delay
Светофор из 3-х светодиодов
Светодиодный модуль RGB. Случайное смешение цветов
Светодиодный модуль RGB. Поочерёдное включение цветов
Светодиодный модуль "Светофор". Имитация работы светофора
Плавное включение светодиодов.
Случайное значение яркости светодиодов.
Передаём сигнал SOS.
Бегущая волна из 5 светодиодов.

Подключение фоторезистора к плате Ардуино - Урок № 2
Мигающий светодиод. Пример Ардуино Blink.
Плавное включение светодиода на Ардуино. analogWrite

Вместо Ардуино используется ESP
Как управлять RGB светодиодом с телефона
esp8266 подключение и управление светодиодом. Примеры esp8266