极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12972|回复: 2

解决Arduino红外转码发射的问题

[复制链接]
发表于 2016-1-6 08:24:30 | 显示全部楼层 |阅读模式
    新手上路,望大家赐教。在坛子里经常看到有关红外线接收和发射的问题,有些问题其实比较简单,直接用好库里的例子就好了,但有些问题还是有一点点难度。比如,将红外接收后直接转码发射的问题,就有一点难度了,但这个转码的功能的确很实用,所以,很有必要研究解决。本人花费了2个小时进行调式,现将通过调式的代码与大家交流,望各位大虾批评指正。

#include <IRremote.h>

int RECV_PIN = 11;//一体化红外接收头接11脚
IRrecv irrecv(RECV_PIN);
decode_results results;

int X=0;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // 使能红外接收进程,此函数使定时器中断
  
}

void loop() {
   
    if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
   
    switch(results.value)
    {
     case 0x288823DC:
     {
      X=1;
      break;
      }

      case 0x2888A35C:
     {
      X=2;
      break;
      }
     }   
    irrecv.resume(); // 接收下一个数据
   }

     switch(X)
     {
      case 1:
    {
      X=0;
      IRsend irsend;//创建一个发射对象,红外发射二极管必须接3脚
      for (int i = 0; i < 3; i++) {
      irsend.sendSony(0xa90, 12); // Sony TV power code
      Serial.println("send 1!");
      delay(100);
      }
      irrecv.enableIRIn();//发射完后,必须重新使能红外接收进程,此函数使定时器中断
      break;      
   
     }
      case 2:
     {
      X=0;
      IRsend irsend;
      for (int i = 0; i < 3; i++) {
      irsend.sendSony(0xa99, 12); // Sony TV power code
      Serial.println("send 2!");
      delay(100);  
      }
       irrecv.enableIRIn();//发射完后,必须重新使能红外接收进程,此函数使定时器中断
      break;     
   
     }      
  }  
}
回复

使用道具 举报

 楼主| 发表于 2016-1-8 10:29:55 | 显示全部楼层
补充一下,或许这样更清晰一些!
#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

int X=0;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // 使能红外接收进程,此函数使定时器中断
  
}

void loop() {
   
    if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
   
    switch(results.value)
    {
     case 0x288853AC:
     {
      X=1;
      break;
      }

      case 0x28884BB4:
     {
      X=2;
      break;
      }
     
      case 0x28889966:
     {
      X=3;
      break;
      }

      case 0x2888837C:
     {
      X=4;
      break;
      }

      case 0x2888738C:
     {
      X=5;
      break;
      }

      case 0x2888A956:
     {
      X=6;
      break;
      }     
      case 0x2888639C:
     {
      X=7;
      break;
      }
         case 0x288823DC:
     {
      X=8;
      break;
      }
         case 0x2888A35C:
     {
      X=9;
      break;
      }
     }   
    irrecv.resume(); // 接收下一个数据
   }

     switch(X)
     {
      case 1:
    {
      X=0;
      sendNECled(0xFFE21D);
      break;      
   
     }
      case 2:
     {
      X=0;
      sendNECled(0xFFD22D);
      break;     
   
     }

     case 3:
    {
      X=0;
      sendNECled(0xFF12ED);
      break;      
   
     }
      case 4:
     {
      X=0;      
      sendNECled(0xFF52AD);
      break;   
     }

      case 5:
    {
      X=0;
      sendNECled(0xFF926D);
      break;      
   
     }
      case 6:
     {
      X=0;
      sendNECled(0xFF32CD);
      break;      
     }
      case 7:
     {
      X=0;      
      sendNECled(0xF1567EA);
      break;   
     }

      case 8:
    {
      X=0;
      sendRC6led(0x059);
      break;      
   
     }
      case 9:
     {
      X=0;
      sendRC6led(0x05C);
      break;      
     }         
  }  
}

void sendNECled(long J){
  
    IRsend irsend;
      delay(100);
      for (int i = 0; i < 1; i++) {
      irsend.sendNEC(J, 32); // Sony TV power code
      Serial.println("send OK!");
      delay(40);  
      }
irrecv.enableIRIn();//发射完后,必须重新使能红外接收进程,此函数使定时器中断
}

void sendRC6led(long J){
  
    IRsend irsend;
      delay(100);
      for (int i = 0; i < 1; i++) {
      irsend.sendRC6(J, 12); // Sony TV power code
      Serial.println("send OK!");
      delay(40);  
      }
irrecv.enableIRIn();//发射完后,必须重新使能红外接收进程,此函数使定时器中断
}
回复 支持 反对

使用道具 举报

发表于 2016-5-10 17:32:15 | 显示全部楼层
支持一个!!!!!!!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 06:33 , Processed in 0.044490 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表