Запоминание данных с ИК пульта.

Нет ответов
uscr
Offline
Зарегистрирован: 17.08.2012

Здравствуйте. Не раз поднималась тема по запоминанияю кода, посылаемого пультом от кондиционера для управления, собственно, самим кондиционером. Решил и я побиться над этой задачей. Библиотека IRemote, как и ожидалось, не дала результата. Но встал фундаментальный вопрос: достаточно ли просто "запомнить" последовательность импульсов инфракрасного диода или всё это гораздо сложнее?

Для проверки был написан такой вот скетч:

#define Rsvr 3
#define btn1 5
#define btn2 4
#define led 6
#define IRled 7

#define membytes 100

byte interrupt=0;

volatile byte data[membytes+1];
volatile unsigned long data_delay[membytes];
volatile unsigned long last_data;
volatile int datacount=0;

void setup() {
  pinMode(Rsvr, INPUT);
  pinMode(btn1, INPUT);
  pinMode(btn2, INPUT);
  pinMode(led, INPUT);
  pinMode(IRled, INPUT);
  cleanData();
  Serial.begin(9600);
}



void loop() {
  if (digitalRead(btn1) == HIGH) {
    delay(300);
    if (!interrupt) {
     cleanData();
     digitalWrite(led, HIGH);
     interrupt=1;
     attachInterrupt(1, recRaw, CHANGE);
    } else {
     interrupt=0;
     digitalWrite(led, LOW);
     detachInterrupt(1);
     data_delay[0]=0;
    }
  }
  if (digitalRead(btn2) == HIGH) {
    delay(500);
    digitalWrite(led, HIGH);
    for (int i=1; i<=datacount; i++) {
      digitalWrite(IRled, data[i]);
      delayMicroseconds(data_delay[i]);
    }
    digitalWrite(led, LOW);
  }
}

void cleanData() {
  for (int i=0; i<=membytes; i++) {
    data[i]=0;
    data_delay[i]=0;
  }
  data[membytes+1]=0;
  datacount=1;
  last_data=0;
}

void recRaw() {
  if (datacount==membytes) { return; }
  data[datacount]=!digitalRead(Rsvr);
  data_delay[datacount-1]=micros()-last_data;
  last_data=micros();
  datacount++;
  
}

 

Но:

1) При выводе в сериал монитор записанных данных вижу всегда разные значения задержек (критически разные - отличаются на порядок)

2) На собранной мной схеме не заработал так-же скетч из примеров к библиотеке (который запоминает код и выдаёт его по кнопке), когда проверял его на пульте от телевизора, хотя раньше он отлично запоминал коды телевизионного пульта.

 

Использую такой приёмник TSOP4838

И инфракрасный диод TSAL7400