что делает функция delay n

Millis() или delay() : что лучше и правильнее использовать?

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

что делает функция delay n. Смотреть фото что делает функция delay n. Смотреть картинку что делает функция delay n. Картинка про что делает функция delay n. Фото что делает функция delay n

Функция delay() останавливает выполнение программы на заданное временное значение перед следующим действием или циклом. Прописывается она в отдельное в строке и содержит внутри себя значение в миллисекундах (на заметку: 1000 мс, миллисекунд = 1 секунда)

Пример задержки в 5 секунд будет выглядеть так:

Часто, например, при обучении Arduino, мы используем такую функцию для мигания и управления светодиодами. Затем уже включаем ее в задержку между операциями в пределах одного цикла и так далее. Но есть несколько негативных моментов в злоупотреблении данной функцией, поскольку при обучении программирования в среде Arduino часто забывают и про другую функцию – millis(), и поэтому нужно знать где какую применять.

Рассмотрим это на следующем примере:

Попробуем включать светодиоды путем нажатия на кнопку/кнопки

В первом коде светодиод, подключенный к контакту 4 будет включаться нажатием кнопки, подключенной к контакту 2.

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

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

Отличия от предыдущего скетча в том, что появляются новые переменные и строчки в коде. led1OnTime и led2OnTime сохраняют значения времени для работы каждого из светодиодов, а led1On и led2On отслеживают значение на выходе светодиода – горит он или не горит (true/false)

Таким образом, если нажмем на кнопку, то будет зафиксировано включение светодиода, и программа запомнит время включения.

При включении светодиода программа будет проверять каждый 30 секунд длительность включенного состояния, чтобы определять включен или выключен светодиод (в последнем случае длительность состояния должна будет превысить 30 секунд)

Таким образом, мы выяснили, что для циклов, содержащих в себе несколько переменных и несколько условий, желательно использовать millis()

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

Надеемся, что материал был для вас интересен, а главное полезен, и желаем всем удачной компиляции!

Источник

Ардуино задержка: delay и millis без delay

что делает функция delay n. Смотреть фото что делает функция delay n. Смотреть картинку что делает функция delay n. Картинка про что делает функция delay n. Фото что делает функция delay n

Функции delay(), millis() и delayMicroseconds() Arduino играют важную роль и написание большинства скетчей без этих команд практически невозможно. На нашем сайте вы найдете множество уроков и проектов с millis(), где необходим отсчет времени или с delay(), например, чтобы избежать дребезга контактов у тактовой кнопки. Рассмотрим назначение и применение команд задержки времени в Ардуино программировании.

Ардуино задержка включения / выключения

Для этого занятия нам потребуется:

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

Ардуино delayMicroseconds()

Команда delayMicroseconds останавливает выполнение программы на заданное количество микросекунд (в 1 секунде 1 000 000 микросекунд). При необходимости задержки в программе более чем на несколько тысяч микросекунд рекомендуется использовать delay(). Продемонстрируем на простом примере использование функции в скетче для мигания встроенным светодиодом на плате Arduino.

Ардуино delay()

Команда delay останавливает выполнение программы на заданное количество миллисекунд (в 1 секунде 1 000 миллисекунд). Во время задержки программы с помощью функции delay(), не могут быть считаны подключенные к плате датчики или произведены другие операции, например, запись в еепром Ардуино данных. В качестве альтернативы следует использовать функцию millis(). Смотри пример далее.

Ардуино millis()

Команда millis возвращает количество прошедших миллисекунд с момента начала выполнения программы. Счетчик времени сбрасывается на ноль при переполнении значения unsigned long (приблизительно через 50 дней). Функция miilis позволяет сделать многозадачность Ардуино, так как выполнение программы не останавливается и можно выполнять параллельно другие операции в скетче.

что делает функция delay n. Смотреть фото что делает функция delay n. Смотреть картинку что делает функция delay n. Картинка про что делает функция delay n. Фото что делает функция delay nArduino команды millis, delay, delaymicroseconds

Используем в Ардуино millis вместо delay

В последнем примере вывод счетчика на мониторе порта прерывается на время задержки в программе delay(1000); — в этом заключается главное отличие этих функций. При подключении датчиков к плате необходимо получать данные от них постоянно, поэтому команду delay заменяют на millis. Как это сделать в скетче для Arduino IDE с мигающим светодиодом — продемонстрируем в следующем примере.

Заключение. Команда millis Arduino не останавливает выполнения программы, а начинает отсчет времени с начала запуска счетчика в миллисекундах. В отличии от этого, delay и delayMicroseconds останавливают выполнение программы на заданное количество миллисекунд или микросекунд соответственно. Применение определенной задержки в скетче Ардуино микроконтроллеров зависит от поставленной задачи.

Источник

Используем функции delay() и millis() в Arduino IDE правильно

Использование DELAY и постановка проблемы

Одна из основных ошибок новичков при написании скетчей для Arduino – чрезмерное использование функции delay().

Эта функция, (как указано в официальной документации) останавливает выполнение программы на указанное количество милисекунд. Давайте рассмотрим пример: вы подключили к Arduino кнопку и светодиод; когда вы нажимаете на кнопку, светодиод должен зажечься на 3 секунды.

Скетч может выглядеть примерно следующим образом (несолько модифицированная версия из оффициального туториала):

const int buttonPin = 2;

const int ledPin = 4;

if (digitalRead(buttonPin) == HIGH) <

Теперь добавим вторую кнопку и второй светодиод и попробуем обновить скетч, чтобы управлять двумя светодиодами, используя при этом функцию delay():

const int button1Pin = 2;

const int button2Pin = 3;

const int led1Pin = 4;

const int led2Pin = 5;

if (digitalRead(button1Pin) == HIGH) <

if (digitalRead(button2Pin) == HIGH) <

Схема подключения с использованием breadboard’a в данном случае выглядит так:

что делает функция delay n. Смотреть фото что делает функция delay n. Смотреть картинку что делает функция delay n. Картинка про что делает функция delay n. Фото что делает функция delay n

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

Используем MILLIS

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

Если вам надо узнать, когда прошло заданное время, вы можете:

сохранить в переменной начальное время, то есть момент времени, когда вы включили светодиод.

Периодически проверять (например, в теле цикла loop), разницу между начальным временем и фактическим на данный момент.

Ниже приведен новый скетч:

const int button1Pin = 2;

const int button2Pin = 3;

const int led1Pin = 4;

const int led2Pin = 5;

unsigned long led1OnTime;

unsigned long led2OnTime;

if (digitalRead(button1Pin) == HIGH) <

if (digitalRead(button2Pin) == HIGH) <

Введено две новые переменные: две (led1OnTime и led2OnTime), чтобы сохранить значения времени, когда светодиоды включаются и две (led1On и led2On), чтобы оценивать текущий статус светодиодов (вкл. или выкл. (on/off) или в булевом типе — true/false).

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

Если светодиод горит (переменная состояния равна true), скетч периодечески проверяет длительность состояния вкл. (30 секунд, то есть 30000 милисекунд): если период превышает допустимый (30 секунд 30000 миллисекунд), то это значит, что светодиод выключен.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Источник

Arduino delay millis и micros для организации задержки в скетче

Задержки в Ардуино играют очень большую роль. Без них не сможет работать даже самый простой пример Blink, который моргает светодиодом через заданный промежуток времени. Но большинство начинающих программистов мало знают о временных задержках и используют только Arduino delay, не зная побочных эффектов этой команды. В этой статье я подробно расскажу о временных функциях и особенностях их использования в среде разработки Arduino IDE.

Функции времени в Ардуино

В Arduino cуществует несколько различных команд, которые отвечают за работу со временем и паузы:

Они отличаются по точности и имеют свои особенности, которые стоит учитывать при написании кода.

Использование функции arduino delay

Синтаксис

что делает функция delay n. Смотреть фото что делает функция delay n. Смотреть картинку что делает функция delay n. Картинка про что делает функция delay n. Фото что делает функция delay nАрдуино delay является самой простой командой и её чаще всего используют новички. По сути она является задержкой, которая приостанавливает работу программы, на указанное в скобках число миллисекунд. (В одной секунде 1000 миллисекунд.) Максимальное значение может быть 4294967295 мс, что примерно ровняется 50 суткам. Давайте рассмотрим простой пример, наглядно показывающий работу этой команды.

В методе setup прописываем, что пин 13 будет использоваться, как выход. В основной части программы сначала на пин подается высокий сигнал, затем делаем задержку в 10 секунд. На это время программа как бы приостанавливается. Дальше подается низкий сигнал и опять задержка и все начинается сначала. В итоге мы получаем, что на пин поочередно подается, то 5 В, то 0.

Пример delay с миганием светодиодом

что делает функция delay n. Смотреть фото что делает функция delay n. Смотреть картинку что делает функция delay n. Картинка про что делает функция delay n. Фото что делает функция delay nПример схемы для иллюстрации работы функции delay.
Можно построить схему со светодиодом и резистором. Тогда у нас получится стандартный пример – мигание светодиодом. Для этого на пин, который мы обозначили как выходной, необходимо подключить светодиод плюсовым контактом. Свободную ногу светодиода через резистор приблизительно на 220 Ом (можно немного больше) подключаем на землю. Определить полярность можно, если посмотреть на его внутренности. Большая чашечка внутри соединена с минусом, а маленькая ножка с плюсом. Если ваш светодиод новый, то определить полярность можно по длине выводов: длинная ножка – плюс, короткая – минус.

Функция delayMicroseconds

Данная функция является полным аналогом delay за исключением того, что единицы измерения у нее не миллисекунды, а микросекунды (в 1 секунде – 1000000 микросекунд). Максимальное значение будет 16383, что равно 16 миллисекундам. Разрешение равно 4, то есть число будет всегда кратно четырем. Кусочек примера будет выглядеть следующим образом:

Проблема с delayMicroseconds точно такая же, как у delay – эти функции полностью «вешают» программу и она на некоторое время буквально замирает. В это время невозможна работа с портами, считывание информации с датчиков и произведение математических операций. Для мигалок данный вариант подходит, но опытные пользователи не используют её для больших проектов, так как там не нужны такие сбои. Поэтому, гораздо лучше использовать функции, описанные ниже.

Функция millis вместо delay

Функция millis() позволит выполнить задержку без delay на ардуино, тем самым обойти недостатки предыдущих способов. Максимальное значение параметра millis такое же, как и у функции delay (4294967295мс или 50 суток). При переполнении значение просто сбрасывается в 0, не забывайте об этом.

С помощью millis мы не останавливаем выполнение всего скетча, а просто указываем, сколько времени ардуино должна просто “обходить” именно тот блок кода, который мы хотим приостановить. В отличие от delay millis сама по себе ничего не останавливает. Данная команда просто возвращает нам от встроенного таймера микроконтроллера количество миллисекунд, прошедших с момента запуска. При каждом вызове loop Мы сами измеряем время, прошедшее с последнего вызова нашего кода и если разница времени меньше желаемой паузы, то игнорируем код. Как только разница станет больше нужной паузы, мы выполняем код, получаем текущее время с помощью той же millis и запоминаем его – это время будет новой точкой отсчета. В следующем цикле отсчет уже будет от новой точки и мы опять будем игнорировать код, пока новая разница millis и нашего сохраненного прежде значения не достигнет вновь желаемой паузы.

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

Сначала мы вводим переменную timing, в ней будет храниться количество миллисекунд. По умолчанию значение переменной равно 0. В основной части программы проверяем условие: если количество миллисекунд с запуска микроконтроллера минус число, записанное в переменную timing больше, чем 10000, то выполняется действие по выводу сообщения в монитор порта и в переменную записывается текущее значение времени. В результате работы программы каждые 10 секунд в монитор порта будет выводиться надпись 10 seconds. Данный способ позволяет моргать светодиодом без delay.

Функция micros вместо delay

Данная функция так же может выполнить задержку, не используя команду delay. Она работает точно так же, как и millis, но считает не миллисекунды, а микросекунды с разрешением в 4мкс. Её максимальное значение 4294967295 микросекунд или 70 минут. При переполнении значение просто сбрасывается в 0, не забывайте об этом.

Резюме

Платформа Arduino предоставляет нам несколько способов выполнения задержки в своем проекте. С помощью delay вы можете быстро поставить на паузу выполнение скетча, но при этом заблокируете работу микроконтроллера. Использование команды millis позволяет обойтись в ардуино без delay, но для этого потребуется чуть больше программировать. Выбирайте лучший способ в зависимости от сложности вашего проекта. Как правило, в простых скетчах и при задержке меньше 10 секунд используют delay. Если логика работы сложнее и требуется большая задержка, то вместо delay лучше использовать millis.

Источник

Обратимся к первому уроку, где мы управляли LED. Между включением и выключением которого была секундная задержка.

В используемой там программе (см. код ниже) был один очень большой недостаток. Для выдержки паузы между вкл/выкл LED в 1 сек. нами была использована функция delay(). В это время контроллер не может выполнять другие команды в главной функции loop()

Первое, что мы сделаем, это внесем небольшие корректировки в функцию loop(). Чтобы сделать код более компактным и изящным, заменим 2 пары строчек на одну пару. Вместо установки значения в HIGH, а затем обратно в LOW, мы получим текущее значение ledPin и проинвертируем его. Т.е. если оно было HIGH, то станет LOW и наоборот.

Отлично! Теперь мы усовершенствуем функцию delay(). Взамен, мы будем использовать функцию millis(). Данная функция возвращает количество миллисекунд, прошедшее с момента запуска текущей программы. Функция переполнится (вернется в нуль) приблизительно через 50 суток работы программы.

Альтернативной функцией является micros(), которая возвращает количество микросекунд, прошедшее с момента запуска текущей программы. Функция переполнится (вернется в нуль) приблизительно через 70 минут работы программы.

В нашем уроке мы будем использовать функцию millis():

В данном примере мы ввели две дополнительные переменные currentTime и loopTime. В функции setup() обе переменные имеют одно и тоже значение. В функции loop(), переменная currentTime каждый раз обновляется в цикле. Когда currentTime больше чем loopTime на 1 секунду (loopTime + 1000), то LED меняет свое состояние, а переменной loopTime присваивается текущее значение currentTime.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *