Читаем коды 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]