Arduino 红外解码程序 我上网找过很多红外解码的程序,都看起来挺麻烦的。后来才发现原来早有人编好了红外编码解码的函数库了。在此感谢极客工坊的弘毅大神,还有编写这个库的那位大神。 关于红外编码解码的原理网上太多了,我就不写在这了。直入正题! 首先,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 11 IRrecv 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 11 IRrecvirrecv(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(); } } 写入后按下按键,串口显示对应按键
|