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.
Tags:
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));}//
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por