781885537 发表于 2012-7-18 19:59:49

Arduino红外解码程序,利用自带的函数库

Arduino 红外解码程序                                                       我上网找过很多红外解码的程序,都看起来挺麻烦的。后来才发现原来早有人编好了红外编码解码的函数库了。在此感谢极客工坊的弘毅大神,还有编写这个库的那位大神。详细资料在:http://coopermaa2nd.blogspot.com/一个台湾人的blog,大陆需翻墙才能看到,里面关于红外解码还有发射红外信号写的非常详细,还有相关代码,有需要的可以翻墙看看,随便找个在线代理就可以了。 关于红外编码解码的原理网上太多了,我就不写在这了。直入正题!首先,arduino IDE本来就有红外线IRremote的函数库,没有的可以去官网下。但是arduino1.0版本的不能直接用这个函数库(一开始还把我搞糊涂了,自带的IRremote 里面的Example都不能编译成功),需要改点东西。首先进入arduino文件夹,然后进入libraries文件夹,然后进入IRremote文件夹,修改IRremoteInt.h 里面的这行:#include <WProgram.h>改成这样子:#if ARDUINO >= 100#include <Arduino.h>#else#include <WProgram.h>#endif改完之後,不管是 Arduino 1.0 或 Arduino-0023 甚至更早期的版本应该都可以 work。   然后就是解码程序,我直接引用blog里面的。 #include<IRremote.h> int RECV_PIN = 11;   //红外线接收器OUTPUT端接在pin 11IRrecv irrecv(RECV_PIN);   // 定义IRrecv 对象来接收红外线信号decode_results results;   //解码结果放在decode_results构造的对象results里 void setup(){Serial.begin(9600);irrecv.enableIRIn(); //    启动红外解码} void loop() { if (irrecv.decode(&results)){      // 解码成功,收到一组红外线信号    Serial.print("irCode: ");         Serial.print(results.value,HEX);    // 输出红外线解码结果(十六进制)//results.value 是unsigned long型,头文件有介绍     Serial.print(",bits: ");          Serial.println(results.bits);   // 红外线码元位数    irrecv.resume(); }   } 原理介绍:irrecv.enableIRIn()启动红外解码后,这时候IRrecv对象会在后台接收红外线信号。接着就可以利用decode()函数持续检查,看看有没有解码成功。irrecv.decode(&results)解码成功,这个函数会返回true,并把结果放在results里面,在解码一个红外线信号之后,要运行resume()函数,这样才会持续接收下一组信号。 可以先利用这个程序解析出所使用遥控的编码,然后根据所得到的编码,修改程序实现所需的功能。解析出的编码数值是unsigned long,注意一下,在判决的时候用0x ******判定是否是某个按键。最后面附上我写的程序。                        
                              出现FFFFFFFF应该是按键码之后出现的重复码,这个可以通过判断语句if(results.value!= (-1))去掉,也有的解码出来是0,或者其他的,这个就自己解决吧。 最后附上本人写的程序,我的是38kHz的红外遥控 #include<IRremote.h> int RECV_PIN = 11;   //红外线接收器OUTPUT端接在pin 11IRrecvirrecv(RECV_PIN);   // 定义IRrecv 对象来接收红外线信号decode_resultsresults;   //解码结果放在decode_results构造的对象results里void irdisplay(unsignedlong value)//按下按键后,显示本人遥控对应的按键{switch(value){                     //判定按下的是哪个按键    case 0xFFA25D:Serial.println("CH-");break;    case 0xFF629D:Serial.println("CH");break;    case 0xFFE21D:Serial.println("CH+");break;    case 0xFF22DD:Serial.println("PREV");break;    case 0xFF02FD:Serial.println("NEXT");break;    case 0XFFC23D: Serial.println("PLAY/PAUSE");break;    case 0xFFE01F:Serial.println("-");break;    case 0xFFA857:Serial.println("+");break;    case 0xFF906F:Serial.println("EQ");break;    case 0xFF6897:Serial.println("0");break;    case 0xFF9867:Serial.println("100+");break;    case 0xFFB04F:Serial.println("200+");break;    case 0xFF30CF:Serial.println("1");break;    case 0xFF18E7:Serial.println("2");break;    case 0xFF7A85:Serial.println("3");break;    case 0xFF10EF:Serial.println("4");break;    case 0xFF38C7:Serial.println("5");break;    case 0xFF5AA5:Serial.println("6");break;    case 0xFF42BD:Serial.println("7");break;    case 0xFF4AB5:Serial.println("8");break;    case 0xFF52AD:Serial.println("9");break;}}void setup(){Serial.begin(9600);irrecv.enableIRIn();          //启动红外解码} void loop() { if (irrecv.decode(&results)){      //解码成功,收到一组红外线信号    /*if(results.value != (-1)){    Serial.print("irCode: ");         Serial.print(results.value,HEX);    //输出红外线解码结果(十六进制)//results.value 是unsigned long型,头文件有介绍    Serial.print(",bits: ");              Serial.println(results.bits);}    //红外线码元位数*/irdisplay(results.value);    irrecv.resume(); }   }写入后按下按键,串口显示对应按键

781885537 发表于 2012-7-18 20:32:57

附带的IRremote library

PureGold 发表于 2012-7-18 20:49:03

朋友,你out了

781885537 发表于 2012-7-18 21:15:46

PureGold 发表于 2012-7-18 20:49 static/image/common/back.gif
朋友,你out了

呵呵   我找了好久了   一直看到别人都用很复杂的代码在那解码,麻烦啊

你看到简单的也不贴出来共享一下:Q

PureGold 发表于 2012-7-19 13:16:51

781885537 发表于 2012-7-18 21:15 static/image/common/back.gif
呵呵   我找了好久了   一直看到别人都用很复杂的代码在那解码,麻烦啊

你看到简单的也不贴出来共享一 ...

呵呵,那还是我问的问题引出来的,别人才贴了那么复杂的代码帮助理解,我也是新手一个:)

MicroCao 发表于 2012-7-31 08:51:22

这个库的原始出处可能是这里,http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
不知道有没有网友成功地遥控过空调,曾经试了好久一直没成功,搁置了

Randy 发表于 2012-7-31 09:05:14

我也没试过,不知道怎么能成功,求实践过程!

zcbzjx 发表于 2012-7-31 09:08:44

这个好。。

但丁 发表于 2012-8-27 13:09:35

求指点,如果解码出来不是常用的那些协议(NEC,SONY,RC5,RC6等等)的话,应该怎么办呢?

qiaobu 发表于 2012-9-14 01:55:06

这个真的不错

maybachwang 发表于 2012-12-19 13:24:26

有点晕~~~, 清醒了再来看看

混球 发表于 2012-12-25 11:10:53

本帖最后由 混球 于 2012-12-25 14:47 编辑

按步骤做,但是编译的时候出现错误,如图,求指导http://b.hiphotos.baidu.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=9d678d392f2eb938e86d7af7e559f408/37d12f2eb9389b5086426e8a8535e5dde6116ead.jpg?referer=18d877576c81800a37f2bd3eca63&x=.jpg

混球 发表于 2012-12-25 11:54:29

混球 发表于 2012-12-25 11:10 static/image/common/back.gif
按步骤做,但是编译的时候出现错误,如图,求指导

多次实验,终于解决这个问题啦。。似乎是因为atmega8最小系统不能使用IRremote.h库,tools—board—atmega8板编译不了,暂时试了改成atmega1280,编译成功。

舟泊烟渚 发表于 2013-8-25 20:25:41

不高深但很清晰{:soso_e142:}

Cc神兽! 发表于 2014-7-28 15:34:03

接收與發射的頻率不同,如何解?
页: [1] 2
查看完整版本: Arduino红外解码程序,利用自带的函数库