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
}