Сложное условие для while. Не могу понять как сделать.
- Войдите на сайт для отправки комментариев
Ср, 09/07/2014 - 12:17
int c=analogRead(A1); while(50<c && c<70) { }
и еще
int c=analogRead(A1); while(digitalRead(pin)==0) { }
как эти два условия объединить в одно через логическое ИЛИ?
Так будет работать или нет?
int c=analogRead(A1); while(50<c && c<70 || digitalRead(pin)) { }
Спасибо. Но все равно что-то не получается. По отдельности работают как надо, а вместе через ИЛИ не хотят.
Вот фрагмент кода. На А1 висят кнопки через резисторы. Если условие (140<c && c<170) выполняется, значитнужная кнопка нажата. Теперь мы попадаем в цикл while, который должен выполняться либо пока нужная кнопка нажата, либо пока не сработает концевик и на pinstart, не поступит единичка. В приведенном виде цикл выполняется не зависимо от того удерживается ли кнопка или нет, до срабатывания концевика. Если пишу так как в первом посте, то каждое условие по отдельности работает. Уже кипит голова:)
ну дык если независимо от кнопки, то значить там поступила единичка. попробуй изменить на ==1.
Я правильно понимаю, что цикл while должен отстановиться, если какое илбо из условий становится ложным?
Ошибку свою понял. Но решения все равно нет. Условия остановки цикла два условия должны быть false. В моем случае это не то что нужно. Мне нужно чтобы while крутился пока оба условия истинны. А если одни из условий становится false останавливался.
Вы запутались не сколько в коде, сколько в логике.
Попробуйте еще раз, словами описать два пункта при ВЫПОЛНЕНИИ которых, цикл должен ПРОДОЛЖАТЬ выполнятся (нарушение любого из этих условий - цикл дожен прерватся). Итак:
1. Условие1:....
2. Условие2:....
Я правильно понимаю, что цикл while должен отстановиться, если какое илбо из условий становится ложным?
неправильно .while прерывается когда ВСЕ выражение в нем ложно. Если результат того что вы запихнули в круглые скобки возвращает true - цикл продолжается, если false - прерывается. А вот каково будет значение этого выражения, если оно состоит из нескольких условий - зависит сугубо от вас. Смотря какими операторами вы "соедините" эти условия Логические операторы | Аппаратная платформа Arduino
Вообщем "казнить нельзя помиловать" :)
Ну или на примере. Два "плана на вечер".
План 1:
1. "гудим" пока не кончится водка и сигареты
2. Бежим в магазин
План 2:
1. "гудим" пока не кончится водка или сигареты
2. Бежим в магазин
Как вы думаете какой план предусматривает более длинную гулянку? Какой из них, по смыслу, ближе к тому что вы хотите от своих кнопок и концевиков? Замените "водка" и "сигареты", на "кнопка" и "концевик".
Спасибо. Все понял, но не работает на практике. Туплю. Сделал все иначе, в while вложил еще один if. Понимаю что некрасивое решение, но работает. Буду разбираться в чем дело.
while ((c>140 && c<170) && digitalRead(pinstart)==0)
Спасибо. Все понял, но не работает на практике.
Значит не все понял. Словами "Условие1" и "Условие2" - вы так и не описали. Что в итоге из этого вы "сделали на практике" - тоже никому не показали.
Условие 1. Концевик не нажат, на пине "0"
Условие 2. Кнопка нажата (140<c && c<170).
Цикл должен прерваться если концевик будет нажат, либо кнопка отпущена.
Условие 1. Концевик не нажат, на пине "0"
Условие 2. Кнопка нажата (140<c && c<170).
Цикл должен прерваться если концевик будет нажат, либо кнопка отпущена.
Смотрите, вот вы сформулировали два условия выполнения. Вот используя их вам нужно сформулировать "условие при котором цикл ВЫПОЛНЯЕТСЯ". while -лу же мы подсовываем именно "условие выполнение цикла", а не условие прерывания (он из него вытекает сам собой).
А вы, взяли и начали формулировать "цикл должен прерватся", что заставило вас инвертировать и условие1 и условие2, плюс заставило использовать слово "либо...". Вообщем-то вот отсюда у вас путаница и пошла.
Попробуйте написать вместо "Цикл должен прерватся...", что-то типа "Цикл должен продолжатся пока..."
P.S. Кстати "while" так и переводится "пока", "в то время как...". Так что код можно читать практически "буквально".
Вот так работает:)
Вот так работает:)
ну только внутри while, естественно должен быть еще один c=analogRead(A1); Что-бы "c" могло обновляется пока цикл крутится.
Или... вынестви это в функции. Что-бы логика "работы с железом" и "логика принятия решений" были разделены.
Делаю функцию которая говорит нам "нажата ли кнопка".
Делаем функцию которая говорит "сработал-ли концевик". (возвращает true если не нажат)
Фактически обе функции и есть вот те "условия", которые мы писали "по русски". Осталось их только запихнуть в while()
Вот такой же код гораздо легче читать. Берем словарик, дословно переводим while (пока) isButtonPressed (кнопка нажата) && (и) isLimitSwitchNotPressed(концевик не нажат)...
Если друг, у нас кнопка скажем станет нет аналоговой, а обычной, или читать мы ее будем через сдвиговые регистры или еще что-то...
Мы поменяем только внутренности функции isButtonPressed(). А вся остальная логика, везде - у нас будет без изменений.