Controle Remoto Infravermelho + Arduino

Em um dos meus últimos projetos de faculdade precisei utilizar um sensor infravermelho no Arduino com uso de um controle remoto. O sensor utilizado foi o HX1838, e o controle foi comprado no Mercado Livre, muito utilizado para projetos, segue foto do controle e o sensor.

controle mais sensor

O esquema para ligação do infravermelho no Arduino está na foto abaixo:

arduinopna4602

Segue abaixo um primeiro código parar teste no Arduino:


#include <IRremote.h>

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

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn(); // Start the receiver
}

void loop() {
 if (irrecv.decode(&results)) {
 switch (results.value) {
 case 0xFFA25D:
 Serial.println("CH-");
 break;
 case 0xFF629D:
 Serial.println("CH");
 break;
 case 0xFFE21D:
 Serial.println("CH+");
 break;
 case 0xFF22DD:
 Serial.println("|<<");
 break;
 case 0xFF02FD:
 Serial.println(">>|");
 break;
 case 0xFFC23D:
 Serial.println("Play/Pause");
 break;
 case 0xFFE01F:
 Serial.println("Volume-");
 break;
 case 0xFFA857:
 Serial.println("Volume+");
 break;
 case 0xFF906F:
 Serial.println("EQ");
 break;
 case 0xFF9867:
 Serial.println("100+");
 break;
 case 0xFFB04F:
 Serial.println("200+");
 break;
 case 0xFF6897:
 Serial.println("0");
 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;
 }
 irrecv.resume(); // Receive the next value

 }
}

E para melhorar o tempo de resposta do controle, utilizei mais um código só que agora funcionando por interrupção, como a interrupção é via Hardware, a resposta se torna mais rápido quando utiliza-se o Arduino com outras funções no código principal.


#include <IRremote.h>

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

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn();
 attachInterrupt(0, controle, CHANGE);
}

void loop() {

 }

void controle()
{
if (irrecv.decode(&results)) {
 switch (results.value) {
 case 0xFFA25D:
 Serial.println("CH-");
 break;
 case 0xFF629D:
 Serial.println("CH");
 break;
 case 0xFFE21D:
 Serial.println("CH+");
 break;
 case 0xFF22DD:
 Serial.println("|<<");
 break;
 case 0xFF02FD:
 Serial.println(">>|");
 break;
 case 0xFFC23D:
 Serial.println("Play/Pause");
 break;
 case 0xFFE01F:
 Serial.println("Volume-");
 break;
 case 0xFFA857:
 Serial.println("Volume+");
 break;
 case 0xFF906F:
 Serial.println("EQ");
 break;
 case 0xFF9867:
 Serial.println("100+");
 break;
 case 0xFFB04F:
 Serial.println("200+");
 break;
 case 0xFF6897:
 Serial.println("0");
 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;
 }
 irrecv.resume(); // Receive the next value

 }
 }

E abaixo segue código para descobrir o código hexadecimal de um outro tipo de controle, se o infravermelho conseguir interpretar direitinho ele irá imprimir o código hexadecimal do botão na tela do console serial.

#include <IRremote.h>

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

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn(); // Start the receiver
}

void loop() {
 if (irrecv.decode(&results)) {
 Serial.print(results.value, HEX);
 irrecv.resume(); // Receive the next value
 Serial.println();
 }
}

Mas para funcionar é preciso utilizar a biblioteca IRremote, que pode ser baixado no download abaixo.

Integral - Métodos Trapézio e Simpson

Obrigado!

 

16 Comentários

  1. Otávio

    Vou Testar e passar para outras pessoas, Ok!

    Responder
  2. Junior

    funciona pra qualquer controle remoto???

    Responder
    1. gutomelo

      Funcionar funciona, agora você tem que saber o código de cada botão do novo controle.

      Responder
  3. Daniel

    Olá amigo, bela postagem!
    Sou bem iniciante em Arduino, portanto, gostaria de saber, se possível, como controlar um servo-motor (esquerda / direita) usando esse controle.
    Muito obrigado

    Responder
    1. gutomelo

      Cara, se tem como controlar tem. Agora terá que usar a biblioteca para servo (http://arduino.cc/en/Reference/Servo). Ae neste guia vc encontra tudo sobre servo.

      Responder
  4. leonardo jose

    Olá amigo, estou com um problema este codigo nao decodifica o controle da SKYHDTV… O que faço?

    Responder
    1. gutomelo

      Vc está fazendo tudo certo? Não tem algum problema eletrônico? já tentou ver com outro controle se funciona?

      Responder
      1. gutomelo

        Esses valores do case é para este tipo de controle, se for usar outro tipo, vc terá que descobrir o código de cada botão para o controle.

        Responder
      2. leonardo jose

        Sim eu uso esse controle diariamente. .. O esquema do arduino também está funcionando, esta configurado o controle da TV e funcionando.

        Responder
    2. gutomelo

      Eu atualizei o post com um código para descobrir o código HEX do botão de alguns controle. Tenta ae e me fala.
      Abraços.

      Responder
      1. Adriano Garcez

        Muito obrigado por esse código. Era exatamente o que estava precisando. Testei com vários controles, inclusive da Sky, e funcionou sem problemas.

        Agora preciso saber como mandar um código através do supervisório via Ethernet (ENC28J60) para acionar um ar condicionado. Deseje-me sorte.. rsrs.

        Responder
  5. Ronaldo

    Muito bom!!

    Responder
  6. Marcus Vinicius

    Estou com o seguinte problema: eu estou usando o código para descobrir os códigos hexadecimais dos botões do controle, mas ele apresenta sempre o mesmo erro, já importei as bibliotecas para a pasta correta e mesmo assim o erro persiste. Utilizo a versão mais recente da IDE do Arduíno. Segue o erro: This report would have more information with

    Arduino: 1.0.6 (Windows 7), Board: “Arduino Uno”
    C:UsersAvellDocumentsArduinoArduino IDEArduinolibrariesRobotIRremoteIRremoteTools.cpp:5: error: ‘TKD2’ was not declared in this scope

    Responder
    1. Ricardo Andrade

      Estou com o mesmo problema , conseguiu resolver ?

      Responder
  7. Sérgio

    Amigo, inclui seu código num programinha que usa outras bibliotecas
    #include ;
    #include ;
    #include ;.
    Quando tento compilar apresenta esta mensagem de erro no meu programa:

    core.a(Tone.cpp.o): In function __vector_13':
    C:Program Files (x86)Arduinohardwarearduinocoresarduino/Tone.cpp:535: multiple definition of
    __vector_13′
    IRremoteIRremote.cpp.o:C:Program Files (x86)ArduinolibrariesIRremote/IRremote.cpp:258: first defined here

    Responder
  8. Lukas RIbeiro

    Olá gutomelo, amigo se vc poder me ajudar, é o seguinte, eu peguei o receptor IR do meu dvd player velho e com o controle da minha tv eu obtive os codigos de cada função do controle da minha TV philips, até ai tudo bem, agr eu peguei o led IR do controle remoto velho e liguei na minha protoboard com um resistor de 330, e programei a minha sketch para que assim que eu colocar algum comando no monitor serial ele executar a função na TV, porem nao estou conseguindo, segue minha sketch:

    #include

    IRsend irsend;

    void setup()
    {
    Serial.begin(9600);

    }

    void loop() {
    switch (Serial.read()) {
    case ‘a’:{
    irsend.sendRC6(0x1000C, 20);
    Serial.println(“Canal 0”);
    break;
    }
    case ‘b’:{
    irsend.sendRC6(0x1000C, 20);
    Serial.println(“Canal 1”);
    break;
    }
    case ‘c’:{
    irsend.sendRC6(0xC, 32);
    Serial.println(“Canal 2”);
    break;
    }
    case ‘d’:{
    irsend.sendNEC(0x20DFC837, 32);
    Serial.println(“Canal 3”);
    break;
    }
    case ‘e’:{
    irsend.sendNEC(0x20DF28D7, 32);
    Serial.println(“Canal 4”);
    delay(100);
    }
    case ‘f’:{
    irsend.sendNEC(0x20DFA857, 32);
    Serial.println(“Canal 5”);
    break;
    }
    case ‘g’:{
    irsend.sendNEC(0x20DF6897, 32);
    Serial.println(“Canal 6”);
    break;
    }
    case ‘h’:{
    irsend.sendNEC(0x20DFE817, 32);
    Serial.println(“Canal 7”);
    break;
    }
    case ‘i’:{
    irsend.sendNEC(0x20DF18E7, 32);
    Serial.println(“Canal 8”);
    break;
    }
    case ‘j’:{
    irsend.sendNEC(0x20DF9867, 32);
    Serial.println(“Canal 9”);
    break;
    }
    case ‘l’:{
    irsend.sendNEC(0x20DF10EF, 32);
    Serial.println(“Ligando…ou… Desligando”);
    delay(100);
    break;
    }
    case ‘m’:{
    irsend.sendNEC(0x20DFC03F, 32);
    Serial.println(“Vol -“);
    delay(100);
    break;
    }
    case ‘n’:{
    irsend.sendNEC(0x20DF40BF, 32);
    Serial.println(“Vol +”);
    delay(100);
    break;
    }
    case ‘p’:{
    irsend.sendNEC(0x20DF00FF, 32);
    Serial.println(“CH+”);
    delay(100);
    break;
    }
    case ‘q’:{
    irsend.sendNEC(0x20DF807F, 32);
    Serial.println(“CH-“);
    delay(100);
    break;
    }
    }

    }

    Voce poderia me ajudar a resolver este problema? Obrigado

    Responder

Deixar um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *