Automação residencial em módulos

O meu esboço é o abaixo, uso a lib do maniac:

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <Wire.h>

#define PIN_VOLT 0  //A0 - Battery State
#define PIN_THERM 1 //A1 - Temperature State

#define SW_PRESENCE 2 //D2 - Presence Switch
#define RelayOrSpkr 3 //D3 - Master: Speker/Siren (PWM)
                      //D3 - Slave: Light Relay
#define SW_DOOR 4 //D4 - Door Switch
#define JP_1 5    //D5 - JP1 Node Definition
#define JP_2 6    //D6 - JP2 Node Definition
#define JP_3 7    //D7 - JP3 Node Definition
#define LED_ON 8  //D8 - Led ONLINE

//D09 - nRF_CE (P3)
//D10 - nRF_CSN (P4)
//D11 - nRF_MOSI (P6)
//D12 - nRF_MISO (P7)
//D13 - nRF_SCK (P5)

#define TimeCheck 1000UL
#define TimeOut 300UL

#define dlyCheck 0
#define dlyMonit 1

const unsigned long intDelay[] = {100UL, 1000UL};
unsigned long longLastMillis[] = {0UL, 1000UL};

#define Debug_Mode

#define Nodes_Count 6
uint8_t this_node = 0;
int to_node_idx = 0;
unsigned long next_check_time = 0;

enum state {OFF, ON, waiting, error};

struct message_t {
  int Id;
  bool Value;
};

struct nodes_t {
  uint8_t Node;
  char Name[8]; //TODO: change to use progmem http://www.nongnu.org/avr-libc/user-manual/pgmspace.html
  state State;
  unsigned long LastRequest;
  unsigned long LastResponse;
  uint8_t retries;
  bool Light;
  bool Presence;
  bool Door;
} 
Node[Nodes_Count] = {
  {0,"Master", OFF, 0UL, 0UL},
  {1,"Living", OFF, 0UL, 0UL},
  {2,"kitchen", OFF, 0UL, 0UL},
  {3,"F-Room", OFF, 0UL, 0UL},
  {4,"B-Room", OFF, 0UL, 0UL},
  {5,"Hall", OFF, 0UL, 0UL}
};

#if defined(__AVR_ATmega2560__)
RF24 radio(9,53);
#else
RF24 radio(9,10);
#endif

RF24Network network(radio);

//Variable to print
double Temp;
float vBatt;

void handle_State(RF24NetworkHeader& header);
void handle_Response(RF24NetworkHeader& header);
void handle_Notification(RF24NetworkHeader& header);

void setup() {
  //    JP_1    Node
  //(X)	( )	( )	0
  //( )	(X)	( )	1
  //( )	( )	(X)	2
  //(X)	(X)	(X)	3
  //( )	(X)	(X)	4
  //(X)	(X)	( )	5

  //TODO: change to use direct port access
  pinMode(JP_1,INPUT); 
  pinMode(JP_2,INPUT);
  pinMode(JP_3,INPUT);

  // turn on pullup resistors
  digitalWrite(JP_1, HIGH);
  digitalWrite(JP_2, HIGH);
  digitalWrite(JP_3, HIGH);

  delay(20); //wait to stabilize

  bool JP1 = digitalRead(JP_1) == LOW;
  bool JP2 = digitalRead(JP_2) == LOW;
  bool JP3 = digitalRead(JP_3) == LOW;

  if (JP1 && !JP2 && !JP3) this_node = 0u;
  if (!JP1 && JP2 && !JP3) this_node = 1u;
  if (!JP1 && !JP2 && JP3) this_node = 2u;
  if (JP1 && JP2 && JP3) this_node = 3u;
  if (!JP1 && JP2 && JP3) this_node = 4u;
  if (JP1 && JP2 && !JP3) this_node = 5u;

  if(this_node == 0){
    to_node_idx = 1;
  }else{
    pinMode(SW_DOOR, INPUT);     //magnetic will put pin LOW
    digitalWrite(SW_DOOR, HIGH); // turn on pullup resistors

    pinMode(SW_PRESENCE, INPUT); //PIR will put pin HIGH

    pinMode(RelayOrSpkr, OUTPUT); //Light Relay
    digitalWrite(RelayOrSpkr, LOW); //OFF
  }

#if defined (Debug_Mode)
  Serial.begin(115200);
#endif

  radio.begin();

  network.begin(75, this_node);
  
#if defined (Debug_Mode)
  Serial.print(Node[this_node].Name);
  Serial.println(F(" Initialized"));
#endif

  pinMode(LED_ON, OUTPUT);
  digitalWrite(LED_ON, HIGH);
}

void loop() {
  NetCheck();

  if (this_node == 0){
    StatusRequest();
    //NodeTimeoutCheck();
  }
  else {
    /*unsigned long now = millis();
    if (now - longLastMillis[1] >= intDelay[1]) {
      GetTemperature();
      GetVoltage();
      longLastMillis[1] = now;
    }*/
  }
}

void NetCheck(){
  network.update();

  while (network.available()) {
    RF24NetworkHeader header;
    network.peek(header);

    int index = GetNodeIndex(header.from_node);

    if (index != -1){
      Node[index].LastResponse = millis();
      if (Node[index].State != ON){
        Node[index].State = ON;
        //mcp.digitalWrite(n, LOW);
      }
      switch (header.type){
      case 'S':
        handle_State(header);
        break;
      case 'R':
        handle_Response(header);
        break;
      case 'N':
        //handle_Notification(header);
        break;
      default:
#if defined (Debug_Mode)        
        Serial.print(F("WARNING - Unknown message type: "));
        Serial.println(header.type);
        network.read(header,0,0);
        break;
#endif
      }
    }
    else{
      network.read(header,0,0);
    }
  }
}

int GetNodeIndex(uint16_t NodeNum){
  int i = Nodes_Count;
  while (i--) {
    if (Node[i].Node == NodeNum)
      return i;
    else if (i == -1)
      break;
  }
  
  return -1;
}

void StatusRequest(void){
  unsigned long now = millis();

  if ((now - longLastMillis[dlyCheck] >= intDelay[dlyCheck])
    && (Node[to_node_idx].retries < 3)
    && (Node[to_node_idx].State != error) 
    && ((now - Node[to_node_idx].LastRequest) >= TimeCheck)
    ){
      longLastMillis[dlyCheck] = now;

      Node[to_node_idx].State = waiting;
      
      Node[to_node_idx].LastRequest = now;

      RF24NetworkHeader header(/*to node*/ Node[to_node_idx].Node, /*type*/ 'S' /*Status*/);
      
      if (network.write(header, &now, sizeof(now))) {
#if defined (Debug_Mode)
        Serial.print(F("Sent Status Request: "));
        Serial.print(now, 10);
        Serial.print(F(", To Node: "));
        Serial.println(Node[to_node_idx].Name);
#endif
        Node[to_node_idx].retries = 0;
      }
      else {
#if defined (Debug_Mode)
        Serial.print(F("Node: "));
        Serial.print(Node[to_node_idx].Node);
        Serial.print(F(" - "));
        Serial.print(Node[to_node_idx].Name);
        Serial.println(F(" no found"));
#endif
        Node[to_node_idx].retries++;
      }
  }

  if(to_node_idx == Nodes_Count -1)
    to_node_idx = 1;
  else
    to_node_idx++;
}

void handle_State(RF24NetworkHeader& header){
  unsigned long ReceivedMillis;

  network.read(header,&ReceivedMillis,sizeof(ReceivedMillis)); 

#if defined (Debug_Mode)
  Serial.print(F("Received from node: "));
  Serial.print(header.from_node);
  Serial.print(F(" - "));
  Serial.println(ReceivedMillis);
#endif

  RF24NetworkHeader header_response(/*to node*/ header.from_node, /*type*/ 'R' /*Status*/);

  int idx = GetNodeIndex(header.from_node);

  if (network.write(header_response, &ReceivedMillis, sizeof(ReceivedMillis))) {
#if defined (Debug_Mode)
    Serial.print(F(". response at: "));
    Serial.print(millis());
    Serial.print(F(" to "));
    Serial.println(Node[idx].Node);
#endif
  }
  else {
#if defined (Debug_Mode)
    Serial.print(F("Node: "));
    Serial.print(Node[idx].Node);
    Serial.print(F(" - "));
    Serial.print(Node[idx].Name);
    Serial.println(F(" no found"));
#endif
  }
}

void handle_Response(RF24NetworkHeader& header){

  unsigned long message;

  network.read(header,&message,sizeof(message));

  int index = GetNodeIndex(header.from_node);

#if defined (Debug_Mode)
  Serial.print(F("Received: "));
  Serial.print(message);
  Serial.print(F(", from node: "));
  Serial.print(Node[index].Node);
  Serial.print(F(" - "));
  Serial.print(Node[index].Name);
  Serial.print(F(", sent at: "));
  Serial.print(Node[index].LastRequest);
  Serial.print(F(". It took: "));
  Serial.println(millis()-Node[index].LastRequest);
#endif
}