一 硬件
这套元件是红外接收头(左)和红外遥控器(右),遥控器按一下,红外接收头接收到并让UNO执行相应的操作。卖家给的资料里面依然是不给力地没有标清楚接收头三个引脚具体接法,我只能反复试,和以前不同,将红外接收头接入UNO,如果接错了,上传代码后UNO会灭灯,完全不能工作,试错了几次得到如上图的结果,VCC对应5V ,OUT则对应一个数字引脚,只是不知换一种接头是不是还要试错?
二 代码
1.初试红外遥控,功能:通过串口查看红外遥控器按钮对应的红外码,代码如下
/* 红外遥控,通过串口查看每个按钮对应的红外码,
同时每按一下控制LED灯的亮灭,通过亮灭变化也
能知晓是否每次按-发送-接收这个流程走完*/#include <IRremote.h>//调用红外遥控对应的库int RECV_PIN = 11;//定义红外接口引脚
int ledpin = 10;//定义LED接口引脚
boolean ledstate = LOW;
/*利用库中的IRrecv函数创建一个红外线接收对象,用来接收红外线信号,* 对象名称为irrecv,* 括号中为用来接收红外信号的引脚*/
IRrecv irrecv(RECV_PIN);//创建一个红外线接收对象irrecv
decode_results results;//声明一个IRremote库函数独有的变量类型(decode_results),results存放红外解码结果,void setup()
{pinMode(ledpin, OUTPUT);Serial.begin(9600);irrecv.enableIRIn(); // Start the receiver启动红外解码
}void loop() {if (irrecv.decode(&results)) {//核心!判断是否接收到红外码,若是,这个函数会返回true,并把红外解码的结果放在results里面Serial.print("bits: "); Serial.println(results.bits);} // 红外线码元位数Serial.print("IRCode: "); Serial.println(results.value,HEX);/*串口监视器查看红外解码结果(HEX十六进制)results.value 是unsigned long型,头文件有介绍*/ledstate = !ledstate;digitalWrite(ledpin,ledstate);irrecv.resume(); // 在解码一个红外线信号之后,要运行resume()函数,这样才会持续接收下一组信号}}
知识点:(1)重点是红外遥控库<IRremote.h>里面相关的函数,参看上面代码注释。
(2)加了一个LED灯,目的在代码最前面的注释里也讲了,就是通过LED的亮灭变化直接知晓是否我按的这个动作已被接收到了。直接通过串口查看的话,每个按钮对应的码就可以一一查看,也能发现异常。
异常有两种:一种是有时候按了并没有反应,估计是没有发送过去(也可能是没接受到),另一种是按了一下,但灯快速明灭,最终状态不变,这是因为按下后发送了两次码,一个是按钮对应码,另一个是随后出现的FFFFFFFF,且这个问题的出现是随机的,有几个按钮比较容易出现(CH+,NEXT等),关于这个问题,搜到文章【1】中提到,出现FFFFFFFF这种情况“可能是按键码之后出现的重复码,可以通过判断语句if(results.value!= (-1))去掉”,可惜我试了一下没有成功,不过因为连续接收到两个码(发出两个码?),导致灯状态变化两次,所以看起来不变。
2. 通过上面的代码,可以得出每一个按钮对应红外解码(十六进制)的列表,下面代码实现用串口显示所按遥控器按钮名称的功能。
功能:按下按键,串口显示对应按键名称,代码如下:
//红外遥控,串口显示所按的遥控器按钮的名称#include <IRremote.h>
int RECV_PIN = 11;//定义红外接口引脚
/*利用库中的IRrecv函数创建一个红外线接收对象,用来接收红外线信号,* 对象名称为irrecv,* 括号中为用来接收红外信号的引脚*/
IRrecv irrecv(RECV_PIN);//创建一个红外线接收对象irrecv
decode_results results;//声明一个IRremote库函数独有的变量类型(decode_results),results存放红外解码结果,
void IRdisplay(unsigned long value){//传过来的results.value 是unsigned long型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("FOL-");break;case 0xFFB04F:Serial.println("FOL+");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(); // Start the receiver
}void loop() {if (irrecv.decode(&results)) {判断是否接收到红外码,并把红外解码的结果放在results里面IRdisplay(results.value);//调用IRdisplay函数irrecv.resume(); // 等待接收下一组信号}}
按钮和生成码的对应表已经列在代码中了,而且在这个代码里面,FFFFFFFF这个错误也能被筛选掉。
【1】Arduino红外解码程序,利用自带的函数库 - Arduino - 极客工坊 - Powered by Discuz!