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!
Hola,
Cómo has realizado el programa para que te funcione con un attiny85 el transmisor? llevo ya días intentandolo y nada, muchas gracias
Son dos Arduinos, no lo hice funcionar con los Attiny85.
Saludos!
Hola
Muy interesante, tengo una duda necesitaria dos modulos de RF (TX y RX) para que el segundo no fuera un mero actuador sino que enviara el estado de las acciones solicitadas, o existen modulos de RF que hacen funciones de TX/RX a la vez en modo Duplex/Semi-Duplex/Simplex
Salu2
Hola,
Si, puedes usar los módulos NRF24L01, esos te permiten enviar y recibir datos y ademas tienen mas alcance.
Saludos!
Buenas tardes!!
Me parece muy interesante tu entrada, estoy intentando hacer lo mismo pero con un aTTINY85, lo conseguiste al final?? yo aun no….
Hola,
No, al final lo deje estar para ese proyecto, y seguramente también para el resto de proyectos, no me gusta como funcionan.
Un código simple que solo regula el brillo por PWM de unos leds y los apaga tras pasar 10 minutos funciona perfectamente en Arduino durante muchos días seguidos, y con attiny hay días que funciona y otros días que no, a parte que los leds hacen pequeños parpadeos como si el PWM fuese inestable.
Y respecto a los módulos RF tampoco me gustaron, son baratos pero dan muchos problemas a la hora de elegir las antenas. He probado también los NRF24L01 y son mucho mejores, solo les veo de pega que usan muchos mas cables para funcionar.
Saludos!
Muy buenas tardes amigo, oye estoy intentando enviar los datos que obtengo de un DHT11, sensor de temperatura y humedad, pero como paso los datos a un array de caracteres?, pordrias ayudarme?, porfa
Hola,
Pues puedes usar estructuras de datos entre ambos Arduinos y así te ahorras el tener que convertir las variables de un tipo a otro.
O puedes, como dices, pasar los números double a arrays de caracteres, y luego en el otro arduino realizar de nuevo la misma operación pero a la inversa.
http://dereenigne.org/arduino/arduino-float-to-string
Yo sin duda te recomiendo lo primero, tienes algunos ejemplos en el blog, busca STRUCT y UNION
Saludos.
Disculpa amigo me gustaría saber que tipo de seguridad le puedo incorporar a estas transmisiones o son vulnerables a cualquier escucha?
Gracias
Hola,
Con estos códigos de ejemplo la información se transmite sin mas, pero eso no te impide implementar cualquier tipo de algoritmo para cifrar los datos.
http://es.wikipedia.org/wiki/Cifrado_clásico
http://es.wikipedia.org/wiki/Cifrado_(criptografía)
Saludos.
buenas tardes amigo, ese modulo puede transmitir un video de forma inalambrica? y a que distancia? espero tu pronta respuesta, gracias
Hola,
Transmite los datos que quieras, pero tendrás que buscarte la vida para enviarlos y recibirlos correctamente.
Quizás sea preferible algún modulo a 2.4Ghz ya que el ancho de banda es mayor, aunque pierdes algo de alcance.
Saludos.
Sabes como acoplar un lm35 con un módulo fm o rf, quiero enviarselo a un arduino y de ahí lo visualice a mi pc, o sea al revés, de sensor a arduino.
Tendrás que conectar el LM35 a un Arduino y este a un modulo RF. Ese circuito se conectara a otro compuesto de un RF y un Arduino conectado por USB al PC y podrás leer los datos.
Estos módulos RF no cuentan con su propio microcontrolador así que no pueden funcionar de forma independiente, siempre necesitan a alguien que los controle.
El código no es correcto, no se como te ha funconado pero sin ir mas lejos, en el emisor no especificas el pin de salida, me ha servido de poca ayuda
El código es correcto. No se especifica el número de pin en el receptor ni en el emisor porque se usan los especificados en la librería.
Te aconsejo que les eches un vistazo y no te conformes solo con usarlas, se aprende bastante.
hola mi nombre es edgar sanchez. tengo que realizar un proyecto en el cual necesito proyectar en un displey LCD 16×2 la lectura enviada desde un encoder´s tanto acendente como acendente y enviarla a otra pantalla lcd 16×2 por medio blutooh. a 20metros. podrian ayudarme mi. el encoder´s es dispositivo medidor y tiene cuatro canales de salida.
hola como estas? logre hace andar los modulos, ahora me gustaria poder mandar info de algun sensor. pero no se como es eso de pasar la lecturs del sensor arrays.
Hola Martin,
Has de usar estructuras igual que hago con las antenas NRF24L01.
En los comentarios del vídeo tienes el código.
https://twitter.com/giltesa/status/591678173512749056
Saludos.
void transmit( float v)
{
byte c;
char buf[10];
dtostrf(v,9,3,buf);
for( int i=0 ; i<8 ; i++ )
{
c = buf[i];
}
algo asi?
No, no tiene nada que ver tu código con el mio, aunque si te funciona puedes usarlo.
Mi código te permite enviar varias variables de cualquier tipo al mismo tiempo y sin conversiones de ningún tipo, y para recibirlas lo mismo, las recibes todas de golpe y sin necesidad de conversiones…
Edit:
La librería del NRF24L01 permite enviar la estructura directamente. los RF433 creo que no, así que tendrás que iterar la estructura y enviar y recibir la información byte a byte.
Para eso has de usar una estructura struct y una union. Esto es lo mismo que necesitas pero en vez de enviar los datos por RF los manda a la EEPROM.
¿como le hago para enviar lecturas de temperatura entre arduino mediante módulos RF de 433 Mhz?
https://giltesa.com/2012/07/19/modulos-de-radio-frecuencia-a-433mhz-para-arduino#comment-3440
SI MI DISPLAY ES EDE 16X 2 QUE CAMBIO EN EL CODIGO?,SALUDOS Y GRACIASsi mi display es ede 16x 2 que cambio en el codigo?,saludos y gracias
En ese código haría falta cambiar muchas cosas, mejor mira el otro menú que es mas fácil de adaptar, solo eran unas variables.
Saludos.
TENGO MIS 2 ARDUINOS UNO,PERO LA OTRA PREGUNTA ES: LAS TERMINALES DE LOS PINES DE LOS MODULOS RF HACIA QUE PINES VAN CONECTADOS DEL LOS ARDUINOS?,GRACIAS…PD . CUAL ES EL MENU QUE DICES…GRACIAS
tengo mis 2 arduinos uno,pero la otra pregunta es: las terminales de los pines de los modulos rf hacia que pines van conectados del los arduinos?,gracias…
pd . cual es el menu que dices…gracias
Si revisas el texto de la entrada veras que se usan los pines 11 y 12 como pines de datos. Están predefinidos así en la librería de los módulos.
El receptor usa el 11 y el emisor el 12.
Los menús:
Menú 1: https://giltesa.com/2012/07/06/menu-en-un-lcd-con-arduino
Menú 2: https://giltesa.com/2015/02/14/control-de-emisoras-de-radioaficionado-con-arduino-4-codigo-de-arduino-y-video-demostrativo
Saludos.
hola mi nombre es luis, quisiera que me ayudes tengo dos arduinos R3 UNO , Módulo NRF24L01+PA+LNA 2.4 GHz con Antena, y Shield Relay, con todo esto deceo encender un motor o dos motores en un rango de 500mtrs, estado revisando tutoriales pero ninguno m ayuda me piden descargar librerias y en verdad no tengo idea nose si m puedes ayudar porfavor con la programacion t estaria agradecido GILTESA…….
Necesitp enviar señales de radiofrecuencia a una distancia de 400 mts y pienso utilizar modulos de arduino que alcanzan máximo 5 mts con un cable como antena, mi pregunta es, que clase de antena le tendria que adaptar para alcanzar esa distancia!
Hola,
Este modulo no me ha dado buenos resultados, sin embargo con los NRF24L01 con antena integrada he llegado casi a los 100 metros, añadiendo una buena antena externa deberías de poder llegar a esa distancia sin obstáculos entre medio.
Saludos.
Hola. intente instalar la libreria VirtualWire la version 1.9 y el programa no lo lee, instale la version 1.27 creo, funcionara igual ? O tendre algun problema ?
Gracias.
Hola Lautaro,
Si el código te compila y graba correctamente en el Arduino no creo que tengas problemas.
Saludos!
Hola, te podria pedir un favor, pasarme la conexion de el lcd en el receptor? Gracias.
Me estan dando problemas dor variables que se usan el codigo.
Las dos que empiezan con (vw).
Tengo bajar alguna libreria adicional?
Buen día.
Hace varias semanas compre un módulo RF HAC-UM12, tengo el manual de instrucciones , he visto sus tutoriales al respecto. Quiero saber si me puedes ayudar, ya que tengo un proyecto en el cual tengo 2 tarjetas Arduinos Mega y 2 módulos RF, en el que pretendo mandar datos de una tarjeta a otra que se encuentran separada a una distancia de 5m, pero no he podido transmitir la información.
En cada tarjeta tengo un programa utilizando la librería VirtualWire en el cual básicamente enciendo un LED en la primera tarjeta con la palabra Encender y Apagar manda el mensaje y quiero que reciba el mensaje la siguiente tarjeta para que prenda y apague el LED que esta en la segunda tarjeta.
Por más que lo he intentado y viendo el manual no he podido mandar la señal y el programa es un ejemplo de RF comunes por llamar así y no conectados a RX y TX.
Si por favor tuviera un diagrama que pudiera ver como conectar los 2 RF con los 2 Arduinos o alguna idea te lo agradecería mucho.
Dejo el manual: http://www.rf-module-china.com/es/admin/uploadfile/201007/20100705184713350.pdf
Hola,
Según veo esos módulos funcionan por comunicación Serial, debes enterarte cuáles son sus pines RX y TX y unirlos con los pines TX y RX del Arduino respectivamente.
También debes averiguar si el modulo funciona a 3.3V o a 5V, en el primer caso deberás de adaptar la tensión con un divisor de tensión por ejemplo.Una vez tengas eso hacer uso de los módulos solo es imprimir información de un lado a otro, ya sea texto plano o datos.
Saludos.
Edit: En ese manual sale todo bien explicado, no deberías de tener problemas ni necesitas usar librerías. Solo una conexión Serial.
Gil saludos !!
Soy nuevo en arduino …el proyecto que deseo desarrollar es con receptor de Rf de 433 mhz y llaveros con 4 botones igual de 433 mhz….
Encontré este código en la red y la verdad funciona muy bien…para un llavero.
Mi duda es como puedo agregar más llaveros al receptor del arduino así mismo incluir un display para que yo pueda ver que llavero activo y desactivo una luz.
Por ejemplo si tengo 10 llaveros, quiero saber que llavero activo y desactivo la luz apareciendo su número de ID en el display.
Espero me puedas orientar para poder desarrollar este proyecto.
Este fue el código que encontre y funciona muy bien:
const int pinLed = 10;
const int pinBoton = 8;
int encender = 0; // si esta encendido el LED
int anterior = 0; // Pulsación anteior
int estado = 0; // El estado actual del botón
void setup ()
{
pinMode(pinLed, OUTPUT); // Ponemos el pin del LED como salida
pinMode(pinBoton, INPUT); // Ponemos el pin del botón como entrada
}
void loop()
{
estado = digitalRead(pinBoton); // Comprobamos el estado
if(estado && anterior == 0) // Comprobamos si el anteior era sin pulsar y el estado actual es pulsado
{
encender = 1 – encender ; // Asignamos el estado contrario
delay(30); // Anti rebote
}
anterior = estado; // Guardamos el estado actual para posteriores comprobaciones
if(encender) // Si encender es 1
digitalWrite(pinLed, HIGH); // Encendemos el LED
else // Si no
digitalWrite(pinLed,LOW); // Apagamos el LED
}
Hola,
Seguro que los mandos/llaveros cuentan con un número de identificación único y lo envían junto al identificador del botón pulsado?
Saludos.
GIL buenos días…un favor…puedes apoyarme para poder realizar la integración entre el código que obtuve en la red junto con un display para que logre ver en el el número del botón que se esta activando (encendido/apagado).
Tienes algún correo electrónico, skype, whatsapp a donde te pueda contactar, gracias.
Saludos.
Hola,
Tienes muchos ejemplos de cómo conectar un LCD: https://giltesa.com/search/LCD
Es copiar el código y juntarlo con el otro.
Saludos.
Hola Giltesa. Armé los mismo módulos de 433MHz, pero yo le soldé unas antenas. Una tipo látigo al emisor y otra helicoidal al receptor. He alcanzado unos 9-10 metros de comunicación en interior, pero por lo visto el alcance es algo mayor en campo abierto. ¿Tienes experiencia de mayor alcance con estos módulos?
Gracias y saludos.
Hola,
No he vuelto a usar esos módulos, los deje de usar por su corto alcance y por lo complicado que era que funcionasen estables. Ahora uso los NRF24L01, en campo abierto llegue a los 80 metros con las antenas integradas en el PCB.
Saludos.
Gracias por la pronta respuesta. También tengo los NRF24L01 con antena integrada pero sólo los he probado en interior. Los de 433MHz los quería para algo como abrir/cerrar un relé y cosas similares, nada de datos o señales de sensores. Estoy por comprar los NRF con antena externa, que por lo visto llegan al km (aproximadamente), aunque he leido que sólo basta en el emisor, y que el receptor puede ser el de antena integrada. ¿Sabes algo de ésto?
Gracias y saludos.
Yo también tengo entendido eso, pero teniendo el precio que tienen yo compraría los dos con antena externa 🙂
Gracias. Será cuestión de probar.
Saludos.
Hola una duda: cómo calculo cuál puede ser la máxima distancia de emisión y tamaño de antena necesito tener para estos módulos? gracias.
Hola Jesús. El tamaño de las antenas es de 1/4 de onda. Como en este caso son 433 MHz equivale a unos 16.5 – 17.5 cm. Puedes hacerla helicoidal o látigo. Y la distancia de emisión lo mejor es probar en campo abierto.
Saludos.
Hola..!!! soy nuevo en Arduino, mi consulta es, como podría programarlo en donde tengo 3 TRANSMISORES y un solo RECEPTOR (433 MHz) que reciba datos de distintos sensores, pero que solo hayga un solo receptor. Por Favor necesito una ayuda o si alguien me podría ayudar con esto. De antemano se les agradece.
Saludos..!!!
Hola Lucho686. He leido que se consigue con los NRF24L01 y el alcance es algo mayor.
Saludos.
Hola,
En este código no veo que se indique el nombre del esclavo al que envías los datos, así que imagino que el maestro los envía y todos los esclavos al alcance podrán leerlos.
Con los NRF24L01 el maestro debe indicar a que esclavo envía los datos, y cada esclavo debe indicar de qué maestro los lee, así que todos pueden leer y recibir entre sí.
Saludos.
se necesita una interfaz para la pantalla?
Para el montaje de esta entrada la pantalla se conecta directa, no necesita ningún adaptador/interfaz.
se puede hacer este proyecto con arduino uno?
Puedes usar el arduino que prefieras, todos son compatibles.
HOLA TE QUEDO EXCELENTE FELICITACIONES, SOY NUEVO EN ESTO Y QUISIERA QUE ME AYUDARAS A HACER UN SISTEMA DE CONTROL REMOTO POR MEDIO DE RF Y CONTROLAR 3 VARIABLES COMO TEMPERATURA, VIBRACION Y MOVIMIENTO
hola a ver si me podeis ayudar voy loco buscando informacion sobre estos modulos el tema es que quiero saber si es posible mover motor toldo con arduino + modulos rf 433 con este mando de 15 canales que ya ago sevir para mover 2 persianas
http://greutor.com/producto/ohe15-mando-a-distancia-de-15-canales/
Hola,
Debería de poderse hacer, sin embargo tendrás que investigar el protocolo de comunicación que sigue la persiana para poder simularla desde el Arduino, también tendrás que averiguar si dicha comunicación va cifrada o no.
Saludos.