Newbie Problem! Get Started with NRF24L01+



  • @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
  • 1
  • 6
  • 1
  • 5

36
Online

11.4k
Users

11.1k
Topics

112.6k
Posts