Iniciando con Recepción de datos........

Hola, Saludes a todos..!!!! :slight_smile:

Resulta que he entrado de a poco con la programación en Arduino, ahora que tengo
la oportunidad de contar con un Arduino MEGA pues me he dado a la tarea de aprender como usar este hardware libre...

He visto tutoriales acerca de lo básico, como usar el monitor serie, mandar señales,
encender leds, etc. Pero igual soy amante a las comunicaciones y siempre me ha fascinado
la manera de comprender como enviar datos y recibir via Wifi, bluetooth, o conexiones cableadas.

He adquirido 2 módulos RF de 433MHZ (Transmisor y Receptor ) y al mismo tiempo un DHT11. los compre por que son baratos y me podrán servir para mi experimento.

Y este consiste en poder enviar los datos que me de el DHT11 como son la humedad y la temperatura al Receptor (me he conseguido un Arduino Nano para realizar las pruebas y tratarlo como RX) .

He estado imaginándome como es que seria el sistema, y lo mejor que me imagine es que los datos del DHT11 vayan al Arduino, luego se los pase al Transmisor, este los envie, y en otro Arduino tener el RX que tome esos valores y los muestre en el monitor serial.

Ya me he puesto manos a la obra, he visto algunos tutoriales que enseñan como trabajar con el DHT11, los he usado y en efecto han funcionado, toman el valor del DHT11 y los envian al monitor
serie, también he vistor otros tutoriales de como enviar datos desde los modulos RF los he probado e igual han funcionado, mandan una señal con un pulsador y en el receptor se enciende un
LED, entonces, lo que hice fue tratar de tomar esos códigos como ejemplo y crear el mio...

Pero aún no se como que parámetros debo considerar para empezar... Si me imagino el esquema que debe tomar, pero no como ese esquema que me imagino ( y que no se si esta correcto ) lo puedo implementar en el código...

Me gustaría que vosotros me puedan ayudar a entender mejor este experimento, y si me
pueden guiar a implementarlo.

NOTA: No estoy pidiendo que me hagan el código, por que no quiero que me lo hagan, quiero aprender a programar en Arduino no que me lo programen.. Así que dicho esto, espero su ayuda... De antemano muchas gracias.-........ :slight_smile: :grin:

Tu problema es fácil cuando lo encaras paso a paso.
Primero sensor de humedad.
Busca la librería DHT11.
Mira los ejemplos
conecta tu sensor al arduino de acuerdo a ese ejemplo
Comprueba que funciona dentro de lo esperado.
Entonces intenta modificar ese ejemplo y hacerlo propio, o sea... tal vez uses un LCD o no se que has preferido.

Resuelve esta parte y luego avanzamos con el tema RF.
Lee las normas, mira como se insertan códigos, enlaces e imágenes.

Muchas gracias por su consejo Sr. surbyte, estuve viendo los ejemplos del DHT11, y he implementado
el código que se proporciona. Trate de entender lo que se hacia, y creo haber captado lo básico.

Ahora bien, como no tengo muchos componentes electrónicos ( lamentablemente como la LCD ), lo que hice fue poder apreciar los datos obtenidos por Arduino en el monitor serie.

Sinceramente como soy algo novato en este Hardware, me sorprendió la manera de como se manipulan
los datos y se envían directamente mediante puerto serial. Y se ve genial la manera en que se muestran los datos tan detallado.

Habiendo visto esto, se me crearon varias incógnitas acerca del mismo (puerto serial) que estoy investigando un poco más para poder entender como es que trabaja y funciona. Para asi aprender de todo lo que se usa.

Aca tienes la librería DHT11 Library
Todo lo encuentras buscando en Google: Arduino DHT11 o arduino vibracion (sin acento) o mejor aún en inglés.

Por eso te digo que vayas paso a paso.
Ahora que resolviste el tema del DHT11 mira con el puerto Serial usando el Monitor Serie como mostrar información
De nuevo, hay ejemplos en el IDE y hay muchos mas ejemplos en Internet usando Google: arduino Serial

Si, el estar tratando paso a paso da mejor perspectiva de lo que se esta siendo y lo que se hará.

Con lo del Monitor serie, ya lo estoy usando, solo que aun no entiendo cuando usar un mayor serial y cuando usar uno menor. Por que estoy notando que en algunos casos se usan 9600 Baudes y en otros 1200 Baudes. Creo que tendre que buscar mas info acerca de estos puntos. :frowning:

A ver..
No existe ninguna instrucción serial con minúsculas. Todas son con mayúsculas.
Repito cuando no sepas: Google : Arduino Serial.

A menos que no sea porque un dispositivo lo requiere expreamente usa siempre 9600 para arriba hasta 115200 bps puedes usar.
Yo no suelo salirme de 9600. NO hace falta en la mayoría de los casos.

Ejemplos, en el IDE busca Comunicaciones

Entendido.

Ya he usado algunas de las instrucciones del Monitor serie, y ya he mandado los datos del DHT11 para que se muestren en el mismo y todo bien hasta acá.

Vi como usar algunas instrucciones del serial, me llamo la atención las lecturas analógicas, pero para este experimento no creo usar mas que lecturas digitales cierto ( las del DHT11 ). Ahora si entendí lo de los baudes, tenian ciertas dudas con eso, pero ahora todo claro.

Saludes a todos, estuve trabajando toda la tarde y mañana de hoy con el "experimento" de recepcionar
los datos, mire varios tutoriales y he tomado los códigos y he tratado de cambiarlos de modo que pueda visualizarlos directamente en el Monitor serie, dado en que todos los códigos los mandan
directamente a una LCD.

El código final que he editado quedo de la siguiente manera:

Para el TX

// Envío de Datos 
#include <VirtualWire.h>
#include "DHT.h"

#define DHTPIN 8                // Pin para el DHT11
#define DHTTYPE DHT11           // Objeto DHT 11
DHT dht(DHTPIN, DHTTYPE);
int ledPin = 13;
char Msg[30];                   // Para el string que enviaremos por el RF


void setup(){
dht.begin();                    // initializar el DHT11
pinMode(ledPin,OUTPUT);
// VirtualWire
vw_setup(2000);                   // Bits por seg
vw_set_tx_pin(12);                // Settear Tx pin.
Serial.begin(19200);
}


void loop() {                                                   // Leer y almacenar data
int humidity = dht.readHumidity();
int temp = dht.readTemperature();
int f = dht.readTemperature(true);
int hi_f = dht.computeHeatIndex(f,humidity);                   //Indice calor en F
int heat_index =(hi_f-32)*5/9;                                  // conversión a C
sprintf(Msg, "%d,%d,%d", humidity,temp ,heat_index);


// Encender LED para mostrar Tx
digitalWrite(ledPin, HIGH);
delay(100);
Serial.print("About to send message");
vw_send((uint8_t *)Msg, strlen(Msg));
Serial.println("");


//print message
Serial.print("The message is");
Serial.println("");
Serial.print(Msg);
vw_wait_tx();                                       // Esperar hasta que todo el string se transmita
Serial.println("");


// Apagar luz después de transmision
digitalWrite(ledPin, LOW);
Serial.print("Message sent!");
Serial.println("");
Serial.println("");
Serial.println("");
}

Y este es el código que he editado para el receptor

#include <VirtualWire.h>                  // Virtual library para decode señal de Rx


// Sensores
int humidity=0;
int temp=0;
int heat_index=0;
char MsgReceived[21];
int led = 13;                         //pin para LED

void setup(){
Serial.print("Variables");
Serial.print("loading...");
pinMode(led, OUTPUT);
delay(2000);

// VirtualWire
// Set rx pin first so setup wont conflict with default set from vw library
vw_set_rx_pin(9);
// Bits por seg
vw_setup(2000);
// Iniciar el receptor PLL funcionando
vw_rx_start();

Serial.begin(19200);
}                                   // END void setup


void loop(){
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

//Tomar data de control base
Serial.print("Obteniendo datos");
Serial.println("");
if (vw_get_message(buf, &buflen)){
Serial.print("Obtenidos!");
Serial.println("");
digitalWrite(led, HIGH);
delay(100);
int i;

// Mensaje con checksum correcta recibida, botar.
for (i = 0; i < buflen; i++){
// Llenar Msg Char array con chars del buffer.
MsgReceived[i] = char(buf[i]);
Serial.print(MsgReceived[i]);
}
sscanf(MsgReceived, "%d,%d,%d",&humidity, &temp,&heat_index); // Converts a string to an array
digitalWrite(led, LOW);
memset( MsgReceived, 0, sizeof(MsgReceived));// This line is for reset the StringReceived
}

Serial.write(1);
Serial.print(temp);
Serial.print("C");

Serial.write(2);
Serial.print(humidity);
Serial.print("%");

Serial.write(3);
Serial.print(heat_index);
Serial.print("C");
}

He probado la transmisión viendo en el monitor serie lo que estoy envio y todo correcto, se envia a como quiero que se vea. Pero en el receptor :frowning: no obtengo lo que quiero, mas bien, aparecen unos símbolos todos extraños, ya que colocado la misma cantidad de baudes a ambos arduinos y aun nada, en que estoy realizando el error, además, dado a mi poca experiencia con arduino, no se si lo que estoy mandando al monitor serie de mi receptor está bien estructurado. Os pido su ayuda, y estoy agradecido con vosotros de antemano..

Adjunto la imagen de lo que recibo en el RX.

No veo donde defines esta variable en el receptor.

VW_MAX_MESSAGE_LEN
debiera haber un

#define VW_MAX_MESSAGE_LEN 10  // por ejemplo

Estaba en lo correcto, esa variable no estaba definida en el RX. La definí.

Pero el error aun sigue prevaleciendo.

Esto es lo que veo a la hora de enviar la informacion.

y esto lo que recibo

:frowning:

Una vez más, Saludes a todos.

Gracias a la maravillosa y generosa ayuda de surbyte en mi código, el mismo (código) ha sido concluido.

Aun queda cierta falla mínima, a la hora de recibir los datos, dado a que en ocasiones no se reciben completos, pero con la secuencia los datos son completados.

Los códigos finales, tanto el del Tx como el del Rx quedan a su disposición a continuación:

TX

// Envío de Datos
#include <VirtualWire.h>
#include "DHT.h"

#define DHTPIN 8                // Pin para el DHT11
#define DHTTYPE DHT11           // Objeto DHT 11
DHT dht(DHTPIN, DHTTYPE);
int ledPin = 13;
char Msg[30];                   // Para el string que enviaremos por el RF

void setup(){
dht.begin();                    // inicializar el DHT11
pinMode(ledPin,OUTPUT);

// VirtualWire
vw_setup(2000);                   // Bits por seg
vw_set_tx_pin(12);                // Settear Tx pin. 

Serial.begin(9600);
}


void loop() {                                                   // Leer y almacenar data
int humidity = dht.readHumidity();
int temp = dht.readTemperature();
int f = dht.readTemperature(true);
int hi_f = dht.computeHeatIndex(f,humidity);                   //Indice calor en F
int heat_index =(hi_f-32)*5/9;                                  // conversión a C
sprintf(Msg, "%d,%d,%d", humidity,temp ,heat_index);

// Encender LED para mostrar Tx
digitalWrite(ledPin, HIGH);
delay(100);
Serial.print("Datos a Enviar");
Serial.println("");
vw_send((uint8_t *)Msg, strlen(Msg));

//print message
Serial.print("Los datos son los siguientes:");
Serial.print(Msg);
Serial.println("");
vw_wait_tx();                           // Esperar hasta que todo el string se transmita

// Apagar luz después de transmision
digitalWrite(ledPin, LOW);
Serial.print("Message sent!");
Serial.println("");
Serial.println("");
}

RX

#include <VirtualWire.h>                  // Libreria Virtual para decode señal de Rx

#define BAUD_RATE    9600
// Sensores
int humidity=0;
int temp=0;
int heat_index=0;
char MsgReceived[30];
int led = 13;                         //pin para LED


void setup(){
  pinMode(led, OUTPUT); 
  delay(2000);
 Serial.println("Iniciando Recepción de datos");
  // VirtualWire
  vw_set_rx_pin(9);
  // Bits por seg
  vw_setup(2000);
  // Iniciar el receptor PLL funcionando
  vw_rx_start();
  Serial.begin(BAUD_RATE);
}                                   


void loop(){
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  
  //Serial.print("Obteniendo datos");
  //Serial.println("");
  if (vw_get_message(buf, &buflen)){
    //Serial.print("Obtenidos");
    //Serial.println("");
    digitalWrite(led, HIGH);
    //delay(1000);
    
    // Mensaje con checksum correcta recibida, botar.
    for (int i = 0; i < buflen; i++){
      // Llenar Msg Char array con chars del buffer.
      MsgReceived[i] = char(buf[i]);
      //Serial.print(MsgReceived[i]);
    }
  
    sscanf(MsgReceived, "%d,%d,%d",&humidity, &temp,&heat_index);               // Convierte un string a un array
    digitalWrite(led, LOW);
    memset( MsgReceived, 0, sizeof(MsgReceived));                               // Reset el String Recibido
    
    char buffer[30];
    sprintf(buffer, "1. temp %d%cF 2. hum %d 3. temp %d%cC", temp, (char) 186, humidity, heat_index, (char) 186);
    Serial.println(buffer);
    }
    Serial.println("");  
}

Una vez más, agradezco la disposición de surbyte para guiarme, ayudarme a entender y corregir todo mis errores en el código, su ayuda fue de modo remoto. Y al final todo ha salido Excelente.

Saludes a todos, Y espero de su ayuda en problemas de código posteriores.

:slight_smile: