lqh 发表于 2016-1-6 08:24:30

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

    新手上路,望大家赐教。在坛子里经常看到有关红外线接收和发射的问题,有些问题其实比较简单,直接用好库里的例子就好了,但有些问题还是有一点点难度。比如,将红外接收后直接转码发射的问题,就有一点难度了,但这个转码的功能的确很实用,所以,很有必要研究解决。本人花费了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;   
   
   }      
}
}

lqh 发表于 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();//发射完后,必须重新使能红外接收进程,此函数使定时器中断
}

zhangdeyue1 发表于 2016-5-10 17:32:15

支持一个!!!!!!!!!!!
页: [1]
查看完整版本: 解决Arduino红外转码发射的问题