# Controle Remoto PPA funcionando no Arduino

**URL:** <https://forum.fazedores.com/t/controle-remoto-ppa-funcionando-no-arduino/3619>\
**Category:** Microcontroladores\
**Created:** [Outubro 28, 2016, 3:29pm UTC](https://forum.fazedores.com/t/controle-remoto-ppa-funcionando-no-arduino/3619 "2016-10-28T15:29:52Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![aecen](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.fazedores.com/aecen/32/1497_2.png) [@aecen](https://forum.fazedores.com/u/aecen)\
**Post date:** [Outubro 28, 2016, 3:29pm UTC](https://forum.fazedores.com/t/controle-remoto-ppa-funcionando-no-arduino/3619/1 "2016-10-28T15:29:52Z")

</div>

Pessoal, comprei um controle remoto da marca ECP, com chip HT6P20, e com o código abaixo funcionou bem no arduino, até com um bom alcance, com uma antena de 50cm no receptor. O que não estou conseguindo é comparar o código recebido para implementar as rotinas. A comparação em negrito, comentada no final, é que não está funcionando:  
Alguém pode ajudar?

```auto
/* 
TITLE: DECODER FOR HT6P20B ENCODER
CREATED BY: AFONSO CELSO TURCATO
DATE: 18/JUN/2014
E-MAIL: acturcato (at) gmail.com
LICENSE: GPL
REV.: 04
DESCRIPTION:
http://acturcato.wordpress.com/2014/01/04/decoder-for-ht6p20b-encod...
DESCRIÇÃO:
http://acturcato.wordpress.com/2013/12/20/decodificador-para-o-enco...
*/
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(){

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.println(rfControl_1.addr, HEX);
Serial.println(rfControl_1.btn1, BIN);
Serial.println(rfControl_1.btn2, BIN);

_**if(rfControl_1.addr == '2FE699') //esse é o código recebido na serial**_
_ **{** _
_**Serial.println("código válido recebido"); //não está imprimindo esta mensagem**_
}

}
}
```

---

<div class="post-metadata">

**Author:** ![sksdutra](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.fazedores.com/sksdutra/32/442_2.png) [@sksdutra](https://forum.fazedores.com/u/sksdutra)\
**Post date:** [Outubro 31, 2016, 12:17pm UTC](https://forum.fazedores.com/t/controle-remoto-ppa-funcionando-no-arduino/3619/2 "2016-10-31T12:17:37Z")

</div>

```auto
void loop() {
    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.println(rfControl_1.addr, HEX);
        Serial.println(rfControl_1.btn1, BIN);
        Serial.println(rfControl_1.btn2, BIN);
        if(rfControl_1.addr == '2FE699') { //esse é o código recebido na serial
            Serial.println("código válido recebido"); //não está imprimindo esta mensagem
        }
    }
}
```

Bom, se esta mensagem não está sendo impressa, creio que o problema seja pelo fato de que a comparação da condicional não está sendo verdadeira por algum motivo, para fazer uma depuração rápida, tente o seguinte:

```auto
if(rfControl_1.addr == '2FE699') { //esse é o código recebido na serial
    Serial.println("código válido recebido"); //não está imprimindo esta mensagem
} else {
    Serial.print("código inválido: ");
    Serial.println(rfControl_1.addr);
}
```

Assim você vai ver que a o condicional vai falhar e ele vai apresentar qual a variável **rfControl\_1.addr** está sendo retornada, de posse disso, basta colocar o valor retornado no condicional para tornar a comparação verdadeira.

Fora isso, posso supor algumas coisas:

1. Você está comparando **rfControl\_1.addr** com a string literal ‘2FE699’, não seria um valor inteiro?;
2. A notação hexadecimal está incorreta: deveria ser 0x2FE699;
3. A notação hexadecimal só é mostrada se for formatada para hexadecimal. Já tentou colocar isso como meramente decimal, que é o padrão?
