Receptor de RF 433.92 para controle de portão

Olá pessoal,

Já estou a uma semana pesquisando sobre isso e já coletei bastante informações, já até montei o sistema. Comprei até um receptor para central de alarme Reptor 2 para auxiliar o meu projeto.

Pesquisando em foruns de Arduino, descobri que meu projeto já é largamente implementado para PIC, mas para Arduino só acho código conversando 2 arduinos com receptor e transmissor, mas ainda não achei um projeto para controles Code Learning (ou qualquer outro).

Eu criei o seguinte código pra teste:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2,3); 

void setup() {
  
  Serial.begin(9600);
  
  mySerial.begin(1200);                      // Software Serial port initialization by 1200 bps
  mySerial.setTimeout(10000);                // Set time out 10 sec
  mySerial.flush();    
  
  /*
  D13 - 1 RF +VCC
  D12 - 2 RF GND 
  NC - 3 IN Antena
  NC - 4 NC 
  NC - 5 NC 
  NC - 6 NC 
  D7 - 7 RF GND 
  NC - NC
  NC - 9 NC 38.1mm
  D5 - 10 AF +VCC
  D4 - 11 AF GND
  NC - 12 AF +VCC
  NC - 13 Test Point
  D1 - 14 OUT decoder
  NC - 15 AF +VCC
  */
  pinMode(13,OUTPUT); // D13 - 1 RF +VCC
  pinMode(12,OUTPUT); // D12 - 2 RF GND 
  pinMode(7,OUTPUT); // D7 - 7 RF GND 
  pinMode(5,OUTPUT); // D5 - 10 AF +VCC 
  pinMode(4,OUTPUT); // D4 - 11 AF GND
  
  digitalWrite(13,1); // D13 - 1 RF +VCC
  digitalWrite(12,0); // D12 - 2 RF GND 
  digitalWrite(7,0); // D7 - 7 RF GND 
  digitalWrite(5,1); // D5 - 10 AF +VCC 
  digitalWrite(4,0); // D4 - 11 AF GND

}

void loop()
{
  if(mySerial.available())  // If Software Serial detect any data in it's buffer
    Serial.print(mySerial.read());
}

E ao ligar o Serial Monitor, aparecem números randômicos de 0 - 9 sem eu pressionar nada. Mas percebi que quando eu pressionava aparecia um número de 13 casas que se repetiam, considerei então que esse era meu ID. Porém quando tentava repetir o teste não conseguia achar ele, repetia novamente e funcionava novamente.

Eu não posso confiar em um código que é intermitente.

Você já aplicaram essa solução, como ficou?

Quanto é que esses bichinhos de RF consomem? Algum motivo para os alimentares através dos pinos do Arduino?

1 Like

bubulindo:
Quanto é que esses bichinhos de RF consomem? Algum motivo para os alimentares através dos pinos do Arduino?

Na verdade esses outputs eram pro receptor RR3 433.9, porém agora estou usando uma central que é alimentada na tomada (não estou usando mais os pinos citados).

Já experimentaste a NewSoftSerial?
Creio que é melhor que a SoftwareSerial.

bubulindo:
Já experimentaste a NewSoftSerial?
Creio que é melhor que a SoftwareSerial.

Baixei a biblioteca e substitui:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3);

por:

#include <NewSoftSerial.h>
NewSoftSerial mySerial(2,3);

Porém não compilou:
error: #error NewSoftSerial has been moved into the Arduino core as of version 1.0. Use SoftwareSerial instead.

Código pronto!
Recuperando o ID dos dispositivos Code Learning, créditos a Dene daqui no fórum.

/* 
 ARDUINO DECODIFICADOR HT6P20B COM RESISTOR DE 2M2 NO OSC.
 ESTE CÓDIGO NÃO USA TIMER, INTERRUPÇÃO EXTERNA E NEM PINO DEFINIDO DE ENTRADA.
 ELE MEDE O TEMPO DO PILOT PERIOD E COMPARA SE ESTÁ DENTRO DA FAIXA DEFINIDA,
 SE TIVER ELE PASSA PARA CODE PERIOD E FAZ AS MEDIDÇÕES DE TEMPO EM NIVEL ALTO
 SE TIVER DENTRO DA FAIXA ACRECENTA BIT 1 OU 0 NA VARIAVEL _DATA CASO NÃO ZERA AS VARIÁVEIS E RE-INICIA
 APOS RECEBER TODOS OS BITS ELE PEGA OS 4 BITS DO ANTE CODE E TESTA PARA SABER SE O CÓDIGO FOI RECEBIDO 
 CORRETAMENTE, CASO RECEBIDO CERTO ELE COLOCA A VARIAVEL ANTCODE EM 1.
 
 CRIADO POR: JACQUES DANIEL MORESCO
 DATA: 28/02/2012 USANDO ARDUINO 0022.
 FONES:54 3324 2251 54 9206 7168
 E-MAIL: ibisul@ibisul.com.br
 Permitido o uso público, mas deve-se manter o nome do autor.
 */

int x,startbit,ctr,dataok,t1,larpulso,larpulso1,larpulso2,larpulso3,larpulso4,bt1,bt2,antcode=0;
unsigned long _data=0;   // DATA é o Código recebio do HT6p20 todos os 28 BITS onde, 22 do coodigo+2 dos botões+4 do anti-codigo;
unsigned long _dur,_dur1;      // Duração do Pulso
byte          _pin;    // Pino que vai receber o sinal RF digital.

void setup(){
  _pin=2;
  Serial.begin(9600);
  pinMode(2, INPUT);
  //pinMode(13, OUTPUT);
  
  pinMode(13,OUTPUT); // D13 - 1 RF +VCC
  pinMode(12,OUTPUT); // D12 - 2 RF GND 
  pinMode(7,OUTPUT); // D7 - 7 RF GND 
  pinMode(5,OUTPUT); // D5 - 10 AF +VCC 
  pinMode(4,OUTPUT); // D4 - 11 AF GND

  digitalWrite(13,1); // D13 - 1 RF +VCC
  digitalWrite(12,0); // D12 - 2 RF GND 
  digitalWrite(7,0); // D7 - 7 RF GND 
  digitalWrite(5,1); // D5 - 10 AF +VCC 
  digitalWrite(4,0); // D4 - 11 AF GND
}

void loop(){

  //digitalWrite(13, digitalRead(2)); //Pisca o LED conforme o valor da entrada digital, testar interferencias.
  if (startbit==0)
  {// Testa o tempo piloto até o Bit de inicio;
    _dur = pulseIn(_pin, LOW);
    if(_dur > 8000 && _dur < 12000 && startbit==0)
    {
      larpulso=_dur/23;
      larpulso1=larpulso-50;
      larpulso2=larpulso+50;
      larpulso3=larpulso+larpulso-50;
      larpulso4=larpulso+larpulso+50;
      startbit=1;
      _dur=0;
      _data=0;
      dataok=0;
      ctr=0;
    }
  }

  // Se o Bit de inicio OK ENTÃO Inicia a medição do tempo em Nivel ALTO dos sinais, e testa se o tempo está na faixa.
  if (startbit==1 && dataok==0 && ctr < 28)
  {
    ++ctr;
    _dur1 = pulseIn(_pin, HIGH);
    if(_dur1 > larpulso1 && _dur1 < larpulso2)     // Se a largura de pulso é entre 1/4000 e 1/3000 segundos
    {
      _data = (_data << 1) + 1;      // anexar um * 1 * para a extremidade mais à direita do buffer
    }
    else if(_dur1 > larpulso3 && _dur1 < larpulso4)   // Se a largura de pulso é entre 2/4000 e 2/3000 segundos
    {
      _data = (_data << 1);       // anexar um * 0 * para a extremidade mais à direita do buffer
    }
    else
    {
      /* força finalização do laço */
      startbit=0;
    }

  }




  if (ctr==28)
  { 
    if (bitRead(_data,0)==1)
    { 
      if (bitRead(_data,1)==0)
      {
        if (bitRead(_data,2)==1)
        {
          if (bitRead(_data,3)==0)
          {
            antcode=1;
          }
        }
      }
    }    

    if (antcode==1)
    {// Se foram recebidos todos os 28 Bits, o valor vai para a variavel _data e pode ser usada como exemplo abaixo.
      dataok=1;
      
      Serial.print("ID: ");
      Serial.println(_data/16,BIN);
      ctr=0;
      startbit=0;
      antcode=0;
      delay(100);
    }
  }
}

Hi Guys!

I developed a sketch based on the code above and many others..
For all "remote controls" that use the encoder HT6P20 I tested, it worked!

See the links below:
English:

Portuguese:

Para quem quiser entender detalhadamente sobre controles remotos de RF,
podem dar uma olhada nesse tutorial que eu fiz:
Citei o código do Turcato - muito bom!

Só para lembrar é errado alimentar qualquer dispositivo pelas portas digitais do arduino , pois as mesma sofrem a oscilação do micro e interfere nos dispositivos