Problema con envio de datos con decimales


muy buenas , estoy utilizando estos codigos , para enviar la temperatura y humedad desde un tx y recibir en el rx:


este es el emisor:

code: [select]
#include <spi.h>
#include <mirf.h>
#include <nrf24l01.h>
#include <mirfhardwarespidriver.h>
#include <dht.h>
// pin donde va conectado los datos
#define dht_pin 2
#define dht21pin 2
#define dhttype dht21
 
//sonda de temperatura
dht dht;
 
//la última vez que envía datos través de la nrf (en ms)
long lastsend = 0;
 
//el retardo entre cada envío (en ms)
  int senddelay = 5*1000;//aqui 5sec
 
//el identificador de cada sonda. este identificador debe ser único una sonda.
int probeid = 0;
 
void setup()
{
  serial.begin(9600);
  serial.println("inicio del sensor.");
  //dht.begin();
  mirf.cepin = 9;
  mirf.csnpin = 10;
  //se incializa mirf , para gestioner el rf24
  mirf.spi = &mirfhardwarespi;
  mirf.init();
  mirf.setraddr((byte *)"prob1");//el nombre de la sonda del sensor
  mirf.payload = 3;//la longitud del paquete que transitará
  mirf.config();
  mirf.settaddr((byte*)"serv0");//el nombre del servidor al que transmite nuestros dato
 
  serial.println( "nrf24l01+ inicializando!" );
  dht.read21(dht_pin);
  serial.println(dht.temperature);
  serial.println(dht.humidity); 
}
 
void loop()
{
  //si, durante el tiempo entre las transferencias de datos
  if(lastsend+senddelay <= millis())
  {
    serial.println("enviando...");
     
    //si uno se está enviando, esperamos que se acabe
    while(mirf.issending()){
    }
     
    //actualiza los valores de dht21 (importante, poner en readdhtxx el que corresponda tu sensor)
    dht.read21(dht_pin);   
 
    //el paquete se crea con una longitud de tres bytes
    byte packet[3];
     
    //el id del sensor
    packet[0] = probeid;
     
    //la temperatura
    packet[1] = dht.temperature;
    //la humedad
    packet[2] = dht.humidity;
    //enviamos el paquete
    mirf.send(packet);
     
    //muestra los datos del paquete de depuración
    serial.print("temp:");
    serial.println(packet[1]);
    serial.print("humi:");
    serial.println(packet[2]);
   
     
    //actualiza la "fecha" de la transmisión de datos reciente
    lastsend = millis();
  }
}


y aqui el receptor:

code: [select]
#include <spi.h>
#include <mirf.h>
#include <nrf24l01.h>
#include <mirfhardwarespidriver.h>
#include <ethernet.h>
 
//la direccion mac del shield ethernet
byte mac[] = {0xaa, 0xbb, 0xcc, 0x18, 0x01, 0x95};
 
//puerto de escucha xx
ethernetserver server(8081);
 
//ip fija
ipaddress ip(192,168,1,123);
//byte server[] = { 192,168,1,200 };
 
//ultimos datos del sensor dht21
int lasttemp = 0;
int lasthumi = 0;
 
//los valores cambia desde los ultimos enviado desde el ethernet
boolean valueshavechanged = false;
 
void setup()
{
  //se inicia la conexion serial
  serial.begin(9600);
  serial.println("inicio de la captura del sensor.");
 
  /*
   * se inicia el nrf24l01
   */
  mirf.cepin = 9;
  mirf.csnpin = 8;
  mirf.spi = &mirfhardwarespi;
  mirf.init();
  mirf.setraddr((byte *)"serv0");//el nombre del servidor/receptor nrf24l01
  mirf.payload = 3;//longitud del paquete en bytes
  mirf.config();
 
  serial.println( "nrf24l01+ inicializando!" );
   
  //se inicia el servidor , dando una ip y la mac.
  ethernet.begin(mac, ip);
  server.begin();
   
  //muestra la ip , para comprobar que todo este bien
  serial.print("direccion obtenida del servidor dhcp: ");
  serial.println(ethernet.localip());
}
 
 
void loop()
{
   
  //recuperacio del servidor si entra un cliente
  ethernetclient client = server.available();
   
  //si esta disponible los datos (nrf24l01+)
  if(mirf.dataready())
  {
    //creamos la tabla que contendrá los datos
    byte datas[3];
     
    //se recupera y coloca los datos en la tabla
    mirf.getdata(datas);
     
    //se muestra los datos mediante el puerto serie para la depuración
    serial.print("temp:");
    serial.println(datas[1]);
    serial.print("humi:");
    serial.println(datas[2]);
     
    //almacena los ultimos datos
    lasttemp = datas[1];
    lasthumi = datas[2];
     
    //se le dice al programa que los valores han cambiado y por lo que hay cosas que se devuelvan
    valueshavechanged = true;
  }
   
  //si un cliente entra, se recupera el servidor
  if (client)
  {
    serial.println("nuevo cliente");
 
    boolean currentlineisblank = true;
     
    //mientras el cliente está conectado
    while (client.connected())
    {
      //hasta que haya terminado de leer su petición
      if (client.available())
      {
        //lee la peticion del cliente , y muestra lo del serial
        char c = client.read();
        serial.write(c);
         
        //si nos encontramos con un salto de línea y la línea actual ya está vacía
        if (c == '\n' && currentlineisblank)
        {
          //responde la petición con nuestros datos
          client.println("http/1.1 200 ok");//código 200 = todo fue bien
          client.println("content-type: application/xml");//especifica el mime-type que envía datos (xml)
          client.println("connection: close"); 
          client.println();
           
          client.println("<?xml version=\"1.0\"?>");//cabecera del documento xml
           
          //el elemento raíz del documento xml
          client.println("<sensors>");
           
         
          (int = 0; < 1; i++)
          {
            //se crea un elemento para cada sensor
            client.print("<sensor name=\"sns");
            client.print(i);//id del sensor
            client.println("\">");
             
            //se crea un elemento secundario que contiene los valores de temperatura
            client.print("<temperatura>");
            //si los valores del sensor han cambiado, se envia
            if(valueshavechanged)
              client.print(lasttemp);
            //de lo contrario, devuelve una cadena no numérica
            else
              client.print("nan");
            client.println("</temperatura>");
             
            //se crea un elemento secundario que contiene valores de humedad
            client.print("<humedad>");
            //si los valores del sensor han cambiado, se envia
            if(valueshavechanged)
              client.print(lasthumi);
            //de lo contrario, devuelve una cadena no numérica
            else
              client.print("nan");
            client.println("</humedad>");
             
            client.println("</sensor>");   
          }
           
          //el elemento raíz sera cerrada
          client.println("</sensors>");
          break;
        }
         
        //si se salta una línea
        if (c == '\n')
        {
          //es que comienza una nueva línea
          currentlineisblank = true;
        }
        else if (c != '\r')
        {
          //un caracter en la linea actual , no esta vacia
          currentlineisblank = false;
        }
      }
    }
    //se deja la vez el navegador del cliente para recuperar datos
    delay(1);
     
    //desconexión del cliente
    client.stop();
    serial.println("cliente desconectado");
  }
}


en el codigo del emisor tengo estas lineas para la comprobacion correcta, de que lee bien el sensor antes de ser enviado:

code: [select]
  dht.read21(dht_pin);
  serial.println(dht.temperature);
  serial.println(dht.humidity); 


si miro en el serial del tx , veo que la primera lectura es correcta con decimales, (22,40 y 54,30 por ejemplo) , pero luego me los envia en numero enteros , 22 y 54, al igual el rx los recibe como 22 y 54 .

como puedo hacer que envie tambien los decimales correctamente al rx ??

gracias y un saludo.

a mi se me ocurre que descompongas el número, y envíes primero la parte entera y luego la parte decimal, como dos números enteros. en el receptor, lo vuelves componer como un número con decimales.


Arduino Forum > International > Español > Software (Moderators: surbyte, Hector_A) > Problema con envio de datos con decimales


arduino

Comments