如何将IRDB的Sony12红外码转为IrRemote库可用的单十六进制格式?
把IRDB里的Sony12红外码转成IrRemote能用的单十六进制格式?看这篇就够了
首先得先搞明白Sony 12位红外编码到底是什么:它本质就是一个12位的二进制数,一般是7位设备地址加5位命令码拼出来的,转成十六进制就是你示例里0xa90这种3位的格式(范围从0x000到0xFFF)。下面针对你提到的两种常见格式,一步步教你转:
一、搞定Pronto格式的码
你给的那个Pronto示例:0000 0068 0000 000D 0060 0018 0030 0018 0018 0018 0030 0018 0018 0018 0030 0018 0018 0018 0018 0018 0030 0018 0018 0018 0018 0018 0018 0018 0018 0408
Pronto码前面4组是头部信息,没用,后面的都是脉冲对(标记+间隔)。咱们要从这些脉冲里抠出二进制数据:
- 先跳过头部和起始脉冲:前4组
0000 0068 0000 000D直接忽略,然后第一个脉冲对0060 0018是Sony编码的起始信号,也跳过。 - 区分逻辑0和1:剩下的每两组脉冲对应一个二进制位。Sony的规则是:标记长度长的是逻辑1,短的是逻辑0。看你的例子,
0030(十进制48)是长标记,对应1;0018(十进制24)是短标记,对应0。 - 拼出二进制再转十六进制:把剩下的12个脉冲对对应的0/1按顺序排好,比如你的例子里拼出来是
101010010000,转成十六进制就是0xA90——正好是你示例里能用的格式!
不过说实话,手动解析容易错,更省心的办法是直接用Arduino接收:
写个简单的接收程序,把对应的红外信号对着Arduino的接收头发送,串口直接给你输出现成的十六进制码:
#include <IRremote.h> const int RECV_PIN = 11; // 接红外接收头的引脚 IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // 启动红外接收 } void loop() { if (irrecv.decode(&results)) { if (results.decode_type == SONY) { Serial.print("可用的Sony十六进制码: 0x"); Serial.println(results.value, HEX); Serial.print("位数: "); Serial.println(results.bits); } irrecv.resume(); // 准备接收下一个信号 } }
二、处理那种00 00 1B...的原始十六进制序列
这种格式一般是原始脉冲数据或者直接的编码值,分两种情况:
- 如果是直接存储的Sony 12位编码,那你要注意字节顺序:通常是高7位地址加低5位命令,拼起来转成十六进制就行。比如地址是
0x25(7位二进制0100101),命令是0x09(5位1001),拼起来是01001011001,转十六进制就是0x4B9。 - 如果是原始脉冲数据,那还是用上面的接收程序最靠谱,避免自己解析脉冲出错。
最后再划个重点
不管哪种格式,用Arduino直接接收是最不容易出错的方法——毕竟你不用手动抠脉冲、算二进制,直接拿现成的结果用就行。要是没有实体遥控器,也可以用能发送红外码的工具(比如另一个Arduino或者专门的红外发射器)把IRDB里的码发出来,再用接收程序捕获。
内容的提问来源于stack exchange,提问作者roguehippo
相关产品推荐
相关产品推荐

