Ligar e desligar uma uma sequencia de leds por controle Ir

Olá, estou com um problema envolvendo o arduino. Tenho um projeto onde em um controle IR ao ser pressionado determinado botão (power por exemplo), o arduino reconhecerá qual botão foi pressionado (power sendo interpretado como o número 8) e então executará a função de ascender três leds em sequência, essa sequencia precisa ficar sendo repetida até que o botão seja novamente pressionado, ou que outro seja pressionado. 

Apenas tenho conseguido ou realizar a sequência uma unica vez para cada vez que é pressionado, ou iniciar a sequencia ao pressionar o botão e depois não conseguir desliga-la. 

A parte do código que traduz os pulsos do controle IR é essa: 
 

int getIRKey() {
int data[BIT_PER_BLOCK];
int i;
while(pulseIn(irPin, HIGH) < start_bit); //Wait for a start bit

for(i = 0 ; i < BIT_PER_BLOCK ; i++)
data[i] = pulseIn(irPin, HIGH); //Start measuring bits, I only want HIGH pulses

delay(100);
for(i = 0 ; i < BIT_PER_BLOCK ; i++) //Parse them
{
if(data[i] > bin_1) //is it a 1?
data[i] = 1;
else if(data[i] > bin_0) //is it a 0?
data[i] = 0;
else
return -1; //Flag the data as invalid; Return -1 on invalid data
}

int result = 0;
for(i = 16 ; i < 24; i++) {
if(data[i] == 1) result |= (1i-16); //Convert data bits to integer
}
return result; //Return key number
}


E depois é declarado a variável que irá receber o valor já traduzido do controle:
 
int key = getIRKey();  

Então um switch case é aberto para o "key" e, caso key for igual a 8 (power do controle), a função é realizada.  Nessa parte eu preciso fazer com que cada vez que o botão for pressionado a sequencia comece a ser executada e só desligue quando for pressionado novamente.

Grato a todos que puderem me salvar, realmente estou precisando.

Exibições: 1006

Responder esta

Respostas a este tópico

Victor,

Eu uso uma lib para pegar os comandos do controle remoto, acho mais fácil. No meu blog tem um post sobre o assunto que acabei de fazer: http://automatobr.blogspot.com.br/2013/11/controle-remoto-para-pc-i.... Lá tem o link prá vc baixar essa lib e o fonte para vc testá-la.

[],

Mauro Assis

Oi Victor, como disse nosso amigo Mauro o uso da biblioteca facilita muito no código também te aconselho usar mas acho que seu maior problema não seja receber os dados do controle mas sim controlar o funcionamento dos leds segue abaixo um sketch de exemplo do meu projeto talvez possa te ajudar

#include <IRremote.h>


int RECV_PIN = 3;//define pino 3 que é PWM para receber o sinal
IRrecv irrecv(RECV_PIN);
decode_results results;
byte x = 0;//variavel para definir uma tecla do controle para mudar de canal(de 1 para 2 e viceversa)
void led1();//inicia as chamadas void
void led2();//
void led3();//
void led4();//

void setup(){

Serial.begin(9600);
irrecv.enableIRIn(); // inicia a recepção

pinMode(10,OUTPUT);//define os pinos dos leds
pinMode(11,OUTPUT);//
pinMode(12,OUTPUT);//
pinMode(13,OUTPUT);//

digitalWrite(10,LOW);//inicia os pinos como LOW
digitalWrite(11,LOW);//
digitalWrite(12,LOW);//
digitalWrite(13,LOW);//

}

void loop(){

if (irrecv.decode(&results)){
Serial.println(results.value);//imprime o valor recebido na serial
irrecv.resume();
//atenção substitua os códigos numericos deste exemplo pelos códigos de seu controle remoto de acordo com seu projeto

if(results.value == 16753245){ x = 1; Serial.println(x);}//compara o valor se ok define x como canal 1
if(results.value == 16736925){ x = 2; Serial.println(x);}//compara o valor e se ok muda para canal 2

//as definições de canal fazem parte do meu projeto e são opcionais se não for usa-las é só excluir

if(x == 1 && results.value == 16769055){led1();}//comandos feitos pelo canal 1
if(x == 1 && results.value == 16754775){led2();}//

if(x == 2 && results.value == 16769055){led3();}//comandos feitos pelo canal 2
if(x == 2 && results.value == 16754775){led4();}//obs: note que as teclas são as mesmas nos dois canais, seta para cima e seta para baixo no meu controle

if(results.value == 16748655){led1();led2();led3();led4();}//nesse comando uma tecla ascende o 4 leds sem definição de canal
}

}
void led1(){digitalWrite(10, !digitalRead(10));}//entre estas chaves inserimos os comandos em uma ou várias linhas
void led2(){digitalWrite(11, !digitalRead(11));}//da mesma forma que fazemos no loop principal
void led3(){digitalWrite(12, !digitalRead(12));}//
void led4(){digitalWrite(13, !digitalRead(13));}//

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço