HT12E library

/ *
ARDUINO HT6P20B DECODER WITH RESISTOR IN OSC 2M2.
THIS CODE NO TIMER USA, INTERRUPTION OR FOREIGN AND PIN SET INPUT.
IT MEASURES OF PILOT TIME PERIOD AND IF YOU COMPARE TO TRACK SET,
IF HE GOES TO CODE AND MAKE THE PERIOD OF TIME IN MEDIDÇÕES HIGH LEVEL
IF YOU HAVE INSIDE TRACK ACRECENTA 1 BIT 0 IN VARIABLE _DATA OR IF YOU DO NOT CLEAR THE MAIN AND RE-START
AFTER RECEIVING IT TAKES ALL THE BITS BITS OF ANTE 4 CODE AND TESTS TO KNOW IF THE CODE HAS BEEN RECEIVED
CORRECTLY, IF HE MAKES SURE TO RECEIVE A VARIABLE IN ANTCODE 1.

CREATED BY: DANIEL JACQUES MORESCO
DATE: 28/02/2012 USING ARDUINO 0022.
PHONES: 54 3324 2251 54 9206 7168
E-MAIL: ibisul@ibisul.com.br
Permitted public use, but should keep the name of the author.

  • /

int x, startbit, ctr, dataok, t1, larpulso, larpulso1, larpulso2, larpulso3, larpulso4, bt1, bt2, antcode = 0;
unsigned long _data = 0, / / ??DATA is the Code of recebio HT6p20 all 28 BITS where 22 of the buttons coodigo +2 +4 anti-code;
unsigned long _dur, _dur1 / / Pulse Duration
_pin byte / / Pin that will receive the digital RF signal.

void setup ()

{
_pin = 2;
Serial.begin (9600);
pinMode (2, INPUT);
pinMode (13, OUTPUT);
}

void loop ()

{

digitalWrite (13, digitalRead (2)) / / Blinks the LED as the value of digital input, interference testing.
if (startbit == 0)
{/ / Test Pilot time until the start bit;
_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;
}
}

/ / If the start bit THEN OK Starts measuring time high of signs, and tests whether the time is in the range.
if (startbit == 1 && dataok == 0 && ctr <28)
{
Ctr + +;
_dur1 pulseIn = (_pin, HIGH);
if (_dur1> && larpulso1 _dur1 <larpulso2) / / If the pulse width is between 1/4000 and 1/3000 seconds
{
_data = (_data << 1) + 1 / / attach a * a * to the rightmost end of the buffer
}
else if (_dur1> && larpulso3 _dur1 <larpulso4) / / If the pulse width is between 2/4000 and 2/3000 seconds
{
_data = (_data << 1) / / attach a * 0 * for the rightmost end of the buffer
}
else
{
/ * Force loop termination * /
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)
{/ / Have been received if all 28 bits, the value goes to _data variable and can be used as an example below.
dataok = 1;
Serial.println (_data, BIN);
Ctr = 0;
startbit = 0;
antcode = 0;
delay (100);
}
}
}

///////em português brasil ////////////////////////////////////////
/*
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);
}

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.println(_data,BIN);
ctr=0;
startbit=0;
antcode=0;
delay(100);
}
}
}