Comunicación de datos por RF

Hola.
Lo primero, me llamo Felipe y soy nuevo en el foro.
Estoy intentando hacer un proyecto para medir la humedad del suelo con una placa y que esta transmita por radiofrecuencia los datos a otra placa.
Las conexiones creo que están bien, y creo que el error está en el código, por alguna razón el receptor solo capta 0000…

Estos son los codigos:
Receptor

#include <VirtualWire.h>
int count;
void setup()
{
  Serial.begin(9600);  // abre el puerto de serie
  vw_set_rx_pin(12);       //Configura el pin 12 como TX
  vw_set_ptt_inverted(true); //Requerido para DR3100
  vw_setup(2000);      //  Bits por segundo
  vw_rx_start();       // Inciar el receptor
}

void loop()
{
  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
  int i;
 Serial.println(buf[i]);
  
    delay(125);                 // Pausa antes repetir el ciclo
  digitalWrite(13, LOW);      // Parpadeo para mostrar actividad
  delay(125);                 // Pausa antes repetir el ciclo
}

Transmisor

#include <VirtualWire.h>
const int sensorPin = A0;

void setup()
{
  
    Serial.begin(9600);    // abre el puerto de serie
       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()
{
   int humedad = analogRead(sensorPin);
   Serial.println(humedad);
       
     char *msg = (humedad);   // 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(1000);                 // Pausa antes repetir el ciclo
         
}

Espero no haber cometido ningún error al postear, estuve buscando, pero no he encontrado nada que me sirva.
Muchas gracias y saludos.

Esos transmisores son malos, mi humilde opinión. Tienen poco alcance, no puedes identificarlos. Solo puedes unir un par emisor/receptor, en definitiva son muy para hobbistas que recién empiezan.
Para algo mas de nivel medio/alto usa los nRF24L01. Son baratos pero la versión sin antena da unos 15 mts o mas sin problemas. Bien alimentado puede llegar a mas. La versión con antena dicen que llega a 1000 mts.
Tmb puedes usar los ESP8266 y los hay en muchas versiones y ellos son WIFI. El nodemcu con un buen router puede funcionar a mas de 100 mts. Vi un video donde dicen que llega a 400 mts. Yo no lo creo hasta probarlo.

Mi humilde colaboración, esta página es de unos amigos.

http://saber.patagoniatec.com/tutorial-nrf24l01-arduino-inalambrico-nrf24l01-radio-frecuencia-rf-arduino-argentina-ptec/

:wink:

Sabía que eran malos, pero no tanto jajaja.
Muchas gracias a los dos, me compraré un nrf24L01 y retomaré el proyecto con el.
Saludos y gracias.

1ro no compres 1, sino 2!!! De lo contrario a quien o a qué le transmitirás algo?
No corregiste el título y te mandé privado pero ahora lo hago público

LEE las NORMAS DEL FORO y ya lo enfatizo.
Edita tu título por favor. No puedes poner Ayuda para enviar datos humedad suelo por radiofrecuencia
Cambia a Comunicación de datos por RF por ejemplo.

Si si a eso me refería.
Emmm, pues perdona no he recibido el mensaje, pero ya mismo lo cambio.

Bueno en este punto debo aconsejarte debidamente y es que la tecnología cambia tan rápidamente que tienes opciones similares o mejores:

  1. Ya te sugerí el RF24 (se lo llama asi simplificadamente) o nRF24L01. Este require un arduino para trabajar
  2. Ahora puedes usar tambien los ESP8266-12 que tiene un AD y es WIFI. Todo en uno sin Arduino.
    Si el lugar dispone de cobertura WIFI sería una buena opción. Requiere fuente de 3.3V a 250mA mínimo pero no es problema.

Perdona mi ignorancia, pero que es un "AD"?
Ah, además, podrías decirme cuál es la diferencia entre el ESP8266 y el ESP8266-12?
Aunque el lugar si tiene cerca wifi, mi idea es instalar varios arduinos nano en diferentes zonas y que un arduino uno me recopile los datos (humedad y temperatura). Luego sí que es buena idea lo que me comentas de usar un ESP8266 para subir los datos a una web.

Perdona mi ignorancia, pero que es un “AD”?

Un AD es un conversor Analógico digital, es algo que te permite leer señales analógicas como tensiones, corrientes temperaturas. Pero esta forma de medir poco a poco esta cayendo en desuso, porque cada vez tienes mas opciones de sensores digitales.

Bueno, la solución con el nRF24L01 verás que es muy cómoda. Yo los he usado y aún los uso. Pero para que veas estoy trabajando en un proyecto que usa unos 20 pero no será mas de la partida si tuviera que empezar de 0 el mismo proyecto. Porqué? Porque el nodemcu poses mas posibilidades combinadas que un NANO y un nRF24 juntos, con el detalle que no tengo tantos AD. Pero como dije… no es preocupante hoy en día.

Te recomiendo las librerías de tmrh20 para Arduino

Ah, pues muchas gracias. :slight_smile:

Hola.
Ya me han llegado los modulos NRF24L01, pero sigo sin conseguir que funcionen…
Para el emisor he empleado este codigo:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
//
// Hardware configuration
// Set up nRF24L01 radio on SPI bus plus pins 9 & 10 
RF24 radio(9,10);
// Topology
// Radio pipe addresses for the 2 nodes to communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
void setup(void)
{
pinMode(10, OUTPUT); 
Serial.begin(9600);
radio.begin();
// optionally, increase the delay between retries & # of retries
radio.setRetries(15,15);
// optionally, reduce the payload size.  seems to
// improve reliability
//radio.setPayloadSize(8);
// Open pipes to other nodes for communication
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
}
void loop(void)
{
// First, stop listening so we can talk.
radio.stopListening();
// Take the time, and send it.  This will block until complete
unsigned long time = millis();
Serial.print("Enviando  ");
Serial.println(time);
bool ok = radio.write( &time, sizeof(unsigned long) );
if (ok){
Serial.println("ok...");}
else{
Serial.println("failed");}
// Now, continue listening
radio.startListening();
// Wait here until we get a response, or timeout (250ms)
unsigned long started_waiting_at = millis();
bool timeout = false;
while ( ! radio.available() && ! timeout ){
if (millis() - started_waiting_at > 200 ){timeout = true;}   
}
// Describe the results
if ( timeout )
{
Serial.println("Failed, response timed out");
}
else
{
// Grab the response, compare, and send to debugging spew
unsigned long got_time;
radio.read( &got_time, sizeof(unsigned long) );
// Spew it
Serial.print("Respuesta = ");
Serial.println(got_time);
}
// Try again 1s later
delay(500);
}

Y…el receptor en el monitor no obtiene nada, y en el monitor del emisor salia este error:

Enviando  5
failed
Failed, response timed out

Pero no se que error hay en el codigo