Читаем коды IR - пультов в попугаях
- Войдите на сайт для отправки комментариев
Чт, 18/04/2019 - 08:33
немного переделал.
[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]