sexta-feira, 18 de janeiro de 2013

Controlando seu arduino via infra-red ! (2/2)

Continuando , cada botão do de cada controle possui um código.
No caso , utilizei 4 botões do mini controle .
O botão CH + , CH - , Vol + e Vol -  .
Apertando o botão CH + voce liga um led piloto e um relê (para ligar   uma carga maior ) , acionando o botão Vol. + , aciona o led piloto piscando e inversamente aciona o relê , fazendo a lâmpada piscar .
Acionando o botão CH - , voce desliga o modo piscante , ou ativa somente o relê , e finalmente acionando o botão Vol. - , desliga tudo .

Chega de papo e vamos a  parte que interessa .
As ligações eletrônicas .

Ligação do receptor IR , segue as mesmas ligações  do primeiro post
Acesse aqui .
Faça aqui o Download  da biblioteca IR , que deverá ficar descompactada  na pasta de bibliotecas .
(no windows eu não sei ao certo onde fica a pasta do arduino , mas acredito que siga o mesmo padrão )
No mac ela segue o caminho  (/Users/SeuUserAqui/Documents/Arduino/libraries)


Os pinos 2 e 3 acionam  os leds , do optoacoplador e do led piloto .
Lembrando que o led do opto que vai ligado ao pino 2  é muito sensível , e precisa de um resistor de 10Ω ( marrom , preto , preto ,dourado ) .
e o relê de 12 V  vai ligado ao transistor do opto .
e um outro led que dependendo da cor deverá ter um resistor para limitar a corrente .

Feitas as ligações , vamos a programação.


#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

#define BT_1 0xE880BBF6 //Botao 1
#define BT_2 0xE880BBD6 //Botao 2
#define BT_3 0xE880BBDE //Botao 3
#define BT_4 0xE880BBFE //Botao 4

#define LED_1 2 //Pino led 1
#define LED_2 3 //Pino led 2
#define LED_3 4 //Pino led 3
#define LED_4 5 //Pino led 4

int led1State = LOW; //Estado atual do led 1
int led2State = LOW; //Led 2
int led3State = LOW; //Led 3
int led4State = LOW; //Led 4

long bt = 0; //Ultimo botao precionado
unsigned long startMilis ; //Contado para blink sem delay

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();

  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(LED_4, OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {
    irrecv.resume();

    Serial.println(results.value, HEX); //Aqui voce descobre qual o botao do seu controle

    //Apenas para filtrar os botoes apertados, no meu caso para filtrar outros controles =)
    if(results.value == BT_1 || results.value == BT_2 || results.value == BT_3 || results.value == BT_4)
    {
      startMilis = millis(); //Apertou um botao, reseta o contador
      bt = results.value; //Salva ultimo botao apertado
    }
  }

  //Ativa o modo dos leds de acordo com o botao apertado
  switch(bt)
  {
    case BT_1 : mod(1); break;
    case BT_2 : mod(2); break;
    case BT_3 : mod(3); break;
    default: mod(0); break;
  }
}

void mod(int x)
{
  unsigned long currentMillis = millis();

  if(x == 0)
  {
    //Mod 0, tudo apagado
    led1State = LOW;
    led2State = LOW;
    led3State = LOW;
    led4State = LOW;
  }
  else if(x == 1)
  {
    //Mod 1, tudo aceso
    led1State = HIGH;
    led2State = HIGH;
    led3State = HIGH;
    led4State = HIGH;
  }
  
  else if(x == 3)
  {
    //Mod 3, arvore de natal
    mod(0);

    if(startMilis + 250 > currentMillis)
    {
      led1State = HIGH;
    }
    else if(startMilis + 500 > currentMillis)
    {
      led1State = LOW;
    }
    else if(startMilis + 750 > currentMillis)
    {
      led2State = HIGH;
    }
    else if(startMilis + 1000 > currentMillis)
    {
      led2State = LOW;
    }
    else
    {
      startMilis = currentMillis;
    }
  }

  digitalWrite(LED_1, led1State);
  digitalWrite(LED_2, led2State);
  digitalWrite(LED_3, led3State);
  digitalWrite(LED_4, led4State);
}



Nenhum comentário:

Postar um comentário