这里先贴一张图,亲测键值标注的没问题
/*
* 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