红外解码——CR2025
本帖最后由 Dzz 于 2013-8-4 11:23 编辑网上有很多关于红外遥控的资料,看了那么多没有适合本遥控器(如下图1)的,就自己整理一个。关于红外编码解码的原理网上太多了,我就不写在这了,直入正题。
首先,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 甚至更早期的版本应该都可以 正常使用,但是有时候也会存在不兼容的问题,不兼容的时候直接改用Arduino-0023
红外接收头有三个引脚(如下图)
用的时候将VOUT接到模拟口,GND接到实验板上的GND,VCC接到实验板上的+5v。
然后就是解码程序:
#include <IRremote.h>
int OUT_PIN = 11; //红外线接收器OUTPUT端接在pin 11
IRrecv irrecv(OUT_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,注意一下,在判决的时候用0xFFA25D判定是否是某个按键。最后附上我写的程序。
出现FFFFFFFF应该是按键码之后出现的重复码,这个可以通过判断语句
if(results.value != (-1))去掉,也有的解码出来是0,或者其他的,这个就自己解决吧。
下面是每个按键对应的编码(按第一行从左到右然后转到第二行)
0xFFA25D 0xFF629D 0xFFE21D
0xFF22DD 0xFF02FD 0XFFC23D
0xFFE01F 0xFFA857 0xFF906F
0xFF6897 0xFF9867 0xFFB04F
0xFF30CF 0xFF18E7 0xFF7A85
0xFF10EF 0xFF38C7 0xFF5AA5
0xFF42BD 0xFF4AB5 0xFF52AD
#include <IRremote.h>
int OUT_PIN = 11; //红外线接收器OUTPUT端接在pin 11
IRrecv irrecv(OUT_PIN); // 定义IRrecv 对象来接收红外线信号
decode_results results; //解码结果放在decode_results构造的对象results里
void irdisplay(unsigned long value)//按下按键后,显示本人遥控对应的按键
{
switch(value){ //判定按下的是哪个按键
case 0xFFA25D:
Serial.println("Power");
break;
case 0xFF629D:
Serial.println("Mode");
break;
case 0xFFE21D:
Serial.println("Mute");
break;
case 0xFF22DD:
Serial.println("Play/Pause");
break;
case 0xFF02FD:
Serial.println("Last");
break;
case 0XFFC23D:
Serial.println("Next");
break;
case 0xFFE01F:
Serial.println("EQ");
break;
case 0xFFA857:
Serial.println("-");
break;
case 0xFF906F:
Serial.println("+");
break;
case 0xFF6897:
Serial.println("0");
break;
case 0xFF9867:
Serial.println("Loop");
break;
case 0xFFB04F:
Serial.println("U/SD");
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();
}
}
初学小白第一次发帖,希望大家指教,继续学习 直接用接收头获取就可以实现呢。论坛上有好多例子参考。:)
话说这种遥控器的编码有很多种,不同厂家编码不同。。但共同点是21键和内置CR2025纽扣电池。
这个是我手里的那个编码
http://wiki.geek-workshop.com/doku.php?id=arduino:libraries:irremote_code_other1
页:
[1]