Выход из цикла по нажатию кнопки
- Войдите на сайт для отправки комментариев
Втр, 14/01/2014 - 21:37
Сильно не ругайтесь, я дикий новичок)
Подскажите, как в функции int main(void) сделать в самом начале бесконечный цикл, чтобы по нажатию кнопки на пульте можно были выйти из него, и программа начала выпонять основной код? То есть пока я не нажму определенную кнопку на пульте, программа не начнет работать. Основной код в int main(void) статичный, то есть после выполнения всего кода, контроллер будет ждать, пока я еще раз не нажду кнопку, чтобы заново запустить процесс.
Что то не хочет работать. Вот код:
Это скетч для Arduino?
Тогда оставайтесь в рамках схемы setup()+loop().
Или хотя бы добавьте в setup() вызов main(). И назовите-таки эту функцию как-нибудь по другому - ведь у препроцессора Arduino IDE может происходить заворот мозгов.
Я уже 3 дня пытаюсь сделать что мне нужно - но безрезультатно. Как я только не пробывал, итог один - программа компилится, но работает не так как надо.
Я пытался сделать, как ты мне предложил, но тогда основнйо код нужно запихивать в loop, и после окончания он опять начнет выполнение этой же программы, что недопустимо.
Можно сделать, чтобы он в loop все время проверял порт с фотоприемника, и по нажатию кнопки запускал функцию отдельную с программой. Вот только я так и не смог это сделать
Помоги перебрать тот код, который я кинул, чтобы он заработал
я таки думаю, что сначала надо осилить урок "мигаем светодиодом без delay", затем научиться опрашивать кнопки без использования delay. а если за тебя программу напишут -- чему ты научишься? хоть через loop(), хоть через main() -- результат можно получить один и тот же.
Мне не просто надо помигать, а прописать последовательный код с обязательным использованием delay, который будет отвечать на паузы между командами.
Я пересел с ATMega8 на Arduino Mega R3. Код почти полностью подходит и компилится. Но суть то не delay. Отдельно кнопки могу читать, отдельно свою прогу могу запустить без кнопки, а объеденить не получается.
Вот я и прошу помощи
Вот я и прошу помощи
Для начала попробуйте объяснить форумчанам (но в первую очередь - себе), каковы глубинные причины использования функции main в скетче Arduino.
Наконец, попробуйте сделать стандартное форматирование исходника (отступы там всякие). И не говорите, что представленный вариант вам удобнее - в конце концов, вы его не дома за рюмкой чая рассматриваете, а выкладываете на суд (и совет) Arduino-сообщества.
В общем, "как справедливо указывали выступавшие до меня товарищи" - "помигайте диодиком".
Расскажу по порядку. Я занимаюсь создание световых шоу путем программирования неоновых костюмов. Как я уже говорил, раньше у меня была Atmega8, и на ней фотоприемник присоеденялся к ножке reset. Это было удобно в плане сброса, но очень сильно не надежно. Программа костюма сбрасывалась на начало при нажатие любой клавиши, волн от аппаратуры или просто от вспышки фотоаппарата.
Сейчас я решил полностью переделать всю электронику и заменой на ардуино. Но от проблемы я решил избавить путем прописывания сброса с определенной кнопки. Если раньше программа статично выполнялась в функции main, дохдила до конца и останавливалась, то сейчас нужно сделать тоже самое, только чтобы параллельно все время опрашивался порт фотоприемника и ждал, пока я не нажму нужную кнопку на пульте и не сброшу контроллер.
Как я понял, если я опять буду использовать delay, то параллельно еще опрашивать контроллер не получился, потому что он заморозит контроллер. Как же бы тогда?
http://arduino.ru/tutorials/BlinkWithoutDelay
Расскажу по порядку. Я занимаюсь создание световых шоу путем программирования неоновых костюмов. Как я уже говорил, раньше у меня была Atmega8, и на ней фотоприемник присоеденялся к ножке reset. Это было удобно в плане сброса, но очень сильно не надежно. Программа костюма сбрасывалась на начало при нажатие любой клавиши, волн от аппаратуры или просто от вспышки фотоаппарата.
Сейчас я решил полностью переделать всю электронику и заменой на ардуино. Но от проблемы я решил избавить путем прописывания сброса с определенной кнопки. Если раньше программа статично выполнялась в функции main, дохдила до конца и останавливалась, то сейчас нужно сделать тоже самое, только чтобы параллельно все время опрашивался порт фотоприемника и ждал, пока я не нажму нужную кнопку на пульте и не сброшу контроллер.
Как я понял, если я опять буду использовать delay, то параллельно еще опрашивать контроллер не получился, потому что он заморозит контроллер. Как же бы тогда?
Расскажу по порядку. Санта-Клаус на 25 декабря 2013 принёс мне Ардуино. Собрал я макетный стенд и начал на нём "уроки" делать, что были в прилагаемой книжечке с картинками. Потом нашёл этот форум, вопросов особо не задавал -- у меня хорошо развиты навыки понимания прочитанного из того, что находит гугл. Обработку кнопок я сделал пятым уроком и результат расписал в этой вот теме: http://arduino.ru/forum/programmirovanie/pyatoe-uprazhnenie-po-arduino-shift-out-click-button-digitalreadwritefast . Функция main() у меня нужна в тексте программы, поскольку я не пользуюсь средой Arduino, стандартно ардуниская среда сама добавляет её. Признаюсь, конечно, я не просто примеры откудато набивал, я их придумывал сам по мотивам известных уроков, добавляя себе упражнения по интересу. Вопросы управления светодиодами, программами моргания и реакций на кнопки у меня в этом упражнении как раз пройдены.
Отличный пример) Вот только все никак не могу сделать так, как мне нужно.
Если я сделаю по твоему примеру и вызову фунцию с основным кодом в loop, то по завершению программа начнет работать заново.
Как можно реализовать следующее: чтобы постоянно работал loop и в нем опрашивался фотоприемник и параллельно с ним работала основная программа, по завершению которой она бы не начала работать заново? Причем основная программа должна приходить в начало ,когда бы я не нажал кнопку сброса на пульте
Отличный пример) Вот только все никак не могу сделать так, как мне нужно.
Если я сделаю по твоему примеру и вызову фунцию с основным кодом в loop, то по завершению программа начнет работать заново.
Как можно реализовать следующее: чтобы постоянно работал loop и в нем опрашивался фотоприемник и параллельно с ним работала основная программа, по завершению которой она бы не начала работать заново? Причем основная программа должна приходить в начало ,когда бы я не нажал кнопку сброса на пульте
Пойми одну вешь: программа должна работать "вечно". Поэтому её зацикливают в loop(). Представь, что у тебя есть набор состояний, которые должны по тобой написанным алгоритмам меняться. Между вызовами loop() состояния запоминаются в глобальных или статических (тоже глобальные, но с ограниченной областью видимости) переменных. Если ты вчитаешься в мой пример, то там есть выполнение програм по свечению светодиодов _и_ опрос состояний кнопок, ничто не мешает на том же принципе, что и кнопки, добавить опрос состояний фотоприёмника.
У тебя прописаны функции с программой, и в loop ты их вызываешь в зависимости от нажатия кнопки. Пока все круто - все мне подходит. Но дальше загвостка - функция, которую ты вызвал в своем примере - мотается по кругу до тех пор, пока не нажмется еще раз кнопка. Мне же нужно, чтобы по звершению вызванной функции программа вернулась в обработчик фотоприемника и ждала очередной сигнал, а не запускала еще раз эту же функцию.
У тебя прописаны функции с программой, и в loop ты их вызываешь в зависимости от нажатия кнопки. Пока все круто - все мне подходит. Но дальше загвостка - функция, которую ты вызвал в своем примере - мотается по кругу до тех пор, пока не нажмется еще раз кнопка. Мне же нужно, чтобы по звершению вызванной функции программа вернулась в обработчик фотоприемника и ждала очередной сигнал, а не запускала еще раз эту же функцию.
Это ж не примерка костюма в магазине, это ателье "умелые руки" -- ты должен сам пошить свой алгоритм, а не ждать, пока тебе сошьют подходящий костюмчик. В моём примере мотается по кругу, поскольку мне так было нужно. Если какой-то алгоритм, а у них у всех в моём примере есть счётчики номеров состояний, дошёл до логического конца, и мне было бы нужно, чтобы он остановился, я бы поставил признак "не вызывайте меня больше из loop()", а при нажатии на кнопку сбрасывал бы его.
Получится так его остановить:
в конце своей функции пропишу a=1, и когда он еще раз захочет запустить, то я поставлю условие, что запуск функции в том случае, если a=0. При этом назначу еще одно условие, что при совпанение нужной кнопки с пульта переменной "a" присваивался 0.
Получится так сделать или есть более простое решение?
или вот еще нашел полезную штуку
тоже вставлю ее в конец, и контроллер начнет работу с начала
или вот еще нашел полезную штуку
тоже вставлю ее в конец, и контроллер начнет работу с начала
Я, в общем, сказал уже всё, что мог и хотел. Решение о способе пошива за тобой.
CEBKACooler
А ты случайно не из Казани ?
CEBKACooler ты еще тут?
Да, я тут. У тебя есть предложение, чем мне помочь?
Я из Хабаровска кстати
Тс, про do..while ничего не слыхал ?
А в свой цикл включал пустой цикл for, с выходом из него по прерыванию ?
на даты не смотрим :)
Нет конечно. Он же не указал, что проблему решил. Мучается бедняга :-)
4 года? - пристрелите его кто-нибудь :)
Внимание всем. На форум произведена атака нэкрофилов. Мне чудится или это не первый топик разрытый из небытия за последние одну-две недели?))))
отчасти мы сами виноваты отправляя новичков в гугл, тут выскачила ссылка на нэкрофильскую тему на этом форуме, несмотря на даты пошли вопросы комменты, дальше поняслось.
Да, но в данном случае не спрашивают, а пытаются отвечать на древний вопрос. От безделия ищут нерешенные проблемы и решают их?
х.з.