Hola, estoy realizando un proyecto con un emisor y receptor típicos de 433Mhz, he probado muchísimos ejemplos con vurtualwire, rcswitch... En ningún momento consigo comunicarme y creo que es bastante sencillo.¿Hay alguien que lo haya usado y le funcione?Muchas gracias.
Siempre los he usado con rcswitch y virtualwire y no he tenido demasiados problemas. No te recomiendo que uses esos módulos de 433 mhz baratos, por mi experiencia, dan muchos problemas y la comunicación se corta. Como alternativa te recomiendo que uses los módulos NRF24L01 de 2,4 Ghz. Estos módulos casi nunca me han dado problemas, son fáciles de utilizar con Arduino y la conexión es estable, pero ten cuidado porque funcionan a 3.3V.
Un saludo y espero haberte ayudado!
Estos módulos funcionan bien. Hacen su cometido según sus características, otra cosa es que no sepamos hacerlos funcionar correctamente.
Para empezar porque no poner el código usado y saber si es correcto?
Hola, gracias por contestar, el código que utilizó es el de los ejemplos de virtualwire y rcswitch, y la conexión es muy sencilla con sólo 3 cables cada módulo. Ni siquiera he conseguido comunicación, tan sólo quiero encender un led para probar proyectos mayores pero ni en la misma protoboard recibo nada.Tengo dos parejas de circuitos por si una fallaba.
No se si necesitan alimentación externa o algo, de estos módulos hay mil ejemplos y todos supersencillos, asique no me explicó que hago mal.Utilizo un Arduino Uno y un Nano para el ejemplo.
Lo que haces mal es no poner los códigos que usas.
No los pones, no te puedo ayudar, me da igual que sean ejemplos. Lo entiendes ahora?
////TRANSMISOR
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600); // abre el puerto de serie
Serial.println("Transmisor listo"); // Imprime "listo" en el monitor serial
pinMode(13, OUTPUT); //configura el pin 13 como salida, se usara el led integrado.
vw_set_tx_pin(12); // Configura el pin 12 como TX
vw_set_ptt_inverted(true); // Requerido para DR3100
vw_setup(4000); // Bits por segundo
}
void loop()
{
digitalWrite(13, HIGH); // Parpadeo para mostrar actividad
char msg[] = "Hello World"; // Mensaje a enviar
vw_send((uint8_t *)msg, strlen(msg)); //Enviando...
vw_wait_tx(); // espera hasta que el mensaje se haya enviado
Serial.println("Transmitiendo..."); // Imprime transmitiendo en el monitor serial
delay(125); // Pausa antes repetir el ciclo
digitalWrite(13, LOW); // Parpadeo para mostrar actividad
delay(125); // Pausa antes repetir el ciclo
}
Y el código del receptor es:
#include <VirtualWire.h>
int count;
void setup()
{
Serial.begin(9600); // abre el puerto de serie
Serial.println("Receptor listo"); //Imprime "listo" en el monitor serial
pinMode(13, OUTPUT); //configura el pin 13 como salida, se usara el led integrado.
vw_set_rx_pin(12); //Configura el pin 12 como RX
vw_set_ptt_inverted(true); //Requerido para DR3100
vw_setup(4000); // Bits por segundo
vw_rx_start(); // Inciar el receptor
}
void loop()
{
digitalWrite(13, HIGH); // Parpadeo para mostrar actividad
uint8_t buf[VW_MAX_MESSAGE_LEN]; //Almacenar en buffer los datos recibidos
uint8_t buflen = VW_MAX_MESSAGE_LEN; //Determina el numero de caracteres recibidos
if (vw_get_message(buf, &buflen)) // Si hay un mensaje recibido ejecuta...
{
int i;
Serial.print("Rx: "); //imprime Rx en el monitor serial
for (i = 0; i < buflen; i++) //rutina para impresion del mensaje recibido
{
char c = (buf[i]); // guarda el caracter recibido para despues imprimirlo
Serial.print(c); //imprime el caracter recibido en el monitor serial
Serial.print(" "); //deja un espacio en el monitor serial
}
count++; //incrementa contador
Serial.print(count); //imprime el contador en el monitor serial
Serial.println(""); // salto de linea monitor serial
}
delay(125); // Pausa antes repetir el ciclo
digitalWrite(13, LOW); // Parpadeo para mostrar actividad
delay(125); // Pausa antes repetir el ciclo
}
Tendrías que editar tu mensaje y poner tag en los códigos.
1/ Para empezar baja la velocidad de vw_setup por 2000 (lo tienes a 4000).
2/ Tienes que localizar la linea que has puesto en el receptor;
uint8_t buf[VW_MAX_MESSAGE_LEN]; //Almacenar en buffer los datos recibidos
por esta;
uint8_t buf[VW_MAX_MESSAGE_LEN] = {};
prueba a ver que pasa.
Te dejo los códigos que tengo de ejemplo donde los uso con un sensor de temperatura y funciona.
Prueba a ver si te funciona.
RECEPTOR
#include <VirtualWire.h>
const int receive_pin = 11; // 11
const int led_pin = 13;
const int transmit_pin = 12;
const int transmit_en_pin = 3;
void setup()
{
delay(1000);
Serial.begin(9600);
Serial.println("Leyendo EMISOR 433MHz");
vw_set_tx_pin(transmit_pin);
vw_set_rx_pin(receive_pin);
vw_set_ptt_pin(transmit_en_pin);
vw_setup(2000);
vw_rx_start();
pinMode(led_pin, OUTPUT);
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN] = {};
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
int i;
digitalWrite(led_pin, HIGH);
for (i = 0; i < buflen; i++)
{
// Serial.print(buf[i], HEX);
// Serial.print(' ');
}
Serial.print((char*)buf);
Serial.println();
digitalWrite(led_pin, LOW);
}
}
TRANSMISOR
#include <VirtualWire.h>
#include "DHT.h"
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
const int led_pin = 13;
const int transmit_pin = 12;
const int receive_pin = 2;
const int transmit_en_pin = 3;
void setup()
{
Serial.begin(9600);
vw_set_tx_pin(transmit_pin);
vw_set_rx_pin(receive_pin);
vw_set_ptt_pin(transmit_en_pin);
vw_set_ptt_inverted(true);
vw_setup(2000);
dht.begin();
pinMode(led_pin, OUTPUT);
}
void loop()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
int tempC1 = (int)t;
int tempC2 = (int)((t*100) - (tempC1*100));
if ((t*100) > (tempC1*100))
{
int tempC2 = (int)((t*100) - ((tempC1*100)-100));
}
char msg[19];
sprintf(msg, "%i.%i", tempC1,tempC2);
digitalWrite(led_pin, HIGH);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
Serial.println(msg);
int humC1 = (int)h;
int humC2 = (int)((h*100) - (humC1*100));
if ((h*100) > (humC1*100))
{
int humC2 = (int)((h*100) - ((humC1*100)-100));
}
sprintf(msg, "%i.%i", humC1, humC2);
digitalWrite(led_pin, LOW);
delay(1000);
}
Pero yo en mi ejemplo sólo utilizo los pines 12 en emisor y receptor, todos esos que utilizas como el 2, 3 y 11..¿dónde los conectas?
2 min de simple análisis responden tu consulta
const int receive_pin = 11; // 11
const int led_pin = 13;
const int transmit_pin = 12;
const int transmit_en_pin = 3;
Pin 11 lo usa para recibir
Pin 12 para transmitir
Pin 13 es un Led
Pin 3 es un pin para habilitar la transmisión.
Si los pines de emision y recepción los tengo claros, pero eso de que habilitas transmison, ¿donde se conecta?Porque el módulo de Tx lleva 3 pines, GND, VCC y ATAD al 12
Yo no lo se.. no usé jamas uno.
¿Puede ser que el receptor no esté ajustado para 433Mhz? No hay manera de que reciba nada.
Si conectas el pin de salida del arduino 1 al de entrada del arduino 2 si se ve por el serial lo enviado, por lo que el código parece funcionar.¿Alguna idea?