I have an arduino that has connected one NRF24L01 + module and a motion sensor and other arduino that has just connected a NRF24L01 module configured as the father of the first . The gateway receives packets of motion sensor but does not return the ack
This is the source code or gateway
#include <MySensor.h>
#include <MySigningNone.h>
#include <MyTransportNRF24.h>
#include <MyHwATMega328.h>
#include <SPI.h>
#define NODE_ID 0
#define MOTION_SENSOR_ID 0
#define MOTION_SENSOR_NODE 1
#define BEGIN_TRANSMISSION "BEGIN"
#define END_TRANSMISSION "END"
#define WHO_AM_I "WHO_AM_I"
#define WHICH_SENSOR "WHICH_SENSOR"
#define WHATH "WHATH"
#define SEND_TELEGRAM "SEND_TELEGRAM"
#define OK "OK"
MyTransportNRF24 transport(7, 8,RF24_PA_HIGH);
MySigningNone signer;
MyHwATMega328 hw;
MySensor gw(transport,hw);
bool begin_transmission=false;
int who_am_i=-1;
int which_sensor=-1;
int whath=-1;
String send_telegram="";
unsigned long timeout=10000;
unsigned long begin_transmission_time=millis();
MyMessage msg(MOTION_SENSOR_ID,V_VAR1);
void response(const MyMessage &m){
String message_text=m.getString();
Serial.println(message_text);
if(message_text==BEGIN_TRANSMISSION && !begin_transmission){
begin_transmission=true;
begin_transmission_time=millis();
}
if(begin_transmission){
if(who_am_i<0 && message_text.startsWith(WHO_AM_I)){
who_am_i=message_text.substring(String(WHO_AM_I).length()+1).toInt();
}
else if(which_sensor<0 && message_text.startsWith(WHICH_SENSOR)){
which_sensor=message_text.substring(String(WHICH_SENSOR).length()+1).toInt();
}
else if(whath<0 && message_text.startsWith(WHATH)){
whath=message_text.substring(String(WHATH).length()+1).toInt();
}
else if(message_text.startsWith(SEND_TELEGRAM)){
send_telegram+=message_text.substring(String(SEND_TELEGRAM).length()+1);
}
else if(message_text.startsWith(END_TRANSMISSION)){
begin_transmission=false;
if(send_telegram!=""){
String telegram=String("Node ")+who_am_i+String(" Sensor ")+which_sensor+String(" Valor ")+whath+String(" ")+send_telegram+String("*");
who_am_i=-1;
which_sensor=-1;
whath=-1;
send_telegram="";
Serial.println(telegram);
}
}
}
msg.setDestination(MOTION_SENSOR_NODE);
gw.send(msg.set(OK),true);
}
void setup()
{
Serial.begin(115200);
gw.begin(response,NODE_ID,false,NULL);
}
void loop()
{
gw.process();
gw.wait(10000); // Wait 10 seconds
if((begin_transmission_time+timeout)<millis()){
begin_transmission=false;
who_am_i=-1;
which_sensor=-1;
whath=-1;
send_telegram="";
}
}
And this is the source code of motion sensor sketch
#include <MySensor.h>
#include <MySigningNone.h>
#include <MyTransportNRF24.h>
#include <MyHwATMega328.h>
#include <SPI.h>
#define MOTION_SENSOR_ID 0
#define MOTION_SENSOR_PIN 5
#define NODE_ID 1
#define PARENT_ID 0
#define BEGIN_TRANSMISSION "BEGIN"
#define END_TRANSMISSION "END"
#define WHO_AM_I "WHO_AM_I"
#define WHICH_SENSOR "WHICH_SENSOR"
#define WHATH "WHATH"
#define SEND_TELEGRAM "SEND_TELEGRAM"
String who_am_i;
String which_sensor;
String whath;
String send_telegram;
bool ack_received=false;
unsigned long send_time=millis();
int retry_times=5;
MyTransportNRF24 transport(7, 8,RF24_PA_HIGH);
MySigningNone signer;
MyHwATMega328 hw;
MySensor gw(transport,hw);
MyMessage msg(MOTION_SENSOR_ID, V_TRIPPED);
void response(const MyMessage &m){
ack_received=m.isAck();
Serial.print("ack_received ");
Serial.println(ack_received);
}
void send_message(const char* text){
for(int i=0;i<retry_times && !ack_received;++i){
gw.send(msg.set(text),true);
delay(100);
}
}
void setup()
{
Serial.begin(115200);
gw.begin(response,NODE_ID,false,PARENT_ID);
gw.sendSketchInfo("Motion sensor", "0.1");
gw.present(MOTION_SENSOR_ID,S_MOTION,"Motion sensor",false);
Serial.print("Id ");
Serial.println(gw.getNodeId());
pinMode(MOTION_SENSOR_PIN, INPUT);
}
void loop()
{
gw.process();
if(digitalRead(MOTION_SENSOR_PIN)){
send_message(BEGIN_TRANSMISSION);
//Who am I
if(ack_received){
ack_received=false;
who_am_i=String(WHO_AM_I)+" "+gw.getNodeId();
send_message(who_am_i.c_str());
}
//Which sensor
if(ack_received){
ack_received=false;
which_sensor=String(WHICH_SENSOR)+" "+MOTION_SENSOR_ID;
send_message(which_sensor.c_str());
}
//Whath
if(ack_received){
ack_received=false;
whath=String(WHATH)+" "+1;
send_message(whath.c_str());
}
//Telegram
if(ack_received){
int string_pos=0;
String message_text=String(" Detectada presencia");
while(string_pos<message_text.length()){
ack_received=false;
send_telegram=String(SEND_TELEGRAM)+" "+message_text.substring(string_pos,string_pos+25-String(SEND_TELEGRAM).length());
send_message(send_telegram.c_str());
string_pos=string_pos+25-String(SEND_TELEGRAM).length()-1;
}
}
//End transmission
if(ack_received){
ack_received=false;
send_message(END_TRANSMISSION);
}
ack_received=false;
}
gw.wait(1000); // Wait 10 seconds
}
Serial port output for gateway is
0;0;3;0;9;gateway started, id=0, parent=0, distance=0
0;0;3;0;9;read: 1-1-0 s=0,c=1,t=16,pt=0,l=5,sg=0:BEGIN
0;0;3;0;9;send: 0-0-0-1 s=0,c=1,t=16,pt=0,l=5,sg=0,st=fail:BEGIN
BEGIN
0;0;3;0;9;send: 0-0-0-1 s=0,c=1,t=24,pt=0,l=2,sg=0,st=fail:OK
0;0;3;0;9;read: 1-1-0 s=0,c=1,t=16,pt=0,l=5,sg=0:BEGIN
0;0;3;0;9;send: 0-0-0-1 s=0,c=1,t=16,pt=0,l=5,sg=0,st=fail:BEGIN
BEGIN
0;0;3;0;9;send: 0-0-0-1 s=0,c=1,t=24,pt=0,l=2,sg=0,st=fail:OK
0;0;3;0;9;read: 1-1-0 s=0,c=1,t=16,pt=0,l=5,sg=0:BEGIN
0;0;3;0;9;send: 0-0-0-1 s=0,c=1,t=16,pt=0,l=5,sg=0,st=fail:BEGIN
BEGIN
0;0;3;0;9;send: 0-0-0-1 s=0,c=1,t=24,pt=0,l=2,sg=0,st=fail:OK
0;0;3;0;9;read: 1-1-0 s=0,c=1,t=16,pt=0,l=5,sg=0:BEGIN
0;0;3;0;9;send: 0-0-0-1 s=0,c=1,t=16,pt=0,l=5,sg=0,st=fail:BEGIN
BEGIN
And serial port output for motion sensor sketch is
send: 1-1-0-0 s=255,c=0,t=17,pt=0,l=5,sg=0,st=ok:1.5.4
send: 1-1-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0
sensor started, id=1, parent=0, distance=1
send: 1-1-0-0 s=255,c=3,t=11,pt=0,l=13,sg=0,st=ok:Motion sensor
send: 1-1-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=fail:0.1
send: 1-1-0-0 s=0,c=0,t=1,pt=0,l=13,sg=0,st=ok:Motion sensor
Id 1
send: 1-1-0-0 s=0,c=1,t=16,pt=0,l=5,sg=0,st=ok:BEGIN
send: 1-1-0-0 s=0,c=1,t=16,pt=0,l=5,sg=0,st=ok:BEGIN
send: 1-1-0-0 s=0,c=1,t=16,pt=0,l=5,sg=0,st=ok:BEGIN
send: 1-1-0-0 s=0,c=1,t=16,pt=0,l=5,sg=0,st=ok:BEGIN
send: 1-1-0-0 s=0,c=1,t=16,pt=0,l=5,sg=0,st=ok:BEGIN
send: 1-1-0-0 s=0,c=1,t=16,pt=0,l=5,sg=0,st=ok:BEGIN
send: 1-1-0-0 s=0,c=1,t=16,pt=0,l=5,sg=0,st=ok:BEGIN
send: 1-1-0-0 s=0,c=1,t=16,pt=0,l=5,sg=0,st=ok:BEGIN
send: 1-1-0-0 s=0,c=1,t=16,pt=0,l=5,sg=0,st=ok:BEGIN
send: 1-1-0-0 s=0,c=1,t=16,pt=0,l=5,sg=0,st=ok:BEGIN
Where is the problem? It seems that the gateway can not find the motion sensor.
Moreover, there is a method in the myMessage class to know id of node sending a message?
Thanks