Вопрос по if

stboris
Offline
Зарегистрирован: 12.04.2015
if(((input_voltage_level/79.92) < 11.9)&&(control_voltage_act_flag==true)){
  
strcpy(Sensor_state_out,Power_fault);
  
digitalWrite(alarm_relay_pin , HIGH);
  
ALM_RELAY__delay_flag=HIGH;
  
control_voltage_act_flag=false;

delay(500);
}

else if((input_voltage_level/79.92) >12.5)control_voltage_act_flag=true;

Здравствуйте.
Непонятно следующее:В таком виде  код работает.При инициализации control_voltage_act_flag устанавливаетс равным true условие выполняется  один раз при этом  выставляется флаг control_voltage_act_flag=false и все останавливается.

Но если при инициализации соntrol_voltage_act_flag установить равным false ,и при выполнении условия менять его   соответственно на  true то условие будет выполняться все время несмотря на флаг.Почему?

Focus
Offline
Зарегистрирован: 05.04.2015

видимо потому что в true его будет делать elseif.

чему равно input_voltage_level/79.92 при той ситуации, которой вы тестировали?

stboris
Offline
Зарегистрирован: 12.04.2015

Оно равно 11.5

stboris
Offline
Зарегистрирован: 12.04.2015

Я убирал else if , и все равно выполнение условия не прекращается

Focus
Offline
Зарегистрирован: 05.04.2015

А если из условия убрать ((input_voltage_level/79.92) < 11.9)&& ?

control_voltage_act_flag глобальная переменная?

Покажите весь код

stboris
Offline
Зарегистрирован: 12.04.2015
boolean control_voltage_act_flag=true;//Флаг для  Control_voltage активная система

Переменная глобальная.

При такой иницивлизации переменной все работает.Но если поменять на false то перестает

 

Focus
Offline
Зарегистрирован: 05.04.2015

Если она true то условие должно выполниться 1 раз, после чего перевестись в false (если вольтаж < 11.9) и больше не повторяться до тех пор, пока вольтаж не повысится больше того что задано в elseif

Если false то не выполниться ниразу, пока напряжение не повысится

Вроде так

stboris
Offline
Зарегистрирован: 12.04.2015

Да это так и приведенный выше код работает. Но если поменять при инициаоизации глобальной переменной  control_voltage_act_flag  значение на falce ,а потом в условии менять его на true ,то код перестает выполняться один раз,а выполняется все время.Я не могу понять почему?

И там должны выполняться два условия если напряжение меньше 11,5 и значение этого флага,первоначальное значение которого  устанавливается при инициализации переменной.

Focus
Offline
Зарегистрирован: 05.04.2015

покажите код который не работает, ато на "пальцах" непонятно

stboris
Offline
Зарегистрирован: 12.04.2015
//Конроль напряжения питания системы если система активна
if(((input_voltage_level/79.92) < 11.9) && (control_voltage_act_flag==true)){
  strcpy(Sensor_state_out,Power_fault);
  digitalWrite(alarm_relay_pin , HIGH);
  ALM_RELAY__delay_flag=HIGH;
  control_voltage_act_flag=false;
delay(500);
}

else if((input_voltage_level/79.92) >12.5)control_voltage_act_flag=true;

Этот работает

stboris
Offline
Зарегистрирован: 12.04.2015

//Конроль напряжения питания системы если система активна 

if(((input_voltage_level/79.92) < 11.9)&&(control_voltage_act_flag==false)){ 
strcpy(Sensor_state_out,Power_fault); 
digitalWrite(alarm_relay_pin , HIGH); 
ALM_RELAY__delay_flag=HIGH;  
control_voltage_act_flag=true
delay(500); 
} 

else if((input_voltage_level/79.92) >12.5)control_voltage_act_flag=false

Вот такой код не работает

Focus
Offline
Зарегистрирован: 05.04.2015
boolean control_voltage_act_flag=false; //до setup
...
...
//Конроль напряжения питания системы если система активна
if(((input_voltage_level/79.92) < 11.9) && (control_voltage_act_flag==false)){
  strcpy(Sensor_state_out,Power_fault);
  digitalWrite(alarm_relay_pin , HIGH);
  ALM_RELAY__delay_flag=HIGH;
  control_voltage_act_flag=true;
delay(500);
}

else if((input_voltage_level/79.92) >12.5)control_voltage_act_flag=false;

Так точно так же должно работать. т.е.:

Если напряжение (input_voltage_level/79.92) меньше 11.9 то выполняется 1 раз и больше не выполняется до тех пор пока напряжение (input_voltage_level/79.92) не поднимится больше 12.5

Focus
Offline
Зарегистрирован: 05.04.2015

Focus пишет:

boolean control_voltage_act_flag=false; //до setup
...
...
//Конроль напряжения питания системы если система активна
if(((input_voltage_level/79.92) < 11.9) && (control_voltage_act_flag==false)){
  strcpy(Sensor_state_out,Power_fault);
  digitalWrite(alarm_relay_pin , HIGH);
  ALM_RELAY__delay_flag=HIGH;
  control_voltage_act_flag=true;
delay(500);
}

else if((input_voltage_level/79.92) >12.5)control_voltage_act_flag=false;

Так точно так же должно работать. т.е.:

Если напряжение (input_voltage_level/79.92) меньше 11.9 то выполняется 1 раз и больше не выполняется до тех пор пока напряжение (input_voltage_level/79.92) не поднимится больше 12.5

если boolean control_voltage_act_flag=true//до setup

то просто ждет пока напряжение (input_voltage_level/79.92) поднимится выше 12.5

stboris
Offline
Зарегистрирован: 12.04.2015

Должно.Но в первом случае все работает.А во втором  условие опрверяется бесконечно пока напряжение не станет >12.5.Это мне и не понятно

stboris
Offline
Зарегистрирован: 12.04.2015

Во вторм случае как будто не видит изменение состояния флага

 

Focus
Offline
Зарегистрирован: 05.04.2015

Во втором, в нерабочем случае, тут что  boolean control_voltage_act_flag=?//до setup

stboris
Offline
Зарегистрирован: 12.04.2015

Да до setup.А что? Объявляем глобальную переменную и присваиваем ей значение,во втором случае (не рабочем)- false.

В первом(рабочем) - true

Focus
Offline
Зарегистрирован: 05.04.2015
boolean control_voltage_act_flag=false; //до setup
int input_voltage_level = 11;
void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  if(((input_voltage_level) < 11.9) && (control_voltage_act_flag==false)){
    digitalWrite(13, HIGH);
    control_voltage_act_flag=true;
    delay(1000);
    digitalWrite(13 , LOW);
    delay(1000);
  }
  else if((input_voltage_level) >12.5) control_voltage_act_flag=false, digitalWrite(13, HIGH), delay(100), digitalWrite(13, LOW), delay(100);
}

Всё работает так как задано в условии. Либо у вас вводные данные неверные, либо условие не то.

Как по вашему должен отрабатывать этот код?

stboris
Offline
Зарегистрирован: 12.04.2015

Этот код должен мигнуть светодиодом.(Одновибратор так сказать). У меня не работает второй вариант.Не знаю почему.

stboris
Offline
Зарегистрирован: 12.04.2015
input_voltage_level

У меня считывается с аналогового входа ,может с этим связано.

Focus
Offline
Зарегистрирован: 05.04.2015

Проверьте что у вас в переменных перед условием

в setup:

Serial.begin(9600);

Перед условием:

Serial.print("input_voltage_level/79.92 = ");
  Serial.print(input_voltage_level/79.92);
  Serial.print(", control_voltage_act_flag = ");
  Serial.println(control_voltage_act_flag);
  if(((input_voltage_level/79.92) < 11.9) && (control_voltage_act_flag==false)){
...
...

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Ну вы и извращаетесь. Вы же уже работаете с булевой переменной. В условии пишется просто переменной:

 if(((input_voltage_level/79.92) < 11.9) && (!control_voltage_act_flag)){...

Focus
Offline
Зарегистрирован: 05.04.2015

nevkon пишет:

Ну вы и извращаетесь. Вы же уже работаете с булевой переменной. В условии пишется просто переменной:

 if(((input_voltage_level/79.92) < 11.9) && (!control_voltage_act_flag)){...

Настоящие герои всегда идут в обход :D

да, так правильно, но кроме изменения наглядности (в худьшую сторону) ничего не даёт.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

nevkon пишет:

Ну вы и извращаетесь. Вы же уже работаете с булевой переменной. В условии пишется просто переменной:

 if(((input_voltage_level/79.92) < 11.9) && (!control_voltage_act_flag)){...

И чем Ваш вариант лучше? Сэкономили 5 символов? А новичкам такое читать не удобно.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Не знаю как на микриках (никогда не нарывался), а на больших компах условие типа flag == true работал не всегда, потому что переменная flag могла принимать значение и 5 и 3, потому никогда не сравниваю flag == true, всегда пишу просто flag.

Однако это не значит, что нужно бросаться исправлять свои скетчи, нужно просто помнить, что при определенных условиях и синус может выдать значение, типа 5 или 6. Я такое видел, правда на QNX и всего лишь если не добавить #include <math.h>.

А потому сей вопрос считаю очень философским.

OFFTOP: после обеда так приятно ввязаться в дискуссию и чего нибудь насочинять, впрочем здесь я написал чистую правду!

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Эмм.. булевская переменная равная 3 или 5?!?!?!?! А все остальные инициализированные переменные (вроде как есть исключения по null/nil) евляются правдой, т.к. проверяется "есть такая переменная? а если найду?"

nevkon
Offline
Зарегистрирован: 20.01.2015

Я про то что в том случае читается как "не истина равна не истине?" а в моем случае читается как "не истина?"

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

JollyBiber пишет:

Эмм.. булевская переменная равная 3 или 5?!?!?!?! А все остальные инициализированные переменные (вроде как есть исключения по null/nil) евляются правдой, т.к. проверяется "есть такая переменная? а если найду?"


Ты думаешь, что тип boolean занимает один бит? Я тебя умоляю, выпей слабительного и снотворного одновременно, ещё Жванецкий этот рецепт озвучивал.

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

kisoft пишет:
JollyBiber пишет:

Эмм.. булевская переменная равная 3 или 5?!?!?!?! А все остальные инициализированные переменные (вроде как есть исключения по null/nil) евляются правдой, т.к. проверяется "есть такая переменная? а если найду?"

Ты думаешь, что тип boolean занимает один бит? Я тебя умоляю, выпей слабительного и снотворного одновременно, ещё Жванецкий этот рецепт озвучивал.

вот оно! теперь я знаю, каким образом вселенная образовалась из ничего - быдлокодеры!

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

kisoft пишет:
JollyBiber пишет:

Эмм.. булевская переменная равная 3 или 5?!?!?!?! А все остальные инициализированные переменные (вроде как есть исключения по null/nil) евляются правдой, т.к. проверяется "есть такая переменная? а если найду?"

Ты думаешь, что тип boolean занимает один бит? Я тебя умоляю, выпей слабительного и снотворного одновременно, ещё Жванецкий этот рецепт озвучивал.

Я думаю что boolean это переменная которая может (и должна раз такой объявлена) принимать только два значения: true или false (1 и 0 соответственно). А то что Вы в нее суете что попало (руки вымыть не забудьте!) это только Ваши проблемы.

Про то что она занимает в памяти 1 байт я никогда в жизни не знал и видимо не узнаю.

Хорошо что есть на форуме кто за меня думать может!

stboris
Offline
Зарегистрирован: 12.04.2015

Это булевская  false должно принимать одно значение-0, а булевская  true - это любое целочисленное число,отличное от 0.Мне кажется что именно с этим и связана эта непонятка.В сериал мониторе y меня true прыгает,принимая разные целочисленные значения.Кстати почему?

red.kaktus.37
red.kaktus.37 аватар
Offline
Зарегистрирован: 06.07.2015

не забывайте, что в некоторых случаях кроме 1 и 0, можно получить и -1 

nevkon
Offline
Зарегистрирован: 20.01.2015

stboris пишет:

Это булевская  false должно принимать одно значение-0, а булевская  true - это любое целочисленное число,отличное от 0.Мне кажется что именно с этим и связана эта непонятка.В сериал мониторе y меня true прыгает,принимая разные целочисленные значения.Кстати почему?

Значит у вас в коде где-то еще присваивается значение к этой переменной, причем не тру или не тру а с какого-нибудь порта, например аналогового.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Я уверен что ниже написанному Вы тоже не поверите.

Wikipedia: a Boolean data type is a data type with only two possible values: true or false.

MSDN: This keyword is a built-in type. A variable of this type can have values true and false. Conditional expressions have the type bool and so have values of type bool. For example,

Oracle: boolean: The booleandata type has only two possible values: true and falsefalse. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.

У Вас видимо какие-то демократичные булевские переменные, что они любые значения принимать могут. Главное чтобы не курили.

stboris
Offline
Зарегистрирован: 12.04.2015

Да, булевская переменная принимает только два значения false и true.Но только false строго равно 0. А true любое целочисленное значене отличное от 0.Например:-127 тоже будет true

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Если быть демократичным, то true - это все что не ноль и все что может быть сделано.

Например (х=sin(5)) или строка: "Да мне как-то похрену что Вы сами себе в булеан пихаете" - тоже true

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Повторю , мне тоже интересно быть умным :

ноль- это false , а всё остальное - true. Именно всё-всё-всё........

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

trembo пишет:

Повторю , мне тоже интересно быть умным :

ноль- это false , а всё остальное - true. Именно всё-всё-всё........

оно все тру, вот только все что не "1" и не "тру" это уже не булеан.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

А приведение типов не сработает?
Смотрим там "0"  или "что-то". И не важно что . Даже на строку и на лонг....????

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

А зачем приведение? Это уже совсем какие-то костыли получатся. В чем проблема сравнить строку или что-то еще на существование и/или нужные значения?

Если Вы про "автоматическое" привидение, то нет, в иф-е оно не работает.

stboris
Offline
Зарегистрирован: 12.04.2015

"В чем проблема сравнить строку или что-то еще на существование и/или нужные значения"

Вот решение. Спасибо всем принявшим участие в обсуждение.Отдельная благодарность JollyBiber

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Ой! Я не специально! :)

stboris
Offline
Зарегистрирован: 12.04.2015

Еще такой вопрос в можно ли булеан присваивать значения LOW /HIGH.Я понимаю что это уровни напряжения для портв ввода/вывода. Будет ли это эквивалентно 0/1 для переменной булеан или существуют какие-то ограничения ?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

А зачем? Вам нужно экономить память или Вы путаетесь в своих переменных?

 

stboris
Offline
Зарегистрирован: 12.04.2015

Мне удобней использовать LOW и HIGH.Логический 0 и 1.Есть ли какие то ограничения ? И сколько памяти экономится при этом? Это тоже немаловажно

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Найдено в просторах  Arduino.h

#define HIGH 0x1
#define LOW  0x0

stboris
Offline
Зарегистрирован: 12.04.2015

Но и без этого все прекрасно работает.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

У Вас нет ардуино чтобы попробовать?

stboris
Offline
Зарегистрирован: 12.04.2015

Ардуина есть и все работает.То есть как я понял никаких ограничений нет и можно булеан присваивать значения LOW/HIGH.Спасибо

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Это Вы так поняли, я такого не говорил :)

stboris
Offline
Зарегистрирован: 12.04.2015

Ну так Да или Нет?