Читаем коды IR - пультов в попугаях

Нет ответов
oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

 

немного переделал. 

[code]
//IDE 1.6.6
//v.0.1.4

/* Данный скетч предназначен для управления Ардуиной практически любым пультом ИК.
Принцип его работы заключается в том, что он сравнивает сигналы  команд ir_ДУ с опорным 
кодом в динамическом режиме, при нажатии различных кнопок на пульте получаем разные коды на выходе.
*/

uint16_t code;
const byte pin_IR = 9;        //ногa от приемника IR   

void setup() {                
  
         pinMode(pin_IR, INPUT);                 
         Serial.begin(9600); 
}

void loop(){
        ir_pult();
        if(code != 0){Serial.print("Code   "); Serial.println(code);  delay(1000);}              
} 
/////////////////////////////////////////////////////////////////////////////////
 void ir_pult(){ 
  code = 0;
      if (digitalRead(pin_IR) != 0)    {return;} //Если нет сигнала  выходим
 #define max_bits 32                             //сколько бит будем слушать. Разные ДУ выдают разное количество бит
 uint32_t starttime = 0;      
 uint32_t time_r = 0;
      starttime = micros();  
      while (digitalRead(pin_IR) == 0){          //сигнал есть ..ждем пока он не прекратися.
      if(micros() - starttime > 100000){return;}}//время ожидания истекло выходим (100 ms)
      time_r = micros() - starttime;             //Высчитываем время. 
      if (time_r < 1000)               {return;} //это скорее шум, а не стартовый бит выходим.
//......................................................................................
 uint16_t n_bit = 0;                             //текущий бит
 while (n_bit < max_bits - 1){                   //В цикле слушаем бит за битом.      
         starttime = micros();
    if (digitalRead(pin_IR) == 0){              //Если сигнал есть  
        while (digitalRead(pin_IR) == 0);
        time_r = micros() - starttime;          //...высчитываем его время.      
   n_bit =  dinamik_kod(n_bit, time_r);}
                                 
       while (digitalRead(pin_IR) == 1);       //пока ждем появления сигнала проверим, не остановка ли это передачи...
       time_r = micros() - starttime;         
    if (time_r > 10000){while (n_bit < max_bits - 1 ){n_bit++;}}  //...ага, остановка.      
     else{n_bit = dinamik_kod(n_bit, time_r);}                                                                               
       }                                   //END В цикле слушаем бит за битом.             
 }
//..................................................................................................
  uint16_t dinamik_kod( uint16_t n_bit, uint32_t time_r){           //в динамическом режиме генерим код
        if(time_r > 700){   
     n_bit++;      
       if (abs(time_r/64 - (n_bit + 7)) > 10 && n_bit < max_bits){  
       code += (n_bit+1)*(n_bit+2); }}                             //генерируем код
  return n_bit;
  }
////////////////////////////////////////////////////////////////////////////////     
   
[/code]