цикличность программы.
- Войдите на сайт для отправки комментариев
Здравствуйте, хочу освоить больше, чем моргать диодом, но не получается. Есть плата 2560, к ней подключены 3 диода и 3 кнопки. Работать должна так: пуск программы, включение генератора псевдослучайных чисел, включение соответствующего диода, нажатие соответствующей(за счет электрики) этому диоду кнопки, возвращение в начало программы. В случае не нажатия кнопки за определенное время, включение всех диодов. По факту плата просто хаотично постоянно мигает диодами. Вопрос, почему на входные пины не подано напряжение (не нажата кнопка и соответственно не выполняется условие if) а программа все равно идет по циклу и не включаются 3 диода одновременно? Если нажать одну из кнопок просто диоды мигают с большей паузой. Как прервать программно этот цикл? Спасибо.
[code] // Псевдослучайное включение светодиодов, подключенных к выходам платы 10,12, 13. //Работать должно так, после нажатия кнопки "РЕСЕТ" на плате, должен в случайном порядке загораться один светодиод и гореть до нажатия соответствующей этому диоду кнопки, далее по циклу int ledPin = 10; // объявляем выходные пины платы МЕГА 2560 В3 int ledPin1 = 12; int ledPin2 = 13; int inPin = 2; // объявляем пин 2 входом int inPin1 = 3; // объявляем пин 3 входом int inPin2 = 4; // объявляем пин 4 входом int k ; // объявляем переменные для генератора случайных чисел void setup() { pinMode(ledPin, OUTPUT); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(inPin, INPUT); pinMode(inPin1, INPUT); pinMode(inPin2, INPUT); } void loop() { lab: ; // начало выполнения программы при выполнении условия задачи k = random (1, 3); // делаем выбор псевдослучайных чисел от 1 до 3 для включения диодов delay (100); // пауза if ( k == 1)// проверяем условие, если к=1 то { analogWrite (ledPin, 255), analogWrite (ledPin1, 0), analogWrite (ledPin2, 0);// включаем диод на выходе 10, на выходе 12 и 13 отключаем } delay (100); // пауза if (k == 2)// проверяем, если к = 2 то { analogWrite (ledPin, 0), analogWrite (ledPin1, 255), analogWrite (ledPin2, 0); // включаем диод на выходе 12, на выходе 10 и 13 отключаем } delay (100); // пауза if (k == 3)// проверяем, если к =3 то { analogWrite (ledPin, 0), analogWrite (ledPin1, 0), analogWrite (ledPin2, 255); // включаем диод на выходе 13, на выходе 10 и 12 отключаем } delay (1000);// пауза if (digitalRead(inPin) == HIGH ) // если на пин 2 подано напряжение { goto lab; } if (digitalRead(inPin1) == HIGH) // если на пин 3 подано напряжение { goto lab; } if (digitalRead(inPin2) == HIGH) // если на пин 4 подано напряжение { goto lab; } delay (1000);// пауза analogWrite (ledPin, 255), analogWrite (ledPin1, 255), analogWrite (ledPin2, 255);// включаем диоды на выходе 10, 12 и 13 } [/code]
INPUT_PULLUP
Вопрос, почему на входные пины не подано напряжение (не нажата кнопка и соответственно не выполняется условие if) а программа все равно идет по циклу
а куда ей еще идти, если loop() - это цикл? - если вы нажали какую-нить кнопку - вы переходите по goto на метку lab, а если не нажали - переходите на ту же lab просто потому что loop закончился
Внешне между этими переходами никакой разницы нет
Это мне не нравится, но хрустального шара нет, потому приведите схему подключения кнопок. Без схемы тут ничего сказать нельзя.
На самом деле, здесь выбирается не число от 1 до 3, как написано в комментарии, а число от 1 до 2. RTFM!
Что касается Вашего "цикла" - это свойство функции loop. Как только она завершается, она тут же начинается снова. RTFM!
Что касается Вашего "цикла" - это свойство функции loop. Как только она завершается, она тут же начинается снова. RTFM!
ждем вопрос "как остановить loop()??!!"
Вопрос, почему на входные пины не подано напряжение (не нажата кнопка и соответственно не выполняется условие if) а программа все равно идет по циклу
а куда ей еще идти, если loop() - это цикл? - если вы нажали какую-нить кнопку - вы переходите по goto на метку lab, а если не нажали - переходите на ту же lab просто потому что loop закончился
Внешне между этими переходами никакой разницы нет
Т.е. если условие if не выполняется то программа не ждет а идет дальше?
Вот в другой редакции, но почему то кнопку нажимаю она не переходит по метке lab а идет до конца...
потому приведите схему подключения кнопок. Без схемы тут ничего сказать нельзя.
Схему пока не нарисую, просто с выхода +5В подключаю проводок к одному из 2,3,4 PWM пинов, с миганием диодов так работало :)
Т.е. если условие if не выполняется то программа не ждет а идет дальше?
а чего ей ждать-то? пока условие выполнится? - так вы этого в коде не заказывали :)
Потому что в этом коде кнопку. чтобы сработала , надо нажимать в строго нужное время с точностью до миллисекунды. Попробуйте нажать кнопку и держать не отпуская секунд этак пять - тогда сработает
вообще. направление ваших вопросов мне начинает не нравится. Если вы думаете. что можно писать программы методом тыка - это без меня. Почитайте учебник, разберитесь
направление ваших вопросов мне начинает не нравится. Если вы думаете. что можно писать программы методом тыка - это без меня. Почитайте учебник, разберитесь
Я частично тыком, так как в тех учебниках что я читал( Brian W.Evans и еще несколько), не написано можно ли оператору if сравнивать несколько условий одновременно, как задать паузу между if и GOTO..... А спросить не у кого мне 44 года мои друзья не каждый компьютером может пользоваться.
можно ли оператору if сравнивать несколько условий одновременно
несколько нет, но можно комбинировать несколько условий в одно при помощи логических операторов:
никак
жуть, это где ж такое? Гватемала какая-нить? мне за 50 у меня в РФ нет знакомых. не умеющих обращаться с компом. У меня маме 80 - она активная пользовательница ПК :)
Будет на LOW проверять. Хаос-то у него от floating pin, полагаю.
Потому что в этом коде кнопку. чтобы сработала , надо нажимать в строго нужное время с точностью до миллисекунды. Попробуйте нажать кнопку и держать не отпуская секунд этак пять - тогда сработает
Спасибо что помогаете, я пробовал все равно идет до конца
Я попросил у ТС схему, он ответил "рисовать не буду". Ну, не будет, так не будет - сам себе злобный Буратино. Откуда Вам известно, что там нет резистора на землю? Шар подсказал? По мне так, пусть рисует сначала, а потом поговорим. А то если ради каждой ленивой задницы шар тереть - шаров не напасёшься.
Схему пока не нарисую
Ну, на нет и суда. Тогда сами ищите свои ляпы. Потребуется помощь, рисуйте и выкладывайте.
Потребуется помощь, рисуйте и выкладывайте.
Всем спасибо, заработала. Может есть ветка на форуме где можно задавать вопросы новичку непосредственно по программированию (как например про несколько сравнений в if или про паузу между if и GOTO) ткните носом пожалуйста.
дел
Я частично тыком, так как в тех учебниках что я читал( Brian W.Evans и еще несколько), не написано можно ли оператору if сравнивать несколько условий одновременно, как задать паузу между if и GOTO..... А спросить не у кого мне 44 года мои друзья не каждый компьютером может пользоваться.
2. Если у Вас возникает потребность задать паузу между if и goto, значит, у Вас ошибка в логике программы. Такого не должно быть от слова "совсем".
3. Тут практически все завсегдатаи старше Вас. Самый молодой недавно отчитался о достижении 50-летия.
Потребуется помощь, рисуйте и выкладывайте.
1. При разомкнутых кнопках состояние входов не определено.
2. При попытке зажечь несколько светодиодов, загораться будет всегда только красный.
3. Тут практически все завсегдатаи старше Вас. Самый молодой недавно отчитался о достижении 50-летия.
я думаю что ТС это и имел в виду - "мне всего 44, мы комп еще не проходили"...
Можно ли сделать так, что бы программа пропускала паузы если условие(к=1, к=2) не выполняется, что бы быстрее дойти до к=3 и если можно то чем?
Можно ли сделать так, что бы программа пропускала паузы если условие(к=1, к=2) не выполняется, что бы быстрее дойти до к=3 и если можно то чем?
Расскажи, что ты знаешь за фигурные скобки {} и операцию "запятая"?
Можно ли сделать так, что бы программа пропускала паузы если условие(к=1, к=2) не выполняется, что бы быстрее дойти до к=3 и если можно то чем?
Расскажи, что ты знаешь за фигурные скобки {} и операцию "запятая"?
Фигурные скобки определяют начало и конец блока функции или блока выражений, таких как функция void loop() или выражений типа for и if. За открывающейся фигурной скобкой всегда должна следовать закрывающаяся.
Запятая в моих учебниках описана как запятая, интуитивно предполагаю что она разделяет разные значения в какой-то операции.
Вставить паузу в фигурные скобки операции if ?
1. Не забудьте прочитать пост #19 - у Вас всегда будут глючные "нажатия кнопок" выскакивать.
2.
а Ваш random уже выдаёт 3? А то, с тех пор как я Вам написал, что он выдаёт только 1 и 2, я не видел исправленного кода.
1. Не забудьте прочитать пост #19 - у Вас всегда будут глючные "нажатия кнопок" выскакивать.
2.
а Ваш random уже выдаёт 3? А то с тех пор как я Вам написал, что он выдаёт только 1 и 2 я не видел исправленного кода.
Притянуть к земле это я знаю, пока так работает четко, да исправил на 4. Спасибо, как здесь репутацию поднимают?
Вместо if в конце лучше применить http://arduino.ru/Reference/SwitchCase
k=1 это не условие, это присвоение
Вместо if в конце лучше применить http://arduino.ru/Reference/SwitchCase
Что это даст в дух словах объясните, мне if проще применять (я очень давно бейсик учил и там применял)
Что это даст в дух словах объясните, мне if проще применять (я очень давно бейсик учил и там применял)
Александр, обьясните лучше, в чем смысл этой ветки? Вы про каждую запятую будете в форуме спрашивать? Если у вачс в прошлом опыт только с бейсиком - для начала найдите в инете любой "краткий курс С++" и прочитайте его от начала и до конца - многие ваши вопросы отпадут.
Можно ли сделать так, что бы программа пропускала паузы если условие(к=1, к=2) не выполняется, что бы быстрее дойти до к=3 и если можно то чем?
Можно. Например переставить паузу туда, где она нужна. Вы хоть напишите как это должно работать (ну т.е. когда пауза то нужна?)
Что это даст в дух словах объясните, мне if проще применять (я очень давно бейсик учил и там применял)
Если у вачс в прошлом опыт только с бейсиком - для начала найдите в инете любой "краткий курс С++" и прочитайте его от начала и до конца - многие ваши вопросы отпадут.
У меня есть "Введение в язык СИ", я еще несколько таких книг прочел, но там нигде нет того что программа не ждет выполнения условия if а идет дальше (я немного с языком LD знаком там пока кнопку не нажмешь ничего не произойдет) и много других нюансов. Я в том году 3 месяца не мог решить эту проблему, пришел на форум(не этот) и задал вопрос "Как остановить цикл" меня осмеяли и я бросил это программирование. Сейчас появилось время и желание попробовать опять. С помощью Вашего форума за пару часов я продвинулся больше чем с книжками за несколько месяцев, за что огромное спасибо Вам.
И если позволите, я так понял что при IF у меня нужно ждать пока условие отработает по паузе и только потом сработает по кнопке, а если использовать SWITCH Case то нажатие кнопки в любое время остановит условие?
Можно. Например переставить паузу туда, где она нужна. Вы хоть напишите как это должно работать (ну т.е. когда пауза то нужна?)
это должно работать так, генератор выдал псевдослучайное число, например 3, оператор IF проверяет условие на каждую цифру от 1 до 3 последовательно и в случае выполнения одного из условий зажигает соответствующий диод на время паузы. Проблема в том, что если выпала цифра 3 то паузы 1-го и 2-го увеличивают время ожидания.
И если позволите, я так понял что при IF у меня нужно ждать пока условие отработает по паузе и только потом сработает по кнопке, а если использовать SWITCH Case то нажатие кнопки в любое время остановит условие?
условие срабатывает только в ту единсвенную микросекунду, когда программа выполняет эту конкретную строчку. Это относится как к IF так и к switch. Программа ничего не ждет.
это должно работать так, генератор выдал псевдослучайное число, например 3, оператор IF проверяет условие на каждую цифру от 1 до 3 последовательно и в случае выполнения одного из условий зажигает соответствующий диод на время паузы. Проблема в том, что если выпала цифра 3 то паузы 1-го и 2-го увеличивают время ожидания.
это делается так - сначала проверяете цифры на совпадение с каждым из вариантов (либо IF либо switch. разницы нет) - а только после всех трех проверок ставите паузу. Тогда пауза после 1 не будет влиять на проверку 2 и так далее
это должно работать так, генератор выдал псевдослучайное число, например 3, оператор IF проверяет условие на каждую цифру от 1 до 3 последовательно и в случае выполнения одного из условий зажигает соответствующий диод на время паузы. Проблема в том, что если выпала цифра 3 то паузы 1-го и 2-го увеличивают время ожидания.
это делается так - сначала проверяете цифры на совпадение с каждым из вариантов (либо IF либо switch. разницы нет) - а только после всех трех проверок ставите паузу. Тогда пауза после 1 не будет влиять на проверку 2 и так далее
Если выпала 1 и совпала с одним из значений то оператор if вторым действием (первое сравнение) зажигает на эту паузу диод, а что должен делать вторым действием в Вашем случае?
Если выпала 1 и совпала с одним из значений то оператор if вторым действием (первое сравнение) зажигает на эту паузу диод, а что должен делать вторым действием в Вашем случае?
вы себя слышите? - что такое "первое действие", "второе действие" "третье" ???
что мешает сделать так:
У меня есть "Введение в язык СИ", я еще несколько таких книг прочел, но там нигде нет того что программа не ждет выполнения условия if а идет дальше
Поделитесь, пожалуйста, ссылкой на книжку, в которой написано, что программа вообще хоть когда-то чего-то ждет, а не идет дальше.
Вы всерьез полагаете, что существует исчерпывающий перечень того, что программа НЕ делает?
И если позволите, я так понял что при IF у меня нужно ждать пока условие отработает по паузе и только потом сработает по кнопке, а если использовать SWITCH Case то нажатие кнопки в любое время остановит условие?
Я смотрю язык LD, чем бы он ни был, опасен для начинающих программистов :)
С делеем бы сначала, а то совсем запутается.
Применяя свич Вы избавитесь от гоуту
Применяя свич Вы избавитесь от гоуту
савершенно ни факт :)
if (k==1) { зажигаем светодиод, делаем паузу }
обратите внимание в каком именно месте пауза относительго блока {}
у вас какое то неправильное понимание в целом или излагаете непонятно. вот if, к примеру, это как стрелка ЖД - он ничего не ждет, в нем нет действий, когда на него натыкаешься - идешь или налево или направо в зависимости от условия в скобках, все
ах вот оно что...
вы себя слышите? - что такое "первое действие", "второе действие" "третье" ???
Нехватка опыта и ошибки в мышлении. Я писал код для одного диода, проверял, если работает, то копировал и затем вставлял с изменениями .....
Такие вещи надо запрещать, как оружие массового поражения мозга...
Все, плата работает как нужно, внес паузу в фигурные скобки. Осталось разобраться как не ждать когда подойдет очередь кнопки а нажать и отпустить ее в момент горения диода.
Вот теперь точно пора изучать блинк без делей. Можно по примерам, можно тут на форуме поискать. В общем как делать паузы в действиях не останавливая программу.
Раньше, помню, бейсик ругали, типа если первым языком был бейсик - все, хана, но этот LD позабористее, видать )
Осталось разобраться как не ждать когда подойдет очередь кнопки а нажать и отпустить ее в момент горения диода.
Боюсь Вас разочаровать, но это невозможно. Тут надо выбирать, либо вставлять паузы, либо обрабатывать кнопки. А Вы хотите всё и сразу - так не бывает :-)
Такие вещи надо запрещать, как оружие массового поражения мозга...
Кто ж тебе мешал предложить такую поправку в конституцию, когда была возможность?
Тут кто-то из старожилов вроде предлагал (через соответствующий портал), чтобы в каждой "пятёрочке" всегда минимум пот три кассы работало. Поправку, конечно не включили (чиновники в "пятёрочки" не ходят - им пофиг), но, по крайней мере, гражданская совесть чиста - предложил, что мог - сделал.