Emissão de Infravermelho para o Loop

Bom dia/tarde/noite Galera!

Estou tendo problema com meu projeto, vou detalhar:

Objetos:
Arduino Uno
Controle do tipo Car mp3(padrão que vem com o arduino)
Emissor de Infravermelho
Receptor de Infravermelho
Relé

Objetivo:
Conseguir Ligar e Desligar o relé, e aumentar o volume do meu som por um controle que emita infravermelho

Problema:
Consigo ligar e desligar o Rele sem problemas, infinitas vezes se precisar. Porém ao acessar o caso de "Aumentar o volume do Som" ele consegue de fato aumentar o volume do som, mas após isso não consigo mais aumentar o som ou ligar/desligar o rele. Coloquei um "chegou aqui" para simbolizar que chegou ao final do loop, e ele chega, mas não recebe mais códigos. Imagino que deva estar usando a função emissorIR.sendRaw errado.

Codigo:

// INCLUSÃO DE BIBLIOTECA
#include <IRremote.h>

// DIRETIVAS DE COMPILAÇÃO
#define tempoTecla 350
#define frequencia 38 // kHz
#define pinoRele  2
#define pinSensor 10

// INSTANCIANDO OBJETOS
IRsend emissorIR;
IRrecv sensorIR (pinSensor);

unsigned int teclaA[] = {9150,4450, 600,550, 550,550, 600,550, 600,500, 600,550, 550,550, 600,550, 550,550, 600,1650, 600,1600, 600,500, 650,1600, 600,1600, 600,1600, 650,1600, 600,1600, 600,550, 600,500, 600,1650, 600,500, 600,550, 600,500, 600,1600, 650,500, 600,1600, 600,1650, 600,500, 600,1600, 650,1600, 600,1600, 600,550, 600,1600, 600};
//Codigo que faz aumentar o volume do meu som

void setup() 
{
  Serial.begin(9600);
  Serial.print("Setup Iniciado\n");
  pinMode(pinoRele, OUTPUT);
  digitalWrite(pinoRele, LOW);
  sensorIR.enableIRIn();
  Serial.print("Setup Concluído\n");
}

void loop() 
{
 decode_results comando;
  if (sensorIR.decode(&comando)) 
  {
    switch(comando.value) 
    {
      case (0xFFA857):  //problema
      {
          Serial.println("Aumentando o volume do Som");
          emissorIR.sendRaw(teclaA, sizeof(teclaA) / sizeof(teclaA[0]), 39);
          delay(tempoTecla);
          break;
      }    
      case (0xFFE21D):  //funciona
      {
          Serial.println("Ligando a Luz");
          digitalWrite(pinoRele, HIGH); 
          delay(tempoTecla);
          break;
      }
      case(0xFFA25D):   //funciona
      {
          Serial.print("Desligando Lampada\n");
          digitalWrite(pinoRele, LOW);
          delay(tempoTecla);
          break;
      }
    }
    sensorIR.resume();
    Serial.println("Chegou aqui");
  }
}


Eis na imagem o que acontece: Ele aumentou o volume do som emitindo infravermelho mas o código não aceita mais outros comandos. Anteriormente ligou e desligou o relé sem problemas, porém bugou quando chegou na parte de emitir o infravermelho e retornar ao loop infinito.

moved to Português

qual arduino você tem?

Uno

Boa noite @murilow ,
vi estas informações iniciais.

O receptor infravermelho não está sendo afetado pelo emissor?
Eles estão montados bem separados?

RV mineirin

Não, ele está longe. Acho que o problema pode estar na biblioteca.
Testei a desse vídeo e envia os comando porém trava durante a execução do código: https://www.youtube.com/watch?v=okP5wnUuHzU
E também Tentei essa: GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols
Essa última o código roda, porém não envia o sinal para o meu som.

por que 39. Normalmente é 38

Oi @murilow , eu estou em uma praia quase deserta e só tenho acesso à um celular.
Vou ficar por aqui mais uma semana, mas qdo eu voltar se não tiver resolvido ainda, eu monto o seu projeto na minha bancada e tento descobrir o problema.
.
RV mineirin

Ola,

Qual a versão da biblioteca IRremote instalada, 3.3.0? (Para confirmar: menu "Tools" > "Manage Libraries" e colocar na caixa de pesquisa "IRremote").

O emissor está ligado no pino 3 do Arduino Uno?

Poderia ficar mais fácil ajudar com um esquema simples do projecto. Basta uma foto de um esquema desenhado num papel em 5min...

Só estava testando algo diferente, mas primordialmente testei com 38 e mesmo assim não funciona

Obrigado pela insistência @ruilviana , agradecido. Estou Vendo um vídeo bem interessante sobre, vou ver se funciona: https://www.youtube.com/watch?v=5yyy7h7qh80
By the Way: canal muito bom

OK

você pode responder às perguntas no # 8? (de @tinyelectr)

Exatamente, estava usando a versão 3.3.0. Sim o emissor esta no pino 3 digital do arduino Uno.
Esquema a mão:


OBs: Tem dois pingos de café que por acidente caíram na minha folha
Eu fatorei o código, pois eu quero que ele ligue o Home Theater, a TV e o Relé. Porém mesmo com somente a função Aumentar o volume do som o meu sketch não funciona

Você pode tentar isso

#include <IRremote.h>

const byte IR_RECEIVE_PIN = 2;
const byte IR_SEND_PIN = 13;
const byte pinoRele = 3;


const unsigned int teclaA[] = {
  9150, 4450, 600, 550, 550, 550, 600, 550, 600, 500,
  600, 550, 550, 550, 600, 550, 550, 550, 600, 1650,
  600, 1600, 600, 500, 650, 1600, 600, 1600, 600, 1600,
  650, 1600, 600, 1600, 600, 550, 600, 500, 600, 1650,
  600, 500, 600, 550, 600, 500, 600, 1600, 650, 500,
  600, 1600, 600, 1650, 600, 500, 600, 1600, 650, 1600,
  600, 1600, 600, 550, 600, 1600, 600
};
const byte teclaALen = sizeof teclaA / sizeof teclaA[0];

void volumeUP() {
  Serial.println(F("Aumentando o volume do Som"));
  IrReceiver.stop();
  IrSender.sendRaw(teclaA, teclaALen, 38);
  IrReceiver.start();
}

void releOn() { // Ligando a Luz
  Serial.println(F("Ligando a Luz"));
  digitalWrite(pinoRele, HIGH);
}

void releOff() { // Desligando Lampada
  Serial.println(F("Desligando Lampada"));
  digitalWrite(pinoRele, LOW);
}

void setup() {
  pinMode(pinoRele, OUTPUT);
  digitalWrite(pinoRele, LOW);
  Serial.begin(115200);
  IrReceiver.begin(IR_RECEIVE_PIN);
  IrSender.begin(IR_SEND_PIN, DISABLE_LED_FEEDBACK);
  IrReceiver.start();
}

void loop() {

  if (IrReceiver.decode()) {
    if (((IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT) == 0) && (IrReceiver.decodedIRData.command != 0)) {
      Serial.print(F("Command: 0x")); Serial.println(IrReceiver.decodedIRData.command, HEX);
      switch (IrReceiver.decodedIRData.command) {
        case 0xFFA857: volumeUP();  break;  // Aumentando o volume do Som
        case 0xFFE21D: releOn();    break;  // Ligando a Luz
        case 0xFFA25D: releOff();   break;  // Desligando Lampada
        default: break;
      }
    }
    IrReceiver.resume();
  }
}

você tem que mudar as conexões:

  • IR_RECEIVE_PIN = 2
  • IR_SEND_PIN = 13
  • pinoRele = 3

você tem que adaptar os códigos de comando para o que você verá impresso, já que a nova API oferece algo diferente

        case 0xFFA857: volumeUP();  break;  // Aumentando o volume do Som
        case 0xFFE21D: releOn();    break;  // Ligando a Luz
        case 0xFFA25D: releOff();   break;  // Desligando Lampada

o monitor serial deve ser aberto em 115200 baud

1 Like

Bom dia @murilow ,
conforme prometido, montei aqui um arduino e tenho os mesmos problemas qdo uso a
função sendRaw().
O programa até sai do switch, mas não aceita receber mais nenhum IRcode.
Estou achando que é algum problema de versão da biblioteca IRemote.
Qual a versão da sua biblioteca.
A minha é : 2.1.
Vou baixar a mais nova versão e testar novamente.

RV mineirin

Boa tarde @murilow,
baixei a versão 3.1 da biblioteca e tive que fazer algumas mudança no sketch para adequá-lo á nova biblioteca.
Também mudei os valores do RC para o meu modelo de RC.
Mas coloquei uma linha imprimindo o valor recebido do RC, pois acho que vc também vai ter que mudar seu valores.

Seguem listagem do sketch e printout da serial.

RV minierin

Sketch

// INCLUSÃO DE BIBLIOTECA
#include <IRremote.h>

// DIRETIVAS DE COMPILAÇÃO
#define tempoTecla 350
#define frequencia 38 // kHz
#define pinoRele  2
#define pinSensor 10

// INSTANCIANDO OBJETOS
IRsend emissorIR;
IRrecv sensorIR (pinSensor);
bool flag = false;
unsigned int teclaA[] = {9150, 4450, 600, 550, 550, 550, 600, 550, 600, 500, 600, 550, 550, 550, 600, 550, 550, 550, 600, 1650, 600, 1600, 600, 500, 650, 1600, 600, 1600, 600, 1600, 650, 1600, 600, 1600, 600, 550, 600, 500, 600, 1650, 600, 500, 600, 550, 600, 500, 600, 1600, 650, 500, 600, 1600, 600, 1650, 600, 500, 600, 1600, 650, 1600, 600, 1600, 600, 550, 600, 1600, 600};
//Codigo que faz aumentar o volume do meu som
//-----------------------------------------------------------------------------------
void setup()
{
  //Serial.begin(9600);
  Serial.begin(115200);
  Serial.print("Setup Iniciado\n");
  pinMode(pinoRele, OUTPUT);
  digitalWrite(pinoRele, LOW);
  sensorIR.enableIRIn();
  Serial.print("Setup Concluído\n");
}
//-----------------------------------------------------------------------------------
void loop()
{
  //decode_results comando;
  if (sensorIR.decode())
  {
    Serial.println(sensorIR.decodedIRData.decodedRawData,HEX);
    switch (sensorIR.decodedIRData.decodedRawData)
    {
      //case (0xFFA857):  //problema
      case (0xFD02FB04):  // meu RC
        {
          Serial.println("Aumentando o volume do Som");
          emissorIR.sendRaw(teclaA, sizeof(teclaA) / sizeof(teclaA[0]), 39);
          flag = true;
          delay(tempoTecla);
          break;
        }
      //case (0xFFE21D):  //funciona
      case (0xEE11FB04):  // meu RC
        {
          Serial.println("Ligando a Luz");
          digitalWrite(pinoRele, HIGH);
          delay(tempoTecla);
          break;
        }
      //case (0xFFA25D):  //funciona
      case (0xEC13FB04):  // meu RC
        {
          Serial.print("Desligando Lampada\n");
          digitalWrite(pinoRele, LOW);
          delay(tempoTecla);
          break;
        }
    }
    sensorIR.resume();
    Serial.println("Chegou aqui");
  }
  if (flag == true)
  {
    emissorIR.sendRaw(teclaA, sizeof(teclaA) / sizeof(teclaA[0]), 39);
    flag = false;
    sensorIR.resume();
  }
}

Printout serial

Setup Iniciado
Setup Concluído
EE11FB04
Ligando a Luz
Chegou aqui
EC13FB04
Desligando Lampada
Chegou aqui
FD02FB04
Aumentando o volume do Som
Chegou aqui
FD02FB04
Aumentando o volume do Som
Chegou aqui
FD02FB04
Aumentando o volume do Som
Chegou aqui
FD02FB04
Aumentando o volume do Som
Chegou aqui

1 Like

Obrigado @ruilviana , era erro na minha biblioteca mesmo. E conforme eu trocava as versões, tinha que mudar alguma lógica na programação. Mas agora funciona certinho

Funcionou certinho também! Se puder me indicar aonde eu estava cometendo o erro, eu agradeço

Usei a nova API.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.