1

以下是我从 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);

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

我错过了什么吗?

4

3 回答 3

1

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

另外,您对“响应”有何期望?通常,IR 通信是单向的。

于 2014-03-31T12:01:46.207 回答
1

您已达到 RAWBUF 的 100 字节限制,因此您可能需要增加该数字。尝试上到 400。

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

#define RAWBUF 100 // Length of raw duration buffer

对更大的东西

#define RAWBUF 400 // Length of raw duration buffer

我正在用三星空调绑定你的代码,我收到 116 个字节

于 2014-11-16T18:04:01.347 回答
0

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

因此,您需要做的就是将原始数组中的每个元素乘以 50,然后将这些值发送到irsend.sendRaw(raw,100,38). 为我工作。

于 2021-03-07T19:38:33.113 回答