выполнить irsend один раз

vetal_dom
Offline
Зарегистрирован: 10.07.2014

Добрый день! Пишу программу для климат контроля... Использую для управления кондиционера IR, соответственно библиотека irremote.

Сам сигнал записал, кондиционер благополучно отвечает... но при отправке сигнала моим способом сигнал шлется постоянно, пока не исполниться другое условие (Будто я зажал кнопку включения на кондиционере и он постоянно шлет сигнал).  Как сделать так, чтоб сигнал (пакет) отправился только один раз? Ну или два на случай если первый не дойдет?

Код


   if(t1 >= 28 || t2 >=28 )
  {
   
    lcd.setCursor(7, 0);
    lcd.print ("ON");
    irsend.sendRaw(ConditionerOn, 295, 38);

  } 
  
 else 
  {

    lcd.setCursor(7, 0);
    lcd.print ("OF");
    irsend.sendRaw(ConditionerOff, 295, 38);
    
 
  }
  
}

 

std
Offline
Зарегистрирован: 05.01.2012

Ну народ, почитайте хоть статью какую по C, не?

boolean bSentOn,bSentOff;

if(t1>=28 || t2>=28){
  if(!bSentOn){
    lcd.setCursor(7, 0);
    lcd.print ("ON");
    irsend.sendRaw(ConditionerOn, 295, 38);
    bSentOn=true;
    bSentOff=false;
  }
}else{
  if(!bSentOff){
    lcd.setCursor(7, 0);
    lcd.print ("OF");
    irsend.sendRaw(ConditionerOff, 295, 38);
    bSentOn=false;
    bSentOff=true;
  }
}

 

vetal_dom
Offline
Зарегистрирован: 10.07.2014

std пишет:

Ну народ, почитайте хоть статью какую по C, не?

boolean bSentOn,bSentOff;

if(t1>=28 || t2>=28){
  if(!bSentOn){
    lcd.setCursor(7, 0);
    lcd.print ("ON");
    irsend.sendRaw(ConditionerOn, 295, 38);
    bSentOn=true;
    bSentOff=false;
  }
}else{
  if(!bSentOff){
    lcd.setCursor(7, 0);
    lcd.print ("OF");
    irsend.sendRaw(ConditionerOff, 295, 38);
    bSentOn=false;
    bSentOff=true;
  }
}

 

Данный способ не меняет ничего! Поставил вместо IR обычный, так он мигает постоянно с паузой в одну секунду! (

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

Надо просто 2 плюса между собой замкнуть после подачи сигнала. Ардуино успешно сгорит и ничего посылать больше не будет.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

vetal_dom пишет:

Данный способ не меняет ничего! Поставил вместо IR обычный, так он мигает постоянно с паузой в одну секунду! (

Навтыкайте в код отладочных принтов и будете видеть: когда какая часть кода исполняется, тогда будет видно - почему оно у Вас не работает...

Например, внутри цикла if можно выводить состояние переменных bSentOn и bSentOff, хотя я бы попытался проанализировать код возврата функции irsend.sendRaw(), как более отвечающий за достоверность...

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

угу. а тупо присвоить переменной 1 после передачи и по ней проверять мама не разрешает?

vetal_dom
Offline
Зарегистрирован: 10.07.2014

JollyBiber пишет:

угу. а тупо присвоить переменной 1 после передачи и по ней проверять мама не разрешает?

Спасибо кэп! Религия не позволяет!

 

vetal_dom
Offline
Зарегистрирован: 10.07.2014

Код вместе с отладкой. По завершению i=4   3.   irsend отправил как минимум два пакета.

 

void loop();
 

 if(t1>=28 || t2>=28)
 {  
    lcd.setCursor(7, 2);
    lcd.print ("l=");
    lcd.setCursor(9, 2);
    lcd.print (l);
    
    
    for(;l<=3; l++)
    {
    lcd.setCursor(11, 0);
    lcd.print ("ON ");
    irsend.sendRaw(ConditionerOn, 295, 38);
    i=1;
    }
     lcd.setCursor(11, 2);
     lcd.print (l);
   
}

else

{
   lcd.setCursor(7, 1);
   lcd.print ("i=");
   lcd.setCursor(9, 1);
   lcd.print (i);
   l=1;
   for (;i<=3; i++)
   {
   lcd.setCursor(7, 0);
   lcd.print ("air:");
   lcd.setCursor(11, 0);
   lcd.print ("OFF");
   irsend.sendRaw(ConditionerOff, 295, 38);
   lcd.setCursor(11, 1);
   lcd.print (i);
   }
}
}