duda rf link 433 Mghz y lcd

Hola. Tengo unas pequeñas dudas y agradecería otra ayudita.

Quiero comunicar dos placas arduinos mediante transmisores y receptores Rf link 433 y la información que veo por Internet es un arduino hace de Tx y otro de Rx. Mi primera pregunta es ¿una placa se puede configurar como emisor y receptor a la vez?

Lo que quiero hacer es comunicar dos arduinos con estos modulos y que pulsando un botón de un placa le envie un mensaje (por ejemplo: Hola) a la otra placa y lo muestre en una plantalla lcd de 16x2. Quiero que con los dos se puedan hacer lo mismo, es decir, cada placa tendria un Tx, Rx, lcd y boton de envio del mensaje.

¿AlGuien podría ayudarme con esto o echarme una mano con el codigo?

Creo que el mayor problema que puedes tener, es que los dos arduinos van con emisor y receptor en la misma frecuencia, así que es posible que los dos arduinos reciban el mismo mensaje lo envíe quien lo envíe , así que tendrias que enviar el mensaje por ejemplo con un 1 o un dos al inicio del mensaje y luego que cada arduino lea el mensaje y solo muestre en el lcd el que le corresponda...

te pongo un código que no he probado directamente, pero es el que usado por separado en alguno de mis proyectos...

Espero que te sirva....

un saludo

#include <VirtualWire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(13, 12, 5, 4, 3, 2);

int boton = 3;
int buttonstate = 0;

void setup()
{
lcd.begin(16, 2);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}

void loop()
{
//************** si recives un mensaje************
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen))
{
int i;

if (buf[0]==49) // chequeamos si el primer caracter que nos llega es de un arduino o de otro 49 para el 1 o 50 para el 2
{
lcd.clear();
lcd.setCursor(0,0);
for (int i = 1; i < buflen; i++) //Mostramos el mensaje desde el segundo caracter
{
lcd.print((char)buf*); *

  • } *
  • } *
  • }*

//************** para enviar el mensaje*************
buttonstate=digitalRead(boton);
if (buttonstate==LOW)

  • {*
    _ const char *msg = "1mensaje enviado"; //cambia el 1 por un 2 para indentificar quien envia el mensaje_
    vw_send((uint8_t *)msg, strlen(msg));
  • vw_wait_tx();*
  • } *
    }
    [/quote]

me tira este error:

sketch_may28a.ino: In function 'void loop()':
sketch_may28a:35: error: cast from 'uint8_t*' to 'char' loses precision

Tienes las librerías ??
No he probado que funcione bien , pero no me da errores al compilar...
Por cierto, debería de poner un contador para borrar el lcd...

las tengo pero voy a probar con otras a ver q pasa

Perdona!!!!

pero al hacer el copy paste del código , no aparece,,,, tenías razón,, da un error....

falta una i entre corchetes .... Lo siento.. te pego el código de nuevo.... y te pongo donde va...

#include <VirtualWire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(13, 12, 5, 4, 3, 2);

int boton = 3;
int buttonstate = 0;

void setup()
{
lcd.begin(16, 2);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}

void loop()
{
//************** si recives un mensaje************
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen))
{
int i;

if (buf[0]==49) // chequeamos si el primer caracter que nos llega es de un arduino o de otro 49 para el 1 o 50 para el 2
{
lcd.clear();
lcd.setCursor(0,0);
for (int i = 1; i < buflen; i++) //Mostramos el mensaje desde el segundo caracter
{
lcd.print((char)buf*** i entre corchetes***); // quita tambien los ***
}
}
}

//************** para enviar el mensaje*************

buttonstate=digitalRead(boton);

if (buttonstate==LOW)
{
const char *msg = "1mensaje enviado"; //cambia el 1 por un 2 para indentificar quien envia el mensaje
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
}
}

#include <VirtualWire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(13, 12, 5, 4, 3, 2);

int boton = 3;
int buttonstate = 0;

void setup()
{
lcd.begin(16, 2);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();
}

void loop()
{
//************** si recives un mensaje************
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen))
{
int i;

if (buf[0]==49) // chequeamos si el primer caracter que nos llega es de un arduino o de otro 49 para el 1 o 50 para el 2
{
lcd.clear();
lcd.setCursor(0,0);
for (int i = 1; i < buflen; i++) //Mostramos el mensaje desde el segundo caracter
{
lcd.print((char)buf _); // quita tambien los *** _

  • } *
  • } *
  • }*

//************** para enviar el mensaje*************
buttonstate=digitalRead(boton);
if (buttonstate==LOW)

  • {*
    _ const char *msg = "1mensaje enviado"; //cambia el 1 por un 2 para indentificar quien envia el mensaje_
    vw_send((uint8_t *)msg, strlen(msg));
  • vw_wait_tx();*
  • } *
    }
    Asi quedaria no? ya no me da fallo pero no hay manera. A ver si tengo mal las conexiones. Asi las tengo puestas el lcd y el rx (tx y rx) sin el led. Ahora tengo una duda con estas conexiones se me pisan los pines ¿que se hace cuando pasa esto? se usa otro pin o el mismo?
    Gracias por la ayuda y perdon por la ignoracia....


El pulsador cambialo de pin..... No puedes usar el mismo pin para dos cosas... Cambia los del lcd en funcion de los que tengas libres...
Al meter el codigo en el foro , desaparecen los corchetes...

Echando un vistazo al proyecto donde he usado esos transmisores...
El tx en el pin 12
El rx en el pin 11
El lcd.. En los pines 2,3,4,5,10,13
El pulsador en el 6

Imagino que asi ya funcionara...
El,lcd y el pulsador tendras que declararlos asi en el código

¿donde defino el tx y el rx en el skecth?

Estas son mis conexiones. Les meto los sketchs a los arduinos pero no muestran nada en los ldc

Pon el sketch tal y como lo has modificado...

falta un:
pinMode(boton, INPUT);
en el setUp()

prueba a iniciar el lcd con un texto al arrancar para comprobar que funciona....

lcd.begin(16, 2);
lcd.setCursor(1,0);
lcd.print(F(" Prueba Rx/Tx"));
delay(1000);
lcd.clear();

Y sobre todo, prueba primero los ejemplos de la libreria virtualwire por separado.. receiver y transmitter con un emisor en un arduino y un receptor en otro para comprobar que funciona...

voy a probar primero con un arduino emisor y otro receptor

arduino emisor:

#include <VirtualWire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(13, 10, 5, 4, 3, 2);

int boton = 6;
int eb = 0;;
int tx = 12;

void setup()
{
lcd.begin(16, 2);
vw_set_ptt_inverted(true);
vw_setup(7000);
pinMode(boton, INPUT);
vw_set_tx_pin(12);
vw_rx_start();

}

void loop()
{
//************** si recives un mensaje************
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen))
{
int i;

if (buf[0]==50) // chequeamos si el primer caracter que nos llega es de un arduino o de otro 49 para el 1 o 50 para el 2
{
lcd.clear();
lcd.setCursor(0,0);
for (int i = 1; i < buflen; i++) //Mostramos el mensaje desde el segundo caracter
{
lcd.print((char)bufi entre corchetes); // quita tambien los ***
}
}
}

//************** para enviar el mensaje*************

eb = digitalRead(boton);

if ( eb == HIGH) //Condicion para ver si esta activado el boton

{
const char *msg = "1mensaje enviado"; //cambia el 1 por un 2 para indentificar quien envia el mensaje
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();

}
}

arduino receptor:

#include <VirtualWire.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(13, 10, 5, 4, 3, 2);

int boton = 6;
int eb = 0;;
int rx = 12;

void setup()
{
lcd.begin(16, 2);
vw_set_ptt_inverted(true); // Required for RX Link Module
vw_setup(7000); // Bits per sec
pinMode(boton, INPUT);
vw_set_rx_pin(12);
vw_rx_start();
Serial.println("Iniciando");

}

void loop()
{
//************** si recives un mensaje************
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen))
{
int i;

lcd.clear();
lcd.setCursor(0,0);
for (int i = 0; i < buflen; i++) //Mostramos el mensaje desde el segundo caracter
{
lcd.print((char)bufi entre corchetes); // quita tambien los ***
}
}

//************** para enviar el mensaje*************

eb = digitalRead(boton);

if ( eb == HIGH) //Condicion para ver si esta activado el boton

{
const char *msg = "1mensaje enviado"; //cambia el 1 por un 2 para indentificar quien envia el mensaje
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();

}
}

asi tengo los dos arduinos montados solo uno con un tx y otro con rx. Le meto el skecth pero no sale nada en los lcd. He probado lo que me pusiste y si sale Prueba Rx/Tx". hay algo que no va bien pero no consigo dar con ello

En el pulsador tienes que poner una resistencia de 10k ...

Es decir.. El pin 6 de arduino a masa con una resistencia de 10k... Y el pulsador entre el pin 6 y 5v...

Prueba a quitar el if que identifica el arduino que envia el mensaje...y que asi muestre cualquier cosa que se envie...

Iba a montar uno para probar, pero no tengo emisores ...

me salen letras por doquier en el arduino receptor... No se si el fallo esta en el emisor y en el receptor. He probado con un led para ver si tanto el receptor como el emisor emiten y reciben y si, parpadean los dos.

Ya he podido probar el código con dos montajes completos y lo he modificado , ahora parece que funciona bien...

el código sería el siguiente...

#include <VirtualWire.h>
#include <LiquidCrystal.h>

int boton=8;
int buttonstate=0;
int t=0;

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print(" PRUEBA RX/TX");
lcd.setCursor(3,1);
lcd.print("By Lisergio");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Esperando... ");

vw_set_ptt_inverted(true);
vw_setup(2000);
vw_rx_start();

}

void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

// *****************************************************************
// ************ Al recibir un mensaje, verificamos que ************
// ************ la primera letra es una "A" (ALARMA) ************
// *****************************************************************

if (vw_get_message(buf, &buflen))
{
if (buf[0]==65)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" ALARMA");
}
}

// *****************************************************************
// ************ Al pulsar el boton enviamos el mensaje ************
// *****************************************************************

buttonstate=digitalRead(boton);

if (buttonstate==LOW)
{
const char *msg = "ALARMA";
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
lcd.setCursor(0,1);
lcd.print("mensaje enviado");
}

delay (50);
t++;

// *****************************************************************
// ************ contabilizamos 5 seg para borrar el LCD ************
// *****************************************************************

if (t>=200)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Esperando... ");
t=0;
}

}

Enlace del funcionamiento en video....