Problemas para mandar float a traves virtualwire

Tengo un problemilla con la libreria virtualwire, tengo que mandar la temperatura y humedad del sensor dth 11 a traves de un modulo de radio frecuencia.Pero claro con esta libreria solo se pueden enviar datos en modo de caracteres, y no se como mandar los datos como float, alguien sabe como convertir de float a char o algo por el estilo, un saludo y gracias.

puedes mostrar el codigo?

#include <DHT11.h>       // LIBRERIA SENSOR DE TEMPERATURA
#include <VirtualWire.h> //LIBRERIA EMISOR-RECEPTOR RF
int pin=4;               //ASIGNACION PIN DE RECOGIDA DE DATOS DEL SENSOR DE TEMPERATURA
DHT11 dht11(pin);        //DEFINICON DEL PIN

const int led_pin = 11;
const int transmit_pin = 12;
const int receive_pin = 2;
const int transmit_en_pin = 3;
char *msgh="H";
char *msgt="T";
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); // Required for DR3100
    vw_setup(2000);       // B
    pinMode(led_pin, OUTPUT);
   
}
void loop()
{
  
  float temp, humi;
  dht11.read(humi, temp);
  char msghum[1] = {humi};
  char msgtemp[1]= {temp}; 
  vw_send((uint8_t*)msgh,strlen(msgh)); //MANDAMOS MENSAJE PARA AVISAR DEL EL ENVIO DE HUMEDAD
  vw_wait_tx();                         // ESPERAMOS A TRANSMITIR
 
  vw_send((uint8_t *)msghum,1);         //ENVIA LOS DATOS DE LA HUMEDAD
  vw_wait_tx();                        // ESPERAMOS A TRANSMITIR
 
  vw_send((uint8_t*)msgt,strlen(msgt)); // MANDAMOS MENSAJE PARA AVISAR DEL EL ENVIO DE TEMPERATURA
  vw_wait_tx();                        // ESPERAMOS A TRANSMITIR 
 
  vw_send((uint8_t *)msgtemp,1);       //ENVIAMOS DATOS DE LA TEMPERATURA
  vw_wait_tx();                        // ESPERAMOS A TRANSMITIR              
 
  
}

para enviar caracteres no tengo problemas pero para enviar variables de tipo float no soy capaz.

por lo que veo Vw_send(,) necesita de dos parámetros el primero es la variable y el segundo el tamaño de ella

vw_send((uint8_t *)msgtemp,1);       //ENVIAMOS DATOS DE LA TEMPERATURA

el ancho esta fijo a uno, creo que solo recibes el primer numero por ejemplo si tienes 20 grados solo recibes el 2

que es lo que recibes en el terminal?

me llegan los doslecturas caracteres  de la humedad y temperatura pero no son correctas las lecturas.

[code#include <VirtualWire.h>
#include <Wire.h>
#include <LiquidCrystal.h>
float humedad;
float temperatura;
LiquidCrystal lcd(0);
void setup()
{
  lcd.begin(16, 2);
  vw_setup(2000);
  vw_rx_start();
  
}
void loop()
{
  uint8_t msg[VW_MAX_MESSAGE_LEN];
  uint8_t len=VW_MAX_MESSAGE_LEN;
  if(vw_get_message(msg,&len))
  {
    if(msg[0]=='H')
    {
      humedad=((float)*msg);
      
    }
     if(msg[0]=='T')
    {
      temperatura=((float)*msg);
    }
    
   
  }
  lcd.setBacklight(HIGH);
  lcd.setCursor(0,0);
  lcd.print("Humedad");
  lcd.setCursor(9,0);
  lcd.print(humedad);
  lcd.setCursor(0,1);
  lcd.print("Temperatura");
  lcd.setCursor(13,0);
  lcd.print(temperatura);
  
  
  
}]

mira por aquí encontré algo:
http://forum.arduino.cc/index.php?topic=45187.0

#include <DHT11.h>       // LIBRERIA SENSOR DE TEMPERATURA
#include <VirtualWire.h> //LIBRERIA EMISOR-RECEPTOR RF
int pin=4;               //ASIGNACION PIN DE RECOGIDA DE DATOS DEL SENSOR DE TEMPERATURA
DHT11 dht11(pin);        //DEFINICON DEL PIN

const int led_pin = 11;
const int transmit_pin = 12;
const int receive_pin = 2;
const int transmit_en_pin = 3;
char *msgh="H";
char *msgt="T";

float temp, humi;          //<--temp & humi son ahora globales 
int tempH,tempL;           //<-- tempH parte positiva & tempL parte negativa

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); // Required for DR3100
    vw_setup(2000);       // B
    pinMode(led_pin, OUTPUT);
   
}
void loop()
{
  
  
  dht11.read(humi, temp);
  
  tempH= int(temp);    //solo parte positiva se carga en tempH
  tempL= int((tempH - temp)*100)  //parte negativa se carga en tempL
  
  
  char msghum[1] = {humi};
 // char msgtemp[1]= {temp}; 
  vw_send((uint8_t*)msgh,strlen(msgh)); //MANDAMOS MENSAJE PARA AVISAR DEL EL ENVIO DE HUMEDAD
  vw_wait_tx();                         // ESPERAMOS A TRANSMITIR
 
  vw_send((uint8_t *)msghum,1);         //ENVIA LOS DATOS DE LA HUMEDAD
  vw_wait_tx();                        // ESPERAMOS A TRANSMITIR
 
  vw_send((uint8_t*)msgt,strlen(msgt)); // MANDAMOS MENSAJE PARA AVISAR DEL EL ENVIO DE TEMPERATURA
  vw_wait_tx();                        // ESPERAMOS A TRANSMITIR 

// mandamos los datos con el formato adecuado
 char msgtemp[24];
 sprintf(msg,"%i.%i",tempH,tempL);
 
  vw_send((uint8_t *)msgtemp,strlen(msgtemp));       //ENVIAMOS DATOS DE LA TEMPERATURA
  vw_wait_tx();                        // ESPERAMOS A TRANSMITIR              
 
  
}

Esta tarde probare a ver que tal me va, pero de todas formas, querria saber si exite otro tipo de modulos inalambricos que sea mas versatil, ya qe esto modulos de radio frecuencia los veo para proyectos que no sean muy complejo a la hora de enviar datos.

Buenos días,

La respuesta es muy sencilla. Únicamente deberás hacer un cast de float a puntero de char (Emulación de variable String en C ANSI).

Para ello te recomiendo utilizar lo siquiente:

sprintf(myCharPointer, "%f", myFloat);

Donde myCharPointer será el puntero de caracteres que mandaras en el método del modulo RF y myFloat el valor float obtenido del método de lectura del sensor DHT11.

Espero sea de ayuda.

Un saludo.

Eso no funciona en arduino. No se puede usar %f en ambiente arduino porque la librería punto flotante no esta implementada como en AVR.

la solucion es usar char * dtostrf (double __val, signed char __width, unsigned char __prec, char *__s)

o sea esta instrucción convierte a un puntero char lo que deseas.
Ejemplo:

float a = 3.14156;
char str[6];
dtostrf(a, 6,2,str);

str tendra "3.14"

Ahora vamos al problema de virtualwire

usa esto cada vez que necesites enviar un float

Envías tu mensaje y luego cuando debes enviar el float humi haces

serialPrintFloat(humi);

void serialPrintFloat( float f){
  //Serial.print((int)f);
  itoa((int)f, charnum, 10);    
  vw_send((uint8_t *)charnum, strlen(charnum));
  vw_wait_tx(); // Wait until the whole message is gone
  // Serial.print(".");
  const char *msg = ".";
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Wait until the whole message is gone
 
  int temp = (f - (int)f) * 100;
  // Serial.print( abs(temp) );
  itoa(abs(temp), charnum, 10);    
  vw_send((uint8_t *)charnum, strlen(charnum));
  vw_wait_tx(); // Wait until the whole message is gone
}

Prueba a ver si funciona y me dices