Olá,

Estou tentando usar um único botão do controle remoto do Arduino para acionar o motor.

A biblioteca e o acionamento já esta ok, mas toda vez que eu retorno para o loop principal o receptor retorna com o ultimo valor lido, por conta disso o meu armário fica abrindo e fechando todo momento.

O meu código ficou assim:

Obs. Deixei algumas linhas do comando entre */ porque eu estou tentando não usar o botão local e sim o remoto.

Desde já muito obrigado.

// Projeto - Amarario para pessoas portadoras de necessidades especiais.
// Acionamento por controle remoto

#include <IRremote.h>

int releA = 10; //Rele para abrir o armário.
int releF = 12; //Rele para fechar o armário.
int aFechado = 5; //Sensor fim de curso
/*int botao = 3; //Botão que inicia o sistema*/
int delayPeriod = 2800; // Atraso de 2,6 segundos
int RECV_PIN = 11;
float armazenaValor;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
pinMode(releA, OUTPUT); //Define o pino 10 como saída.
pinMode(releF, OUTPUT); //Define o pino 12 como saída.
pinMode(aFechado, INPUT); //Define o pino 5 como entrada
/*pinMode(botao, INPUT); //Define o pino 3 como entrada*/
digitalWrite(aFechado, HIGH); //Habilita resistor de Pull Up na entrada 5
/*digitalWrite(botao, HIGH); //Habilita resistor de Pull Down na entrada 3*/
Serial.begin(9600);
irrecv.enableIRIn(); //Inicializa o receptor IR
}

void loop()

{
if (irrecv.decode(&results))
{
Serial.print("Valor lido : ");
Serial.println(results.value, HEX);
armazenaValor = (results.value);
if (((armazenaValor) == 0xFF30CF) && (digitalRead(aFechado) == HIGH)) //Se o botão foi acionado e o armário estiver fechado, vai para função que abre o armário.
{
openCloset(); //Função que abre o armário
}
else if (((armazenaValor) == 0xFF30CF) && (digitalRead(aFechado) == LOW)) //Se o botão estiver acionado e o armário estiver aberto, vai para função fechar armário.
{
closeCloset(); //Função que fecha o armário
}
else //Se não
{
loop(); //Vai para função checkButton
}
}
}

void openCloset() //Função que abre o armário
{
digitalWrite(releA, HIGH); //Adiciona 5V na saída para comutar o rele de abertura
delay(delayPeriod); //Aguarda 2600ms
digitalWrite(releA, LOW); //Retira o 5V da entrada para desligar o motor
loop(); //Vai para a função checkButton
}

void closeCloset() //Função que fecha o armário
{
digitalWrite(releF, HIGH); //Adiciona 5V na saída para comutar o rele de fechamento
delay(delayPeriod); //Aguarda 2600ms
digitalWrite(releF, LOW); //Retira o 5V da entrada para desligar o motor
loop(); ////Vai para a função checkButton
}

Exibições: 442

Anexos

Responder esta

Respostas a este tópico

Rodrigo,

Experimente zerar sua variável float, no inicio do código:

void loop()

{

armazenaValor=0;


if (irrecv.decode(&results)) 
{
Serial.print("Valor lido : ");
Serial.println(results.value, HEX);
armazenaValor = (results.value);
if (((armazenaValor) == 0xFF30CF) && (digitalRead(aFechado) == HIGH)) //Se o botão foi acionado e o armário estiver fechado, vai para função que abre o armário.
{
openCloset(); //Função que abre o armário
}
else if (((armazenaValor) == 0xFF30CF) && (digitalRead(aFechado) == LOW)) //Se o botão estiver acionado e o armário estiver aberto, vai para função fechar armário.
{
closeCloset(); //Função que fecha o armário
}
else //Se não
{
loop(); //Vai para função checkButton
}
}
}

Olá Andrade, obrigado pela resposta, mas infelizmente não zerou.

Estranho, eu também achei que dessa forma conseguiríamos zerar o valor lido pelo receptor do IR.

Tem mais alguma dica? 

Victor, cara. Muito obrigado. Funcionou do jeito que você colocou no chat.

 O irrecv.resume();, funcionou sim. Apenas tive que adicionar ele em todas as minhas outras funções dentro do Sketch e tbm colocar um delay(250) quando volto para o loop principal. Muito obrigado Victor. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço