对于 红外遥控的信号处理 每一个按键都会有单独的操作【Arduino】

原创 2017年12月02日 17:54:04

长话短说,Arduino下的红外遥控器实验。需要一跟10欧电阻。面包线 子对子 *3.遥控一个。红外接收头一个。

已经做好按下每一个键的处理,屏幕上会输出你按下的那个键。



红外遥控器长这样子



线这样子接: 看好线的颜色


最后是代码部分,已经设置好按下指定键进行指定操作

#define IR_IN  8  //红外接收
int Pulse_Width = 0;//存储脉宽 
int ir_code = 0x00;// 用户编码值
char  adrL_code = 0x00;//命令码
char  adrH_code = 0x00;//命令码反码

void timer1_init(void)//定时器初始化函数
{
  TCCR1A = 0X00; 
  TCCR1B = 0X05;//给定时器时钟源  
  TCCR1C = 0X00;
  TCNT1 = 0X00;
  TIMSK1 = 0X00;  //禁止定时器溢出中断
}
void remote_deal(void)//执行译码结果函数
{
  if(adrL_code != 0x00) //如果没有检测到信号则不输出
  { 
switch(adrL_code){
  case 0x45:
  Serial.println("CH-");
  break;
  case 0x46:
    Serial.println("CH");
  break;
  case 0x47 :
    Serial.println("CH+");
  break;
   case 0x44 :
     Serial.println("|<<");
  break ;
   case 0x40 :
     Serial.println(">>|");
  break;
   case 0x43 :
     Serial.println(">||");
  break;
   case 0x07 :
     Serial.println("-");
  break;
   case 0x15 :
     Serial.println("+");
  break;
   case 0x09:
     Serial.println("EQ");
  break;
   case 0x16:
     Serial.println("0");
  break;
   case 0x19:
     Serial.println("100+");
  break; 
   case 0x0d:
     Serial.println("200+");
   break;
   case 0x0c:
     Serial.println("1");
  break;
   case 0x18:
  Serial.println("2");
    break;
   case 0x5e:
     Serial.println("3");
    break;
   case 0x08:
     Serial.println("4");
  break;
   case 0x1c:
     Serial.println("5");
  break;
   case 0x5a:
     Serial.println("6");
  break;
   case 0x42:
     Serial.println("7");
  break;
   case 0x52:
     Serial.println("8");
  break;
   case 0x4a:
     Serial.println("9");
  break;
  } 
 }
}
char logic_value()//判断逻辑值“0”和“1”子函数
{
  TCNT1 = 0X00;
  while(!(digitalRead(IR_IN))); //低等待
  Pulse_Width=TCNT1;
  TCNT1=0;
  if(Pulse_Width>=7&&Pulse_Width<=10)//低电平560us
  {
    while(digitalRead(IR_IN));//是高就等待
    Pulse_Width=TCNT1;
    TCNT1=0;
    if(Pulse_Width>=7&&Pulse_Width<=10)//接着高电平560us
      return 0;
    else if(Pulse_Width>=25&&Pulse_Width<=27) //接着高电平1.7ms
      return 1;
  }
  return -1;
}
void pulse_deal()//接收地址码和命令码脉冲函数
{
  int i;
  int j;
  ir_code=0x00;// 清零
  adrL_code=0x00;// 清零
  adrH_code=0x00;// 清零

  //解析遥控器编码中的用户编码值  
  for(i = 0 ; i < 16; i++)
  {
    if(logic_value() == 1) //是1
        ir_code |= (1<<i);//保存键值
  }
  //解析遥控器编码中的命令码
  for(i = 0 ; i < 8; i++)
  {
    if(logic_value() == 1) //是1
      adrL_code |= (1<<i);//保存键值
  }
  //解析遥控器编码中的命令码反码 
  for(j = 0 ; j < 8; j++)
  {
    if(logic_value() == 1) //是1
        adrH_code |= (1<<j);//保存键值
  }
}
void remote_decode(void)//译码函数
{
  TCNT1=0X00;       
  while(digitalRead(IR_IN))//是高就等待
  {
    if(TCNT1>=1563)  //当高电平持续时间超过100ms,表明此时没有按键按下
    {
      ir_code=0x00ff;// 用户编码值
      adrL_code=0x00;//键码前一个字节值
      adrH_code=0x00;//键码后一个字节值
      return;
    }  
  }

  //如果高电平持续时间不超过100ms
  TCNT1=0X00;

  while(!(digitalRead(IR_IN))); //低等待
  Pulse_Width=TCNT1;
  TCNT1=0;
  if(Pulse_Width>=140&&Pulse_Width<=141)//9ms
  {

    while(digitalRead(IR_IN));//是高就等待
    Pulse_Width=TCNT1;
    TCNT1=0;
    if(Pulse_Width>=68&&Pulse_Width<=72)//4.5ms
    {  
      pulse_deal();
      return;
    }
    else if(Pulse_Width>=34&&Pulse_Width<=36)//2.25ms
    {
      while(!(digitalRead(IR_IN)));//低等待
      Pulse_Width=TCNT1;
      TCNT1=0;
      if(Pulse_Width>=7&&Pulse_Width<=10)//560us
      {
        return; 
      }
    }
  }
}
void setup()
{
  Serial.begin(9600);
  pinMode(IR_IN,INPUT);//设置红外接收引脚为输入
Serial.flush();
}
void loop()
{        
  timer1_init();//定时器初始化
  while(1)
  {
    remote_decode();  //译码
    remote_deal();   //执行译码结果
  }  
}

最后是运行结果:


版权声明:本文为博主原创文章,未经博主允许不得转载。

使用Arduino录制与播放遥控器的红外信号

使用的材料有arduino R3,一个金属外壳红外接收头,一个红外发射头,LED指示灯若干,两个开关,电阻若干 以下为arduino的代码,相关注意事项在注释中已经写明。 我尝试过使用delayM...
  • luhanglei
  • luhanglei
  • 2016年02月28日 23:02
  • 1674

红外遥控通信原理

摘要:   在实际的通信领域,发出来的信号一般有较宽的频谱,而且都是在比较低的频率段分布大量的能量,所以称之为基带信号,这种信号是不适合直接在信道中传输的。为便于传输、提高抗干扰能力和有效的利用带宽,...
  • linglongqiongge
  • linglongqiongge
  • 2015年06月04日 19:23
  • 1325

对于 红外遥控的信号处理 每一个按键都会有单独的操作【Arduino】

长话短说,Arduino下的红外遥控器实验。需要一跟10欧电阻。面包线 子对子 *3.遥控一个。红外接收头一个。 已经做好按下每一个键的处理,屏幕上会输出你按下的那个键。 红外遥控器长这样子...
  • u013542549
  • u013542549
  • 2017年12月02日 17:54
  • 114

电子产品的按键“消抖”处理和Arduino中的Bounce2头文件

在电子产品的设计中,考虑到产品的性能与质量,常常需要对按键进行一系列的处理,最常见的就是“消抖”,网络上这方面资料很多,我这里对消抖方法进行一定的总结归纳,另外针对Arduino,介绍其Bounce2...
  • Nolan__Roronoa
  • Nolan__Roronoa
  • 2015年07月06日 23:53
  • 2130

Arduino简单实例之七_红外遥控接收

1)       说明: 红外接收模块适用于红外线遥控和红外线数据传输。对于不同的遥控器,区别只是接到的数字不同。 注意要买三脚的红外接收头,而不是直接购买红外对管。当然也可以买电子积木的红外接收...
  • xieyan0811
  • xieyan0811
  • 2017年02月20日 13:32
  • 4033

红外遥控器信号的接收和转发

 摘要:介绍用51系列单片机采集家用电器红外遥控器信号,并将其转发原理。文中给出红外接收芯片的外围电路和测量接收波形的程序。    关键词:红外遥控 单片机系统 转发红 外遥控在家电产品中有广泛...
  • gothicane
  • gothicane
  • 2007年04月17日 12:40
  • 1087

iOS耳机红外线遥控器

目前家里很多家用电器都是使用红外线遥控的,如果知道这些遥控器的红外编码,就可以使用手机利用手机的耳机口输出红外信号,从而把手机变成红外遥控器。目前输出红外信号可以通过一个红外发光二极管来实现。这个红外...
  • dfman1978
  • dfman1978
  • 2017年06月23日 14:30
  • 927

Arduino Uno  红外遥控 接收 和 发射信号 实验 (下)

在上一篇,制作了一块可以接收红外信号的板子,并且向板子发送了开关按键的信号...
  • ling3ye
  • ling3ye
  • 2017年01月07日 22:25
  • 5903

Arduino硬件开发--红外遥控舵机

硬件:Arduino uno板、红外遥控器、红外接收三极管、舵机、杜绑线;  端口:红外接收管VOUT脚接11,舵机信号接9; 效果:随机按红外遥控器1~9之间数字,对就舵机旋转20、40、60、...
  • neil89
  • neil89
  • 2015年07月24日 17:13
  • 2672

我也DIY一个Android遥控器-全部开源

记得宋宝华在「设备驱动开发详解」提出一个这样的理论「软件和硬件互相渗透对方的领地」,这次证明还是确实是这样,使用上层APP软件加上简单的更为简单的硬件设计就可以完成一个遥控器了。...
  • kangear
  • kangear
  • 2014年09月18日 17:58
  • 28602
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对于 红外遥控的信号处理 每一个按键都会有单独的操作【Arduino】
举报原因:
原因补充:

(最多只允许输入30个字)