Como dicen los creadores, y yo traduzco, "VirtualWire es una librería para Arduino que permite enviar mensajes cortos, sin direccionamiento, retransmisión o confirmación, como un UDP inalámbrico, utilizando ASK"
VirtualWire is an Arduino library that provides features to send short messages, without
addressing, retransmit or acknowledgment, a bit like UDP over wireless, using ASK
(amplitude shift keying).
El enlace anterior apunta a un documento donde está explicada perfectamente toda la librería. Lo cierto es que la API que proporcionan es bastante limpia y parece sencilla. Así que manos a la obra.
Lo primero que vamos a programar es la parte emisora y el código que he escrito es el siguiente. Es realmente sencillo. Lee cada medio segundo el estado de los botones y lo envía.
#include
int pinRojo = 2;
int pinVerde = 3;
// me he dado cuenta de que no hace falta
// configurarlo para salida o entrada
int pinTx = 4;
void setup(){
pinMode(pinRojo,INPUT);
pinMode(pinVerde,INPUT);
vw_set_tx_pin(pinTx);
vw_setup(2000);
Serial.begin(9600);
}//setup
void loop(){
delay(500);
int estadoRojo = digitalRead(pinRojo);
int estadoVerde = digitalRead(pinVerde);
char *mensaje = "VACIO";
if ( (estadoRojo == HIGH ) && (estadoVerde == HIGH) ){
mensaje = "A"; // rojo + verde = azul
}else if ( (estadoRojo == LOW) && (estadoVerde == LOW) ){
mensaje = "N"; // nada
}else if ( (estadoRojo == HIGH) && (estadoVerde == LOW) ){
mensaje = "R"; // rojo
}else if ( (estadoRojo == LOW) && (estadoVerde == HIGH) ){
mensaje = "V"; //verde
}
Serial.print("Enviado -> ");
Serial.println( mensaje );
vw_send( (uint8_t *) mensaje , strlen(mensaje) );
}//loop
Y aquí se puede ver el circuito que he montado para el emisor. Está hecho con Fritzing. Como no tenía un componente para el emisor, he dejado el cableado suelto y he añadido las patillas.
Y ahora, vamos a por la parte receptora. También sencilla, cada vez que recibe un mensaje, lo compara y enciende el LED correspondiente.
#include
int pinRojo = 2;
int pinVerde = 3;
int pinRx = 4;
void setup(){
pinMode(pinRojo,OUTPUT);
pinMode(pinVerde,OUTPUT);
Serial.begin(9600);
vw_set_rx_pin(pinRx);
vw_setup(2000);
vw_rx_start();
}//setup
void loop(){
// esto es un poco engañoso porque sólo voy
// a recibir cosas de tamaño 0
uint8_t mensaje[VW_MAX_MESSAGE_LEN];
uint8_t longitud = VW_MAX_MESSAGE_LEN;
if (vw_get_message( mensaje , &longitud ) ){
Serial.print("Recibido -> ");
Serial.println( mensaje[0] );
if( mensaje[0] == 'A' ){
digitalWrite( pinRojo , HIGH );
digitalWrite( pinVerde , HIGH );
}else if( mensaje[0] == 'R' ){
digitalWrite( pinRojo , HIGH );
digitalWrite( pinVerde , LOW );
}else if( mensaje[0] == 'V' ){
digitalWrite( pinRojo , LOW );
digitalWrite( pinVerde , HIGH );
}else if( mensaje[0] == 'N' ){
digitalWrite( pinRojo , LOW );
digitalWrite( pinVerde , LOW );
}// if de caso de mensaje
}//if de he recibido un mensaje
}//loop
Y aquí se puede ver el circuito que he montado para el receptor. Está hecho con Fritzing. Como no tenía un componente para el receptor, he dejado el cableado suelto y he añadido las patillas.
Y me ha funcionado todo, más o menos a la primera, y no me lo creo todavía. He conseguido exactamente lo que pretendía en un principio. Aquí os dejo un video de esta maravilla funcionando.
4 comentarios:
si precionas los dos botones al mismo tiempo si encienden los 2?
Aunque no se aprecia bien en el vídeo, sí.
que circuitos utilizas para el transmisor y receptor? son comprados? o tu los armaste?? gracias por tu respuesta!
Buenas.
En el primer párrafo de la primera entrada del bloque Emisor Receptor RF con Arduino (I): Introducción comento en qué tienda les adquirí.
Un saludo y gracias
Publicar un comentario