极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 40165|回复: 30

解决问题系列(2)——红外发射"未知类型"代码

[复制链接]
发表于 2013-1-5 10:54:10 | 显示全部楼层 |阅读模式
本帖最后由 瘦网虫 于 2016-10-1 14:57 编辑

新人写红外发射测试代码的时候,最好用空调、电视等等用标准格式发送的红外来测试。

可是碰到解析出来的代码类型是UNKNOWN,长度为一个32位的代码,再通过sendNEC,sendSony,sendRC5,sendRC6怎么都不成功?遇到过吗?数字电视机顶盒的遥控器出来的就是这样的东东。
例子:irsend.sendRC6(0x30D0000A, 32);

如果你在找这个解决方法,在这里就对了。

先看看IRemote库里面的这段代码,(你也可以不看)
  1. long IRrecv::decodeHash(decode_results *results) {
  2.   // Require at least 6 samples to prevent triggering on noise
  3.   if (results->rawlen < 6) {
  4.     return ERR;
  5.   }
  6.   long hash = FNV_BASIS_32;
  7.   for (int i = 1; i+2 < results->rawlen; i++) {
  8.     int value =  compare(results->rawbuf[i], results->rawbuf[i+2]);
  9.     // Add value into the hash
  10.     hash = (hash * FNV_PRIME_32) ^ value;
  11.   }
  12.   results->value = hash;
  13.   results->bits = 32;
  14.   results->decode_type = UNKNOWN;
  15.   return DECODED;
  16. }
复制代码


看不懂,没关系,我也看不懂,但是里面提到了个hash,赶紧搜一下。
懒得搜的点这里

简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

上面的例子里面“0x30D0000A”是经过一个hash函数变换过后得到的,原始的数据类似这样:
3550 ,1800 ,350 ,400 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,1400 ,300 ,400 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,1400 ,300 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,350 ,1400 ,350 ,350 ,400 ,350 ,350 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,400 ,1350 ,350 ,350 ,400 ,350 ,400 ,350 ,350 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,400 ,350 ,350 ,1400 ,350 ,350 ,400 ,350 ,350 ,1400 ,350 ,1350 ,350 ,1350 ,350 ,350 ,400 ,350 ,400

原始数据怎么得到的?看IRemote库里面的例子代码IRrecvdump和IRrecord,里面帮你通过串口打印出来这些数据了。
要想发送成功,不能发送“0x30D0000A”,要发送原始数据,通过sendRaw函数发送。
irsend.sendRaw(rawCodes, codeLen, 38);
rawCodes就是上面的原始数据,codeLen是这个原始数据的长度,38是38khz的意思。

  1. //定义下原始数据
  2. unsigned int rawCodes_num9[100] = {
  3. 3550 ,1800 ,350 ,400 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,1400 ,300 ,400 ,350 ,400 ,350 ,400 ,350 ,1350 ,350 ,400 ,350 ,1400 ,300 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,350 ,1400 ,350 ,350 ,400 ,350 ,350 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,400 ,1350 ,350 ,350 ,400 ,350 ,400 ,350 ,350 ,400 ,350 ,400 ,350 ,1400 ,300 ,1400 ,350 ,350 ,400 ,350 ,350 ,1400 ,350 ,350 ,400 ,350 ,350 ,1400 ,350 ,1350 ,350 ,1350 ,350 ,350 ,400 ,350 ,400
  4. };
  5. //发送时使用下面的语句测试
  6. irsend.sendRaw(rawCodes_num9, 100, 38);
复制代码


GOOD LUCK~

解决问题系列(3)——红外发射,控制美的空调开


解决问题系列(1)——红外发射管
回复

使用道具 举报

发表于 2013-1-5 11:12:03 | 显示全部楼层
不知道楼主能否写个空调的例子 不知道怎么解码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-1-5 11:17:31 | 显示全部楼层
IRemote库自带的例子里面就有,你也可以看论坛里前人TOM发的帖子

Arduino 红外遥控接收篇之一

足够详细了。
回复 支持 反对

使用道具 举报

发表于 2013-1-5 12:48:36 | 显示全部楼层
不错,受教了
回复 支持 反对

使用道具 举报

发表于 2013-2-5 11:57:17 | 显示全部楼层
嗯.感谢楼主啊.. 好人. 我晚上回去试试
回复 支持 反对

使用道具 举报

发表于 2013-2-7 22:23:17 | 显示全部楼层
这个不错。。
回复 支持 反对

使用道具 举报

发表于 2013-2-24 22:52:35 | 显示全部楼层
楼主,原始数据是通过IRemote库里面的例子代码IRrecvdump和IRrecord的例程,通过串口打印出来的吗?为什么我采用例子的时候,居然什么都没有
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-25 11:26:22 | 显示全部楼层
waiom 发表于 2013-2-24 22:52
楼主,原始数据是通过IRemote库里面的例子代码IRrecvdump和IRrecord的例程,通过串口打印出来的吗?为什么我 ...

是通过串口打印出来的,你LED接线正确吗?
回复 支持 反对

使用道具 举报

发表于 2013-2-27 09:18:21 来自手机 | 显示全部楼层
瘦网虫 发表于 2013-2-25 11:26
是通过串口打印出来的,你LED接线正确吗?

楼主,问题暂时解决了,问题不在代码和接线那,在电脑那,它的com口出故障了,我换个板子,变成另一个com口后,问题解决。电视是可以遥控了,但是空调不行,能用代码解码出原码,是32的.串口显示出类型.但是还是不能遥控空调(红外线二极管距离空调很近,都小于1m.)分析下问题,估计空调的波长大于380nm.这样解码不正确,或者程序只能认380nm.大于就不行,要不然在复制原码的时候,少复制了,在解码出原码的时候,有2组数字是经常变化,我没有复制。请问楼主,大于380是不是解码错误,或者我少复制了2组数字的原码导致无法遥控,ps:我的原码是有正负号,我估计是波段的正负弦表现形式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-27 10:29:42 | 显示全部楼层
waiom 发表于 2013-2-27 09:18
楼主,问题暂时解决了,问题不在代码和接线那,在电脑那,它的com口出故障了,我换个板子,变成另一个com ...

这个。。我就不知道了,请论坛里的达人们出来解释吧。
我家里的格力空调用的是NEC格式的编码,很轻松就可以控制了。
回复 支持 反对

使用道具 举报

发表于 2013-3-4 16:50:42 | 显示全部楼层
我也遇到了同样的问题,电视机机顶盒可以控制,格力空调不能控制,sendNEC,sendSony,sendRC5,sendRC6这些方法都试过了,距离小于20cm,就是不行,电视机倒是很容易的控制了
回复 支持 反对

使用道具 举报

发表于 2013-3-4 23:35:47 | 显示全部楼层
我用IRremote库自带的IRecvDump例子,获得到格力空调遥控器的开机键的红外编码,如下所示:
Decoded NEC: 3010040A (32 bits)
Raw (74): 764 8950 -4350 750 -500 700 -500 700 -1550 700 -1550 700 -550 700 -450 750 -450 700 -500 700 -500 700 -500 700 -500 700 -1550 700 -500 700 -500 700 -500 700 -500 700 -500 700 -450 750 -500 700 -450 750 -450 700 -1600 700 -500 700 -500 700 -450 800 -450 650 -500 750 -450 700 -1600 700 -500 700 -1550 700 -500 700 -500 700 -1550 700 -500 700 ,
然后我再写irsend.sendNEC(0x3010040A, 35);无论如何都是不能控制空调打开,这是为什么啊?用同样的方法我已经控制机顶盒成功了,就是不能控制家里的格力空调,求助!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-5 08:35:48 | 显示全部楼层
irsend.sendNEC(0x3010040A, 35);
35kHz?
回复 支持 反对

使用道具 举报

发表于 2013-3-22 13:19:34 | 显示全部楼层
试过,但是不成功,不知道什么原因!
回复 支持 反对

使用道具 举报

发表于 2013-3-22 14:14:12 | 显示全部楼层
今天看了一下海尔空调的遥控器编码,好像比普通NEC的编码要长很多,如果用这种方式还能解出码来么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-29 11:22 , Processed in 0.065540 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表