Problema comunicazione EasyTransfer & Xbee

Salve a tutti,
ho un problema con la comunicazione di una struttura tramite la libreria EasyTransfer.
Nel sistema, sono presenti 2 schede collegate via seriale(XBee): un Arduino Mega che funge da master e un Arduino Uno configurato come slave.
Dopo l'avvenuta ricezione della struttura e dell'ultimo valore dallo slave, il master si blocca inesorabilmente, non va in crash ne null'altro, si blocca punto.
Ho provato a rimuovere XBee ed instaurare una connessione seriale diretta, ma il problema rimane.
Ho controllato la questione del delay al di sotto dei 5 secondi, ma nulla il master "s'impalla" =( =(
Esiste qualche alternativa per la comunicazione tramite seriale xbee di questo set di dati, oppure sapete come fixare questo problema?
Grazie mille in anticipo in allegato i due codici

Master

#include <EasyTransfer.h>

struct DATA_STRUCTURE{
  char TYPE;//tipo di trasmissione C=Comando S=inviodati T=settempo
  int DESTINATION;//destinazione 9999=a tutti
  int IDDevice;//id slave
  int enable;
  int pwmVal;
  int ledT;
  int power;
  int temperature;
  int umidity;
  int pressure;
  int lux;
  int aperto;
  int controll_var;
};


EasyTransfer ET;
DATA_STRUCTURE myData;


void setup(){
ET.begin(details(myData), &Serial1);
}

void loop(){
if(ET.receiveData()){
        Serial.println("In ricezione dati...");
        Serial.println(Receive_XBEE());
       }
}

String Receive_XBEE(){
  String s="";
      char TYPE=myData.TYPE;
      int DESTINATION=myData.DESTINATION;
      int IDDevice=myData.IDDevice;
      s+="|RECEIVE XBEEE ID="; s+=IDDevice; s+= "|"; s+='\n';
      int enable=myData.enable;Serial.print(s);s="";
      s+="|RECEIVE XBEEE enable="; s+=enable; s+= "|"; s+='\n';
      int pwmVal=myData.pwmVal;Serial.print(s);s="";
           s+="|RECEIVE XBEEE pwmVal="; s+=pwmVal; s+= "|"; s+='\n';
      int ledT=myData.ledT;Serial.print(s);s="";
           s+="|RECEIVE XBEEE ledT="; s+=ledT; s+= "|"; s+='\n';
      int power=myData.power;Serial.print(s);s="";
           s+="|RECEIVE XBEEE power="; s+=power; s+= "|"; s+='\n';
     int temperature=myData.temperature;Serial.print(s);s="";
           s+="|RECEIVE XBEEE temperature="; s+=temperature; s+= "|"; s+='\n';
      int umidity=myData.umidity;Serial.print(s);s="";
           s+="|RECEIVE XBEEE umidity="; s+=umidity; s+= "|"; s+='\n';
      int pressure=myData.pressure;Serial.print(s);s="";
           s+="|RECEIVE XBEEE pressure="; s+=pressure; s+= "|"; s+='\n';
      int lux=myData.lux;Serial.print(s);s="";
           s+="|RECEIVE XBEEE lux="; s+=lux; s+= "|"; s+='\n';
      int aperto=myData.aperto;Serial.print(s);s="";
           s+="|RECEIVE XBEEE aperto="; s+=aperto; s+= "|"; s+='\n';
      int controll_var=myData.controll_var;Serial.print(s);s="";
           s+="|RECEIVE XBEEE controll_var="; s+=controll_var; s+= "|"; s+='\n';
        Serial.print(s);
        return("FINE RICEZIONE");
}

Slave

#include <EasyTransfer.h>


EasyTransfer ET;

struct DATA_STRUCTURE{
  char TYPE;//tipo di trasmissione C=Comando S=inviodati T=settempo
  int DESTINATION;//destinazione 9999=a tutti
  int IDDevice;//id slave
  int enable;
  int pwmVal;
  int ledT;
  int power;
  int temperature;
  int umidity;
  int pressure;
  int lux;
  int aperto;
  int controll_var;
};

DATA_STRUCTURE myData;

void setup(){
ET.begin(details(myData), &xbee);}

void loop(){
  float current = emon1.calcIrms(1480)-0.05;
  float power_consumed = current*220;
  myData.TYPE='S';
  myData.DESTINATION=99999;
  myData.IDDevice=MY_ID;
  myData.enable=0;
  myData.pwmVal=215;
  myData.ledT=sensors.getTempCByIndex(0);
  myData.power=(int)power_consumed;
  myData.temperature=dht.readTemperature()*100;
  myData.umidity=dht.readHumidity()*100;
  myData.pressure=-1;
  myData.lux=analogRead(photoresistor); 
  myData.aperto=1;
  myData.controll_var=0;
  ET.sendData();
}

Ma ti stampa qualcosa il master a Seriale? Da quello che hai detto sembra un problema di RAM

No, si blocca completamente, dopo aver stampato tutti i valori sulla seriale.

Nel master prova a togliere quel String e mettere tutti i dati piano piano su seriale con una serie di Serial.print()
Secondo me è problema di SRAM, dopo il primo giro hai uno String "enorme" che si mangia la SRAM.

String Receive_XBEE(){
      String s="";
      char TYPE=myData.TYPE;
      int DESTINATION=myData.DESTINATION;
      int IDDevice=myData.IDDevice;
      s+="|RECEIVE XBEEE ID="; s+=IDDevice; s+= "|"; s+='\n';
      int enable=myData.enable;Serial.print(s);s="";
      s+="|RECEIVE XBEEE enable="; s+=enable; s+= "|"; s+='\n';
      int pwmVal=myData.pwmVal;Serial.print(s);s="";
           s+="|RECEIVE XBEEE pwmVal="; s+=pwmVal; s+= "|"; s+='\n';
      int ledT=myData.ledT;Serial.print(s);s="";
           s+="|RECEIVE XBEEE ledT="; s+=ledT; s+= "|"; s+='\n';
      int power=myData.power;Serial.print(s);s="";
           s+="|RECEIVE XBEEE power="; s+=power; s+= "|"; s+='\n';
     int temperature=myData.temperature;Serial.print(s);s="";
           s+="|RECEIVE XBEEE temperature="; s+=temperature; s+= "|"; s+='\n';
      int umidity=myData.umidity;Serial.print(s);s="";
           s+="|RECEIVE XBEEE umidity="; s+=umidity; s+= "|"; s+='\n';
      int pressure=myData.pressure;Serial.print(s);s="";
           s+="|RECEIVE XBEEE pressure="; s+=pressure; s+= "|"; s+='\n';
      int lux=myData.lux;Serial.print(s);s="";
           s+="|RECEIVE XBEEE lux="; s+=lux; s+= "|"; s+='\n';
      int aperto=myData.aperto;Serial.print(s);s="";
           s+="|RECEIVE XBEEE aperto="; s+=aperto; s+= "|"; s+='\n';
      int controll_var=myData.controll_var;Serial.print(s);s="";
           s+="|RECEIVE XBEEE controll_var="; s+=controll_var; s+= "|"; s+='\n';
        Serial.print(s);
        free(s);
        return("FINE RICEZIONE"); //è necessario questo return??? non puoi usare un intero tipo
        //return 1; ???
}

prova cosi..secondo me è troppo onerosa questa funzione o incasina qualcosa questa

Grazie mille ora funziona! :slight_smile: