Módulos de radio frecuencia a 433Mhz para Arduino
Una de las funcionalidades que quiero que tenga la estación de información es que sea capaz de mostrarme la temperatura, tanto la de la habitación como la del exterior.
Para ello es necesario varios componentes, el primero de ellos son los sensores de temperatura de los cuales hay infinidad de modelos diferentes y cada uno con sus peculiaridades, para no extenderme hablare de ellos en otra entrada. También necesitaremos solventar el problema de conectar el Arduino al sensor de exterior, separado por varios metros, podemos hacerlo por cable o como en este caso con unos módulos inalámbricos.
Dichos módulos nos van a permitir conectar dos Arduinos y que estos puedan comunicarse unidireccionalmente de modo que el Arduino (o Attiny) que este en la terraza leerá la temperatura del sensor y la enviara inalámbricamente al Arduino de la EIE que se encargara de mostrar el dato por pantalla.
También hay distintos módulos RF, yo me he decantado por estos que necesitan muy pocos pines para funcionar, no usan el puerto serie si no los pines 11 y 12, y encima tan solo cuestan 2€ con envió incluido. Los módulos trabajan a 433Mhz, el emisor puede funcionar con una tensión de entre 3 y 12V, y el receptor funciona a 5V.
Para hacerlos funcionar necesitamos la librería VirtualWire que podemos descargar del repositorio oficial o de aquí la versión 1.9. También es recomendable bajarse este pdf con mas documentación sobre la librería.
Adjunto el código del ejemplo del vídeo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
/* CÓDIGO PARA EL EMISOR/SERVIDOR: Nombre proyecto: Ejemplo de uso de dos módulos RF junto a dos Arduinos. Desde el monitor serial se escribe lo que se quiera (hasta 128bytes), el Arduino emisor lo envía por el modulo RF y el Arduino receptor lo recoge y muestra en el LCD que tiene conectado. URL proyecto: http://giltesa.com/?p=11606 Fecha: 19/07/2012 Licencia: (CC) BY-NC-SA: giltesa.com */ // Librerias: #include <VirtualWire.h> // Variables globales char cad[100]; int i=0; void setup() { Serial.begin(9600); // Abre el puerto serie a 9600 bps vw_setup(2000); // Abre el puerto RF a 200 bps Serial.print("Finalice con \".\" cada envio de datos."); } void loop() { // Indica cuantos caracteres hay en el buffer: if( Serial.available() > 0) { cad[i] = Serial.read(); // Cada vez que se lee un carácter se guarda en nuestro array y se descuenta del buffer. i++; } // Cuando escribamos un punto, se enviara todo el texto por el emisor RF: if( cad[i-1] == '.') { cad[i] = '\0'; // Se añade fin de linea al array (string) i=0; vw_send((byte *)cad, strlen(cad)); // Se envía el texto. delay(400); } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
/* CÓDIGO PARA EL RECEPTOR/CLIENTE: Nombre proyecto: Ejemplo de uso de dos módulos RF junto a dos Arduinos. Desde el monitor serial se escribe lo que se quiera (hasta 128bytes), el Arduino emisor lo envía por el modulo RF y el Arduino receptor lo recoge y muestra en el LCD que tiene conectado. URL proyecto: http://giltesa.com/?p=11606 Fecha: 19/07/2012 Licencia: (CC) BY-NC-SA: giltesa.com */ // Librerías: #include <LiquidCrystal.h> #include <VirtualWire.h> // Instanciacion del LCD: LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Variables globales: char cad[100]; int pos = 0; void setup() { lcd.begin(20, 4); // Configuración del LCD, 4 líneas de 20 caracteres cada una. lcd.setCursor(0, 0); // Se pone el cursor en la primera posición de la pantalla. vw_setup(2000); // Se indica los bits por segundo (baudios) para la comunicacion. vw_rx_start(); // Se inicia la recepción. } void loop() { byte buf[VW_MAX_MESSAGE_LEN]; // Se crea una array de tipo byte de 30 componentes (Es el valor que tiene la constante VW_MAX_MESSAGE_LEN en la libreria) byte buflen = VW_MAX_MESSAGE_LEN; // Se indica que por defecto el tamaño sera de hasta 30 caracteres. int i; // Si se recibe un mensaje desde el Arduino emisor, la función vw_get_message devolverá por valor un true y por referencia el mensaje y si tamaño. if( vw_get_message(buf, &buflen) ) { if(pos < 4) lcd.setCursor(0, pos); else { pos=0; lcd.clear(); } // Se imprime por pantalla componente a componente del array hasta que se llegue al final. for (i = 0; i < buflen; i++) { lcd.print(buf[i]); // Otras formas de imprimir: // lcd.write(buf[i]); // lcd.print(buf[i], BYTE); // lcd.print((char)buf[i]); pos++; } } } |

interesante..
que alcance tienen los modulos rf?
si necesitas mas velocidad y precision te recomiendo los apc220 ademas de que son mucho mas faciles de usar.
un saludo!
Unos 4 metros con un alambre como antena.
Esos módulos tiene buena pinta pero de 30€ no bajan…
la verdad es que si.. 90€ me gaste yo en 3 pares.. pero vamos.. 1km de alcance, comunicacion serial.. lo usado en varios proyectos y van muy bien.
echale un vistazo a mi blog si quieres!
http://xapus.blogspot.com.es
En tu caso es perfecto para el coche teledirigido, necesitas mucho alcance y enviar muchos datos, además haciéndolo por serial es mas sencillo.
En mi caso no me sirve porque el chip que uso no tiene salida serial, y con menos alcance me sirve igual
hombre.. valer si que te valdria, el arduino mini tiene serial XD
No no, lo de esta entrada es un ejemplo. Su uso va a ser con un Attiny85 para montar un sensor de temperatura inalámbrico montado en la terraza.
Como ese chip no tiene conexión serial esta es una de las mejores alternativas, además con 2€ que cuesta me hace la faena perfectamente
Muchas gracia explicarlo todo tan bien, me acaban de llegar los módulos y no sabia por donde empezar con ellos, ahora ya he entendido un poco mejor como funciona.
En la linea 54 del código del receptor he tenido que cambiar la linea porque sino me imprimía los caracteres como numeros, este es el cambio:
lcd.write(buf[i]);
Hola rulicos,
Me alegro de que te sirviera la información y de tu comentario.
La linea que comentas si que es cierto que puede que haga lo que dices, ya no lo recuerdo, quizás modifique el código en el IDE pero no puse aquí la ultima versión…
Puedes probar también a poner esto:
lcd.print((char)buf[i]);
o
lcd.print(buf[i], BYTE);
Creo que funcionaran ambas.
Saludos!
Buenas tardes, me maree un poco al ver que en el video tienes conectado el receptor al arduino nano y el emisor al otro y en las fotos alrevez…
Son dos pruebas distintas, cualquiera de los dos Arduinos puede usar cualquiera de los dos módulos. Solo hay que grabarles el código que corresponda y funcionaran perfectamente.
Saludos!
Hola, muy interesante tu proyecto, como se haría para transmitir mediante RF unicamente una señal de abierto/cerrado desde un arduino, tendría que haber necesariamente otro arduino como receptor o se podría hacer directamente sobre el circuito?
Hola,
A través de los módulos se envían bytes, eso hace que sea necesario un Arduino o cualquier otro microcontrolador para obtener esos datos y hacer lo que se desee según lo leído.
En ebay tienes módulos RF ya preparados para activar relés con un mando a distancia, así te ahorras ambos Arduinos.
Saludos!
Estimado, solo tengo una duda, cómo lograste enviar el dato de temperatura, sensado con tu arduino?? El valor lo trasnformaste a string??
Hola,
Tienes que pasarlo a un array de caracteres y después enviarlo.
Muchas Gracias por tu ayuda !!!!
Utilizaste el comando “dtostrf” para hacer el cambio?
Buena información estoy buscando el control de un motor dc con los módulos tlp434 y rlp434 algún tutoríal me podrías ayudar gracias tengo un arduino uno
Hola,
Pásate por este hilo de forocoches donde se esta hablando mucho sobre montar coches robot inalámbricos, creo que querían hacerlo para que fuera con varios módulos inalámbricos…
Saludos!