Extraer de una misma trama recibida desde un Xbee(ZigBee) la MAC y la Analógica

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.

Hay alguien que me puede echar una mano, please

Me he mareado al leer tu código, no facilitas que te ayuden.

En el loop haces un XBee.read() hasta encontrar el byte de inicio de trama y extraes la MAC
Pero luego en FuncHumedad vuelves a buscar el byte de inicio, con lo que entiendo que ya estas en la segunda trama y has perdido la humedad de la primera.

Entiendo que cada Xbee tiene solo un sensor y en cada trama solo hay una lectura, entonces no hace falta que separes la lectura de humedad en una función aparte, no hay ninguna ventaja real ya que solo se ejecuta una vez en el loop y se ejecuta a cada loop.
Si lo haces para mejorar la legibilidad del código me parece bien pero podrías haber hecho lo mismo con la extracción de la MAC.

pseudo codigo

Opción todo junto

loop (

     si hay una trama(
          extraer_mac
          extraer humedad
          convertir valores
          imprimir resultados
          )
)

Opción separado en funciones

loop ( 

     si hay una trama(
          VariableTrama=leer trama
          VariableMac=Extraer_mac()
          VariableValor=Extraer_Humedad()
          imprimir resultadosVariableMac VariableValor salto linea
          )
)

Extraer_Mac(
trbajar sobre VariableTrama
return(mac)
)

Extraer_Humedad(
trabajar sobre VaribleTrama
return(valor)
)

espero que te ayude.

Hola @jordi3sk97.

Exacto, por cada XBee sólo estoy utilizando una entrada analógica.

El problema que tengo es que no puedo procesar correctamente las 2 funciones para cada trama recibida, entiendo que este problema es debido a que el arduino necesita un tiempo para procesarlo todo.

Lo que estoy intentando hacer ahora es 1º guardar cada byte de la trama recibida en variables independientes para posteriormente leer/extraer sólo los bytes que me interesan, creo que así debería ser más fluido.

Muchísimas gracias por tú respuesta.

El Arduino tiene velocidad suficiente.

Creo que no has entendido lo que yo te quería transmitir.

A mi entender en tu código tienes un error.
No he utilizado xbee.read() Pero entiendo que una vez leída una trama, ya no la puedes volver a leer

relee esto

En el loop haces un XBee.read() hasta encontrar el byte de inicio de trama y extraes la MAC
Pero luego en FuncHumedad vuelves a buscar el byte de inicio, con lo que entiendo que ya estas en la segunda trama y has perdido la humedad de la primera.

Eres tu quien desperdicia los datos de la primera trama.
Te intentaba explicar que leyeras una trama y la pusieras en una variable, y de ella extrajeras la MAC y la humedad, luego a esperar la siguiente trama.

Sí te había entendido, exacto tengo en las 2 funciones en la que tengo la misma búsqueda del byte de inicio, quería hacerlo de ese modo repitiendo de nuevo la misma funcionalidad para que el código quedase más intuitivo...

Lo que estaba haciendo ahora es lo que tú decías, 1º guardar la trama recibida y después extraer la MAC y la humedad.

Muchas gracias jordi3sk97.