Go Down

Topic: SOLUCIONADO - Comunicación RF 433 con RadioHead.h (Read 258 times) previous topic - next topic

DOMPA

Hola Chicos.
Son las 00.04H y llevo todo el santo sábado atascado con un código.
Para proyecto de complejidad superior, he pretendido hacer la base que necesitaré para empezar.
Como novato ya me he atascado en el primer paso.
Pretendo enviar mensajes de 8 dígitos de TX433 a RX433. El RX al recibir los dígitos programados en el su código, debe encender un led. Luego hará otras cosas, pero para empezar me conformo con le led.
Si recibe otros números, no debe hacer nada (De momento).
En el lado RX, por serial recibo los numeros correctos, pero el hardware no obedece a pesar de verse los numeros correctos.
He buscado en la red, pero me encuentro cientos de codigos y proyectos con las librerias rc-swith y VirtualWire. Esta, la  RadioHead que me han recomendado, me dicen que es mucho más segura a la hora de enviar y recibir los paquetes de datos completos.
El codigo es copiado y pegado pero con adaptaciones mías para poder mandar numero largos y diferentes desde según qué TX.
Bueno al codigo, a ver si alguien ve donde la estoy piciando:

Code: [Select]
/*
  Capitulo 46 de Arduino desde cero en Español.
  Programa que mediante dos pulsadores en un modulo emisor RF de 433 Mhz
  permite enviar el caracter 1 o 2.
  Requiere instalar libreria RadioHead.h

  Autor: bitwiseAr  

*/


/// Programa 2 lado Emisor ////

  #include <RH_ASK.h>   // incluye libreria RadioHead.h
  #include <SPI.h>    // incluye libreria SPI necesaria por RadioHead.h
 
  RH_ASK rf_driver;   // crea objeto para modulacion por ASK


  #define PULSADOR2 3   // reemplaza ocurrencia de PULSADOR2 por el numero 3
 
  void setup(){
  pinMode(PULSADOR2, INPUT_PULLUP);  // pin 3 como entrada con resistencia de pull-up
  rf_driver.init();      // inicializa objeto con valores por defecto
}
 
  void loop(){
  if (digitalRead(PULSADOR2) == LOW){   // si se presiona PULSADOR1
  const char *msg = "12345678";      // carga numero 12345678 en mensaje a enviar
  rf_driver.send((uint8_t *)msg, strlen(msg));  // envia el mensaje
  rf_driver.waitPacketSent();     // espera al envio correcto del mensaje
    }
    
  delay(200);         // demora de 200 mseg.
}


Y este es el receptor:
Code: [Select]
/*
  Capitulo 46 de Arduino desde cero en Español.
  Programa que enciende LED rojo y apaga el mismo al recibir el numero 1 y
  enciende LED verde por 5 segundos y apaga al recibir el numero 2.
  Ver: Capitulo46-Programa2-Emisor.txt  
  Requiere instalar libreria RadioHead.h

  Autor: bitwiseAr  

*/


//// Programa 2 lado Receptor ////

  #include <RH_ASK.h>   // incluye libreria RadioHead.h
  #include <SPI.h>    // incluye libreria SPI necesaria por RadioHead.h

  RH_ASK rf_driver;   // crea objeto para modulacion por ASK

  #define LEDROJO 2   // reemplaza ocurrencia de LEDROJO por el numero 2

 
  void setup(){
  pinMode(LEDROJO, OUTPUT); // pin 2 como salida
      
  rf_driver.init();   // inicializa objeto con valores por defecto
  Serial.begin(9600);   // inicializa monitor serie a 9600 bps
}
 
  void loop(){
  uint8_t buf[8];     // espacio para mensaje recibido de 8 caracteres
  uint8_t buflen = sizeof(buf); // longitud de buffer
    
  if (rf_driver.recv(buf, &buflen)) // si se recibieron datos correctos
    {
  if((char)buf[0]=='12345678')   // si los caracteres son el numero 12345678
        {
  digitalWrite(2,HIGH);   }            // estado del LED rojo
  Serial.println((char*)buf);   // imprime buffer de mensaje  
        
        {
            
  delay(1000);        // demora de 1 segundos
  digitalWrite(2, LOW);
}
}

Algo me llama la atención. El original de este codigo, era para enviar un solo digito con uno u otro botón, el 1 o el 2.
Por eso la linea  
Code: [Select]
uint8_t buf[8];     // espacio para mensaje recibido de 8 caracteres
Yo he cambiado el valor a 8, estaba en 1.
Por algun motivo que desconozco, en la linea
Code: [Select]
if((char)buf[0]=='12345678')   // si los caracteres son el numero 12345678
Antes había solo un caracter y en color azul, al escribir el segundo caracter, se cambia a negro...Incluso habiendo cambiado la linea citada antes  de 1 a 8.
Alguien ve el fallo, por favor.

Gracias de antemano.

DOMPA

Por si a alguien le sirve para sus proyectos.

La linea if tiene que comparar cada uno de los char individualmente

Code: [Select]
if (((char)buf[0]=='1') && ((char)buf[1]=='2') && ((char)buf[2]=='3') && ((char)buf[3]=='4') && ((char)buf[4]=='5') && ((char)buf[5]=='6') && ((char)buf[6]=='7') && ((char)buf[7]=='8'))

Saludos.

Go Up