muy buenas , estoy utilizando estos codigos , para enviar la temperatura y humedad desde un tx y recibir en el rx:
este es el emisor:
y aqui el receptor:
en el codigo del emisor tengo estas lineas para la comprobacion correcta, de que lee bien el sensor antes de ser enviado:
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.
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
Post a Comment