Прием и передача ик сигнала (библиотекой IRremote)

balash64
Offline
Зарегистрирован: 02.05.2015

Необходимо с помощью одного пульта управлять другими устройствами с помощью ИК сигнала. Написал программку, но она почему то один раз выполняет одну команду и все. После не каких действий не производит. Подскажите в чем ошибся?

#include <IRremote.h>

IRsend irsend;
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  
}
unsigned int menu[68]={9892, 8850, 4450, 550, 600, 500, 600, 500, 600, 500, 650, 450, 650, 500, 600, 500, 1700, 500, 650, 450, 1700, 550, 1700, 500, 1750, 500, 1700, 500, 1700, 500, 1700, 550, 600, 500, 1700, 500, 1700, 550, 600, 500, 1700, 500, 1700, 500, 650, 500, 600, 500, 1700, 500, 650, 450, 650, 500, 1700, 500, 600, 500, 600, 500, 1750, 500, 1700, 500, 600, 500, 1750, 500};
unsigned int up[68]={18450, 8900, 4450, 500, 650, 500, 600, 500, 600, 500, 600, 500, 600, 500, 650, 500, 1700, 500, 600, 500, 1750, 500, 1700, 500, 1750, 450, 1750, 500, 1700, 500, 1750, 450, 650, 500, 1700, 500, 1750, 450, 1750, 500, 600, 550, 1700, 450, 650, 500, 600, 500, 600, 500, 600, 500, 650, 450, 650, 500, 1700, 500, 600, 500, 1750, 500, 1700, 500, 1700, 500, 1750, 500};
unsigned int down[68]={10370, 8900, 4450, 500, 650, 500, 600, 500, 600, 500, 600, 550, 550, 500, 650, 500, 1700, 500, 600, 500, 1750, 450, 1750, 500, 1700, 500, 1750, 500, 1700, 500, 1700, 500, 650, 500, 1700, 500, 600, 550, 600, 450, 1750, 500, 1700, 500, 600, 500, 650, 450, 1750, 500, 600, 500, 1700, 500, 1750, 500, 600, 500, 600, 500, 1750, 500, 1700, 500, 600, 500, 1700, 500};
unsigned int exi[68]={10328, 8900, 4450, 500, 600, 500, 650, 500, 550, 550, 600, 500, 600, 500, 600, 500, 1700, 550, 600, 500, 1700, 500, 1700, 550, 1700, 500, 1700, 500, 1700, 550, 1700, 500, 600, 500, 1700, 550, 600, 500, 1700, 500, 650, 500, 1700, 500, 600, 500, 600, 500, 650, 500, 550, 550, 1700, 500, 600, 500, 1700, 550, 600, 500, 1700, 500, 1700, 550, 1700, 500, 1750, 450};
//unsigned int prog_up[68]={};
//unsigned int prog_down[68]={};


//void(* resetFunc) (void) = 0;
void loop() {
if (irrecv.decode(&results)) {
//delay(300);
if (results.value == 0xDE8D48A3){irsend.sendRaw(menu,68,38);} 
if (results.value == 0x20DF02FD){irsend.sendRaw(up,68,38);} 
if (results.value == 0x20DF827D){irsend.sendRaw(down,68,38);} 
if (results.value == 0x3D90959F){irsend.sendRaw(exi,68,38);} 

if (results.value == 0x4FBB847){irsend.sendRaw(menu,68,38);} 
if (results.value == 0x4FBC23D){irsend.sendRaw(up,68,38);} 
if (results.value == 0x4FBA25D){irsend.sendRaw(down,68,38);} 
if (results.value == 0xE7ED801F){irsend.sendRaw(exi,68,38);} 

{
delay(100);
}
//resetFunc();

irrecv.resume();
}
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Попробуйте перед (или после) irrecv.resume(); сделать irrecv.enableIRIn();

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В принципе достаточно irrecv.enableIRIn(), потому что он внутри делает в том числе то же, что и resume, однако это не очень хорошо.

В целом, могу предложить почти всегда использовать следующий вариант:

  if (irrecv.decode(&results)) {
    unsigned long l_code = results.value;
    irrecv.resume();
    switch(l_code)
    {
      ...
    }
  }

ну и, как уже сказал maksim, после вывода IR кода нужно всегда переключаться на прием, т.е. выполнять в конце цикла enableIRIn(), поскольку выдача IR кода отключает режим приема.

 

balash64
Offline
Зарегистрирован: 02.05.2015

Спасибо за подсказку. Вставил irrecv.enableIRIn(); после irrecv.resume(); т.к. если поставить до, сигнал считывается не с первого раза.

kisoft

А можно по подробнее, на примере моей программы предоставить,

 

 

if (irrecv.decode(&results)) {
  unsigned long l_code = results.value;
  irrecv.resume();
  switch(l_code)
  {
    ...


а то я не особо понял куда что вставлять

 

balash64
Offline
Зарегистрирован: 02.05.2015

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

При нажатии одной и той же кнопки:

Unknown encoding: 9BDB47E3 (32 bits)
Raw (68): 3844 8750 -4550 450 -650 450 -650 450 -650 450 -700 400 -650 450 -1850 400 -650 400 -700 450 -1800 400 -1750 450 -1750 500 -1700 450 -1750 500 -650 450 -1800 400 -1750 500 -1800 400 -650 450 -1750 450 -1750 450 -1750 450 -700 400 -700 450 -650 450 -650 450 -1750 450 -700 400 -700 400 -650 450 -1800 450 -1750 450 -1750 450
56606B9
Unknown encoding: 56606B9 (32 bits)
Raw (68): 8092 8750 -4500 450 -750 400 -650 450 -700 400 -650 450 -650 450 -1800 400 -650 500 -650 400 -1800 450 -1750 450 -1750 450 -1750 500 -1700 500 -700 350 -1750 500 -1750 450 -1800 400 -650 500 -1800 400 -1750 450 -1750 450 -650 450 -650 500 -650 450 -700 400 -1750 450 -650 450 -650 450 -650 450 -1750 450 -1850 400 -1750 450
E2334DF0
Unknown encoding: E2334DF0 (32 bits)
Raw (68): -9196 8800 -4550 400 -700 400 -700 400 -700 450 -650 400 -700 450 -1750 450 -700 400 -650 500 -1700 450 -1800 450 -1750 450 -1750 450 -1800 400 -650 450 -1800 450 -1700 500 -1800 450 -650 400 -1800 450 -1750 450 -1750 450 -700 400 -750 350 -650 450 -700 400 -1800 450 -650 450 -650 450 -600 500 -1750 500 -1750 400 -1800 450
6DAC90CB
Unknown encoding: 6DAC90CB (32 bits)
Raw (68): 23598 8800 -4550 400 -700 450 -650 450 -750 350 -600 550 -650 400 -1750 450 -700 450 -650 450 -1750 500 -1650 550 -1750 400 -1800 450 -1750 450 -650 500 -1700 450 -1800 400 -1800 450 -650 450 -1800 400 -1700 550 -1750 400 -700 450 -650 450 -650 450 -650 450 -1800 400 -700 400 -700 400 -700 400 -1800 450 -1750 450 -1750 450
43F8861D
Unknown encoding: 43F8861D (32 bits)
Raw (64): -28366 8750 -4550 50 -100 150 -2050 300 -900 100 -1000 200 -750 350 -2050 150 -850 200 -1050 100 -2050 150 -2050 200 -4250 100 -2050 200 -850 250 -2000 200 -2050 200 -1950 250 -950 50 -2100 150 -2000 300 -2050 150 -850 150 -1000 100 -1050 150 -3000 300 -750 400 -800 250 -900 200 -2100 100 -2050 200 -1950 250

 

Как правильно считать коды?

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

С большой долей вероятности, частоты передатчика и приемника различны. Потому коды разные. Плюс ещё показателем разных частот может являться малое расстояние срабатывания, т.е. чем они дальше друг от друга, тем меньше срабатываний.

balash64
Offline
Зарегистрирован: 02.05.2015

То есть, правильно считать код невозможно?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если частоты совпадают, то можно. Попробуйте пульты разных брендов и увидите разницу.

balash64
Offline
Зарегистрирован: 02.05.2015

На устройстве, с пульта которого я пытаюсь считать  ir код, стоит такой же ir приемник, что и у меня на ардуино. Но при считывании все равно каждый раз разные коды выходят.  Может дело в чем то другом?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Схема подключения с номиналами?

Пульт какого бренда?

Я пока не встречался с ситуацией, когда всё корректно подключено, а код считывается нестабильно. Обычно это передатчик и приёмник с разными частотами.

Ещё, пальцем в небо, для передатчика указана не корректная частота в скетче.

 

 

balash64
Offline
Зарегистрирован: 02.05.2015

Я приемник на прямую в 5v. подключаю.

А где частоту для приемника  указывать?

Вот  скетч из стандартной библиотеке, я им и считываю:

 

 


#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  } 
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  } 
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  } 
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  } 
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) { 
    Serial.print("Decoded PANASONIC - Address: ");
    Serial.print(results->panasonicAddress,HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == JVC) {
     Serial.print("Decoded JVC: ");
  }
  Serial.print(results->value, HEX);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}


void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}

 

nikolaj.sosedov
Offline
Зарегистрирован: 02.11.2014

Использую библиотеко IRremode для робота

Скачал скетч:

#include <IRemote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}
 
void loop()
{
  if (irrecv.decode(&results))
    {
     Serial.println(results.value, HEX);
     irrecv.resume(); // Receive the next value
    }

Стал компилировать, выдаёт ошбку:

sketch_may10b.ino:1:21: fatal error: IRemote.h: No such file or directory
compilation terminated.
Ошибка компиляции.
 
Подскажите что делать.
 
maksim
Offline
Зарегистрирован: 12.02.2012

balash64 пишет:

А где частоту для приемника  указывать?

Нигде и никак. 

nikolaj.sosedov пишет:

Подскажите что делать.

Во-первых, читать здесь, а во-вторых правильно импортировать библиотеку.

 

balash64
Offline
Зарегистрирован: 02.05.2015

Проблему с разными кодами я решил, добавил к приемнику конденсатор и сопротивление. Пробовал разные пульты, при повторном нажатие на кнопки, коды всегда одинаковые.

Считываю стандартным скетчем IRrecvDump.

Но появилась другая проблема при считывании кода с пульта кондиционера. Там  значение Raw больше 100. Изменил  в IRremote.h   значение #define RAWBUF 100  на 255. Но все равно он почти всегда выдает значение Raw (100). При этом кондей не реагирует.  Каким то не понятным мне способом, при считывании ir кода тем же скетчем, он мне выдал значение Raw (200). При таком раскладе кондей стал включаться. НО это было один раз и больше IR  более Raw (100) не выдает.

Подскажите может есть какие то хитрости при считывании, когда Raw должно быть больше 100?

Arseniy_16
Offline
Зарегистрирован: 11.09.2015

Подскажите пожалуйста, я вводил вот этот код:

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

Мне выдаёт ошибку

C:\Program Files\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5: error: 'TKD2' was not declared in this scope

Не понимаю в чём проблема ,

Заранее спасибо.)))

eberle
Offline
Зарегистрирован: 28.02.2018

Доброго времени задача такая с блютус модуля приходит сигнал в виде цифры далее с ардуины отправляется код кнопки пульта

во пример скетча но проблема в том что код отправляется не 1 раз в цикле а пока висит команда с блютус как это исправить?? новичёк в програмировании так что не кидайте тапками )))

#include <IRremote.h> // это скачанная библиотека
int index; // Данные пришедшие по Bluetooth от Android телефона.
// Пин 3 выход ИК передатчика
IRsend irsend;
void setup() {
Serial.begin(9600); //скорость (9600).
irsend.enableIROut(38); // частота передачи обычно 38 кГц
} 

void loop()
{
while (Serial.available() == 0);
int index = Serial.read() - '0';
if (index == 1) irsend.sendRC6(0x1000C, 20);//кнопка питания
if (index == 2) irsend.sendRC6(0x10010, 20);//громкость плюс
if (index == 3) irsend.sendRC6(0x10011, 20);//громкость минус
if (index == 4) irsend.sendRC6(0x1000D, 20);///без звука
if (index == 5) irsend.sendRC6(0x10020, 20);//канал вверх
if (index == 6) irsend.sendRC6(0x10021, 20);//канал вниз
if (index == 7) irsend.sendRC6(0x1009F, 20);// телевизор
if (index == 8) irsend.sendRC6(0x100BE, 20);//смарт
if (index == 9) irsend.sendRC6(0x1000A, 20);//назад
}

заранее спасибо))