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

问题描述

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

遥控器有点异国情调。我们确信这是因为远程发送的数据包太宽/太大。

您如何调整 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,0x22,0xA,0xC,};
    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,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,0xB

解决方法

我有一个空调的遥控器我需要克隆

来自 IRremote Arduino 库的文档

Handling Unknown Protocols

这个库从来没有被设计用来处理像这样的长代码 空调使用

Recording long Infrared Remote control signals with Arduino。 主要原因是,它被设计为适合在 MCU 中使用 资源水平相对较低,旨在作为 库以及其他也需要一些应用程序的应用程序 MCU 运行的资源。

Hints

对于超过 48 位的长代码,例如来自空调的代码,您 可以在 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.

请阅读手册!