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

cactous
Offline
Зарегистрирован: 18.11.2013

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))
 {

 }

 

__Alexander
Offline
Зарегистрирован: 24.10.2012


while ( (50<c && c<70) || (digitalRead(pin)==0) )

 

 

cactous
Offline
Зарегистрирован: 18.11.2013

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

int c=analogRead(A1);

  
  if (140<c && c<170)               
  {                                  
    digitalWrite(dir,0);           
    while((140<c && c<170)||(digitalRead(pinstart)==0))  
    {                               
      digitalWrite(stp,1);          
      digitalWrite(stp,0);        
      delayMicroseconds(200);   
      c=analogRead(A1);
    }                                      
  }                                 

Вот фрагмент кода. На А1 висят кнопки через резисторы.  Если условие (140<c && c<170) выполняется, значитнужная кнопка нажата. Теперь мы попадаем в цикл while, который должен выполняться либо пока нужная кнопка нажата, либо пока не сработает концевик и на pinstart, не поступит единичка. В приведенном виде цикл выполняется не зависимо от того удерживается ли кнопка или нет, до срабатывания концевика. Если пишу так как в первом посте, то каждое условие по отдельности работает. Уже кипит голова:) 

__Alexander
Offline
Зарегистрирован: 24.10.2012

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

cactous
Offline
Зарегистрирован: 18.11.2013

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

cactous
Offline
Зарегистрирован: 18.11.2013

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

leshak
Offline
Зарегистрирован: 29.09.2011

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

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

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

leshak
Offline
Зарегистрирован: 29.09.2011

cactous пишет:

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

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

Вообщем "казнить нельзя помиловать" :)

leshak
Offline
Зарегистрирован: 29.09.2011

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

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

План 2:

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

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

cactous
Offline
Зарегистрирован: 18.11.2013

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

toly
Offline
Зарегистрирован: 17.05.2014

while ((c>140 && c<170) && digitalRead(pinstart)==0) 

leshak
Offline
Зарегистрирован: 29.09.2011

cactous пишет:

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

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

cactous
Offline
Зарегистрирован: 18.11.2013

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

Условие 2. Кнопка нажата (140<c && c<170).

 

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

leshak
Offline
Зарегистрирован: 29.09.2011

cactous пишет:

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

Условие 2. Кнопка нажата (140<c && c<170).

 

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

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

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

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

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

cactous
Offline
Зарегистрирован: 18.11.2013
int c=analogRead(A1);
while((50<c && c<70) &&(digitalRead(pin)))
 {
 }
 

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

leshak
Offline
Зарегистрирован: 29.09.2011

cactous пишет:

int c=analogRead(A1);
while((50<c && c<70) &&(digitalRead(pin)))
 {
 }
 

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

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

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

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

bool isButtonPressed(){
 int c=analogRead(A1);
  return (50<c && c<70)
}

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

bool isLimitSwitchNotPressed(){
  return digitalRead(pin);
}

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

 

while(isButtonPressed() && isLimitSwitchNotPressed()){
  .... и уже не нужно захламлять само тело while-ла чтением входов)
}

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

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