COMUNICACIÓN INALÁMBRICA EN ARDUINO CON MÓDULOS RF 433MHZ

arduino-comunicacion-inalambrica-433-mhz

¿QUÉ ES UN MÓDULO RF 433MHZ?

Estos módulos tienen una frecuencia de RF 433MHz son transmisores/receptores inalámbricos, los mas populares son el FS1000A y el receptor XY-MK-5V, el alcance depende del voltaje con el que alimentemos el módulo y la antena que usemos. A 5V y con la antena del módulo, el alcance difícilmente excederá de los 2 metros. Alimentando a 12V y con una antena de cobre de 16.5cm el rango en exteriores puede alcanzar 300 metros.


PRECIO

Cómo hemos comentado, estos módulos son muy baratos. Podemos comprar el par de emisor (FS1000A) y receptor (XY-MK-5V) RF 433MHz por 0.80€, buscando en vendedores internacionales de eBay o AliExpress.

arduino-comunicacion-inalambrica-433-mhz-componente

ESQUEMA DE MONTAJE

La conexión es sencilla, en primer lugar, se alimentan los módulos conectando Vcc y Gnd respectivamente a 5V y Gnd en Arduino.

Para la conexión del emisor FS1000A sería la siguiente: 



Y para la XY-MK-5V es la siguiente:



Finalmente, la conexión en ambos casos de los Arduino que controlan cada uno de los módulos emisor/receptor es la misma:



EJEMPLOS DE CÓDIGO

ENCENDER UN LED A DISTANCIA

CÓDIGO EMISOR

#include <VirtualWire.h>
const int dataPin = 9;
void setup()
{
Serial.begin(9600);
vw_setup(2000);
vw_set_tx_pin(dataPin);
}
void loop()
{
while (Serial.available() > 0)
{
char data[1];
data[0] = Serial.read();
vw_send((uint8_t*)data,sizeof(data));
vw_wait_tx();
}
delay(200);
}

CÓDIGO RECEPTOR

#include <VirtualWire.h>
const int dataPin = 9;
const int ledPin = 13;
void setup()
{
vw_setup(2000);
vw_set_rx_pin(dataPin);
vw_rx_start();
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, false);
}
void loop()
{
uint8_t data;
uint8_t dataLength=1;
if (vw_get_message(&data,&dataLength))
{
if((char)data=='a')
{
digitalWrite(ledPin, true);
}
else if((char)data=='b')
{
digitalWrite(ledPin, false);
}
}
}

ENVIAR UN STRING

CÓDIGO EMISOR

#include <VirtualWire.h>
const int dataPin = 9;
const int ledPin = 13;
void setup()
{
vw_setup(2000);
vw_set_tx_pin(dataPin);
}
void loop()
{
const char *msg = "Hola mundo";
digitalWrite(ledPin, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(ledPin, false);
delay(200);
}

CÓDIGO RECEPTOR

#include <VirtualWire.h>
const int dataPin = 9;
const int ledPin = 13;
void setup()
{
Serial.begin(9600);
vw_setup(2000);
vw_set_rx_pin(dataPin);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
digitalWrite(ledPin, true);
Serial.print("Mensaje: ");
for (int i = 0; i < buflen; i++)
{
Serial.print((char)buf[i]);
}
Serial.println("");
digitalWrite(ledPin, false);
}
}


ENVIAR UNA VARIABLE INTEGER Y FLOAT

CÓDIGO EMISOR

#include <VirtualWire.h>
const int dataPin = 9;
void setup()
{
vw_setup(2000);
vw_set_tx_pin(dataPin);
}
void loop()
{
String str;
char buf[VW_MAX_MESSAGE_LEN];
// Ejemplo de envío int
int dataInt = millis() / 1000;
str = "i" + String(dataInt); /// Convertir a string
str.toCharArray(buf,sizeof(buf)); // Convertir a char array
vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
vw_wait_tx(); // Esperar envio
// Ejemplo de envío float
float dataFloat = 3.14;
str = "f" + String(dataFloat); // Convertir a string
str.toCharArray(buf,sizeof(buf)); // Convertir a char array
vw_send((uint8_t *)buf, strlen(buf)); // Enviar array
vw_wait_tx(); // Esperar envio
delay(200);
}

CÓDIGO RECEPTOR

#include <VirtualWire.h>
const int dataPin = 9;
void setup()
{
Serial.begin(9600);
vw_setup(2000);
vw_set_rx_pin(dataPin);
vw_rx_start();
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
// Recibir dato
if (vw_get_message((uint8_t *)buf,&buflen))
{
String dataString;
if((char)buf[0]=='i')
{
for (int i = 1; i < buflen; i++)
{
dataString.concat((char)buf[i]);
}
int dataInt = dataString.toInt(); // Convertir a int
Serial.print("Int: ");
Serial.println(dataInt);
}
else if((char)buf[0]=='f')
{
for (int i = 1; i < buflen; i++)
{
dataString.concat((char)buf[i]);
}
float dataFloat = dataString.toFloat(); // Convertir a float
Serial.print("Float: ");
Serial.println(dataFloat);
}
}
}

Referencias:

Luis. (2016, diciembre 6). Comunicación inalámbrica en Arduino con módulos RF 433MHz. Recuperado el 31 de mayo de 2021, de Luisllamas.es website: https://www.luisllamas.es/comunicacion-inalambrica-en-arduino-con-modulos-rf-433mhz/


Comentarios

Entradas populares