Hola, buenos días.
Estoy desarrollando una aplicación para transmitir la lectura de humedad a través de ZigBee(Módulos XBee) a un Arduino el cual ya recibo correctamente la señal.
Antes de comentaros el problema que tengo, os comento la arquitectura que tengo montada:
-Arduino UNO Wifi REv.2 + Placa Shield + Xbee S2C(Configurado cómo Coordinador + Modo API)
-Placa USB Explorer para Xbee´s + XBee S2C(Configurado cómo Router + Modo Transparente, configurado para que envíe datos cada 1 segundo) + Sensor de humedad(Conectado a la entrada analógica "0" del Xbee).
El problema que tengo es que no consigo extraer de la misma trama recibida desde el módulo Xbee tanto la dirección MAC cómo la señal de humedad simultáneamente, sí consigo extraer de la trama ambas cosas pero NO simultaneamente. Para leer tanto la dirección MAC cómo la humedad tengo una 2 funciones separadas, una es la función para extraer la MAC se ejecuta dentro del "void loop" y la otra es la función "void FunHumedad" la cual llamo justo antes de finalizar el loop.
Mi idea sería imprimir por pantalla por cada vez que recibo una trama lo siguiente:
-Identificación Xbee: 13A43DSDCS Medición de humedad: 60 %
Ahora mismo lo que imprimo es algo así:
-Identificación Xbee: 13A241918DA3 Identificación Xbee: 13A241918DA3 Identificación Xbee: 13A241918DA3 Medición de humedad: 60 %
-Identificación Xbee: 13A241918DA3 Medición de humedad: 60 %
-Identificación Xbee: 13A241918DA3 Medición de humedad: 60 %
-Identificación Xbee: 13A241918DA3 Identificación Xbee: 13A241918DA3 Identificación Xbee: 13A43DSDCS Identificación Xbee: 13A241918DA3 Medición de humedad: 60 %
-Identificación Xbee: 13A241918DA3 Identificación Xbee: 13A241918DA3 Identificación Xbee: 13A241918DA3 Medición de humedad: 60 %
-Identificación Xbee: 13A241918DA3 Medición de humedad: 60 %
Por cada trama recibida se está imprimiendo una a una cada parte de cada línea.
No sé si es que el arduino que no es capaz de procesar dos consultas a una misma trama en ese intervalo o si soy yo que no estoy ejecutanto la secuencia ordenada(lo mas probable...).
Si me pudieseis hechar una mano os lo agradecería enormemente, llevo dándole vueltas probando multitud de cosas pero no consigo solucionarlo.
El código que estoy utlizando es este:
#include <SoftwareSerial.h>
SoftwareSerial XBee(3,2);
float ValorTemporal;
int Humedad;
String DireccionMAC;
int led = 13;
void setup() {
Serial.begin(9600);
XBee.begin(9600);
}
void loop() {
//______________________1º Extraer de cada trama recibidad desde cada ZigBee la dirección MAC________________________________
if (XBee.available() > 21) { //Recorremos la trama recibida
//1º Extraemos de las tramas las direcciones MAC de los ZigBee de origen, ignoramos todo lo demás...
if (XBee.read() == 0x7E){
for (int i = 0; i<4; i++){
byte descartar = XBee.read(); // descarta todos los bytes hasta llegar al de lectura de la direciión MAC
}
Serial.print("Identificador XBee: ");
for (int x = 0; x<7; x++){
DireccionMAC = String(XBee.read(), HEX);
Serial.print(DireccionMAC);
}
Serial.print(" "); //Metemos un espacio
}
}
FunHumedad(); //A continuación llamamos a la funcion "FunHumedad" para que se ejecute en 2º lugar
}
//_________________________2º Extraer de cada trama recibidad desde cada ZigBee la señal analógica de Humedad________________________________
void FunHumedad()
{
if (DireccionMAC != NULL){ // Si tenemos alguna dirección MAC leida, leemos la señal analógica. NOTA: Sólo estamos leyendo la última parte de la MAC del ZigBee. Ejemplo 13A241918D>"A3"<
//Recorremos la trama que nos envía el ZigBee hasta el canal de la entrada analógica que nos interesa
if (XBee.available() > 21) { //Recorremos la trama recibida
if (XBee.read() == 0x7E){ //byte de inicio.
for (int z = 0; z<18; z++){
byte descartar2 = XBee.read(); // descarta todos los bytes hasta llegar al de lectura de canal analogico
}
int analogMSB = XBee.read(); //toma el valor de los 2 byte de lectura del canal analógico
int analogLSB = XBee.read();
int analogReading = analogLSB + (analogMSB * 256); //Une los dos bytes
ValorTemporal = analogReading * (1.2/1024); // Convierte a voltaje
//Escalamos la entrada de tensión en voltaje
Humedad = (ValorTemporal * 100) / 1.2; //Pasamoa a escala de humedad(%)
Serial.print(" "); //Metemos un espacio despues de imprimir la dirección MAC(Imprimida arriba...)
Serial.print("Humedad: ");
Serial.print(Humedad);
Serial.println(" %");
DireccionMAC = ""; // Al acabar "borramos" la variable global con la dirección MAC del último ZigBee guardada
}
}
}
}
Muchas gracias de antemano por vuestra atención.
Un saludo.