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

标签 c++ arduino embedded infrared arduino-c++

以下是我从 Arduino 读取原始红外数据的代码:

#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("");
}

使用它我可以从远程 Controller 获取:

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)。

此外,您希望“回应”是什么?通常,IR 通信是单向的。

关于c++ - 如何从 Arduino 正确接收和发送原始红外数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22751255/

相关文章:

arduino - 在arduino中将十六进制字符串转换为十进制

c - 使用 win32 API 查看 Windows XPe 系统是否有 USB2 或只有 1.1

c - 如何在 Cortex-M 嵌入式系统上使用 Firebase

c - 关于从寄存器GPIODATA读取引脚

c++ - 如何使用 clang++ 链接到 boost in/usr/local 编译?

c++ - 什么是 std::safe_string?

虚拟表上的 C++ 虚拟析构函数和类的类型信息

c++ - 两个事件之间的计时持续时间

c++ - 使用 C++17 扩展 using 声明的问题

arduino - 什么会导致Arduino不断重启?