Como usar controle PPA (de alarme, portão eletrônico) com arduino (código sem erros e sem travamentos)

Olá, amantes de robótica!
Estamos fazendo uma central de alarme e disponibilizarei o código e um tutorial aqui no site em breve, mas, por agora, mostrarei como decodificar o controle remoto de 433Mhz , esse código funciona 100%, sem erros e sem travamento, agradeço ao autor do código pela contribuição!



Veja o vídeo do controle em funcionamento:



Vamos ao material que precisamos: 



Qtd     Itens:
1      -  Arduino UNO ou qualquer outra versão;
1      -  LED;
1      -  Controle de alarme ou portão, PPA, Tx de 433MHz;
1      -  Receptor RX 433Mhz;
3      -  Jumpers (Fios);
1      -  Fios de 17 cm para ser a antena do receptor.

Não sabe onde comprar as peças, confira esse post:  onde comprar arduino e componentes

Vamos à montagem:



Basta fazer as mesmas conexões da imagem abaixo:
(clique na imagem pra ampliá-la)

Atenção: para que o receptor receba o sinal normal à uma distancia de até aproximadamente 200 metros, é necessário que ele tenha antena, que é um fio de 17 cm, igual ao da foto abaixo.
Os dois pinos centrais do receptor são de dados (DATA), ou seja, tanto faz qual você usará no arduino.

Veja as fotos do projeto:














O mais importante, o código fonte:


Não sabe programar? Então acesse: Como programar em Arduíno, fazer robôs e projetos diversos
Se você é iniciante veja:Como enviar (upload) o programa pronto para a placa do arduino uno, mega entre outros

 /*   
 TITLE:    DECODER FOR HT6P20B ENCODER  
 CREATED BY: AFONSO CELSO TURCATO  
 DATE:    18/JUN/2014  
 E-MAIL:   acturcato (at) gmail.com  
 LICENSE:   GPL  
 REV.:    04  
 Alterações: Criando Robô Com Arduino  
 http://www.criandorobocomarduino.com/  
 Site do criador do código:  
 http://acturcato.wordpress.com/2013/12/20/decodificador-para-o-encoder-ht6p20b-em-arduino/  
 */  
 const byte pinRF = 2; // Pin where RF Module is connected. If necessary, change this for your project  
 int lambda;   // on pulse clock width (if fosc = 2KHz than lambda = 500 us)  
 struct rfControl    //Struct for RF Remote Controls  
 {  
   unsigned long addr; //ADDRESS CODE  
   boolean btn1;    //BUTTON 1  
   boolean btn2;    //BUTTON 2  
 };  
 boolean ACT_HT6P20B_RX(struct rfControl &_rfControl){   
  static boolean startbit;   //checks if start bit was identified  
  static int counter;      //received bits counter: 22 of Address + 2 of Data + 4 of EndCode (Anti-Code)  
  static unsigned long buffer; //buffer for received data storage  
  int dur0, dur1; // pulses durations (auxiliary)  
  if (!startbit)  
  {// Check the PILOT CODE until START BIT;  
   dur0 = pulseIn(pinRF, LOW); //Check how long DOUT was "0" (ZERO) (refers to PILOT CODE)  
   //If time at "0" is between 9200 us (23 cycles of 400us) and 13800 us (23 cycles of 600 us).  
   if((dur0 > 9200) && (dur0 < 13800) && !startbit)  
   {    
    //calculate wave length - lambda  
    lambda = dur0 / 23;  
    //Reset variables  
    dur0 = 0;  
    buffer = 0;  
    counter = 0;  
    startbit = true;  
   }  
  }  
  //If Start Bit is OK, then starts measure os how long the signal is level "1" and check is value is into acceptable range.  
  if (startbit && counter < 28)  
  {  
   ++counter;  
   dur1 = pulseIn(pinRF, HIGH);  
   if((dur1 > 0.5 * lambda) && (dur1 < (1.5 * lambda))) //If pulse width at "1" is between "0.5 and 1.5 lambda", means that pulse is only one lambda, so the data é "1".  
   {  
    buffer = (buffer << 1) + 1;  // add "1" on data buffer  
   }  
   else if((dur1 > 1.5 * lambda) && (dur1 < (2.5 * lambda))) //If pulse width at "1" is between "1.5 and 2.5 lambda", means that pulse is two lambdas, so the data é "0".  
   {  
    buffer = (buffer << 1);    // add "0" on data buffer  
   }  
   else  
   {  
    //Reset the loop  
    startbit = false;  
   }  
  }  
  //Check if all 28 bits were received (22 of Address + 2 of Data + 4 of Anti-Code)  
  if (counter==28)   
  {   
   // Check if Anti-Code is OK (last 4 bits of buffer equal "0101")  
   if ((bitRead(buffer, 0) == 1) && (bitRead(buffer, 1) == 0) && (bitRead(buffer, 2) == 1) && (bitRead(buffer, 3) == 0))  
   {     
    counter = 0;  
    startbit = false;  
    //Get ADDRESS CODE from Buffer  
    _rfControl.addr = buffer >> 6;  
    //Get Buttons from Buffer  
     _rfControl.btn1 = bitRead(buffer,4);  
     _rfControl.btn2 = bitRead(buffer,5);  
    //Serial.print("Address: "); Serial.println(_rfControl.addr, HEX);  
    //Serial.print("Button1: "); Serial.println(_rfControl.btn1, BIN);  
    //Serial.print("Button2: "); Serial.println(_rfControl.btn2, BIN);  
    //Serial.println();  
    //If a valid data is received, return OK  
    return true;  
   }  
   else  
   {  
    //Reset the loop  
    startbit = false;  
   }  
  }  
  //If none valid data is received, return NULL and FALSE values   
  _rfControl.addr = NULL;  
  _rfControl.btn1 = NULL;  
  _rfControl.btn2 = NULL;   
  return false;  
 }  
 void setup(){    
  pinMode(pinRF, INPUT);  
  pinMode(13, OUTPUT);  
  Serial.begin(9600);  
 }  
 void loop(){  
  digitalWrite(13, digitalRead(pinRF)); //blink de onboard LED when receive something  
  struct rfControl rfControl_1;  //Set variable rfControl_1 as rfControl type  
  if(ACT_HT6P20B_RX(rfControl_1))  
  {  
   //If a valid data is received, print ADDRESS CODE and Buttons values    
   Serial.print("Address: "); Serial.println(rfControl_1.addr, HEX);  
   Serial.print("Button1: "); Serial.println(rfControl_1.btn1, BIN);  
   Serial.print("Button2: "); Serial.println(rfControl_1.btn2, BIN);  
   Serial.println();  
   //PEGUE O "ADDRESS" E COLOQUE NA FRENTE DELE "0x" para poder comparar  
   if (rfControl_1.addr == 0x249FB2){  
    if ((rfControl_1.btn1 == 1) && (rfControl_1.btn2 == 0)){//se botão 1 for pressionado  
      digitalWrite(13,HIGH);  
    }  
    if ((rfControl_1.btn1 == 0) && (rfControl_1.btn2 == 1)){//se botão 2 for pressionado  
      digitalWrite(13,LOW);  
    }  
    if ((rfControl_1.btn1 == 1) && (rfControl_1.btn2 == 1)){//se botão 3 for pressionado  
      digitalWrite(13,HIGH);  
      delay(1000);  
      digitalWrite(13,LOW);  
      delay(1000);  
    }  
   }  
  }  
 }  

O código acima não é nossa. Alterei para fazer comparações de códigos recebidos.

Código fonte de controle ppa funcionando sem erros e travamentos.

Pronto, qualquer duvida é só deixar nos comentários ou entrar em Contato 

Quer ajuda ou quer ajudar? Clique em Ajuda e veja como você pode ajudar ou ser ajudado.



6 comentários:

  1. Mas como enviar o código recebido pelo arduino?

    ResponderExcluir
  2. Muito bom o seu projeto parabéns.
    Gostaria de alterar o código para abrir/fechar um portão de correr, usando 02 reles( um abre, outro fecha o portão); 02 fim de curso ( na confirmação do portão aberto ou fechado; barreira eletronica ( para pedestre).
    Como ficaria este código?
    Help...
    segue email: robertocarlosalvarenga@hotmail.com
    obrigado desde já

    ResponderExcluir
  3. Amigo, como faço para controlar um motor de 12 volts ou um motor de 220 volts com este projeto por sinal muito interessante?.

    ResponderExcluir
  4. boa noite, obrigado pelo projeto... fiz tudo certim meu led fica piscando e so para quando aperto e fico apertado. e qualquer controle que eu aperto faz esse efeito . queria salvar apenas um no maximo dois.

    ResponderExcluir
  5. Esta-me a dar erro "boolean ACT_HT6P20B_RX(struct rfControl &_rfControl){" o que e que eu posso fazer

    ResponderExcluir
  6. muito bom o código funciona certinho sem erros

    ResponderExcluir

O seu comentário estará aguardando aprovação.