Функция задержки Arduino, и почему вы не должны ее использовать

Когда вы впервые начали учиться, как развиваться

для Arduino

Вы, вероятно, создали продукт, который работает примерно так:

К вашему Arduino будет подключен один светодиод. Это будет включать и выключать каждую секунду или около того, и будет продолжаться, пока Arduino не будет выключен. Это программа «Hello World» от Arduino, которая прекрасно иллюстрирует, как всего несколько строк кода могут создать что-то осязаемое.

Arduino под руководством

Я также готов поспорить, что вы использовали функцию delay () для определения интервалов между включением и выключением света. Но вот в чем дело: хотя задержка удобна для основных демонстраций того, как работает Arduino, вы не должны использовать ее в реальном мире. Вот почему — и что вы должны использовать вместо этого.

Как работает Delay ()

Принцип работы функции delay () довольно прост. Он принимает одно целое число

(или число) аргумент. Это число представляет время (измеренное в миллисекундах), в течение которого программа должна дождаться перехода к следующей строке кода.

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

Разница между блокирующими и неблокирующими функциями

Чтобы проиллюстрировать, почему блокирующие функции плохи, я хочу, чтобы вы представили на кухне двух разных поваров: Генри Блокинга и Эдуардо Нон Блокинга. Оба выполняют одну и ту же работу, но совершенно разными способами.

Когда Генри готовит завтрак, он начинает с того, что кладет в тостер два куска хлеба. Когда он, наконец, пингует, и хлеб выпадает золотисто-коричневого цвета, Генри кладет его на тарелку и разбивает два яйца на сковороде. Снова, он готовится, поскольку нефть появляется, и белые начинают укрепляться. Когда они закончили, он накрывает их и начинает жарить два ломтика бекона. Как только они станут достаточно хрустящими, он снимает их со сковороды, ставит их на тарелку и начинает есть.

Arduino-повар

Эдуардо работает немного по-другому. Пока его хлеб поджаривается, он уже начал жарить яйца и бекон. Вместо того, чтобы ждать, пока один предмет закончит готовиться, прежде чем переходить к следующему, он готовит несколько блюд одновременно. Конечным результатом является то, что Эдуардо тратит меньше времени на приготовление завтрака, чем Генри, и к тому времени, когда Генри Блокинг закончил, тост и яйца уже остыли.

Это глупая аналогия, но она иллюстрирует суть.

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

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

К счастью, delay () — не единственный способ заставить вашу программу ждать при кодировании для Arduino.

Знакомьтесь, Миллис ()

Функция millis () выполняет одну задачу. При вызове он возвращает (в виде длинного типа данных) количество миллисекунд, прошедших с момента первого запуска программы. Итак, почему это полезно?

Потому что, используя немного простой математики, вы можете легко «оценить» аспекты вашей программы, не влияя на ее работу. Ниже приведена базовая демонстрация того, как работает millis (). Как вы увидите, программа включает светодиодный индикатор на 1000 миллисекунд (одну секунду), а затем выключает его. Но самое главное, он делает это не блокирующим образом.

Теперь давайте посмотрим, как это работает с Arduino.

Arduino-Миллис-пример

Эта программа, которая в значительной степени основана на официальной документации Arduino, работает, вычитая предыдущее записанное время из текущего времени. Если остаток (т. Е. Время, прошедшее с момента последней записи) превышает интервал (в данном случае 1000 миллисекунд), программа обновляет переменную previousTime до текущего времени и либо включает, либо выключает светодиод.

А поскольку он неблокирующий, любой код, расположенный за пределами первого оператора if, должен работать нормально.

Нашли какие-нибудь другие блокирующие функции, к которым мы должны относиться с осторожностью? Дайте мне знать в комментариях ниже, и мы будем общаться.

Авторы фотографий: Ардуино (Дэниел Спиесс), шеф-повар (Олли Свенсон)

Ссылка на основную публикацию
Adblock
detector