arduino红外遥控控制LED灯亮度

红外接收和红外发射

arduino红外遥控控制LED灯亮度_第1张图片
vcc接5v或者3.3v

红外接收头的接线

arduino红外遥控控制LED灯亮度_第2张图片

IRremote库安装

arduino红外遥控控制LED灯亮度_第3张图片
arduino红外遥控控制LED灯亮度_第4张图片
如果下面运行版本报错请下载第一点的版本比如2.x.x

获取遥控器按键的值


/* 红外遥控,通过串口查看每个按钮对应的红外码,
同时每按一下控制LED灯的亮灭,通过亮灭变化也
能知晓是否每次按-发送-接收这个流程走完
 */
 
#include //调用红外遥控对应的库
 
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()函数,这样才会持续接收下一组信号
  }
 }


arduino红外遥控控制LED灯亮度_第5张图片

点击按键就会出现对应值
异常有两种:一种是有时候按了并没有反应,估计是没有发送过去(也可能是没接受到),另一种是按了一下,但灯快速明灭,最终状态不变,这是因为按下后发送了两次码,一个是按钮对应码,
另一个是随后出现的FFFFFFFF,且这个问题的出现是随机的,有几个按钮比较容易出现(CH+,NEXT等),关于这个问题,出现FFFFFFFF这种情况“可能是按键码之后出现的重复码,可以通过判断语句if(results.value!= (-1))去掉”,可惜我试了一下没有成功,不过因为连续接收到两个码(发出两个码?),导致灯状态变化两次,所以看起来不变。

通过按钮调节小灯亮度

这里我们用1 2 3三个按键设置小灯三个档位
arduino红外遥控控制LED灯亮度_第6张图片
小灯的正极要连接在支持PWM的端口
我们选择接在引脚5


/* 红外遥控,通过串口查看每个按钮对应的红外码,
同时每按一下控制LED灯的亮灭,通过亮灭变化也
能知晓是否每次按-发送-接收这个流程走完
 */
 
#include //调用红外遥控对应的库
 
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

你可能感兴趣的:(单片机,嵌入式硬件,c语言)