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

delay()

Описание

Приостанавливает выполнение программы на указанный промежуток времени (в миллисекундах). (В 1 секунде — 1000 миллисекунд.)

Синтаксис

Параметры

ms: количество миллисекунд, на которые необходимо приостановить программу (unsigned long)

Возвращаемые значения

Пример

Предупреждение

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

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

Источник

Используем функции 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 в данном случае выглядит так:

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

Используем 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 миллисекунд), то это значит, что светодиод выключен.

Читайте также:  при какой температуре сушить рыбу в сушилке

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

Источник

Работаем с задержками без delay() на arduino.

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

Мы рисовали общую схему нашего устройства, но сейчас посмотрим на элементы, с которыми мы будем работать в данном уроке. Собственно – их 5. – это зуммер, реле с 2 типами контактов, светодиод, показывающий состояние прохода и кнопка мгновенного действия. Подготовим для всех них понятные имена

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

Теперь зададим режим работы пинов нашей периферии. Как не сложно догадаться на вход у нас будет настроен только контакт кнопки, все остальные устройства являются исполнительными и будут настроены на выход. Чтобы не вешать внешнее сопротивление, настроим внутреннюю резистивную подтяжку на входе кнопки.

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

К счастью, в ардуино уже есть для этого инструменты. Попытаюсь дать короткое объяснение, почему delay это плохо. Для этого отвлечёмся и представим абстрактную задачу, где один светодиод у нас моргает каждую 1 секунду, а другой, каждые 0,2 секунды. Возьмём обычный пример мигания через delay

Естественно, в данном примере, они мигают по очереди, потому-что пока выполняется delay, контроллер делает бесполезные операции в цикле. Можно конечно сделать мигание второго диода в прерывании, но опять же, использовать там delay не получится, чтобы выдержать 200мс.

Можно извратиться, и рассчитать задержки свечения светодиода, который мигает чаще, так, чтобы создать второму диоду нужные 1 секунду простоя и свечения.

Всё просто! Мы используем вспомогательную переменную текущего времени currentTime, На старте её значение равно = 0, как и millis() = 0. Но millis() у нас постоянно увеличивается, а currentTime – нет. Поэтому через 1000мс, сработает условие if (millis() – currentTime > 1000), т.е. мы создали задержку в 1с, но код при этом выполнялся циклично в loop, и мы могли успеть обработать много периферии. Потом мы просто обновляем нашу переменную currentTime, и она снова ждёт сравнения с millis(), когда она вырастет на 1000мс. Попробуем сделать вышестоящую задачу, мигание двумя светодиодами с разной задержкой. но при этом вставим в loop какой нибудь код, пусть будет отправка в терминал, и проверим, как это работает. Я сделал для наглядности вторую переменную currentTime2, для второго светодиода.

Для состояний светодиодов, возьмём переменную bool ledState и ledState2. Мы задали её тип как boolean, а это значит что она может принимать два значения – true и false, что в принципе равно 0 и 1. Чтобы не писать по несколько раз HIGH, LOW, мы подставляем туда состояние светодиода ledState. А меняем его каждый раз логическим отрицанием (!) на противоположное значение.

Читайте также:  Что значит шелушится тату

В конце цикла loop, впишем команду инкрементирования переменной a++, и отправки значения в серийный порт, чтобы отследить, будет ли выполняться этот код в момент ожидания задержек.

Смотрим, что получилось

Видно, что теперь у нас и светодиоды моргают с заданными задержками (1000мс и 200мс) и в серийный порт с постоянством отправляется новая переменная. Отлично – теперь мы можем получить какие-то задатки многозадачности, и продолжить писать код для нашего устройства в следующей статье.

Источник

Структура программы на языке C++ для Arduino

Рассмотрим пример минимально возможной программы на C++ для Arduino, которая ничего не делает:

Разберёмся что здесь написано и почему это обязательно: почему нельзя обойтись просто пустым файлом.

Из чего состоит программа

Блоки бывают разных видов и какой из них когда будет исполняться зависит от внешних условий. В примере минимальной программы вы можете видеть 2 блока. В этом примере блоки называются определением функции. Функция — это просто блок кода с заданным именем, которым кто-то затем может пользоваться из-вне.

Классика жанра: мигающий светодиод

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

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

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

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

Результат от этого не изменится ни на йоту: после компиляции вы получите абсолютно эквивалентный бинарный файл.

Что делают выражения

Теперь давайте попробуем понять почему написанная программа приводит в итоге к миганию светодиода.

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

Это делается выражением в функции setup :

Уточняющие значения, такие как 13 и OUTPUT называются аргументами функции. Совершенно не обязательно, что у всех функций должно быть по 2 аргумента. Сколько у функции аргументов зависит от сути функции, от того как её написал автор. Могут быть функции с одним аргументом, тремя, двадцатью; функции могут быть без аргументов вовсе. Тогда для их вызова круглые скобка открывается и тут же закрывается:

На самом деле, вы могли заметить, наши функции setup и loop также не принимают никакие аргументы. И загадочное «нечто» точно так же вызывает их с пустыми скобками в нужный момент.

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

Перейдём к функции loop :

Как только сон окончен, функция loop завершается. По факту завершения «нечто» тут же вызывает её ещё раз и всё происходит снова: светодиод поджигается, горит, гаснет, ждёт и т.д.

Читайте также:  какой ник можно придумать в инстаграме с именем таня на английском

Если перевести написанное на русский, получится следующий алгоритм:

Источник

Функции digitalWrite() и delay() в Arduino IDE на примере мигания светодиода.

В статье познакомимся с платой Arduino Uno, пинами платы. Напишем программу мигания светодиода в Arduino IDE.

Сборка схемы

Плата Arduino Uno

Для начала разберемся с платой, с которой будем работать. Для примера используем Arduino Uno — плата с микроконтроллером, то есть микросхемой. Она нужна для управления электронными устройствами.

Плата Arduino Nano

На изображении видно устройство данной платы. В этой статье нас интересуют цифровые выводы. Они также называются пины или «ножки» платы. Данные пины используются для подключения к плате различных электронных компонентов.

Каждый из пинов имеет своё обозначение. Для работы нам нужны пин 3 и Gnd. Пин 3 мы используем для вывода, а пин Gnd для заземления. Gnd — это сокращение слова ground, в переводе на русский — земля.

Чтобы ток куда-то шел, цепь должна быть замкнута. Для этого есть обозначения + и . Ток перемещается от + к —

Сборка схемы на макетной плате

Для сборки нам нужны:

Короткую ножку подключаем к пину GND. Длинную ножку светодиода соединяем с резистором. Второй конец резистора соединяем проводом с пином 3.

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

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

Теперь разберемся с кодом для мигания светодиода. Нам нужно настроить нашу ножку на вывод. Для этого используем команду pinMode. Эта команда говорит плате, как она будет работать: на вход или на вывод. Команда является настройкой программы, поэтому она пишется в первом блоке setup(). Общий вид кода:

В скобках после функции pinMode мы указываем номер пина, с которым мы будем работать. После точки с запятой указываем, на что будет работать наш пин: на ввод INPUT или на вывод OUTPUT. В нашем случае пин 3 работает на вывод, это мы и пишем в коде.

Не забывайте после каждой функции ставить знак «;», например:

Функция digitalWrite()

Функция digitalWrite даёт команду подать напряжение на определённый пин платы. Номер этого пина мы указываем в скобках. У функции есть параметры HIGH и LOW. Параметр HIGH (с английского — высоко) включает напряжение, параметр LOW (с английского — низко) отключает.

Нам нужно включить светодиод. Для этого мы включаем напряжение на 3-ий пин, поэтому код будет выглядеть так:

Это уже готовый код. На его основе мы можем включить светодиод. Если загрузить этот код на плату, то светодиод загорится.

Для выключения светодиода мы используем ту же функцию. Для этого в скобках после функции задаем параметр LOW. Функция выглядет так: digitalWrite(3; LOW)

Функция delay()

Delay с английского переводится как «задерживать». Эту задачу и выполняет функция: она приостанавливает выполнение программы на указанный промежуток времени. В скобках мы указываем время остановки в миллисекундах. 1 секунда = 1000 миллисекунд, поэтому если нам нужно установить задержку в секунду, пишем: delay(1000).

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

После загрузки программы на плату получаем следующее:

Источник

Сказочный портал