Однократный импульс при выполнении условия.

sp34
Offline
Зарегистрирован: 05.03.2013

Подскажите , как прописать задачу.

Есть три переменные и цифровой выход LOW на котором должен пройти однократно короткий импульс (500) HIGH при соблюдения условия !

      if(digitalRead(15)==LOW&&on_off==0&&tempS2>27.01&&tempS2<100.00) 
      
      {             
        digitalWrite(2,HIGH);
        on_off=1;
        delay(500);
       }
maksim
Offline
Зарегистрирован: 12.02.2012

Вставка программного кода в тему/комментарий

Совершенно не понятно чего вы хотите... 

так?

if(digitalRead(15)==LOW&&on_off==0&&tempS2>27.01&&tempS2<100.00) 
{             
  digitalWrite(2,HIGH);
  on_off=1;
  delay(500);
  digitalWrite(2,LOW);
}

 

sp34
Offline
Зарегистрирован: 05.03.2013

Нет!!!  ну до этого я бы догодался - ну вобщемто все должно происходить как написано у вас , но оно должно выполниться однократно и игнорировать далее данное условие .

при коде выше светодиод на выходе просто мигает при выполнении условия с частотой delay(500)

а он должен загореться и погаснуть и больше не включаться.

maksim
Offline
Зарегистрирован: 12.02.2012

То что находится в фигурных скобках будет выполнено только один раз.

А знаете почему у вас мигает?
Потому что код нужно показывать весь, а не кусочки...
Скорее всего переменная on_off объявлена внутри функции loop().

maksim
Offline
Зарегистрирован: 12.02.2012

Так что либо вынесите за пределы функции loop() переменную on_off или обьявите ее так:

void loop() 
{
  static bool on_off;
  .......
  ........
  if(digitalRead(15)==LOW && on_off==0 && tempS2>27.01 && tempS2<100.00) 
  {             
    digitalWrite(2,HIGH);
    on_off=1;
    delay(500);
    digitalWrite(2,LOW);
  }
}

 

sp34
Offline
Зарегистрирован: 05.03.2013

 

Весь код очень большой 1200 строк , переменная была вынесена за пределы и стояла в самом начале кода , попробовал прописать ее в функции Loop как   static boolean on_off_AC , но результат тотже.
Вот ниже весь сектор где используется переменная - больше нигде ее нет.
 
// - on_off A/C
      if(digitalRead(15)==LOW&&on_off_AC==0&&tempS2>27.01&&tempS2<100.00)
 
      {             
        digitalWrite(2,HIGH);
        on_off_AC=1;//присваиваем 1 переменной on_off_AC
        delay(500);
        digitalWrite(2,LOW);
 
      }
          
       if(digitalRead(15)==HIGH&&on_off_AC==1&&tempS2>-50.00&&tempS2<27.00)
 
      {
         digitalWrite(2,HIGH);    
         on_off_AC=0;
         delay(500);
         digitalWrite(2,LOW);
 
      }
      if(digitalRead(15)==LOW&&on_off_AC==1)
      {
         digitalWrite(2,LOW);    
         on_off_AC=0;//присваиваем 0 переменной on_off_AC
      }
maksim
Offline
Зарегистрирован: 12.02.2012

Так не пойдет. У вас не выполняется условие только один раз, потому что переменная on_off_AC изменяется в коде ниже при совершенно неизвестных никому кроме вас условиях. К сожалению, экстрасенсы только на ТНТ.

И еще раз повторю вот эту ссылку Вставка программного кода в тему/комментарий.

И естественно, в 1200 строках врядли кто-то будет разбираться. Так что попробуйте как-то локализовать данный кусок кода и разобраться почему он работает не так как вы этого хотите... если не разберетесь, то выкладываите и описывайте что хотите от кода, а лучше пишите подробные комментарии к коду.

sp34
Offline
Зарегистрирован: 05.03.2013

Хорошо спасибо !!!  попробую.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Элементарная задача для шестого класса. 

Используцте переменную "флаг".  В условии , по мимо прочего, интересуетесь равен ли флаг 0. Если равен , выполняете действия и присваиваете флагу 1. Если флаг нигде не обнуляется то данное действие больше не произойдет.

sp34
Offline
Зарегистрирован: 05.03.2013

Спасибо помогло "flag" , я просто новичек в С++ и не то что в шестом класс , а наверное только в первом - но все туда же.

maksim
Offline
Зарегистрирован: 12.02.2012

В сообщении #1 этим flag'ом была переменная on_off.

Snubist
Offline
Зарегистрирован: 18.02.2013

судя по листингу

if(digitalRead(15)==LOW&&on_off_AC==0&&tempS2>27.01&&tempS2<100.00)
 
      {             
        digitalWrite(2,HIGH);
        on_off_AC=1;//присваиваем 1 переменной on_off_AC
        delay(500);
        digitalWrite(2,LOW);
 
      }
          
       if(digitalRead(15)==HIGH&&on_off_AC==1&&tempS2>-50.00&&tempS2<27.00)
 
      {
         digitalWrite(2,HIGH);    
         on_off_AC=0;
         delay(500);
         digitalWrite(2,LOW);
 
      }
      if(digitalRead(15)==LOW&&on_off_AC==1)
      {
         digitalWrite(2,LOW);    
         on_off_AC=0;//присваиваем 0 переменной on_off_AC
      }

При выполнении первого условия вы ставите флаг on_off_AC=1, 

Так что когда начинает проверятся третий if, флаг уже установлен, и вы его опять сбрасываете on_off_AC=0

И так по кругу. Вот мерцание и идет.

sp34
Offline
Зарегистрирован: 05.03.2013

Точно вы правы , так и есть и когда я ввел еще одну переменную "flag" и не прописал его в третьем условии   все встало на свои места. - но третье условие мне необходимо в том виде как есть поэтому дополнительное условие и есть решение моей проблемы.

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