Ir ao conteúdo
  • Cadastre-se

Arduino Controle Remoto IR + Interrupção Externa


Posts recomendados

Boa noite.

 

Estou tentando escrever um firmware para controle de uma luminária usando um controle remoto IR, porém estou com dificuldade para implementar a leitura do controle quando acionado através de uma interrupção, pois se implementado no loop principal a função para a leitura do controle, esta pode acabar não ler o sinal  do controle, uma vez que no loop principal possui o restante do código. Segue o código para teste:

 

// Programa : Teste Controle Remoto IR

//1 - FFA25D
//2 - FF629D
//3 - FFE21D
//4 - FF22DD
//5 - FF02FD
//6 - FFC23D
//7 - FFE01F
//8 - FFA857
//9 - FF906F
//0 - FF9867
//* - FF6897
//# - FFB04F
//
//cima     - FF18E7
//esquerda - FF10EF
//baixo    - FF4AB5
//direita  - FF5AA5
//ok       - FF38C7

#include <IRremote.h>

int RECV_PIN = 3;

int tecla;

IRrecv irrecv(RECV_PIN);
decode_results results;

void Controle_IR(){

  Serial.println("Desativado Interrupção");
  detachInterrupt(digitalPinToInterrupt(3));

  if (irrecv.decode(&results)){
    
    Serial.print("Valor lido : ");
    Serial.println(results.value, HEX);
    irrecv.resume();

    Serial.print("Tecla: ");

    tecla = results.value;

    switch (tecla) {
    
      case 0xFF9867:
        Serial.println("0");
      break;

      case 0xFFA25D:
        Serial.println("1");
      break;

      case 0xFF629D:
        Serial.println("2");
      break;

      case 0xFFE21D:
        Serial.println("3");
      break;

      case 0xFF22DD:
        Serial.println("4");
      break;

      case 0xFF02FD:
        Serial.println("5");
      break;

      case 0xFFC23D:
        Serial.println("6");
      break;

      case 0xFFE01F:
        Serial.println("7");
      break;

      case 0xFFA857:
        Serial.println("8");
      break;

      case 0xFF906F:
        Serial.println("9");
      break;

      case 0xFF6897:
        Serial.println("*");
      break;

      case 0xFFB04F:
        Serial.println("#");
      break;

      case 0xFF18E7:
        Serial.println("Cima");
      break;

      case 0xFF10EF:
        Serial.println("Esquerda");
      break;

      case 0xFF4AB5:
        Serial.println("Baixo");
      break;

      case 0xFF5AA5:
        Serial.println("Direita");
      break;

      case 0xFF38C7:
        Serial.println("OK");
      break;
      
    }
  }

  Serial.println("Ativada Interrupção");
  attachInterrupt(digitalPinToInterrupt(3), Controle_IR,FALLING);
  
}

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Inicializa o receptor IR
  pinMode(3, INPUT);
  attachInterrupt(digitalPinToInterrupt(3),Controle_IR,FALLING);
}

void loop()
{
  Serial.println(".");
  delay(1000);
}

Se alguém tiver uma ideia para resolver este problema ou até mesmo outro tipo de solução ficaria muito agradecido.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Reative a interrupção e nela coloque o mínimo possível de coisas pra fazer. Algo como:

void interrupt(){
tecla = results.value;
	switch (tecla) 	
	{
	case 0xFF9867: r=0; break;
	case 0xFFA25D: r=1; break;
	//		...
	}
}

e no loop principal avalie a variável r

if (r==0) Serial.println("0");
if (r==1) Serial.println("1");
//	...

...

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...