如何增加 IR 接收器中的帧缓冲区大小?

How do I increase the frame buffer size in an IR receiver?

我有一个空调遥控器需要克隆。 当我按下遥控器时,带有红外接收器的 MEGA2650 变得疯狂,到处都是十六进制代码行。

遥控器有点异国情调。我们确信这是因为远程也在发送数据包 wide/big。

如何调整 IR 接收器帧缓冲区大小?

代码:

#define sprint Serial.print 
#define sprintln Serial.println
#include <IRremote.h>
#define IR_RCVR_PIN 7

IRrecv ir_receiver(IR_RCVR_PIN);
decode_results results;
    
void setup() {
  Serial.begin(115200);
  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("");
}

狂野输出:

0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xA 0xC 0xB 0xB 0xA 0xC 0xB 0xB 0x21 0xB 0x21 0xB 0x22 0xB 0xB 0xB 0xA 0xC 0xB 0xB 0xB 0xB 0xA 0xC 0xA 0xC 0xB 0xA 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x22 0xA 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xA 0xC 0xA 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0x22 0xA 0x22 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB

对于 Arduino 草图:

unsigned int raw[201] = {0xB2,0x59,0xB,0x21,0xB,0x22,0xB,0xA,0xC,0xA,0xB,0xC,0xA,0xB,0xB,0x22,0xB,0x21,0xB,0x22,0xB,0x21,0xB,0x21,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xA,0xC,0xB,0xB,0xA,0xC,0xB,0xB,0x21,0xB,0x21,0xB,0x22,0xB,0xB,0xB,0xA,0xC,0xB,0xB,0xB,0xB,0xA,0xC,0xA,0xC,0xB,0xA,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x22,0xA,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xA,0xC,0xA,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0x22,0xA,0x22,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0xB,};
    irsend.sendRaw(raw,201,38);
    
    68

对于红外范围:

0xB2 0x59 0xB 0x21 0xB 0x22 0xB 0xA 0xC 0xA 0xB 0xC 0xA 0xB 0xB 0x22 0xB 0x21 0xB 0x22 0xB 0x21 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xA 0xC 0xB 0xB 0xA 0xC 0xB 0xB 0x21 0xB 0x21 0xB 0x22 0xB 0xB 0xB 0xA 0xC 0xB 0xB 0xB 0xB 0xA 0xC 0xA 0xC 0xB 0xA 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x22 0xA 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xA 0xC 0xA 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0x22 0xA 0x22 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB

对于 Arduino 草图:

unsigned int raw[201] = {0xB2,0x59,0xB,0x21,0xB,0x22,0xB,0xA,0xC,0xA,0xB,0xC,0xA,0xB,0xB,0x22,0xB,0x21,0xB,0x22,0xB,0x21,0xB,0x21,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xA,0xC,0xB,0xB,0xA,0xC,0xB,0xB,0x21,0xB,0x21,0xB,0x22,0xB,0xB,0xB,0xA,0xC,0xB,0xB,0xB,0xB,0xA,0xC,0xA,0xC,0xB,0xA,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x22,0xA,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xA,0xC,0xA,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0x22,0xA,0x22,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0xB,0x21,0xB,0xB,0xB,0xB,};
    irsend.sendRaw(raw,201,38);
    
    69

对于红外范围:

0xB2 0x59 0xB 0x21 0xB 0x22 0xB 0xA 0xC 0xA 0xB 0xC 0xA 0xB 0xB 0x22 0xB 0x21 0xB 0x22 0xB 0x21 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xA 0xC 0xB 0xB 0xA 0xC 0xB 0xB 0x21 0xB 0x21 0xB 0x22 0xB 0xB 0xB 0xA 0xC 0xB 0xB 0xB 0xB 0xA 0xC 0xA 0xC 0xB 0xA 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x22 0xA 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xA 0xC 0xA 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0x22 0xA 0x22 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0xB 0x21 0xB 0xB 0xB 0xB

对于 Arduino 草图:

unsigned int raw[201] = {0xB2,0x59,0xB,0x21,0xB,0x22,0xB,0xA,0xC,0xA,0xB,0xC,0xA,0xB,0xB,0x22,0xB,0x21,0xB,0x22,0xB,0x21,0xB

I have a remote control from an air conditioner I need to clone

来自 IRremote Arduino 库的文档

Handling Unknown Protocols

This library was never designed to handle long codes like the ones used by air conditioners.

See Recording long Infrared Remote control signals with Arduino. The main reason is, that it was designed to fit inside MCUs with relatively low levels of resources and was intended to work as a library together with other applications which also require some resources of the MCU to operate.

Hints

For long codes with more than 48 bits like from air conditioners, you can change the length of the input buffer in IRremote.h.

https://github.com/Arduino-IRremote/Arduino-IRremote/blob/c0f75685de63d211bad780816b691655df45d7e1/src/IRremote.h#L36

#define RAW_BUFFER_LENGTH  101  ///< Maximum length of raw duration buffer. Must be odd. Supports 48 bit codings.

请阅读手册!

对我们来说,与众不同的是

在 Arduino\libraries\IRremote\src\IRremoteInt.h 第 38 行“#define RAW_BUFFER_LENGTH 100”>>“#define RAW_BUFFER_LENGTH 220”