Digitrode
цифровая электроника вычислительная техника встраиваемые системы
Приостанавливаем и возобновляем работу программы Arduino с помощью кнопок
Arduino является открытой микроконтроллерной платформой, которая прославилась в очень короткие сроки благодаря своим мощным функциям и простоте. Arduino – это находка для изобретателя, энтузиаста, художника и т. д. Можно создать собственную систему, не имея глубоких знаний в области базовой электроники и программирования.
В этой статье вы узнаете, как приостановить выполнение кода и возобновить его с помощью кнопочного переключателя. Иногда мы хотим, чтобы наш код запускался только тогда, когда пользователь выполняет какое-либо действие, например, нажимает кнопку, чтобы получить какое-то значение датчика. В материале вы узнаете, как приостановить программу и возобновить ее только одним нажатием кнопки без использования функции задержки, поскольку мы не можем использовать функцию задержки, если программа должна возобновить работу после взаимодействия с пользователем.
Схема подключения показана на следующем рисунке, она основана на Arduino Nano, двух кнопочных переключателей, ЖК-дисплея и нескольких других пассивных электронных компонентов, таких как резистор. ЖК используется здесь только для демонстрации.
Программный код написан на языке программирования Arduino и скомпилирован с использованием Arduino IDE. В скетче мы будем использовать функции CheckButton().Функция CheckButton1() проверяет, нажата кнопка 1 или нет. При нажатии кнопки значение становится высоким для CheckButtonPress1, и программа возвращается к функции цикла.
как остановить цикл arduino
У меня есть этот цикл, как бы я закончил цикл?
6 ответов
Arduino специально не предоставляет абсолютно никакого способа выйти из их loop функция, как показано кодом, который фактически ее запускает:
кроме того, на микроконтроллере нет ничего, чтобы выйти в первую очередь.
самое близкое, что вы можете сделать, это просто остановить процессор. Это остановит обработку, пока не будет сброшено.
Это не опубликовано на Arduino.cc но вы можете фактически выйти из цикла с простым выходом (0);
Это будет компилироваться практически на любой доске, которую вы имеете в своем списке. Я использую IDE 1.0.6. Я протестировал его с Uno, Mega, Micro Pro и даже безделушкой Adafruit
Я использую это в проектах, где я подключаю кнопку к pin-коду сброса. В основном ваш цикл работает до выхода (0); а затем просто сохраняется в последнем состоянии. Я сделал несколько роботов. для моих детей, и каждый раз, когда нажмите кнопку (Сброс), код начинается с начала функции loop ().
Матти Вирккунен сказал это правильно, нет» приличного » способа остановить цикл. Тем не менее, глядя на свой код и делая несколько предположений, я предполагаю, что вы пытаетесь вывести сигнал с заданной частотой, но хотите его остановить.
если это так, есть несколько решений:
если вы хотите генерировать сигнал с помощью ввода кнопки, вы можете сделать следующее
In в этом случае мы используем pin-код кнопки как INPUT_PULLUP . Вы можете прочитать ссылка Arduino для получения дополнительной информации об этой теме, но в двух словах эта конфигурация устанавливает внутренний импульсный резистор, таким образом, вы можете просто подключить свою кнопку к земле, без необходимости внешних резисторов. Примечание: это будет инвертировать уровни на кнопку LOW будет нажата и HIGH выйдет.
другой вариант будет использовать один из встроенных аппаратных таймеров для получения функции, вызываемой периодически с перерывами. Я не буду углубляться вздесьэто отличное описание того, что это такое и как его использовать.
три варианта, которые приходят на ум:
1-й) конец void loop() С while(1) . или не хуже. while(true)
эта опция запускает ваш код один раз, а затем запускает Ard в бесконечная «невидимая» петля. Возможно, не самый лучший способ идите, но что касается внешних проявлений, это делает свою работу.
Ard будет продолжать рисовать ток, пока он вращается в бесконечный круг. возможно, можно установить своего рода таймер функция, которая ставит Ard спать после стольких секунд, минуты и т. д.- зацикливания. просто мысль. есть конечно различные библиотеки сна там. видеть например, Monk, программирование Arduino: следующие шаги, pgs., 85-100 для дальнейшего обсуждения таких.
2nd) создайте функцию «stop main loop» с условным управлением структура, которая делает свой первоначальный тест неудачным на втором проходе.
Это часто требует объявления глобальной переменной и имеющих функция» stop main loop » переключает значение переменной при прекращении. Е. Г.,
конечно, это может быть не особенно красиво, но это также работает.
Он пинает Ard в другую бесконечную «невидимую» петлю, но это время это случай многократной проверки if(stop_it == false) условие stop_main_loop() который, конечно, не проходит каждый раз после первого раза.
3rd) можно снова использовать глобальную переменную, но использовать простой if (test == blah)<> структура вместо причудливой » остановки main функция петля».
есть, конечно, другие способы «остановить» этот надоедливый бесконечный основной цикл но эти три, а также те, которые уже упоминались, должны заставить вас начать.
Arduino.ru
Как ее остановить.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Боже, кто-то, помогите пожалуйста!
не могу найти как удалить то, что я прописал!
установил программу для виндовса, сделал все что описано в http://arduino.ru/Guide/Windows и теперь она постоянно мигает >_ где, где найти то что прописано в нутри ее? меня это мигание начинает раздрожать =\\\
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
На ардуине есть встроенный светодиод. в обучающей статье описано как заставить его мигать. И после этого я не знаю как остановить это мигание.
у меня нигде не отображается тот код, который я загрузил на ардуину. и не знаю как его удалить, чтобы остановить это мигание
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Залейте этот пример
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Максим, я бы Вас расцеловал =)
теперь могу пойти спать спокойно. спасибо большое!
этот код обнуляет все что я раньше написал?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
хм, через нескольких таких обнулений у меня теперь встроенный зеленый светодиод постоянно горит. так разве должо быть?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Светодид не будет гореть пока вы ему не прикажите. Или пока соблюдается условие.
Скорее всего вы зали что то другое.
Попробуйте такую программу. С ней точно ничего не должно мигать.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
теперь встроенный зеленый светодиод постоянно горит
так это индикатор питания светит
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
У меня UNO R3. Там красный — индикатор питания, а зеленый — просто встроенный светодиод. и они оба светились.
спасибо, nestandart , все помогло и теперь ничего лишнего не мигает =)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Но когда прописываю, чтобы шло питание от других выходов и замыкаю их на GND, то опять начинает светится этот зеленый диод (О_о) или так и должно быть?
тут даже нет этого 13 выхода, а он начинает светится. что не так? или он должен работать, когда идет ток через ардуину куда-то дальше?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Может автор темы скажет какая именно у него плата Arduino? А что бы не раздражало мигание, накройте пока плату чем нибудь непрозрачным. Да и ещё — не надо другие выходы замыкать на GND.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
у меня Ардуино UNO R3.
Постараюсь объяснить суть проблемы:
Вчера вечером первый раз подключил ардуину и попробовал сделать как описно в «обучении». Все получилось правильно, и светодиод с выхода №13 начал мигать (который на плате).
Потом я захотел подключить макетную плату: вставил «+» из выхода №12 в макетную плату, потом там из «+» через резистор включил диод, а минус замкнул на GND. и у меня начал мигать диод на макетной плате и диод на ардуине.
Потом я написал сюда эту тему, и обнулил данные как посоветовал Максим. Диоды мигать перестали. Но когда я по новой прописал мигание для выхода №12, то у меня просто стал светится встроенный светодиод (который для обучения).
Пока все это писал, то возник вопрос: может это из-за того, что я минус вывожу в GND? поэтому у меня и светится встроенный диод? и если это делаю не правильно, то куда тогда мне выводить минус с макетной платы?
Arduino.ru
подскажите как остановить цикл For.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Подскажите пож. как остановить цикл FOR
или временно его приостановить, чтобы выполнить другое действие.
Написал скетч, измерение температуры, и управление радио розетками.
Но вот затык, пока идет цикл измерения температуры, кнопки управления радио разетками не работают, до полного остановки цикла.
измеряется температура в сауне, включён цикл чтобы чтобы видеть как повышается температура.
приходит 8 по блютуз, измерения начанаются , и нельзя нажать 1 или 2(управление розетками), пока не закончится цикл. и остановить не возможно. как цикл остановился через 25 проверок, кнопки работают и розетки срабатывают.
OneWire oneWire(9); // вход датчиков 18b20
DallasTemperature ds(&oneWire);
Serial.begin(38400); //установка порта на скорость 9600 бит/сек
ds.begin();
while (Serial.available() == 0); //функция Serial.аvailable() проверяет, есть ли в COM порте
int val = Serial.read() — ‘0’;
if (val == 1) transmit(RF1ON); //если с COM порта поступил символ (1), начинаем отправлять через пин №11 (там радио передатчик)
if (val == 2) transmit(RF2ON);
for (int i = 0; i Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Поменять на while, останавливать правкой переменной условия (чтобы оно сработало).
Переменная i должна быть глобальной.
Тогда bStopFlag должна быть глобальной, а счётчик (i) может быть локальным.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
для остановки циклов есть оператор break;
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
пробовал break; не помогает.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
>> подскажите как остановить
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
если заменить функцию For ?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
у меня while (Serial.available() == 0); //функция проверяет что пришло из блютуз модуля
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
while (Serial.available() == 0); //функция делает проверку какую команду прислал блютуз модуль.
если 1, передача по радио вкл. радио розетку. 2 тожесамое но др. розетка. — 8 включить проверку датчиков температуры. запускает цикл, который не останавливается если нажать 1 или 2. значит я не могу отправить команду радио розеткам на вкл. или выкл. пока не кончится цикл проверки.
значит надо если придет любая другая команда 1 или 2 . останавливать цикл проверки. чтоб сработали эти команды.
и как мне остановить цикл. .
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
И как можно остановить бесконечный цикл через 1 илии 2 часа ??
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender, вы изначально ставите себе неверную задачу. Вам не нужен этот цикл вообще. Создайте отдельный флаг вместо цикла .
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender, вы изначально ставите себе неверную задачу. Вам не нужен этот цикл вообще. Создайте отдельный флаг вместо цикла .
пишет ошибку
sketch_apr12a.ino: In function ‘void loop()’:
sketch_apr12a.ino:56:15: error: ‘serial_cicle’ was not declared in this scope
sketch_apr12a.ino:58:5: error: ‘serial_cicle’ was not declared in this scope
sketch_apr12a.ino: At global scope:
sketch_apr12a.ino:81:1: error: expected declaration before ‘>’ token
Ошибка компиляции.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
std как мне это прикрутить или заменить у меня в коде.
Переменная i должна быть глобальной.
Тогда bStopFlag должна быть глобальной, а счётчик (i) может быть локальным.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
продекларировал теперь новая ошибка
sketch_apr12a.ino: In function ‘void loop()’:
sketch_apr12a.ino:57:29: error: expected primary-expression before ‘=’ token
sketch_apr12a.ino:59:18: error: expected primary-expression before ‘)’ token
sketch_apr12a.ino:60:23: error: expected primary-expression before ‘;’ token
Ошибка компиляции.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
как обойтись без цикла.
если надо постоянный визуальный контроль за температурой.
а телефон на базе андроид сам контролирует привышение температуры.
как включить что либо пока идет цикл.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender, я вам дал только фрагмент. Разумеется нужно объявить переменную, serial_cicle, компилятор как раз на это ругается. Помимо того нужно убрать ещё один while из скетча. while (Serial.available() == 0); Подобное выражение имеет очень ограниченное применение, потому что полностью застопоривает исполнение программы. Лучше вообще его никогда не использовать. Нужно либо отказаться от него вообще, либо перевести проверку на оператор if
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
а перенести проверку сериала в цикл ? или вообще убрать цикл опроса — луп сам цикл.
проверку 25-ти замеров можно и по другому организовать
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Но вот затык, пока идет цикл измерения температуры, кнопки управления радио разетками не работают, до полного остановки цикла. измеряется температура в сауне, включён цикл чтобы чтобы видеть как повышается температура. приходит 8 по блютуз, измерения начанаются , и нельзя нажать 1 или 2(управление розетками), пока не закончится цикл. и остановить не возможно. как цикл остановился через 25 проверок, кнопки работают и розетки срабатывают.
Мне кажется, что для такой ситуации как раз и были придуманы прерывания. :)
С другой стороны, раз уж Вы взались автоматизировать, то, на мой взгляд, надо свести человеческие вмешательства к минимуму: пусть автоматика сама регулирует температуру — у нее это получится лучше.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
мне не надо регулировать температуру. все само работает.
1 — void loop() как цикл у меня не работает.
пришлось дополнить цыклом опроса датчиков.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
если убираю For цикл опроса датчиков void loop()
не хочет этого делать.
нажимаю 1 или 2 включаются радио розетки, на них вентилятор и еще чтото.
нажимаю 8 на экран монит порта и на телефон приходит данные с температурой датчика только 1 раз и всё. нет цикла нет динамики роста температуры. нажать еще раз еще 1 раз придет температура. и опять тишина.
радио розетки исправно меня слушаются.
но если сам прописываю цикл For . вот тогда вижу как меняеся температура. НО тогда не проходят команды к радио розеткам. пока цикл не закончится.
радио кнопки нужны для вкл выкл вентилятора в комноте, включить или выключить тены в сауне.
while (Serial.available() == 0); //функция Serial.аvailable() проверяет, есть ли в COM порте
// доступные для чтения данные.
int val = Serial.read() — ‘0’;
if (val == 1) transmit(RF1ON); //если с COM порта поступил символ (1), начинаем отправлять через пин №11 (там радио передатчик)
if (val == 2) transmit(RF2ON);
if (val == 3) transmit(RF3ON);
if (val == 4) transmit(RF4ON);
// if (val == 5)
// // for (int i = 0; i
ds.requestTemperatures(); // считываем температуру с датчиков
Serial.print(«Temper1 «);
Serial.print(ds.getTempC(sensor1)); // отправляем температуру
Serial.println(» *C»);
Serial.print(«Temper2 «);
Serial.print(ds.getTempC(sensor2));
Serial.println(» *C»);
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
. свернуть и нумеровать
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
власть захватывает то блок while (Serial.available() == 0); , то блок for
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
если убираю For цикл опроса датчиков void loop()
не хочет этого делать.
нажимаю 1 или 2 включаются радио розетки, на них вентилятор и еще чтото.
нажимаю 8 на экран монит порта и на телефон приходит данные с температурой датчика только 1 раз и всё. нет цикла нет динамики роста температуры. нажать еще раз еще 1 раз придет температура. и опять тишина.
радио розетки исправно меня слушаются.
но если сам прописываю цикл For . вот тогда вижу как меняеся температура. НО тогда не проходят команды к радио розеткам. пока цикл не закончится.
радио кнопки нужны для вкл выкл вентилятора в комноте, включить или выключить тены в сауне.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
«8» — вкл/выкл передачи температуры. или по нажатию «8» нужно отослать 25 замеров температуры ?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender, я же вам написал в сообщении #15 что нужно делать. В чём пролема? Кстати, когда обращаетесь к кому-то конкретно -пишите ник того человека, к кому обращаетесь. А то непонятно кому адресуются ваши высказывания.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
dimax , и я просмртрел-пропустил. прошу пардона :)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
всё попробовал всё равно пишет об ошибке
sketch_apr12a.ino: In function ‘void loop()’:
sketch_apr12a.ino:73:16: error: expected primary-expression before ‘)’ token
sketch_apr12a.ino:74:23: error: expected primary-expression before ‘;’ token
Ошибка компиляции.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender, вы неправильно вставляете скетч. Обратите вгнимание в верхнем правом углу объекта со скетчем есть всплывающее меню. там есть кнопка скопировать.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ничего не работает по вашему скетчу пишет ошибку .
sketch_apr12a.ino: In function ‘void loop()’:
sketch_apr12a.ino:41:28: error: expected primary-expression before ‘=’ token
sketch_apr12a.ino:44:16: error: expected primary-expression before ‘)’ token
sketch_apr12a.ino:45:22: error: expected primary-expression before ‘;’ token
Ошибка компиляции.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender, вы не объявили переменную. Посмотрите 15 строку что это? Дожна быть переменная! Например так: byte serial_cicle;
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
что в строчках 39 и 40 что за трансмит .
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender, это не ко мне вопрос. Я скопировал ваши команды из первого сообщения.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
ваш скетч. заработал. но пока идет цикл чтения датчиков. опять ни чего нажать не возможно, пока цикл не дойдет до конца.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
да извиняюсь, точно это из моего скетча. передача кода на радио розетки.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender , зачем пакет из 25-ти замеров ?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
это было временно для проверки скетча, будет ли он останавливаться если нажать на отправку управления радио розеткой.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
я делал скетч, чтоб видеть как менятся температура 4 датчиков. чтом они постоянно показывали температуру, это улица, дом и сауна, данные приходят на телефон.
НО если работают датчики , то кнопки управления розетками не работают.
вот я и искал разные варианты, если вкл. постоянный цикл, то выйти из него я не знаю как, вот и поставил временно 25. чтоб цыкл если все не правельно хоть иногда сам останавливался.
по настоящему мне нужно видеть температуру и управлять розетками, пусть даже с остановкой в показанях, от датчиков. но потом после вкл выкл розеток возобновить показания.
ничего не получается, 4 дня мучуюсь.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender , в #23 убрать строки 11, 14 — будут постоянно опрашиваться приёмник команд и происходить отсылка значения температуры
. строки 14. 23 — продублировать код для остальных двух датчиков
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender, по идее вам нужно опрос датчиков производить не на каждом круге loop, а по таймеру, и чем реже тем лучше, по крайней мере не чаще 1 раза в секунду. Тогда контроллер будет слабо загружен, и всё успеет.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
да возможно вы правы
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
тов Dimax. Большое спасибо за советы. начинаю вникать в коды.
подскажите а как делать опрос датчиков по таймеру, и как вклинить ее в мой скетчь.
и еще может вы програмке в App Iventor разбираетесь ?
это написание програмулек для мобильных телефонов. под Андроид.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
TovBender, по идее вам нужно опрос датчиков производить не на каждом круге loop, а по таймеру, и чем реже тем лучше, по крайней мере не чаще 1 раза в секунду. Тогда контроллер будет слабо загружен, и всё успеет.
Мои пять копеек, уйдите от библиотеки Далласа на Onewire и делайте на ней. Описание команд датчика. Одна секунда тоже слишком частый интервал, не меняется температура в объемах с такой скоростью. 30с-1мин вполне достаточно для помещения. Таймер делаете на основе этого . И не забудьте гистерезис сделать, иначе будете постоянно щелкать в граничной точке.
Алгоритм простой — взвели таймер, по достижении времени дали команду на конвертацию всех датчиков, взвели флаг и таймер на 750мС, по достижении провели считывание данных с датчиков, сбросили флаг, вернулись в начало. Все проверки в loop, if-ами.
Для спокойствия, можете еще CRC сверять, в стандартных примерах OneWire есть как.