Меню

Arduino while не работает

Циклы for и while в Ардуино

Рассмотрим, как работают операторы циклов for, while и do while в Arduino IDE, как правильно использовать циклы в скетчах и каких ошибок следует избегать. На простых примерах продемонстрируем, как можно остановить цикл или перейти из одного цикла в другой. Для того, чтобы разобраться в правильности написания циклов, прежде всего, следует изучить виды и свойства алгоритмов в робототехнике.

Как работают циклы в Arduino IDE

Любой цикл в C++ и языке программирования Ардуино представляет собой действие, которое повторяется множество или бесконечное количество раз. Ни одна программа для микроконтроллера Ардуино не обходится без цикла, например, void loop вызывается в бесконечном цикле. Операторы циклов бывают трех видов: for, while и do while — остановимся на каждом операторе, рассмотрим, как они работают на примерах.

Принцип работы for и while можно объяснить на следующих простых примерах. Цикл for выполняется конечное количество раз (указывается в условии оператора) его используют, когда в программе, например, требуется несколько раз моргнуть светодиодом. Цикл while может выполняться бесконечно, например, когда светодиод на Ардуино будет мигать до тех пор, пока не изменятся данные с датчика.

Пример, демонстрирующий разницу между for и while

Описание цикла for в Ардуино с примером

Конструкция for в Arduino задается следующим образом:

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

В примере скетча задана переменная с начальным значением i=0, в условии указано, что цикл будет выполняться до тех пор, пока переменная не станет равна или больше пяти i Описание работы программы Arduino с циклами for и while

Описание цикла while Ардуино с примером

Конструкция while в Arduino задается следующим образом:

Цикл while будет выполняться непрерывно и бесконечно, пока условие в круглых скобках является истиной. Выход из цикла будет достигнут, когда изменится переменная в условии while, поэтому что-то должно изменять ее значение. Изменение переменной может происходить в программном коде внутри цикла или при считывания значений с любого датчика, например, с ультразвукового дальномера HC-SR04 .

При использовании функции while, переменную необходимо создавать до начала цикла. В примере скетча светодиод моргнет пять раз, прежде чем закончится цикл. Если не изменять переменную внутри фигурных скобок i++, то цикл будет повторяться бесконечно. Второй способ сделать выход из цикла while Arduino Uno, это считывать данные с датчика и использовать условный оператор if для изменения переменной.

Еще один цикл, который можно использовать в Arduino IDE — это цикл с постусловием do … while. При использовании данной конструкции команды в цикле выполнятся минимум один раз, вне зависимости от условия, так как условие проверяется уже после выполнения тела цикла. В следующем примере кода, светодиод включится независимо от показаний датчика и только потом выполнится проверка постусловия.

Циклы void loop и void setup в скетче Ардуино

Как выйти из цикла while или for

В том случае, если необходимо выйти из тела цикла, независимо от обозначенных условий, используется оператор break или goto. Оператор break позволяет выйти из цикла и программа продолжит выполнение следующих команд. Оператор goto позволяет не только выйти из цикла, но и продолжить выполнение программы с нужного места по метке, например, можно перейти в другой цикл в Arduino.

Источник

Arduino.ru

Проблемка с циклом while

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

Здравствуйте уважаемые камрады!

Прошу простить меня великодушно, но самостоятельно не получается осилить.

В процессе экспериментов по программированию Ардуины, столкнулся с проблемой в цикле while.

Суть опыта в следующем:

Запрограммированы две антидребезговые кнопки на 6 и 7ой пин. При нажатии на первую кнопку, загорается красный светодиод, а на вторую, зеленый. Соответственно при повтором нажатии светодиоды гаснут.

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

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

Объясните, пожалуйста, где зарыта собака? Каким образом заставить повторно работать цикл?

Есть ли какие команды, что бы после прохождения одного цикла происходил сброс параметров в исходное положение?

int regim=1;
int flag=1;

int regim_1=1;
int flag_1=1;

// Задаем значение выходов для светодиодов
<
pinMode(28,OUTPUT); // Красный
pinMode(30,OUTPUT); // Зеленый
pinMode(29,OUTPUT); // Синий
pinMode(31,OUTPUT); // Белый
>

Читайте также:  Не работает вестгейт клапан

if(regim==1)
<
delay(50);
digitalWrite(28,LOW);

if(regim_1>2)//ограничиваем режимы
<
regim_1=1;
>
>

if(regim_1==1)//первый режим
<
delay(50);
digitalWrite(30,LOW);
>

if(regim_1==2)//второй режим
<
delay(50);
digitalWrite(30,HIGH);
>

Источник

Arduino.ru

Сложное условие для while. Не могу понять как сделать.

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

как эти два условия объединить в одно через логическое ИЛИ?

Так будет работать или нет?

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

Спасибо. Но все равно что-то не получается. По отдельности работают как надо, а вместе через ИЛИ не хотят.

Вот фрагмент кода. На А1 висят кнопки через резисторы. Если условие (140

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

ну дык если независимо от кнопки, то значить там поступила единичка. попробуй изменить на ==1.

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

Я правильно понимаю, что цикл while должен отстановиться, если какое илбо из условий становится ложным?

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

Ошибку свою понял. Но решения все равно нет. Условия остановки цикла два условия должны быть false. В моем случае это не то что нужно. Мне нужно чтобы while крутился пока оба условия истинны. А если одни из условий становится false останавливался.

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

Вы запутались не сколько в коде, сколько в логике.

Попробуйте еще раз, словами описать два пункта при ВЫПОЛНЕНИИ которых, цикл должен ПРОДОЛЖАТЬ выполнятся (нарушение любого из этих условий — цикл дожен прерватся). Итак:

1. Условие1.
2. Условие2.

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

Я правильно понимаю, что цикл while должен отстановиться, если какое илбо из условий становится ложным?

неправильно .while прерывается когда ВСЕ выражение в нем ложно. Если результат того что вы запихнули в круглые скобки возвращает true — цикл продолжается, если false — прерывается. А вот каково будет значение этого выражения, если оно состоит из нескольких условий — зависит сугубо от вас. Смотря какими операторами вы «соедините» эти условия Логические операторы | Аппаратная платформа Arduino

Вообщем «казнить нельзя помиловать» 🙂

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

Ну или на примере. Два «плана на вечер».

План 1:
1. «гудим» пока не кончится водка и сигареты
2. Бежим в магазин

1. «гудим» пока не кончится водка или сигареты
2. Бежим в магазин

Как вы думаете какой план предусматривает более длинную гулянку? Какой из них, по смыслу, ближе к тому что вы хотите от своих кнопок и концевиков? Замените «водка» и «сигареты», на «кнопка» и «концевик».

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

Спасибо. Все понял, но не работает на практике. Туплю. Сделал все иначе, в while вложил еще один if. Понимаю что некрасивое решение, но работает. Буду разбираться в чем дело.

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

while ((c>140 && c Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Спасибо. Все понял, но не работает на практике.

Значит не все понял. Словами «Условие1» и «Условие2» — вы так и не описали. Что в итоге из этого вы «сделали на практике» — тоже никому не показали.

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

Условие 1. Концевик не нажат, на пине «0»

Условие 2. Кнопка нажата (140

Цикл должен прерваться если концевик будет нажат, либо кнопка отпущена.

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

Условие 1. Концевик не нажат, на пине «0»

Условие 2. Кнопка нажата (140

Цикл должен прерваться если концевик будет нажат, либо кнопка отпущена.

Смотрите, вот вы сформулировали два условия выполнения. Вот используя их вам нужно сформулировать «условие при котором цикл ВЫПОЛНЯЕТСЯ». while -лу же мы подсовываем именно «условие выполнение цикла», а не условие прерывания (он из него вытекает сам собой).

А вы, взяли и начали формулировать «цикл должен прерватся», что заставило вас инвертировать и условие1 и условие2, плюс заставило использовать слово «либо. «. Вообщем-то вот отсюда у вас путаница и пошла.

Попробуйте написать вместо «Цикл должен прерватся. «, что-то типа «Цикл должен продолжатся пока. «

P.S. Кстати «while» так и переводится «пока», «в то время как. «. Так что код можно читать практически «буквально».

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

Вот так работает:)

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

Вот так работает:)

ну только внутри while, естественно должен быть еще один c=analogRead(A1); Что-бы «c» могло обновляется пока цикл крутится.

Читайте также:  Не работает пульт управления earpods

Или. вынестви это в функции. Что-бы логика «работы с железом» и «логика принятия решений» были разделены.

Делаю функцию которая говорит нам «нажата ли кнопка».

Делаем функцию которая говорит «сработал-ли концевик». (возвращает true если не нажат)

Фактически обе функции и есть вот те «условия», которые мы писали «по русски». Осталось их только запихнуть в while()

Вот такой же код гораздо легче читать. Берем словарик, дословно переводим while (пока) isButtonPressed (кнопка нажата) && (и) isLimitSwitchNotPressed(концевик не нажат).

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

Источник

Циклы FOR и WHILE в Arduino

Циклы с использованием операторов for и while являются одной из важнейших конструкций языка C++, лежащего в основе Ардуино. Они встречаются абсолютно в каждом скечте, даже если вы не подозреваете об этом. В этой статье мы познакомимся поближе с циклами, узнаем, в чем отличие for от while, как можно упростить написание программы с их помощью и каких ошибок следует избегать.

Цикл WHILE и бесконечный цикл в Ардуино

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

Оператор WHILE используется в C++ и Ардуино для организации повтора одних и тех команд произвольное количества раз. По сравнению с FOR цикл WHILE выглядит проще, он обычно используется там, где нам не нужен подсчет числа итераций в переменной, а просто требуется повторять код, пока что-то не изменится, не наступит какие-то событие.

Синтаксис WHILE

В качестве условий может использоваться любая конструкция языка, возвращающая логическое значение. Условиями могут быть операции сравнения, функции, константы, переменные. Как и при любых других логических операциях в Ардуино любое значение, кроме нуля будет восприниматься как истина (true), ноль – ложь (false).

Обратите внимание, что оператор while может использоваться без выделения блока фигурными скобками, в этом случае повторяться будет первая команда, встреченная после цикла. Крайне не рекомендуется использовать while без фигурных скобок, т.к. в этом случае можно очень легко допустить ошибку. Пример:

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

Пример использования цикла while

Чаще всего while используется для ожидания какого-либо события. Например, готовности объекта Serial к работе.

Пример ожидания прихода символа от внешних устройств по UART:

В данном случае мы будем считывать значения до тех пор, пока Serial.available() будет возвращать не нулевое значение. Как только все данные в буфере закончатся, цикл остановится.

Цикл FOR в Ардуино

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

Синтаксис цикла FOR

Здесь конструкция будет немного сложнее:
for( ; ; )<

>

Самый простой пример:

Мы сразу создали переменную, инициализировали ее, указали, что в конце каждого цикла значение счетчика нужно увеличивать на единицу. И все – теперь можно использовать переменную внутри цикла.

Шаг переменной может быть иным. Вот примеры:

  • for(int i=0; i 0; i–) // Идем обратно – от 10 до 1

Цикл do while

В некоторых случаях нам нужно организовать цикл таким образом, чтобы инструкции блока выполнялись хотя бы один раз, а затем уже осуществлялась проверка. Для таких алгоритмов можно использовать конструкцию do while. Пример:

Никаких сложностей этот вариант цикла не представляет – мы просто перенесли блок с условиями вниз, поэтому все содержимое внутри фигурных скобок после оператора do выполнится до первой проверки.

Операторы continue и break

Бывают ситуации, когда вам нужно экстренно прервать выполнение цикла внутри блока цикла, не дожидаясь до перехода к блоку проверки условий. Для этого можно использовать оператор break:

Если мы просто хотим остановить ход выполнения текущей итерации, но не выйти из цикла, а перейти к блоку проверки условий, то должны использовать оператор continue:

Операторы continue и break могут использоваться со всеми вариантами циклов FOR и WHILE.

Вложенные циклы в Ардуино

Любые варианты циклов можно спокойно совмещать друг с другом, делая вложенные конструкции. Переменные, определенные в блоке «вышележащего» цикла будут доступны во внутреннем. Самый часто встречаемый пример такого рода циклов – обход двумерных массивов. В следующем примере мы используем двойной цикл: первый будет перебирать строчки (переменная i), второй, вложенный – столбцы (переменная j) массива, который мы определили в переменно arr.

Читайте также:  Как настроить колонку елари

Подробнее о циклах

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

Зачем нужен цикл

На самом деле, главная задача цикла – повторить одни и те же конструкции языка несколько раз. Такая потребность возникает практически в каждой программе и уж точно без цикла не обходится ни один скетч Ардуино – функция loop() тоже вызывается в бесконечном цикле.

Давайте рассмотрим следующий пример. Вам нужно подать питание одновременно на 5 светодиодов, подключенных к плате Arduino с 5 по 9 пины. Самым очевидным вариантом для этого будет размещение пяти инструкций подряд:

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

  • При любом изменении придется вносить правки одновременно во множество строк. Например, если нам понадобится переключить светодиоды на пины со 2 по 6 или не включить, а выключить напряжение, то придется сделать 5 изменений в коде. А если инструкций и изменений будет больше?
  • Объемный код с большим количеством однотипных инструкций неудобно и неприятно читать. Пять одинаковых строчек – не сильно страшно. Но привычка к грязному коду со временем приведет к десяткам и сотням лишних страниц в листинге, что повергнет в уныние и вас, и ваших коллег.
  • В процессе «копипастинга» почти одинаковых инструкций можно легко совершить ошибку, например, забыв поменять номер пинов: digitalWrite(5, HIGH); digitalWrite(5, HIGH);
  • Вы с легкостью провалите собеседование в любую нормальную софтверную компанию, показав интервьюеру такой код.

Исходя из всего этого, можно сделать вывод, что повторное многократное использование одних и тех же строк почти всегда нужно избегать и заменять циклами. Более того, во многих ситуациях без циклов не обойтись в принципе, их ничем заменить не получится. Вы не сможете изменить количество повторений кода в момент выполнения программы. Например, вам нужно обработать каждый элемент массива данных, поступившего от внешних устройств. Вы никогда не предугадаете, сколько будет данных, сколько раз повторить обработку и поэтому не сможете вставить нужное количество инструкций в момент написания статьи.

И тут нам на помощь приходят циклы.

Правила синтаксиса

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

В нашем описанном выше примере мы могли бы сказать контроллеру следующее:

Повтори команду digitalWrite 5 раз

В идеальном мире с роботами-программистами этого бы, наверное, хватило, но так как мы разговариваем с компьютером на языке C++, нам нужно перевести эту фразу на этот язык:

Повтори команду – нужно использовать специальные инструкции, говорящие контроллеру, что сейчас начинается что-то интересное с циклами while или for

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

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

Давайте посмотрим на пример такой «переведенной» команды цикла с инструкцией while:

Тем, кто заметил в приведенном коде ошибку, ставим пятерку и пишем блок цикла по-другому:

Такого же результата можно добиться с использованием цикла FOR:

Как видим, в данном случае мы сразу помещаем все необходимые операции со счетчиком в одну инструкцию FOR – это гораздо удобнее, если вам нужно подсчитывать нужное количество.

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

Заключение

В этой статье мы рассмотрели очень важные конструкции языка Ардуино: циклы FOR и WHILE. Вы сможете встретить эти операторы практически в любом более-менее сложном скетче, потому что без циклов многие операции над данными были бы невозможны. Ничего сложного в синтаксисе циклов нет – вы без труда к ним привыкните и сможете активно использовать в своих проектах.

Источник

Adblock
detector