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!
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
Basta fazer as mesmas conexões da imagem abaixo:
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.
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
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
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)
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
Mas como enviar o código recebido pelo arduino?
ResponderExcluirMuito bom o seu projeto parabéns.
ResponderExcluirGostaria 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á
Amigo, como faço para controlar um motor de 12 volts ou um motor de 220 volts com este projeto por sinal muito interessante?.
ResponderExcluirboa 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.
ResponderExcluirEsta-me a dar erro "boolean ACT_HT6P20B_RX(struct rfControl &_rfControl){" o que e que eu posso fazer
ResponderExcluirmuito bom o código funciona certinho sem erros
ResponderExcluirHello, how the images for me are appearing normally on the computer. hugs
ResponderExcluir