While - не работает два условия ???

artmasterpro
Offline
Зарегистрирован: 15.06.2019

Доброго всем дня.

Столкнулся на первый взгляд с "детским" вопросом, но пока решить не смог:

Есть цикл, который вот так выполнять условие не хочет:

while ( (zaderzka < 5) || (millis() < (timer + PZU_data*60*1000)) ) {
...
}

 

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

while ( zaderzka < 5 ) {
...
}

И так тоже:

while ( millis() <= (timer + PZU_data*60*1000) ) {
...
}

В чем может быть дело ??

Заранее спасибо.

b707
Offline
Зарегистрирован: 26.05.2017

приведите полный код, где проявляется эта проблема. Ошибка явно не в синтаксисе  - составное условие вполне легальное и должно работать. Скорее всего у вас ошибка в логике программы.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а если заменить || на && )))

IVAN222
Offline
Зарегистрирован: 19.04.2017

а если так  

while ( zaderzka < 5 || millis() < timer + PZU_data*60*1000 ) {
...
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

IVAN222 пишет:

а если так  

while ( zaderzka < 5 || millis() < timer + PZU_data*60*1000 ) {
...
}

так тоже работать не будет )))

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

так тоже работать не будет )))

ну почему, может ТС именно "||" и надо. Хотя вероятность, что он с "&&" перепутал - велика :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

artmasterpro пишет:
вот так выполнять условие не хочет
Он Вам сам сказал?

Прекратите детский сад и напишите внятно: 1) чего именно Вы от него ждёте, что он по-Вашему должен делать (т.е. как Вы это условие понимаете),

Оно работает именно так как написано. А чего Вы ждёте мы не знаем. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

так тоже работать не будет )))

ну почему, может ТС именно "||" и надо. Хотя вероятность, что он с "&&" перепутал - велика :)

он не перепутал, он неверно решил уравнение )))

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Прекратите детский сад и напишите внятно:

Евгений, что вы хотите от человека с ником, в котором есть и "мастер" и "про"? - только детский сад и может быть :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

artmasterpro пишет:
вот так выполнять условие не хочет
Он Вам сам сказал?

Прекратите детский сад и напишите внятно: 1) чего именно Вы от него ждёте, что он по-Вашему должен делать (т.е. как Вы это условие понимаете),

Оно работает именно так как написано. А чего Вы ждёте мы не знаем. 

Как не знаем, он же написал, что должно отрабатывать на одно из двух условий, что слева, что справа - пишет жеж, что поодиночке работают )))

artmasterpro
Offline
Зарегистрирован: 15.06.2019

Цикл While должен прерываться по одному из условий (т.е. OR и AND я не перепутал)

вот полный код теста:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>                // подключаем библиотеку дисплея I2C

LiquidCrystal_I2C lcd(0x27, 20, 4); 

const byte ButtonStartPin = 4;   
uint32_t ms = 0;
unsigned long m1, m2;
unsigned long timer;
unsigned long PZU_data = 1;
int zaderzka=0;


void setup() {
  lcd.init();
  lcd.backlight();
  pinMode(ButtonStartPin, INPUT);
}

void loop() {

     lcd.setCursor(0, 0);
     lcd.print("Millis=");
     lcd.print(millis());

     timer = millis();
     lcd.setCursor(0, 1);
     lcd.print("Timer =");
     lcd.print(timer);

     lcd.setCursor(14, 0);
     lcd.print("TIME");
     lcd.setCursor(15, 1);
     lcd.print(":");

     timer = millis();

    
    //zaderzka < 5
    //millis() < (timer + PZU_data*60*1000)
 while ( (zaderzka < 5) || (millis() < (timer + PZU_data*60*1000))  ) {    
     if (millis() - ms > 1000){
         m1 = (PZU_data*60*1000 - (millis() - timer)) / 60000;
         m2 = ((PZU_data*60*1000 - (millis() - timer)) - (m1*60*1000))/1000 ;
          
         lcd.setCursor(13, 1);
         if (m1 > 9){
            lcd.print(m1);
         }else{
            lcd.print("0"); 
            lcd.print(m1);
         }

         lcd.setCursor(16, 1);
         if (m2 > 9){
            lcd.print(m2);
         }else{
            lcd.print("0"); 
            lcd.print(m2);  
         }
         ms = millis();
     } 

     if (digitalRead(ButtonStartPin)==HIGH) {
            zaderzka++;
            delay(500);
         }else{
            zaderzka=0;
     }

     lcd.setCursor(7, 3);
     lcd.print(zaderzka);

 }

 lcd.clear();
 lcd.setCursor(5, 1);
 lcd.print("PROGRAM ABORT");
 exit(0);



   

}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

таки перепутали, цикл идёт пока ТРЮ, значит должно быть &&

artmasterpro
Offline
Зарегистрирован: 15.06.2019

???

Цикл идет пока ИЛИ не удержали кнопку примерно 3 сек

                           ИЛИ пока не закончился таймер.

 

Так откуда && ?, объясните пожалуйста

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

artmasterpro пишет:

???

Цикл идет пока ИЛИ не удержали кнопку примерно 3 сек

                           ИЛИ пока не закончился таймер.

 

Так откуда && ?, объясните пожалуйста

Не объясню, так каккузнец )))
Поставьте && и проверьте, если работает как вы задумывали, вам ЕвгенийП на пальцах объяснит

sadman41
Offline
Зарегистрирован: 19.10.2016

Цикл идет пока истинно условие.  1 || 0 -> 1 , т.е.  условие остаётся истинным, даже если истинно только одно из "подусловий" . Тут требуется 1 && 0 -> 0, т.е. цикл прекращается, когда любое из "подусловий" превращает результат в false.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Цикл идет пока истинно условие.  1 || 0 -> 1 , т.е.  условие остаётся истинным, даже если истинно только одно из "подусловий" . Тут требуется 1 && 0 -> 0, т.е. цикл прекращается, когда любое из "подусловий" превращает результат в false.

вот как я ему мог бы это объяснить, выше же писал, что пока ТРЮ, а как тока не трю ... )))

artmasterpro
Offline
Зарегистрирован: 15.06.2019

Спасибо большое -  разобрался!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

artmasterpro пишет:

Спасибо большое -  разобрался!

так...теперь понятно, что ИЛИ это у нас в голове...

PS "ты проверяй какого пола твой сосед" В.Высоцкий