Arduino игнорирует оператор "if"

Vernam
Vernam аватар
Offline
Зарегистрирован: 17.02.2016

И так, проблема в том что я пытаюсь сделать замок как на сейфе с помощью потенциометра. Создаю условие: 

"

  if (550 > sensorValue > 650)
  {
    delay(2000);
    digitalWrite(LED_PIN, HIGH);
    delay(2000);
    digitalWrite(LED_PIN, LOW);
   }
"
Но Arduino выполняет действия в скобках, не проверяя условие выполнения. Сталкиваюсь с этой проблемой не в первый раз. Что я только не перепробовал. Очень сильно напрягает эта проблема, а этот оператор не из редких. Специально зарегистрировался на этом сайте для помощи опытных и продвинутых людей, помогите чем сможете пожалуйста!

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

писать надо так

if (sensorvalue > 550 && sensorvalue < 650) {
выполняем что-то между 550 и 650

}

а с тем условием которое у вас так

if (sensorvalue < 550 || sensorvalue > 650) {
выполняем что-то до 550 и после 650

}

 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Vernam пишет:

И так, проблема в том что я пытаюсь сделать замок как на сейфе с помощью потенциометра. Создаю условие: 

"

  if (550 > sensorValue > 650)
  {
    delay(2000);
    digitalWrite(LED_PIN, HIGH);
    delay(2000);
    digitalWrite(LED_PIN, LOW);
   }
"
Но Arduino выполняет действия в скобках, не проверяя условие выполнения. Сталкиваюсь с этой проблемой не в первый раз. Что я только не перепробовал. Очень сильно напрягает эта проблема, а этот оператор не из редких. Специально зарегистрировался на этом сайте для помощи опытных и продвинутых людей, помогите чем сможете пожалуйста!

Почитать описание языка Си религия не позволяет?

http://arduino.ru/Reference/If

 

lex2k
Offline
Зарегистрирован: 17.12.2015

at0mix пишет:

Vernam пишет:

И так, проблема в том что я пытаюсь сделать замок как на сейфе с помощью потенциометра. Создаю условие: 

"

  if (550 > sensorValue > 650)
  {
    delay(2000);
    digitalWrite(LED_PIN, HIGH);
    delay(2000);
    digitalWrite(LED_PIN, LOW);
   }
"
Но Arduino выполняет действия в скобках, не проверяя условие выполнения. Сталкиваюсь с этой проблемой не в первый раз. Что я только не перепробовал. Очень сильно напрягает эта проблема, а этот оператор не из редких. Специально зарегистрировался на этом сайте для помощи опытных и продвинутых людей, помогите чем сможете пожалуйста!

Почитать описание языка Си религия не позволяет?

http://arduino.ru/Reference/If

 

в операторе IF про это как раз не чего и нет........

а есть в 

&& (логическое И)

Истина, если оба операнда истина (true).

if (digitalRead(2) == HIGH  && digitalRead(3) == HIGH) { // считывает состояние двух портов
  // ...
}

Истина если оба порта вход/выхода HIGH

|| (логическое ИЛИ)

Истина, если хотя бы один операнд истина, например:

if (x > 0 || y > 0) {
  // ...
}

будет верно (истина) если x или y больше 0.

! (логическое отрицание)

True, если операнд false, и наоборот, например:

if (!x) {
  // ...
}

условие верно, если x - false (x равно 0).

Важно различать логический оператор "И" - && и битовый оператор "И" - &. Тоже самое относится к логическому оператору "ИЛИ" - || и битовому оператору "ИЛИ" - |.

Пример
if (a >= 10 && a <= 20){}   // условие верно, если a больше 10, но меньше 20

 

Vernam
Vernam аватар
Offline
Зарегистрирован: 17.02.2016

Спсибо, помог! Буду очень благодарен если поможешь ещё с кодовым замком. Проблема что и предыдущая светодиоды горят без нажатия кнопок,  мигают, меняются. Пробовал ещё с оператором "else", но пока остановился на этом.

 

void loop(){
  outset:                             //начало кода
  BUTTON1 = digitalRead(BUTTON_1);
  BUTTON2 = digitalRead(BUTTON_2);
  BUTTON3 = digitalRead(BUTTON_3);
  digitalWrite(LED_FALSE, LOW);       //выключаем красный светодиод
  if(BUTTON1 > 0){                     //проверка первой кнопки
    delay(DREBEZG);                   //не забываем про дребезг
    digitalWrite(LED_TRUE_1, HIGH);   //включаеми ндикатор
    delay(TRUE_BLINK);
    digitalWrite(LED_TRUE_1, LOW);
    goto stage_2;
    }                                 //переход на следущий уровень                                   
  if(BUTTON2 > 0){
  delay(DREBEZG);
  digitalWrite(LED_FALSE, HIGH);
  delay(TIME_FALSE);
  goto outset;}
   if(BUTTON3 > 0){
  delay(DREBEZG);
  digitalWrite(LED_FALSE, HIGH);
  delay(TIME_FALSE);
  goto outset;}
goto outset;                          //Не пускаем на следующие стадии кода 

Вот схема, если как то поможет:

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

для начала надо с каждой кнопки (концы которые к цифровым пинам ардуино подключены) на землю подтягивающий резистор поставить  в 1 - 10 кОм

lex2k
Offline
Зарегистрирован: 17.12.2015

Valera19701 пишет:

для начала надо с каждой кнопки (концы которые к цифровым пинам ардуино подключены) на землю подтягивающий резистор поставить  в 1 - 10 кОм

правельно

 

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

Vernam пишет:

  if (550 > sensorValue > 650)

Я бы такой тоже игнорировал. А вот Ардуина его не игнорирует, а вполне себе исполняет в точности, как написано. Результат: всегда false.

Vernam пишет:

проблема в том что ....

Нет, проблема не в этом. Проблема в том, что Вы абсолютно не знаете языка на котором пытаетесь писать. Читайте много раз и внимательно. Такого рода проблемы исчезнут сразу.

 

Vernam
Vernam аватар
Offline
Зарегистрирован: 17.02.2016

На данный момент у меня нет резисторов на 1kΩ, но что нужно будет сделать дальше?

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

Vernam пишет:

На данный момент у меня нет резисторов на 1kΩ, но что нужно будет сделать дальше?

Один - это он погорячился. Ставьте 10 (ну, от пяти хотя бы) у Вас же питание не лишнее. Нет 5 или 10, ставьте 20, там почти всё равно, хоть до 100.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

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

Один - это он погорячился. Ставьте 10 (ну, от пяти хотя бы) у Вас же питание не лишнее. Нет 5 или 10, ставьте 20, там почти всё равно, хоть до 100.

от 1 до 10 написал же, и чем меньше сопротивление, тем меньше наводок :)

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

Valera19701 пишет:

от 1 до 10 написал же, и чем меньше сопротивление, тем меньше наводок :)

И тем больше ток через него (если батарейка, то это особенно приятно).

Сопротивление входя атмеги - 100МОм, так что поставите Вы туда 1К или 10 или 20 особой роли не играет, а вот ток... При 1К и HIGH на пине - это худо-бедно 5мА ПОСТОЯННО вылетающие в трубу.

Vernam
Vernam аватар
Offline
Зарегистрирован: 17.02.2016

Сделал как вы сказали, но пока ничего не изменилось

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Vernam пишет:

На данный момент у меня нет резисторов на 1kΩ, но что нужно будет сделать дальше?

1. Красный СД светить не будет - земля оборвана - если судить по схеме.

2. кнопки сажать не на +5 а на землю, а на входных пинах включить подтягивающее сопротивление к +5 - и будет щастье ;)

Vernam
Vernam аватар
Offline
Зарегистрирован: 17.02.2016

"

1. Красный СД светить не будет - земля оборвана - если судить по схеме.

2. кнопки сажать не на +5 а на землю, а на входных пинах включить подтягивающее сопротивление к +5 - и будет щастье ;)

"

1. Светодиод связал с землёй.

2. Поставил подтягивающие резисторы на пины 3-5 и на землю через резисторы кнопки насадил.

Резисторы на схеме те же что и у меня на 5,4.7 и 4kΩ

Я всё правильно сделал?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Valera19701 пишет:

а с тем условием которое у вас так

if (sensorvalue < 550 || sensorvalue > 650) {
выполняем что-то до 550 и после 650

}

 

Вы в этом уверены?

sensorvalue фигурирует в исходном коде только один раз, следовательно, и сравнивается тоже только один раз. В результате сравнения получается либо 0, либо 1. Очевидно, обе эти величины всегда меньше 650.

Поэтому, как верно замиетил ЕвгенийП, второе сравнение (оно же результат всего выражения) вегда дает false.

Jatixo
Offline
Зарегистрирован: 13.01.2016

Есть же внутренние подтягивающие резисторы, 100К как раз для такого случая, только логику в скетче наоборот переделать, когда true - кнопка не нажата, когда false нажата.

Ой, at0mix, уже написал.

Vernam, почитайте про внутренние подтягивающие резисторы, тогда внешние для кнопок Вам будут не нужны, для светодиодов по-прежнему нужны.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

andriano пишет:

Valera19701 пишет:

а с тем условием которое у вас так

if (sensorvalue < 550 || sensorvalue > 650) {
выполняем что-то до 550 и после 650

}

 

Вы в этом уверены?

sensorvalue фигурирует в исходном коде только один раз, следовательно, и сравнивается тоже только один раз. В результате сравнения получается либо 0, либо 1. Очевидно, обе эти величины всегда меньше 650.

Поэтому, как верно замиетил ЕвгенийП, второе сравнение (оно же результат всего выражения) вегда дает false.

вы на знаки больше или меньше присмотритесь и на логический оператор

SSTTEEPPAANN
Offline
Зарегистрирован: 27.04.2018

Подскажите пожалуйста почему после ИСТИНА значение в скобках игнорируется?

{//Полив растения1
 digitalWrite(moisture_sensor_power1, HIGH);
 delay(10);
 int moisture_value1 = analogRead(moisture_sensor1);
 digitalWrite(moisture_sensor_power1, LOW);
 int moisture_value_percent1 = map(moisture_value1,very_moist_value1,1023,100,0);
 Serial.println(String(moisture_value_percent1) + " % (Гигромер№1)");
 if(moisture_value_percent1>=VlagaZemlya1)
 {digitalWrite(PIN_RELAY1, HIGH);
 }else{(PIN_RELAY1, LOW);
 }
}
SSTTEEPPAANN
Offline
Зарегистрирован: 27.04.2018

И как это решить?

bwn
Offline
Зарегистрирован: 25.08.2014

Для начала, всавьте код нормально (есть в прикрепленных темах). Глазы ломаются и ссылаться не на что.

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

SSTTEEPPAANN пишет:

Подскажите пожалуйста почему после ИСТИНА значение в скобках игнорируется?

Это Вам так кажется.

Но, в любом случае,

bwn пишет:

Для начала, всавьте код нормально (есть в прикрепленных темах). Глазы ломаются и ссылаться не на что.

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

SSTTEEPPAANN, Вам уже два человека сказали - вставьте код нормально. Вы над нами издеваетесь?

Пока не вставите код правильно, никто Ваш код читать не будет.