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