极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15804|回复: 2

红外解码——CR2025

[复制链接]
发表于 2013-8-4 11:23:43 | 显示全部楼层 |阅读模式
本帖最后由 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。
   然后就是解码程序:


  1. #include <IRremote.h>

  2. int OUT_PIN = 11;   //红外线接收器OUTPUT端接在pin 11
  3. IRrecv irrecv(OUT_PIN);   // 定义IRrecv 对象来接收红外线信号
  4. decode_results results;   //解码结果放在decode_results构造的对象results里

  5. void setup()
  6. {
  7.   Serial.begin(9600);
  8.   irrecv.enableIRIn(); //    启动红外解码
  9. }

  10. void loop()
  11. {
  12.   if (irrecv.decode(&results))
  13.   {         // 解码成功,收到一组红外线信号
  14.     Serial.print("irCode: ");           
  15.     Serial.print(results.value, HEX);    // 输出红外线解码结果(十六进制)
  16.     //results.value 是unsigned long型,头文件有介绍
  17.     Serial.print(",  bits: ");         
  18.     Serial.println(results.bits);     // 红外线码元位数   
  19.     irrecv.resume();
  20.   }   
  21. }
复制代码

   原理介绍: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
  1. #include <IRremote.h>
  2. int OUT_PIN = 11;   //红外线接收器OUTPUT端接在pin 11
  3. IRrecv irrecv(OUT_PIN);   // 定义IRrecv 对象来接收红外线信号
  4. decode_results results;   //解码结果放在decode_results构造的对象results里
  5. void irdisplay(unsigned long value)  //  按下按键后,显示本人遥控对应的按键
  6. {
  7.   switch(value){                     //判定按下的是哪个按键
  8.   case 0xFFA25D:
  9.     Serial.println("Power");
  10.     break;
  11.   case 0xFF629D:
  12.     Serial.println("Mode");
  13.     break;
  14.   case 0xFFE21D:
  15.     Serial.println("Mute");
  16.     break;
  17.   case 0xFF22DD:
  18.     Serial.println("Play/Pause");
  19.     break;
  20.   case 0xFF02FD:
  21.     Serial.println("Last");
  22.     break;
  23.   case 0XFFC23D:
  24.     Serial.println("Next");
  25.     break;
  26.   case 0xFFE01F:
  27.     Serial.println("EQ");
  28.     break;
  29.   case 0xFFA857:
  30.     Serial.println("-");
  31.     break;
  32.   case 0xFF906F:
  33.     Serial.println("+");
  34.     break;
  35.   case 0xFF6897:
  36.     Serial.println("0");
  37.     break;
  38.   case 0xFF9867:
  39.     Serial.println("Loop");
  40.     break;
  41.   case 0xFFB04F:
  42.     Serial.println("U/SD");
  43.     break;
  44.   case 0xFF30CF:
  45.     Serial.println("1");
  46.     break;
  47.   case 0xFF18E7:
  48.     Serial.println("2");
  49.     break;
  50.   case 0xFF7A85:
  51.     Serial.println("3");
  52.     break;
  53.   case 0xFF10EF:
  54.     Serial.println("4");
  55.     break;
  56.   case 0xFF38C7:
  57.     Serial.println("5");
  58.     break;
  59.   case 0xFF5AA5:
  60.     Serial.println("6");
  61.     break;
  62.   case 0xFF42BD:
  63.     Serial.println("7");
  64.     break;
  65.   case 0xFF4AB5:
  66.     Serial.println("8");
  67.     break;
  68.   case 0xFF52AD:
  69.     Serial.println("9");
  70.     break;
  71.   }
  72. }
  73. void setup()
  74. {
  75.   Serial.begin(9600);
  76.   irrecv.enableIRIn();          //启动红外解码
  77. }

  78. void loop()
  79. {
  80.   if (irrecv.decode(&results))  
  81.   {         //解码成功,收到一组红外线信号

  82.     /*  if(results.value != (-1)){
  83.      Serial.print("irCode: ");           
  84.      Serial.print(results.value, HEX);   //输出红外线解码结果(十六进制)
  85.      //results.value 是unsigned long型,头文件有介绍
  86.      Serial.print(",  bits: ");         
  87.      Serial.println(results.bits);}    //  红外线码元位数
  88.      */
  89.     irdisplay(results.value);
  90.     irrecv.resume();
  91.   }   
  92. }
复制代码
初学小白第一次发帖,希望大家指教,继续学习

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +1 收起 理由
幻生幻灭 + 1 感谢分享

查看全部评分

回复

使用道具 举报

发表于 2013-8-4 16:52:06 | 显示全部楼层
直接用接收头获取就可以实现呢。论坛上有好多例子参考。
回复 支持 反对

使用道具 举报

发表于 2013-8-4 21:42:04 | 显示全部楼层
话说这种遥控器的编码有很多种,不同厂家编码不同。。但共同点是21键和内置CR2025纽扣电池。

这个是我手里的那个编码
http://wiki.geek-workshop.com/do ... rremote_code_other1
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-7 08:33 , Processed in 0.038625 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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