一 硬件

python红外遥控控制 红外遥控arduino_红外

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这个错误也能被筛选掉。