Ir ao conteúdo

Posts recomendados

Postado

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.

  • Membro VIP
Postado

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");
//	...

...

 

 

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!