ИК приемник

Robinson
Offline
Зарегистрирован: 26.09.2013

Имеется: 3 датчика температуры, экран, ик приемник.

Задача: включать/выключать подсветку экрана по кнопке на пульте

код примерно такой:

...
int pause = 500;
bool ledon;
...
void setup()
{ 
...
lcd.backlight();  
...
}


void loop()
{
if (pause==500) {
...
обновляем температуру с 3-ех датчиков на экране
...
pause=1;
} else
pause=pause+1;
  
  //получаем команду с ик пульта
   if (irrecv.decode(&results)) {
     Serial.println(results.value);
   if(results.value==16753245) 
   {
     ledon=!ledon;
     if (ledon==1) lcd.backlight(); else
     lcd.noBacklight();
     
   }
    irrecv.resume();
    
  }
  
delay(10);

} 

Все работает почти как надо

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

Как это граммотно реализовать?

Пока только 2 варианта в голове:
1) увеличить период обновления с 5сек до...

2) опрашивать 3 датчика отдельно, подвисать должно меньше.

Буду рад выслушать ваши варианты.

Спасибо

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

прерывания для этого есть. надо смотреть как с ними библиотеки работают.

тоесть в момен изменения уровня на ик приемнике ардуина должна начать его обрабатывать - получить полностью весь код или ожидать его получения в цикле и выйти из него по таймауту.

victoruni
Offline
Зарегистрирован: 25.06.2012
Примерно так - (у меня работает)
 
// подключение библиотеки
#include <IRremote.h> 
//вход ИК приемника
int RECV_PIN = 2;  
IRrecv irrecv(RECV_PIN); 
decode_results results; 
long ir_kod;


void setup() 
 { 
  // включить приемник 
  irrecv.enableIRIn(); 
  // прерывания для ИК
  ir_time1=0;ir_time2=0;
  attachInterrupt(0, get_ir_kod, FALLING); 
 } 
  
void loop() 
 { 
 //обновляем температуру с 3-ех датчиков на экране
.................................
 // обработка кода нажатия
 if(ir_kod>0)
   {
   Serial.println(ir_kod);
   ir_go(ir_kod);  
   ir_kod=0;  
   } 
      
 }
// получить код переданный с ИК пульта
void get_ir_kod()
 {
 detachInterrupt(0);    // отключить прерывание 0
 // получаем с ИК
  { 
  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

  attachInterrupt(0, get_ir_kod, CHANGE); 
 }

 

duss1981
Offline
Зарегистрирован: 03.10.2013

Вопросик немного не потеме, нашел примеры работы с IR приемником, после приема посылки вывод в serial port. ЕСли подключить ардино Uno к  компу через терминал увижу ли я данные?

Looka
Offline
Зарегистрирован: 24.04.2012

duss1981 пишет:

Вопросик немного не потеме, нашел примеры работы с IR приемником, после приема посылки вывод в serial port. ЕСли подключить ардино Uno к  компу через терминал увижу ли я данные?

 

Если данные в ком порт отправляются конечно увидите.