红外接收和红外发射
vcc接5v或者3.3v
红外接收头的接线
IRremote库安装
如果下面运行版本报错请下载第一点的版本比如2.x.x
获取遥控器按键的值
/* 红外遥控,通过串口查看每个按钮对应的红外码,
同时每按一下控制LED灯的亮灭,通过亮灭变化也
能知晓是否每次按-发送-接收这个流程走完
*/
#include <IRremote.h>//调用红外遥控对应的库
int RECV_PIN = 11;//定义红外接口引脚
/*利用库中的IRrecv函数创建一个红外线接收对象,用来接收红外线信号,
* 对象名称为irrecv,
* 括号中为用来接收红外信号的引脚*/
IRrecv irrecv(RECV_PIN);//创建一个红外线接收对象irrecv
decode_results results;//声明一个IRremote库函数独有的变量类型(decode_results),results存放红外解码结果,
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver启动红外解码
}
void loop() {
if (irrecv.decode(&results) ) {//核心!判断是否接收到红外码,若是,这个函数会返回true,并把红外解码的结果放在results里面
Serial.print("IRCode: ");
Serial.println(results.value,HEX);/*串口监视器查看红外解码结果(HEX十六进制)
results.value 是unsigned long型,头文件有介绍*/
irrecv.resume(); // 在解码一个红外线信号之后,要运行resume()函数,这样才会持续接收下一组信号
}
}
点击按键就会出现对应值
异常有两种:一种是有时候按了并没有反应,估计是没有发送过去(也可能是没接受到),另一种是按了一下,但灯快速明灭,最终状态不变,这是因为按下后发送了两次码,一个是按钮对应码,
另一个是随后出现的FFFFFFFF,且这个问题的出现是随机的,有几个按钮比较容易出现(CH+,NEXT等),关于这个问题,出现FFFFFFFF这种情况“可能是按键码之后出现的重复码,可以通过判断语句if(results.value!= (-1))去掉”,可惜我试了一下没有成功,不过因为连续接收到两个码(发出两个码?),导致灯状态变化两次,所以看起来不变。
通过按钮调节小灯亮度
这里我们用1 2 3三个按键设置小灯三个档位
小灯的正极要连接在支持PWM的端口
我们选择接在引脚5
/* 红外遥控,通过串口查看每个按钮对应的红外码,
同时每按一下控制LED灯的亮灭,通过亮灭变化也
能知晓是否每次按-发送-接收这个流程走完
*/
#include <IRremote.h>//调用红外遥控对应的库
int RECV_PIN = 11;//定义红外接口引脚
/*利用库中的IRrecv函数创建一个红外线接收对象,用来接收红外线信号,
* 对象名称为irrecv,
* 括号中为用来接收红外信号的引脚*/
IRrecv irrecv(RECV_PIN);//创建一个红外线接收对象irrecv
decode_results results;//声明一个IRremote库函数独有的变量类型(decode_results),results存放红外解码结果,
int LEDa=5;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver启动红外解码
}
void loop() {
if (irrecv.decode(&results) ) {//核心!判断是否接收到红外码,若是,这个函数会返回true,并把红外解码的结果放在results里面
Serial.print("IRCode: ");
Serial.println(results.value,HEX);
switch(results.value){
case 0xFF30CF: //小灯亮度
analogWrite(LEDa,80); //
break;
case 0xFF18E7:
analogWrite(LEDa,160);
break;
case 0xFF7A85:
analogWrite(LEDa,255);
break;
}
irrecv.resume(); // 在解码一个红外线信号之后,要运行resume()函数,这样才会持续接收下一组信号
}
}
analogWrite(引脚号,0~255);数值越大小灯越亮具体原理自己搜索PWM