arduino红外遥控控制LED灯亮度

文章讲述了如何使用Arduino配合IRremote库实现红外接收和发射,通过红外遥控器控制LED灯的亮度。在接收到特定红外码时,利用analogWrite函数调整引脚5上的LED亮度。同时,文中指出了在处理红外信号时可能出现的异常情况,如未接收到信号或接收到重复码导致的问题。
摘要由CSDN通过智能技术生成

红外接收和红外发射

在这里插入图片描述
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我把把C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值