Newbie Problem! Get Started with NRF24L01+



  • Good day!

    I have a problem setting up my army.
    I am planning to monitor my house using a lot of NRF24 modules but instead of connecting to a cloud I want the master NRF to send me a message.

    I am very new to this and any help will be truly appreciated.

    I have 2x NRF24L01+ Modules and 2x Arduino UNO.
    I already have an Arduino IDE so I just downloaded the library.
    I uploaded SerialGateway.ino to one of the Arduino and DallasTemperatureSensor.ino to the other.
    I followed the wire connection.
    I placed capacitor between the 3.3V and GND
    I placed inclusion button, leds and resistors.

    When I open the Serial Monitor for the SerialGateway, Nothing happens 😢

    The led for the inclusion button is not blinking on the SerialGateway
    I can't see temp readings on the DallasTemperatureSensor even though I use Serial.print()

    am I missing anything?
    Do I need to have a controller?
    Is Serial.print() not applicable if I am using NRF24?



  • Just to check, did you upload the DallasTemperatureSensor.ino, or did you upload the Temperature sketch inside the MySensors subfolder?

    I'm at work currently so I can't give exact details, but I noticed that if you unpack the MySensors package into the Arduino libraries, you get a heap of example sketches for various items, but then inside the MySensors subfolder are the sketches set up for the MySensors stuff.

    So check which one you have used for the remote module with the dallas sensor.

    Also on the serial gateway, check the serial output on that (at 115,200 board speed), and check, it should say "Gateway setup complete" or something close to that.



  • @Chester : Thank you!

    I changed baud rate on the Serial Monitor, now it says "0;0;3;0;14;Gateway startup complete."

    I used the one inside 'MySensors'. I also changed the baud rate and now it says "check wires"

    Why is the inclusion button not working? Will a message show if I press the button?



  • Have you set up any controller? For example Domoticz or MYSController?



  • @Striffster : No I haven't. Is it necessary? My plan was to send data using a gsm module after I get it from NRF modules



  • I'm kind of a newbie too, but yes I think you need a controller. It's the controller who assigns ID's to the sensor nodes.



  • @Striffster Hmm, so it can't be stand alone? If I press the inclusion button, will it not send the received ID for the NRF module?


  • Admin

    The serial gateway does not hand out ids by itself.

    If you want to create something standalone I suggest you set static id:s on your nodes and don't rely on any configuration (metric/imperial) received from controller.



  • @hek How can I set static IDs?


  • Admin

    http://www.mysensors.org/download/sensor_api_14#the-full-api

    Second argument to gw.begin(NULL, xxx);



  • @Chester : After checking the wire and the supply I know my connection isn't the problem so I replaced my Arduino.

    This is the output:

    send: 255-255-255-255 s=255,c=3,t=7,pt=0,l=0,st=fail:
    req node id
    send: 255-255-255-0 s=255,c=3,t=3,pt=0,l=0,st=fail:
    sensor started, id 255
    req node id
    send: 255-255-255-0 s=255,c=3,t=3,pt=0,l=0,st=fail:
    req node id
    send: 255-255-255-0 s=255,c=3,t=3,pt=0,l=0,st=fail:
    req node id
    send: 255-255-255-0 s=255,c=3,t=3,pt=0,l=0,st=fail:
    req node id
    send: 255-255-255-0 s=255,c=3,t=3,pt=0,l=0,st=fail:
    

    @hek : After using gw.begin(NULL, 0);

    Thi is the output:

    send: 0-0-255-255 s=255,c=3,t=7,pt=0,l=0,st=fail:
    sensor started, id 0
    send: 0-0-255-0 s=255,c=0,t=17,pt=0,l=5,st=fail:1.4.1
    send: 0-0-255-0 s=255,c=3,t=6,pt=1,l=1,st=fail:255
    send: 0-0-255-0 s=255,c=3,t=11,pt=0,l=18,st=fail:Temperature Sensor
    send: 0-0-255-0 s=255,c=3,t=12,pt=0,l=3,st=fail:1.0
    send: 0-0-255-0 s=0,c=0,t=6,pt=0,l=5,st=fail:1.4.1
    send: 0-0-255-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.9
    

    What are the s,c,t,pt


  • Hero Member

    Don't use 0 for your node ID! (gw.begin(NULL, 0);) Choose a value beween 1 and 254.

    nodeId - The unique id (1-254) for this sensor.
    

    Do not confuse this with child sensor ID

    childSensorId - The unique child id you want to choose for the sensor connected to this Arduino. Range 0-254.


  • @korttoma : Ok. Thank you! Could you kindly explain what are the send, s, c, t, pt, l and st?


  • Hero Member


  • Admin

    @fakeJake you could also use the latest release of MYSController (0.1.2.278) to have the debug messages parsed.



  • Can I use the inclusion button on the serialGateway?


  • Hero Member

    @fakeJake said:

    Can I use the inclusion button on the serialGateway?

    yes



  • The inclusion button is used to detect the connecting modules, yes?

    This is the output I get when I press the inclusion button on the serial gateway

    0;0;3;0;14;Gateway startup complete.
    0;0;3;0;9;Inclusion started by button.
    0;0;3;0;5;1
    0;0;3;0;5;0
    

    I have another NRF module with ds18b20 connected. Can you help me on how I can get the temp sensor to connect to the serial gateway? I c

    I used the code here and changed the gw.begin() to gw.begin(NULL, 1)

    sensor started, id 1
    send: 1-1-0-0 s=255,c=0,t=17,pt=0,l=5,st=fail:1.4.1
    send: 1-1-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
    send: 1-1-0-0 s=255,c=3,t=11,pt=0,l=18,st=fail:Temperature Sensor
    send: 1-1-0-0 s=255,c=3,t=12,pt=0,l=3,st=fail:1.0
    send: 1-1-0-0 s=0,c=0,t=6,pt=0,l=5,st=fail:1.4.1
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.6
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.7
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.6
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.7
    send: 1-1-255-255 s=255,c=3,t=7,pt=0,l=0,st=fail:
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.6
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.8
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.7
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.6
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.7
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.6
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:29.7
    send: 1-1-255-255 s=255,c=3,t=7,pt=0,l=0,st=fail:
    


  • This post is deleted!

  • Hero Member

    How are you powering your node? Your node's radio is constantly fail to transmit (st=fail).


  • Admin

    How are you powering your node? Your node's radio is constantly fail to transmit (st=fail).

    It's actually the gateway having problems transmitting acks back to node.



  • @hek said:

    How are you powering your node? Your node's radio is constantly fail to transmit (st=fail).

    It's actually the gateway having problems transmitting acks back to node.

    I'm powering the nrf modules from same 3.3V supply since I haven't bought a regulator yet. I'll test it again later. I'll be going out to buy them now.

    Just to give me a heads up. What should the serial gateway get after i press the inclusion button?



  • Sorry for the late reply

    Each modules are now supplied with 5V and 3.3V.

    This is the serial gateway output:

    0;0;3;0;14;Gateway startup complete.
    0;0;3;0;9;read: 1-1-0 s=0,c=1,t=0,pt=7,l=5:30.2
    1;0;1;0;0;30.2
    0;0;3;0;9;Inclusion started by button.
    0;0;3;0;5;1
    0;0;3;0;5;0
    

    This is the temp output:

    sensor started, id 1
    send: 1-1-0-0 s=255,c=0,t=17,pt=0,l=5,st=fail:1.4.1
    send: 1-1-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
    send: 1-1-0-0 s=255,c=3,t=11,pt=0,l=18,st=fail:Temperature Sensor
    send: 1-1-0-0 s=255,c=3,t=12,pt=0,l=3,st=fail:1.0
    send: 1-1-0-0 s=0,c=0,t=6,pt=0,l=5,st=fail:1.4.1
    send: 1-1-0-0 s=0,c=1,t=0,pt=7,l=5,st=fail:30.2
    

    st keeps on failing. I checked the nrf supply and it ranges from 3.1v to 3.3 v. Is this bad? I'm using spx2815 since it's the only thing available to me. I placed 10uF capacitor in the 5v input and 3.3v output to ground



  • @rvendrame said:

    Maybe this may cover it http://www.mysensors.org/download/serial_api_14

    It only explains the "0;0;3;0;14;" but not the "s=255,c=3,t=11,pt=0,l=18,st=fail:Temperature Sensor" that it sends or reads


  • Hero Member

    @fakeJake , are the node far from gateway, or any obstacle (such as a wall) in between? Another source of interference is for example a microwave.



  • @rvendrame said:

    @fakeJake , are the node far from gateway, or any obstacle (such as a wall) in between? Another source of interference is for example a microwave.

    They are just 6 inches apart 😟


  • Hero Member

    Some people reported trouble with cheap fake radios. If you have spares nRF try replacing one of them or both.

    You mentioned a flotation (3.1 to 3.3) in radio VCC, this can also be a reason, as these nRF are very sensible to power variations.

    Post your sketches too, just incase...



  • I'm using the DallasTemperatureSensor.ino on MySensors library. I just change the gw.begin(); to gw.begin(NULL, 1);

    // Example sketch showing how to send in OneWire temperature readings
    #include <MySensor.h>  
    #include <SPI.h>
    #include <DallasTemperature.h>
    #include <OneWire.h>
    
    #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
    #define MAX_ATTACHED_DS18B20 16
    unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    MySensor gw;
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors=0;
    boolean receivedConfig = false;
    boolean metric = true; 
    // Initialize temperature message
    MyMessage msg(0,V_TEMP);
    
    void setup()  
    { 
      // Startup OneWire 
      sensors.begin();
    
      // Startup and initialize MySensors library. Set callback for incoming messages. 
      gw.begin(NULL,1); 
    
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Temperature Sensor", "1.0");
    
      // Fetch the number of attached temperature sensors  
      numSensors = sensors.getDeviceCount();
    
      // Present all sensors to controller
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
         gw.present(i, S_TEMP);
      }
    }
    
    
    void loop()     
    {     
      // Process incoming messages (like config from server)
      gw.process(); 
    
      // Fetch temperatures from Dallas sensors
      sensors.requestTemperatures(); 
    
      // Read temperatures and send them to controller 
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
     
        // Fetch and round temperature to one decimal
        float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
     
        // Only send data if temperature has changed and no error
        if (lastTemperature[i] != temperature && temperature != -127.00) {
     
          // Send in the new temperature
          gw.send(msg.setSensor(i).set(temperature,1));
          lastTemperature[i]=temperature;
        }
      }
      gw.sleep(SLEEP_TIME);
    }
    


  • Good news! The gateway is now working 🙂
    I changed the dallas temperature to relay actuator and, yes, it's now working!
    Bad news is I still don't know what went wrong with my temperature sensor.
    I'll investigate on it soon.

    This is the gateway output:

    0;0;3;0;14;Gateway startup complete.
    0;0;3;0;9;read: 2-2-0 s=255,c=0,t=18,pt=0,l=5:1.4.1
    2;255;0;0;18;1.4.1
    0;0;3;0;9;read: 2-2-0 s=255,c=3,t=6,pt=1,l=1:0
    2;255;3;0;6;0
    0;0;3;0;9;read: 2-2-0 s=255,c=3,t=11,pt=0,l=5:Relay
    2;255;3;0;11;Relay
    0;0;3;0;9;read: 2-2-0 s=255,c=3,t=12,pt=0,l=3:1.0
    2;255;3;0;12;1.0
    0;0;3;0;9;read: 2-2-0 s=1,c=0,t=3,pt=0,l=5:1.4.1
    2;1;0;0;3;1.4.1
    

    This is the relay output:

    repeater started, id 2
    send: 2-2-0-0 s=255,c=0,t=18,pt=0,l=5,st=ok:1.4.1
    send: 2-2-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
    send: 2-2-0-0 s=255,c=3,t=11,pt=0,l=5,st=ok:Relay
    send: 2-2-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
    send: 2-2-0-0 s=1,c=0,t=3,pt=0,l=5,st=ok:1.4.1
    

    I just need to test it.
    Since I'll be using a gsm to control the relay. Can you help me on what to send to the relay to turn it on/off?


  • Hero Member

    @fakeJake , I' m glad it worked with relay sketch.

    Regarding the temperature, try to move the sensor to other arduino pin. Pin 2 & 3 are used by interrupts and may not play nice with gw.sleep depending on the lib used.

    To send a message to the relay , you need a controller connected to the GW, either via USB or ethernet. You can also simulate it by entering the message on the Serial monitor.

    The protocol is described here http://www.mysensors.org/download/serial_api_14



  • I tried entering message on the serial monitor of the gateway but still no luck.
    This is the closest thing that I did to tell the relay to turn the light on.

    Gateway output after I enter "2;0;1;1;2;1;" to the Serial monitor:

    0;0;3;0;14;Gateway startup complete.
    0;0;3;0;9;read: 2-2-0 s=255,c=0,t=17,pt=0,l=5:1.4.1
    2;255;0;0;17;1.4.1
    0;0;3;0;9;read: 2-2-0 s=255,c=3,t=6,pt=1,l=1:0
    2;255;3;0;6;0
    0;0;3;0;9;read: 2-2-0 s=255,c=3,t=11,pt=0,l=5:Relay
    2;255;3;0;11;Relay
    0;0;3;0;9;read: 2-2-0 s=255,c=3,t=12,pt=0,l=3:1.0
    2;255;3;0;12;1.0
    0;0;3;0;9;read: 2-2-0 s=1,c=0,t=3,pt=0,l=5:1.4.1
    2;1;0;0;3;1.4.1
    0;0;3;0;9;send: 0-0-2-2 s=0,c=1,t=2,pt=0,l=1,st=ok:1
    0;0;3;0;9;read: 2-2-0 s=0,c=1,t=2,pt=0,l=1:1
    2;0;1;1;2;1
    

    Relay output after "2;0;1;1;2;1;" :

    sensor started, id 2
    send: 2-2-0-0 s=255,c=0,t=17,pt=0,l=5,st=ok:1.4.1
    send: 2-2-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
    send: 2-2-0-0 s=255,c=3,t=11,pt=0,l=5,st=ok:Relay
    send: 2-2-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
    send: 2-2-0-0 s=1,c=0,t=3,pt=0,l=5,st=ok:1.4.1
    read: 0-0-2 s=0,c=1,t=2,pt=0,l=1:1
    send: 2-2-0-0 s=0,c=1,t=2,pt=0,l=1,st=ok:1
    Incoming change for sensor:0, New status: 1
    

    Still it doesn't turn on the light


  • Hero Member

    Maybe you can you connect the node also in a USB port, and open a serial monitor for it? You would see if it is receiving the message correctly.



  • @rvendrame Sorry I forgot to include that, I edited the post



  • It still doesn't open the light even if I change it to "2;255;1;1;2;1;"
    I checked the relay using relay.ino from an instructable controlling ac light with relay and it's working.


  • Hero Member

    Can we see your sensor's sketch?



  • I just changed the gw.begin();

    // Example sketch showing how to control physical relays. 
    // This example will remember relay state even after power failure.
    
    #include <MySensor.h>
    #include <SPI.h>
    
    #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #define NUMBER_OF_RELAYS 1 // Total number of attached relays
    #define RELAY_ON 1  // GPIO value to write to turn on attached relay
    #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
    
    MySensor gw;
    
    void setup()  
    {   
      // Initialize library and add callback for incoming messages
      gw.begin(incomingMessage, 2);
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Relay", "1.0");
    
      // Fetch relay status
      for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
        // Register all sensors to gw (they will be created as child devices)
        gw.present(sensor, S_LIGHT);
        // Then set relay pins in output mode
        pinMode(pin, OUTPUT);   
        // Set relay to last known state (using eeprom storage) 
        digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
      }
    }
    
    
    void loop() 
    {
      // Alway process incoming messages whenever possible
      gw.process();
    }
    
    void incomingMessage(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.type==V_LIGHT) {
         // Change relay state
         digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
         // Store state in eeprom
         gw.saveState(message.sensor, message.getBool());
         // Write some debug info
         Serial.print("Incoming change for sensor:");
         Serial.print(message.sensor);
         Serial.print(", New status: ");
         Serial.println(message.getBool());
       } 
    }
    

  • Hero Member

    @fakeJake said:

    > Incoming change for sensor:0
    

    Means your are asking to activate relay 'zero'.

    digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
    

    So digital pin will be 0 - 1 + RELAY_1 = 0 - 1 + 3 = 2

    Conclusion: Try activating relay 1 instead 0. 😉



  • @rvendrame The light is still not turning on 😓
    I even change it to "2;257;1;1;2;1" just incase 255 is the message.sensor but it still prints "2;1;1;1;2;1" so I there's no problem there.

    sensor started, id 2
    send: 2-2-0-0 s=255,c=0,t=17,pt=0,l=5,st=ok:1.4.1
    send: 2-2-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
    send: 2-2-0-0 s=255,c=3,t=11,pt=0,l=5,st=ok:Relay
    send: 2-2-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
    send: 2-2-0-0 s=1,c=0,t=3,pt=0,l=5,st=ok:1.4.1
    read: 0-0-2 s=1,c=1,t=2,pt=0,l=1:1
    send: 2-2-0-0 s=1,c=1,t=2,pt=0,l=1,st=ok:1
    Incoming change for sensor:1, New status: 1
    

  • Hero Member

    how the relay is connected to arduino pin 3? Is there a transistor in between?



  • @rvendrame No transistor. I just followed MySensors: Build Relay Actuator. I directly connected the 5v, gnd and signal to the arduino.


  • Hero Member

    Do you have a standalone relay, or a arduino relay board, like this picture?
    http://www.mysensors.org/relay/relayModule.png

    The board contains a transistor. Some boards also have a 'hi-low' switch, if yours have it, you may try to play with it.

    The arduino output is max of 40ma and will eventually burn or not operate correctly if connected directly to a relay. You must have a transistor in between.

    Make sure you relay board contains at least this circuit: http://www.electroschematics.com/8975/arduino-control-relay/



  • @rvendrame My relay is more like this http://www.elecdesignworks.com/images/stories/virtuemart/product/img_62112.jpg

    Thank you for your reference.
    It has a transistor. I hope it's ok to use. I have tested it by following an instructable.



  • @rvendrame You know what. I'm really thankful for you help and I'm really sorry for dragging you with me. I can turn the light on now. I just have to print "2;1;1;1;2;0;" instead of "2;1;1;1;2;1".

    I will check if I will encounter any problem because of my relay module.
    Again, thank you so much for your help. And I'm really sorry.


  • Hero Member

    Just swap the 0 & 1 here:

    #define RELAY_ON 1  // GPIO value to write to turn on attached relay
    #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
    

    and it will obey as you expect. Some relays boards have inverted input (Zero/GND is ON and VCC is OFF) 😉

    I'm glad it worked.



  • This post is deleted!


  • Is there a way to receive only the last state of the sensors/actuators in the serial?

    instead of:

    0;0;3;0;9;read: 2-2-0 s=1,c=1,t=2,pt=2,l=2:1
    0;0;3;0;9;send: 0-0-2-2 s=1,c=1,t=2,pt=2,l=2,st=ok:1
    2;1;1;0;2;1
    

    it only print the "2;1;1;0;2;1" on the serial



  • I placed if statement in serial function inside MyGateway.cpp
    where 0 is the gateway address

    void MyGateway::serial(MyMessage &msg) {
      if (msg.sender != 0); serial(PSTR("%d;%d;%d;%d;%d;%s\n"),msg.sender, msg.sensor, mGetCommand(msg), mGetAck(msg), msg.type, msg.getString(convBuf));
    }
    

    Still it doesnt work.

    Heres the format:

        msg.sender = GATEWAY_ADDRESS;
    	msg.destination = destination;
    	msg.sensor = sensor;
    	msg.type = type;
    	mSetCommand(msg,command);
    	mSetRequestAck(msg,ack?1:0);
    	mSetAck(msg,false);
    	if (command == C_STREAM)
    		msg.set(bvalue, blen);
    	else
    		msg.set(value);
    


  • if (msg.sender != 0); serial(PSTR("%d;%d;%d;%d;%d;%s\n"),msg.sender, msg.sensor, mGetCommand(msg), mGetAck(msg), msg.type, msg.getString(convBuf));

    Note the ; after the 0) which should not belong there..



  • @Stric Removed it but still the read and send appears



  • Should I post my new question on another board?

    Re: s there a way to receive only the last state of the sensors/actuators in the serial?


  • Admin

    The gateway itself doesn't buffer anything. It just forwards the data from your sensors.



  • @hek can you please help me on what should I comment out?


  • Admin

    turn off DEBUG in MyConfig.h (by commenting it out) before comping you gateway sketch to get rid of debug messages.



  • @hek Thank you! I will try it as soon as I go home. Can you tell me what is the expected output from the gateway if I use static id 2 for a relayActuator that I turned on?

    will it be just "2;1;1;0;2;1" or will "2;255;x;x;x;x" appear? only the read/send data is hidden



  • Is it ok to have two gateways?


Log in to reply
 

Suggested Topics

  • 1
  • 2
  • 2
  • 10
  • 1
  • 2

38
Online

11.4k
Users

11.1k
Topics

112.6k
Posts