Запоминание данных с ИК пульта.
- Войдите на сайт для отправки комментариев
Здравствуйте. Не раз поднималась тема по запоминанияю кода, посылаемого пультом от кондиционера для управления, собственно, самим кондиционером. Решил и я побиться над этой задачей. Библиотека 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