Muy buenas , estoy utilizando estos codigos , para enviar la temperatura y humedad desde un TX y recibir en el RX:
Este es el emisor:
#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 a 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 a 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 a 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:
#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 a 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>");
for (int i = 0; i < 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 a 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:
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.