Problema per acquisizione codice ir modbus

Salve a tutti, ho un problema software che non riesco a risolvere ed ho pensato di chiedere a chi ne sa più di me XD. Ho realizzato delle schede domotiche con arduino per accendere e spegnere le luci ed il riscaldamento. Utilizzo per fare ciò gli arduino nano rev 3 che si occupano di acquisire lo stato delle luci e di accendere dei relè per pilotare le suddette utenze. Usando il protocollo modbus gestito tramite la libreria modbus-slave ho realizzato una supervisione ad hoc con uno scada configurato per il modbus. Tutto funziona egregiamente, il problema sorge quando ho deciso di ampliare il progetto integrando un ricevitore ir da usare con dei telecomandi che già ho per avere una possibilità in più per accendere le luci. Sono riuscito ad aquisire i codici del telecomando e vorrei passarli “grezzi” (codice esadecimale) alla supervisione in modo da evitare di riprgrammare il firmware di arduino ogni volta che cambio un codice. Ho visto dai vari esempi e da qualche lettura in questo forum che le variabili impostate nell’array del modbus possono essere solo a 16 bit , e non possono essere long a 32 bit come servono a me per acquisire il codice in supervisione tramite modbus. Sapete se esiste una soluzione che posso adottare per risolvere il problema??
Sketch usato nell’arduino:

#include <IRremote.h>

int receiver = 11; //  pin 1 di arduino dove è collegato il ricevitore ir
IRrecv irrecv(receiver); // creo un'istanza per il ricevitore ir in modo da acquisire i codici 
decode_results results; //inizializzo la variabile result per appoggiarci il valore letto dal ricevitore ir
IRsend irsend; //istaanza per scrittura codici sul trasmettitore ir

#include <SimpleModbusSlave.h>  //includo la libreria del modbus

#define  riscaldamento_pt 8 //assegni l'8 all'etichetta riscaldamento_pt
#define  luce_tavolo_cucina 9 // assegni il 9 all'etichetta luce_tavolo_cucina
#define  luce_cucina 10 //assegni il 10 all'etichetta luce_cucina
#define  luce_tavolo_cucina_on  5 // assegni 5 all'etichetta luce_tavolo_cucina_on
#define  luce_cucina_on  6 // assegni 6 all'etichetta  luce_cucina_on


int lettura_acc_tavolo_cucina = 0;   //dichiarazione di variabile usata sotto
int lettura_acc_cucina = 0;          //dichiarazione di variabile usata sotto

 enum 
{     
  // Appena aggiungi o rimuovi i registri risultano già mappati e consecutivi a quelli precedenti...
  // il primo registro parte dall'indirizzo  0
  ADC0,     
  ADC1,        
  ADC2,
  ADC3,
  ADC4,
  ADC5,  
  ACCENSIONE_RISCALDAMENTO_PT,
  SPIA_RISCALDAMENTO_PT_ON,
  ACCENSIONE_LUCE_CUCINA,
  SPIA_LUCE_CUCINA_ON,
  ACCENSIONE_LUCE_TAVOLO_CUCINA,
  SPIA_LUCE_TAVOLO_CUCINA_ON, 
 CODICE_IR_PER_ACCENSIONE_RELE_1,
  CODICE_IR_PER_ACCENSIONE_RELE_2,
  VALORE_GREZZO_CODICE_IR, //porto in supervisione il valore grezzo della lettura del codice ir catturato del sensore(per dianostica errori)
  TOTAL_ERRORS,// lascialo , è meglio sempre usare sia il registro sopra che quello sotto
  TOTAL_REGS_SIZE, // totale del numero di registri per la funzione 3 e 16 condivisa sull'Array generale 
};

unsigned int holdingRegs[TOTAL_REGS_SIZE]; // funzione  3 e 16 definito come array intero. formatta l'array e per ogni registro gli assegna un intero 
////////////////////////////////////////////////////////////

void setup()
{
  /* parametri(bouderate, 
                charattere senza segno: ID, 
                carattere senza segno:ABILITAZIONE ALLA TRASMISSIONE, 
                carattere senza segno: LUNGEZZA DELL' HOLDING REGISTER O ARRAY)
               
     L' abilitazione alla trasmissioe è usata in comunicazioni HALF DUPLEX per usare un max 485 o simili.
     per disattivarlo usare qualsiasi valore  < 2 perchè 0 & 1 è riservato  per  Rx & Tx
  */
  
  modbus_configure(19200, 2, 2, TOTAL_REGS_SIZE); //configurazione del modbus
  pinMode(riscaldamento_pt, OUTPUT); //I/O 9 utilizzato come uscita 9
  pinMode(luce_tavolo_cucina, OUTPUT);  //I/O 10 utilizzato come uscita 10
  pinMode(luce_cucina, OUTPUT);  //I/O 10 utilizzato come uscita 10
  pinMode(luce_tavolo_cucina_on, INPUT); //I/O 5 utilizzato come ingresso 5
  pinMode(luce_cucina_on, INPUT);  //I/O 6 utilizzato come ingresso 6
 //Serial.begin(19200);// abilitazione della seriale solo per debugger software per serial monitor
  irrecv.enableIRIn(); // abilitazione del ricevitore ir

}

void loop()
{
  // L'istruzione modbus_update() è l'unica usata in loop().restituisce il totale degli errori
  // da quando si accende lo slave.  E' usato per trovare i guasti nel master
  //
  holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
  for (byte i = 0; i < 6; i++)
  {
    holdingRegs[i] = analogRead(i);
    delayMicroseconds(500);	     
  }
   
  // leggo lo stato di ACCENSIONE_RISCALDAMENTO_PT dal modbus e scrivo il valore della variabile interna ACCENSIONE_RISCALDAMENTO_PT_HMI dichiarata al volo come byte 
  //che puo' avere come valore intero 0 O 1
  byte  ACCENSIONE_RISCALDAMENTO_PT_HMI= holdingRegs[ACCENSIONE_RISCALDAMENTO_PT];  
  
  if (ACCENSIONE_RISCALDAMENTO_PT_HMI ==1 ) // accendo l'uscita led dove è collegata la luce se si schiaccia il pulsante da supervisione 
   {	  
    digitalWrite(riscaldamento_pt, HIGH);
     holdingRegs[SPIA_RISCALDAMENTO_PT_ON] = 0; //Segnalo la commutazione a off del riscaldamento PT alla supervisione
      } 
  else // accendo l'uscita  dove è collegata la luce se si schiaccia il pulsante da supervisione 
  {
    digitalWrite(riscaldamento_pt, LOW);
    holdingRegs[SPIA_RISCALDAMENTO_PT_ON] = 1; //Segnalo la commutazione a on del riscaldamento PT alla supervisione
  }
  // leggo lo stato di ACCENSIONE_LUCE_TAVOLO_CUCINA dal modbus e scrivo il valore della variabile interna ACCENSIONE_LUCE_TAVOLO_CUCINA_HMI  dichiarata al volo come byte 
  //che puo' avere come valore intero 0 O 1 
  byte ACCENSIONE_LUCE_TAVOLO_CUCINA_HMI = holdingRegs[ACCENSIONE_LUCE_TAVOLO_CUCINA];  
  
  if (ACCENSIONE_LUCE_TAVOLO_CUCINA_HMI ==1 ) // accendo l'uscita led dove è collegata la luce se si schiaccia il pulsante da supervisione
   {	  
   digitalWrite(luce_tavolo_cucina, HIGH);
     } 
 else // accendo l'uscita led dove è collegata la luce se si schiaccia il pulsante da supervisione 
 {
   digitalWrite(luce_tavolo_cucina, LOW);
 }
   lettura_acc_tavolo_cucina = digitalRead(luce_tavolo_cucina_on);
  
 if (lettura_acc_tavolo_cucina ==HIGH ) // segnalo alla supervisione che l'utenza relativa al luce_tavolo_cucina è spenta(dovuta o a domotica o a pulsanti in manuale)
   {	  
  holdingRegs[SPIA_LUCE_TAVOLO_CUCINA_ON] = 0;
  } 
 else // segnalo alla supervisione che l'utenza relativa al luce_tavolo_cucina è accesa(dovuta o a domotica o a pulsanti in manuale)
 {
  holdingRegs[SPIA_LUCE_TAVOLO_CUCINA_ON] = 1;
  } 
  // leggo lo stato di ACCENSIONE_LUCE_CUCINA  dal modbus e scrivo il valore della variabile interna ACCENSIONE_LUCE_CUCINA_HMI dichiarata al volo come byte 
  //che puo' avere come valore intero 0 O 1 
  byte ACCENSIONE_LUCE_CUCINA_HMI = holdingRegs[ACCENSIONE_LUCE_CUCINA];  
  
  if (ACCENSIONE_LUCE_CUCINA_HMI ==1 ) // accendo l'uscita  dove è collegata la luce se si schiaccia il pulsante da supervisione
   {	  
   digitalWrite(luce_cucina, HIGH);
     } 
 else // spengo l'uscita  dove è collegata la luce se si schiaccia il pulsante da supervisione 
 {
   digitalWrite(luce_cucina, LOW);
 }
   lettura_acc_cucina = digitalRead(luce_cucina_on);
  
 if (lettura_acc_cucina ==HIGH ) // segnalo alla supervisione che l'utenza relativa a luce_cucina è spenta(dovuta o a domotica o a pulsanti in manuale)
   {	  
  holdingRegs[SPIA_LUCE_CUCINA_ON] = 0;
  } 
 else // segnalo alla supervisione che l'utenza relativa a luce_cucina è accesa(dovuta o a domotica o a pulsanti in manuale)
 {
  holdingRegs[SPIA_LUCE_CUCINA_ON] = 1;
  } 

   
//Parte di gestione telecomandi  

 byte CODICE_IR_HMI_ACC_RELE_1 = holdingRegs[CODICE_IR_PER_ACCENSIONE_RELE_1];  
 
 byte CODICE_IR_HMI_ACC_RELE_2 = holdingRegs[CODICE_IR_PER_ACCENSIONE_RELE_2];  


  if (irrecv.decode(&results)) // con la libreria ir rimango in ascolto sul pin 11 utilizzato per leggere i codici del telecomando
  {
 // Serial.println(results.value, HEX); // spedisce il valore nel seriale ed è visualizzabile con il serial monitor 
  irrecv.resume();// receive the next value
  }
  holdingRegs[VALORE_GREZZO_CODICE_IR] = results.value >>  16;
}

L’ultima istruzione l’ho messa per cercare di passare solo l’ultima parte della variabile in modo da restringerla a 16 bit ma non funziona.
Scusate se l’ho fatta molto lunga ma non sono riuscito ad essere più sintetico :).
Ciaooo

I'm sorry but I'm not able to write italian, but I do understand it as it is close to my mother tongue catalan.
I'm afraid that your code should not include any sort of delay() instance, since it interferes the modpoll.
Here there is another topic relative to Modbus:

http://forum.arduino.cc/index.php?topic=213432.msg1593556#msg1593556

Just try this new library!

Alex benvenuto. :slight_smile:
Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

Il codice devi racchiuderlo negli appositi tag, vedi regolamento, sezione 7. Viene spiegato bene.
Altrimenti alcune parti del codice vengono interpretati come comandi html e perciò non visibili.

Ciao,
scusate se scrivo solo ora, ma ho avuto dei problemi. Ho lasciato la mia presentazione e scusate per aver pubblicato male il codice..
Saluti