初出茅庐的小李第58篇博客之arduino遥控器键值读取

这里先贴一张图,亲测键值标注的没问题

在这里插入图片描述
在这里插入图片描述

/*
 * FFA25D  CH-
 * FF629D  CH
 * FFE21D  CH+
 * FF22DD  PREV
 * FF02FD  NEXT
 * FFC23D  PLAY/PAUSE
 * FFE01F  -
 * FFA857  +
 * FF906F  EQ
 * FF6897  0
 * FF30CF  1
 * FF18E7  2
 * FF7A85  3
 * FF10EF  4
 * FF38C7  5
 * FF5AA5  6
 * FF42BD  7
 * FF4AB5  8
 * FF52AD  9
 * FF9867  100+
 * FFB04F  200+
 */

我手里的遥控器有好几个,但是应该都是NEC编码的遥控器为了测试这个解析是否可以解析其它格式的红外波我用我的华为手机(对我的手机具备万能遥控器的功能)简单测了一下其它格式比如SONY协议红外也是客户以识别的,我前几天看了正点原子的解析函数也挺复杂的感觉,而且只是解析了一种编码格式。

在这里插入图片描述

其实这里解析也不是百分之百准确有的时候你按键按下的时候程序会识别错,甚至认为是其它编码的格式,当你重复按下这个按键的时候它会解读为FFFFFFFF
在这里插入图片描述
写按键处理的函数时候这个情况要考虑进去是否支持按着不松的情况。

/*
 * IRrecvDemo
 * 目前按键没有做连续按键的检测
 */
/*
 * FFA25D  CH-
 * FF629D  CH
 * FFE21D  CH+
 * FF22DD  PREV
 * FF02FD  NEXT
 * FFC23D  PLAY/PAUSE
 * FFE01F  -
 * FFA857  +
 * FF906F  EQ
 * FF6897  0
 * FF30CF  1
 * FF18E7  2
 * FF7A85  3
 * FF10EF  4
 * FF38C7  5
 * FF5AA5  6
 * FF42BD  7
 * FF4AB5  8
 * FF52AD  9
 * FF9867  100+
 * FFB04F  200+
 */

#include <IRremote.h>

int RECV_PIN = 11;      /*红外接收的信号输入引脚*/

int RED_LED = 10;
int UNO_LED = 13;

IRrecv irrecv(RECV_PIN);/*创建红外接收的一个对象*/
IRsend irsend;          /*定义 IRsend 物件来发射红外线讯号*/
                        // 头文件已经定义PIN 3为信号输出
                        // 所以只能连接PIN 3 ,若更改请在头文件更改
//irsend.sendNEC(0xFF02FD, 32);   //这里的FF02FD编码

decode_results results; /*解析的一个结果放在decode_results构造的对象中去*/

void setup()
{
  Serial.begin(115200);/*串口波特率初始化*/
  irrecv.enableIRIn(); /*开始接收红外信号*/
  pinMode(UNO_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  digitalWrite(UNO_LED, HIGH);/*低电平驱动的方式点亮LED*/
  digitalWrite(RED_LED, LOW); /*高定平驱动的方式点亮LED*/
}
/* 
 *  显示红外线协定种类
 *  显示红外键值HEX格式
 *  显示红外码元数bits
 *  传入参数是对象指针
*/
void ShowIRProtocol(decode_results *results)
{
  Serial.println("您输入的红外协议参数如下 ");
  switch(results->decode_type) 
  {
   case NEC:
     Serial.println("NEC协议红外");
     break;
   case SONY:
     Serial.println("SONY协议红外");
     break;
   case RC5:
     Serial.println("RC5协议红外");
     break;
   case RC6:
     Serial.println("RC6协议红外");
     break;
   default:
     Serial.println("Unknown encoding ...");
  }
    Serial.print("红外键值是hex:");
    Serial.println(results->value,HEX); /*十六进制输出红外键值*/
    Serial.print("红外键码元bit:");
    Serial.println(results->bits);      /*默认是十进制输出*/
}
/*
 * 红外控制函数
 * 函数说明:
 * 传入红外键值
 * 执行对应动作
 */
void IR_Contrl(unsigned int key_val)
{
  switch(key_val)
  {
    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 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;
    case 0xFF9867:
      Serial.println("100+");
      break;
    case 0xFFB04F:
      Serial.println("200+");
      break;
  }
}                          
void loop() 
{
  if (irrecv.decode(&results)) /*收到一组红外信号用decode进行解码*/
  {
    //ShowIRProtocol(&results);
    IR_Contrl(results.value);
    irrecv.resume();           /*准备下一次接收红外信号*/
  }
  delay(100);
}

按键测试

23:33:06.537 -> CH-
23:33:06.946 -> CH-
23:33:07.252 -> CH-
23:33:07.832 -> CH-
23:33:08.036 -> CH-
23:33:08.240 -> CH-
23:33:08.649 -> CH-
23:33:09.855 -> CH-
23:33:10.234 -> CH-
23:33:10.544 -> CH-
23:33:11.159 -> CH
23:33:11.743 -> CH
23:33:12.051 -> CH
23:33:12.359 -> CH
23:33:12.665 -> CH
23:33:12.836 -> CH
23:33:13.246 -> CH+
23:33:13.964 -> CH+
23:33:14.135 -> CH+
23:33:14.341 -> CH+
23:33:14.752 -> CH+
23:33:16.153 -> PREV
23:33:16.736 -> PREV
23:33:17.043 -> PREV
23:33:17.864 -> NEXT
23:33:18.241 -> NEXT
23:33:18.549 -> NEXT
23:33:18.959 -> NEXT
23:33:19.470 -> PLAY/PAUSE
23:33:19.745 -> PLAY/PAUSE
23:33:20.155 -> PLAY/PAUSE
23:33:21.663 -> -
23:33:22.142 -> -
23:33:22.860 -> +
23:33:23.270 -> +
23:33:23.543 -> +
23:33:23.954 -> EQ
23:33:24.261 -> EQ
23:33:24.567 -> EQ
23:33:26.042 -> 0
23:33:27.244 -> 100+
23:33:28.648 -> 200+
23:33:29.949 -> 1
23:33:30.462 -> 2
23:33:33.163 -> 3
23:33:33.574 -> 3
23:33:33.849 -> 3
23:33:34.155 -> 3
23:33:34.563 -> 3
23:33:36.576 -> 4
23:33:36.952 -> 4
23:33:38.662 -> 5
23:33:39.174 -> 5
23:33:41.053 -> 6
23:33:41.361 -> 6
23:33:42.657 -> 7
23:33:43.274 -> 7
23:33:43.858 -> 8
23:33:44.953 -> 9
23:33:45.261 -> 9

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值