如何正确接收和发送原始红外数据从Arduino

How to correctly receive and send raw IR data from Arduino

本文关键字:数据 Arduino 原始 何正确      更新时间:2023-10-16

下面是我从Arduino读取原始IR数据的代码:

#define sprint Serial.print 
#define sprintln Serial.println
#include <IRremote.h>
#define IR_RCVR_PIN 11
IRrecv ir_receiver(IR_RCVR_PIN);
decode_results results;
void setup() {
    Serial.begin(9600);
    ir_receiver.enableIRIn(); // Start the receiver
}
void loop() {
   if (ir_receiver.decode(&results)) {
    dump(&results);
    ir_receiver.resume(); // Receive the next value
   }
}
int c = 1;
void dump(decode_results *results) {
   int count = results->rawlen;
   sprintln(c);
   c++;
   sprintln("For IR Scope: ");
   for (int i = 1; i < count; i++) {
       sprint("0x");
       sprint((unsigned int)results->rawbuf[i], HEX);
    sprint(" ");
   }
   sprintln("");
   sprintln("For Arduino sketch: ");
   sprint("unsigned int raw[");
   sprint(count, DEC);
   sprint("] = {");
   for (int i = 1; i < count; i++) {
       sprint("0x");
       sprint((unsigned int)results->rawbuf[i], HEX);
       sprint(",");
    }
    sprint("};");
    sprintln("");
    sprint("irsend.sendRaw(raw,");
    sprint(count, DEC);
    sprint(",38);");
    sprintln("");
    sprintln("");
}

使用这个我可以从远程控制器得到这个:

1
For IR Scope: 
0x47 0x1F 0xB 0x17 0xA 0x17 0xB 0x6 0xA 0x6 0xB 0x6 0xA 0x17 0xB 0x6 0xA 0x6 0xB 0x17     
0xA 0x17 0xA 0x7 0xA 0x17 0xA 0x7 0xA 0x6 0xB 0x17 0xA 0x17 0xA 0x6 0xB 0x17 0xA 0x17    
0xB 0x6 0xA 0x6 0xB 0x17 0xA 0x6 0xB 0x6 0xA 0x17 0xB 0x6 0xA 0x6 0xB 0x6 0xA 0x7 0xA     
0x6 0xB 0x6 0xA 0x6 0xB 0x6 0xA 0x7 0xA 0x6 0xB 0x6 0xA 0x7 0xA 0x6 0xB 0x6 0xA 0x6 0xB    
0x6 0xA 0x7 0xA 0x6 0xB 0x6 0xA 0x6 0xB 0x17 0xA 0x6 0xB 0x6 0xA 
For Arduino sketch: 
unsigned int raw[100] =       
{0x47,0x1F,0xB,0x17,0xA,0x17,0xB,0x6,0xA,0x6,0xB,0x6,0xA,0x17,
 0xB,0x6,0xA,0x6,0xB,0x17,0xA,0x17,0xA,0x7,0xA,0x17,0xA,0x7,0xA,0x6,
 0xB,0x17,0xA,0x17,0xA,0x6,0xB,0x17,0xA,0x17,0xB,0x6,0xA,0x6,0xB,0x17,0xA,
 0x6,0xB,0x6,0xA,0x17,0xB,0x6,0xA,0x6,0xB,0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,
 0x6,0xB,0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,0x6,0xB,
 0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,0x6,0xB,0x17,0xA,0x6,0xB,0x6,0xA,};

发送数据时,我可以使用下面的指令:

irsend.sendRaw(raw,100,38);

问题是我无法从我需要控制的设备得到任何响应。我已经检查了我的红外发射器,我的读数和上面一样。

我错过了什么吗?

您应该对信号进行多次读取,然后取其平均值以消除小偏差。确保你的发射器和接收器使用相同的光波长,并在38KHz工作(你在38KHz传输调制)。如果你的发射器为你调制,那么你不应该使用IRremote。

还有,你希望得到什么样的"回应"?通常情况下,红外通信是单向的。

您已经达到了RAWBUF的100字节限制,因此您可能需要增加这个数字。试着调到400

在IRemote.h中打开并修改这一行(大约#122)

#define RAWBUF 100 // Length of raw duration buffer

变成更大的

#define RAWBUF 400 // Length of raw duration buffer

我把你的代码和三星空调绑在一起,我收到了116字节

我刚刚开始玩Arduino,并试图通过做你所做的事情来复制我的宾得遥控器的代码,但它不起作用。然后我找到了这篇文章:http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html。在发送和接收的原始缓冲区之间有两个不同之处。发送缓冲区值以微秒为单位,而接收缓冲区值以50微秒为单位。"

所以你所需要做的就是将原始数组中的每个元素乘以50,并将这些值发送到irsend.sendRaw(raw,100,38)