Go Down

Topic: Transferir float por Xbee (Read 1 time) previous topic - next topic

pasteur87

Buenos días,

Estoy metido en un proyecto en el que trabajo con dos arduinos Duemilanove Atmega328 y dos módulos Xbee. La idea es utilizar uno de los arduinos como estación meteorológica (con sensores de temperatura, humedad, ...) y el otro como receptor de los datos y para mostrarlos por pantalla LCD o por el PC. La qüestión es que cuando recibo los datos del sensor de temperatura (un float, por ejemplo 23.25) no soy capaz de enviarlo por Xbee vía serial al otro arduino. He conseguido enviar sólo un bit haciendo pruebas pero enviar un float se me escapa. Utilizo el programa X-CTU para configurar los dos módulos Xbee para los arduinos y en principio creo que eso lo hago correctamente. Os dejo los códigos que tengo del arduino emisor y del arduino receptor (hasta ahora son muy sencilos). Tengo entendido que un float hay que descomponerlo, enviarlo y volver a componerlo al otro lado pero he probado varios métodos que he encontrado por aquí y ninguno me ha funcionado. A ver si alguien me puede orientar y acabo de comprender cómo he de hacerlo. Gracias de antemano.

ARDUINO EMISOR DE DATOS

#include <Math.h>
int tempSensor = 1;

void setup()
{
   Serial.begin(9600);
}

void loop()
{
   float tempValor;
   tempValor = ( 5.00 * analogRead(tempSensor) * 10.00) / 1024.00;  \\ Conversión a grados centígrados
   Serial.print(tempValor);
   delay(5000);
}

ARDUINO RECEPTOR DE DATOS

float temp;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  while (Serial.available() > 0)
{
   
    temp = Serial.read();
    Serial.print(temp);
    delay (5000);
  }
}

pasteur87

Hola f0raster0,

Lo primero, gracias por contestar. Creo que intentaré la segunda opción que dices, enviar el dato y manipularlo al otro lado una vez recibido. Los datos que recibo del sensor son enteros de 3 cifras, por ejemplo 435. Imagino que no tiene que ser muy dificil enviar este tipo de información de un aruino al otro... pues yo de momento no sé cómo hacerlo. Intentaré buscar la manera por internet. Tu sabes cómo debería hacerlo?

Gracias.

f0raster0

#2
Mar 18, 2013, 01:45 pm Last Edit: Mar 22, 2013, 12:14 pm by f0raster0 Reason: 1

http://arduino.cc/forum/index.php/topic,154889.msg1161463.html#msg1161463
http://arduino.cc/forum/index.php/topic,154927.msg1161443.html#new
keep calm & carry on

Conguito

#3
Mar 19, 2013, 06:07 pm Last Edit: Mar 19, 2013, 06:19 pm by Conguito Reason: 1
Si los datos que tienes que enviar de un arduino a otro son enteros de tres cifras como máximo decláralos como int en vez de como float para enviarlos por XBee, házte a la idea de que cuanta menos memoria ocupes en el arduino emisor más velocidad tendrás en ese arduino y menos problemas tendrás para enviar los datos, después en el receptor puedes declarar el dato recibido como float si quieres, pero lo que más te interesa es agilizar los procesos que tienen lugar en el emisor y cuanto menos le hagas trabajar mejor, si ahorras memoria usando un int en vez de un float pues mejor, yo lo haría de la siguiente manera:

ARDUINO EMISOR DE DATOS
Code: [Select]

int tempSensor = 1;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int tempValor;
  tempValor = 0;  
  tempValor = analogRead(tempSensor);
  Serial.print(tempValor);
  delay(5000);
}


ARDUINO RECEPTOR DE DATOS

Code: [Select]

#include <Math.h>

float temp;
float tempValor;
void setup()
{
 Serial.begin(9600);
}

void loop()
{
 while (Serial.available() > 0)
{
 temp = 0;
 tempValor = 0;
 temp = Serial.read();  
 tempValor = ( 5.00 * temp * 10.00) / 1024.00;  \\ Conversión a grados centígrados
 Serial.print(tempValor);
 delay(5000);    
 }
}


Te recomiendo que cojas la sana costumbre de poner a cero los valores al inicio de las rutinas porque a veces puedes tener resultados extraños, poniendo a cero los valores de temp y tempValor te aseguras de que no ocurre nada raro con los datos al almacenar en ellos lo recibido por el puerto serial o lo leído del sensor.
De todas formas.......si en el Arduino receptor usas el comando Serial.print lo que haces es enviar ese dato al Arduino emisor a través del XBee y no sé si leerás correctamente los datos en el monitor serial........casi mejor que uses el XBee receptor con la librería SoftSerial para no entorpecer los datos que quieres leer en el monitor serial del Pc y dejar el serial normal para comunicación con Pc, una vez que consigas que funcione y quieras usarlo de forma autónoma con un display LCD puedes usar el serial por defecto de los pines 0 y 1.
Salu2.

pasteur87

Hola Conguito,

He probado todo lo que me has comentado y al menos, creo que me has ayudado a entender algunos conceptos en los que no había caído. Tiene lógica lo que dices sobre utilizar serial.print en el receptor... quizás no me funciona porque lo que hago es machacar la información que me está mandando el otro arduino y entra todo en un bucle, ya que los dos estan haciendo serial.print. He estado mirandome la libreria softwareserial y tiene pinta de que puede ser la solución, aunque me parece entender que sólo funciona con arudino Mega, Mega 2560 y Leonardo... yo tengo un DuemilanoveAtmega328 así que no sé si lo conseguiré. De momento he hecho algunas pruebas sin éxito pero lo seguiré intentando. Conoces alguna otra vía o posibilidad, si esta no me diera resultados?

Muchas gracias.

Conguito

#5
Mar 21, 2013, 12:20 pm Last Edit: Mar 21, 2013, 12:25 pm by Conguito Reason: 1
La librería softserial no funciona solo en los mega y leonardo, para estas placas hay condiciones especiales, pero se puede usar perfectamente en la UNO o en la duemilanove.
También puedes probar la librería newsoftserial, te permite usar comunicación serie en todos los pines del arduino: http://arduiniana.org/libraries/newsoftserial/
Salu2.

Go Up