Problem getting the code to run with MySensors library 2.0



  • Hello guys,

    I am trying to write a simple code using the MySensors library 2.0. Its a simple switch. I am generating interrupt on pin 2 of Arduino Uno. Switch is connected between Pin 2 and GND. The interrupt is invoked when I change the state of the switch and then LED on pin 13 toggles.

    First I wrote the code without MySensors library. Just a simple Arduino code to make sure this thing works. It works flawlessly.

    Below is the code for this without MySensors library: This code works. I have commented out the lines which involve use o MySensors library.

    const byte ledPin = 13;
    volatile byte state = LOW;
    
    //MySensors
    // Enable debug prints
    //#define MY_DEBUG
    
    // Enable and select radio type attached
    //#define MY_RADIO_NRF24
    
    //#include <SPI.h>
    //#include <MySensors.h>
    
    const byte DIGITAL_INPUT_SENSOR = 2;
    //#define CHILD_ID 1   // ID of the sensor child
    
    // Initialize message
    //MyMessage msg(CHILD_ID, V_LIGHT);
    
    void setup() {
      pinMode(ledPin, OUTPUT);
      pinMode(DIGITAL_INPUT_SENSOR, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), state_change, CHANGE);
    
      Serial.begin(115200);
    }
    
    //void presentation()  {
    //  // Send the sketch version information to the gateway and Controller
    //  sendSketchInfo("Switch", "1.0");
    //
    //  // Register all sensors to gw (they will be created as child devices)
    //  present(CHILD_ID, S_LIGHT);
    //}
    void loop() {
    
     // boolean status = digitalRead(DIGITAL_INPUT_SENSOR);
      digitalWrite(ledPin, state);
      
      //Serial.println(digitalRead(ledPin));
    
    
      //Serial.println(status);
      //send(msg.set((status)?"1":"0"));  //Send status value to the GW
    }
    
    void state_change() {
      Serial.println(state);
      state = !state;
    }
    

    The problem starts is when I add the line #include<MySensors.h>. When I add this line to the code, LED doesn't toggle when I flip the switch. I don't know what the problem is.
    I really appreciate the help.

    Thank You,
    Vaibhav


  • Mod

    @palande.vaibhav does the problem start when you only uncomment include MySensors.h, or does it start if you uncomment more than that line?

    If you activate the MySensors radio functions (by uncommenting MY_RADIO_NRF24) pin 13 will be used for communicating with the radio. See https://www.mysensors.org/build/connect_radio



  • @mfalkvidd @ayo Thanks for the reply.

    I have tried changing the pin to Pin8.

    I now have tried a Arduino library LED blink code. I attached the LED to Pin 8. It blinks without the #include<MySensors.h> line. But when I add #define MY_RADIO_NRF24 and #include <MySensors.h>, it stops working.

    I have to add #define MY_RADIO_NRF24 because if I don't it throws an error saying if I don't have a radio then adding MySensors.h is pointless. And I get it, its pointless.

    So, problem starts after uncommenting #include<Mysensors.h> and #define MY_RADIO_NRF24.

    /*
      Blink
      Turns on an LED on for one second, then off for one second, repeatedly.
    
      Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO 
      it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN takes care 
      of use the correct LED pin whatever is the board used.
      If you want to know what pin the on-board LED is connected to on your Arduino model, check
      the Technical Specs of your board  at https://www.arduino.cc/en/Main/Products
      
      This example code is in the public domain.
    
      modified 8 May 2014
      by Scott Fitzgerald
      
      modified 2 Sep 2016
      by Arturo Guadalupi
    */
    
    //#define MY_RADIO_NRF24
    //#include <MySensors.h>
    
    // the setup function runs once when you press reset or power the board
    void setup() {
      // initialize digital pin LED_BUILTIN as an output.
      pinMode(8, OUTPUT);
    }
    
    // the loop function runs over and over again forever
    void loop() {
      digitalWrite(8, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(500);                       // wait for a second
      digitalWrite(8, LOW);    // turn the LED off by making the voltage LOW
      delay(500);                       // wait for a second
    }```


  • I believe the problem is a result of the pin 13 you are using for the Led. The Mysensor & SPI both require pin 13 (Pin 13 is SCK pin for SPI) for the radio communication. Try and move your Led Pin to another pin from Pin 8 downward.



  • @ayo
    I did. The problem is still there. I also tried simplest of the simple LED blink code. Check my new post.

    Thank You



  • @palande.vaibhav said:

    @mfalkvidd @ayo

    Even uncommenting #define MY_RADIO_NRF24 WORKS.

    So the problem starts when I uncomment #include <MySensors.h>.



  • @mfalkvidd @ayo

    I just tested with older library version 1.5.4.

    Both Blink and my Switch code work with MySensors library version 1.5.4 but doesn't work with version 2.0.



  • So I tired the blinking thing on my own Arduino setup using the MySensors 2.0 installed var the Arduino Library manager.

    The Led blinks with the mysensors library attached.

    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    // Set LOW transmit power level as default, if you have an amplified NRF-module and
    // power your radio separately with a good regulator you can turn up PA level. 
    #define MY_RF24_PA_LEVEL RF24_PA_LOW
    
    // Enable serial gateway
    #define MY_GATEWAY_SERIAL
    
    // Define a lower baud rate for Arduino's running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
    #if F_CPU == 8000000L
    #define MY_BAUD_RATE 38400
    #endif
    
    // Flash leds on rx/tx/err
    #define MY_LEDS_BLINKING_FEATURE
    // Set blinking period
    #define MY_DEFAULT_LED_BLINK_PERIOD 300
    
    // Inverses the behavior of leds
    //#define MY_WITH_LEDS_BLINKING_INVERSE
    
    // Enable inclusion mode
    #define MY_INCLUSION_MODE_FEATURE
    // Enable Inclusion mode button on gateway
    #define MY_INCLUSION_BUTTON_FEATURE
    
    // Inverses behavior of inclusion button (if using external pullup)
    //#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP
    
    // Set inclusion mode duration (in seconds)
    #define MY_INCLUSION_MODE_DURATION 60 
    // Digital pin used for inclusion mode button
    #define MY_INCLUSION_MODE_BUTTON_PIN  3 
    
    // Uncomment to override default HW configurations
    //#define MY_DEFAULT_ERR_LED_PIN 4  // Error led pin
    //#define MY_DEFAULT_RX_LED_PIN  6  // Receive led pin
    //#define MY_DEFAULT_TX_LED_PIN  5  // the PCB, on board LED
    
    #include <SPI.h>
    #include <MySensors.h>  
    
    void setup() { 
      // Setup locally attached sensors
      pinMode(8, OUTPUT);
    }
    
    void presentation() {
     // Present locally attached sensors 
    }
    
    void loop() { 
      // Send locally attached sensor data here 
       digitalWrite(8, HIGH);   // turn the LED on (HIGH is the voltage level)
      wait(1000);              // wait for a second
      digitalWrite(8, LOW);    // turn the LED off by making the voltage LOW
      wait(1000);              // wait for a second
    }
    

    Maybe you can give that a short...



  • This post is deleted!


  • @ayo
    OK. I will give this a shot.

    One more thing is installing the library 2.0 from Arduino library manager gives an error "
    CRC doesn't match. File is corrupted." I am using Arduino IDE version 1.6.12.

    I am downloading the zip from GitHub and pasting it in the Documents/Arduino/libraries folder. This is OK right??



  • @ayo
    Something weird is happening right now. I am now running MySensors version 2.0. The code you gave works with library version 2.0.

    I was just experimenting with the lines of the code to see which line makes difference and I found that #define MY_GATEWAY_SERIAL line makes difference.
    If I just add that line to my Blink code, it works with MySensors.h

    I don't know why this happens.

    //// Enable debug prints to serial monitor
    //#define MY_DEBUG 
    //
    //
    //// Enable and select radio type attached
    #define MY_RADIO_NRF24
    ////#define MY_RADIO_RFM69
    //
    //// Set LOW transmit power level as default, if you have an amplified NRF-module and
    //// power your radio separately with a good regulator you can turn up PA level. 
    //#define MY_RF24_PA_LEVEL RF24_PA_LOW
    //
    //// Enable serial gateway
    #define MY_GATEWAY_SERIAL
    //
    //// Define a lower baud rate for Arduino's running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
    //#if F_CPU == 8000000L
    //#define MY_BAUD_RATE 38400
    //#endif
    //
    //// Flash leds on rx/tx/err
    //#define MY_LEDS_BLINKING_FEATURE
    //// Set blinking period
    //#define MY_DEFAULT_LED_BLINK_PERIOD 300
    //
    //// Inverses the behavior of leds
    ////#define MY_WITH_LEDS_BLINKING_INVERSE
    //
    //// Enable inclusion mode
    //#define MY_INCLUSION_MODE_FEATURE
    //// Enable Inclusion mode button on gateway
    //#define MY_INCLUSION_BUTTON_FEATURE
    //
    //// Inverses behavior of inclusion button (if using external pullup)
    ////#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP
    //
    //// Set inclusion mode duration (in seconds)
    //#define MY_INCLUSION_MODE_DURATION 60 
    //// Digital pin used for inclusion mode button
    //#define MY_INCLUSION_MODE_BUTTON_PIN  3 
    
    // Uncomment to override default HW configurations
    //#define MY_DEFAULT_ERR_LED_PIN 4  // Error led pin
    //#define MY_DEFAULT_RX_LED_PIN  6  // Receive led pin
    //#define MY_DEFAULT_TX_LED_PIN  5  // the PCB, on board LED
    
    #include <SPI.h>
    #include <MySensors.h>  
    
    void setup() { 
      // Setup locally attached sensors
      pinMode(8, OUTPUT);
    }
    
    void presentation() {
     // Present locally attached sensors 
    }
    
    void loop() { 
      // Send locally attached sensor data here 
       digitalWrite(8, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);              // wait for a second
      digitalWrite(8, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);              // wait for a second
    }
    

    This code works but only if I have #define MY_GATEWAY_SERIAL line included. Can you try this on your setup?

    In my code which was not working previously, If I just add #define MY_GATEWAY_SERIAL , it works.

    In your Blink code, if you just comment out the line #define MY_GATEWAY_SERIAL, it won't work. Can you try this?



  • @mfalkvidd
    Any idea why this is happening?
    Cause I can't use MY_GATEWAY_SERIAL for a node. Right?



  • Okay....so you are really having a strange problem here.
    Am using the Arduino version 1.6.8,
    Can you consider upgrading your arduino version maybe that could fix the CRC thing...


  • Mod

    @palande.vaibhav said:

    Cause I can't use MY_GATEWAY_SERIAL for a node. Right?

    Yes you can. But I read that there is a bug in MySensors 2.0 that causes the presentation function to not run, so you'll need the latest code from the MySensors development branch on Github.



  • @ayo

    1.6.8 is the older version. 1.6.12 is the latest version.

    And the CRC error is the known bug. So, if your IDE and MySensors work then don't change anything.



  • @ayo
    did you try commenting #define MY_GATEWAY_SERIAL and running your Blink code?
    Can you please try that?



  • @mfalkvidd said:

    @palande.vaibhav said:

    Cause I can't use MY_GATEWAY_SERIAL for a node. Right?

    Yes you can. But I read that there is a bug in MySensors 2.0 that causes the presentation function to not run, so you'll need the latest code from the MySensors development branch on Github.

    But am I right that for MySensors version 2.0, we must have #define MY_GATEWAY_SERIAL line in order for the code to work? OR is it just me?

    And I don't even have anything in the presentation function. I think my problem is loop function not working if I don;t have #define MY_GATEWAY_SERIAL line in the code.



  • @mfalkvidd said:

    @palande.vaibhav said:

    Cause I can't use MY_GATEWAY_SERIAL for a node. Right?

    Yes you can. But I read that there is a bug in MySensors 2.0 that causes the presentation function to not run, so you'll need the latest code from the MySensors development branch on Github.

    I tried with the library from Development branch on GitHub. It still doesn't work.
    I must have #define MY_GATEWAY_SERIAL line in the code for the code to work with MySensors.h.

    Library version:
    0_1474709782623_javaw_2016-09-24_02-35-41.png

    Code below doesn't work cause I have commented #define MY_GATEWAY_SERIAL: Just uncomment it and the same code works

    //MySensors
    // Enable debug prints
    //#define MY_DEBUG
    
    //// Enable and select radio type attached
    #define MY_RADIO_NRF24
    ////#define MY_RADIO_RFM69
    
    //#define MY_GATEWAY_SERIAL
    
    #include <SPI.h>
    #include <MySensors.h>
    
    unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds)
    const byte DIGITAL_INPUT_SENSOR = 3;   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
    //#define CHILD_ID 1   // Id of the sensor child
    
    // Initialize motion message
    //MyMessage msg(1, V_LIGHT);
    
    void setup() { 
      // Setup locally attached sensors
      pinMode(8, OUTPUT);
    }
    
    void presentation() {
     // Present locally attached sensors 
    }
    
    void loop() { 
      // Send locally attached sensor data here 
       digitalWrite(8, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);              // wait for a second
      digitalWrite(8, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);              // wait for a second
    }
    


  • @mfalkvidd

    I saw the post about the presentation function not working in 2.0. But that has been fixed in development version.

    My problem is still there that code doesn't work at all. To which I think my loop function stops working if I don't have #define MY_GATEWAY_SERIAL line in the code.


  • Mod

    @palande.vaibhav what does the debug output say?
    You can also add a few Serial.println in the code to see where the execution stops.



  • @mfalkvidd
    Thanx for the suggestion. It's worse than I thought.

    Here is the code:

    
    //MySensors
    // Enable debug prints
    //#define MY_DEBUG
    
    //// Enable and select radio type attached
    #define MY_RADIO_NRF24
    ////#define MY_RADIO_RFM69
    
    #define MY_GATEWAY_SERIAL
    
    #include <SPI.h>
    #include <MySensors.h>
    
    // Initialize motion message
    //MyMessage msg(1, V_LIGHT);
    
    void setup() { 
      // Setup locally attached sensors
      pinMode(8, OUTPUT);
      Serial.println("Setup runs");
    }
    
    void presentation() {
     // Present locally attached sensors 
     Serial.println("presentation runs");
    }
    
    void loop() { 
      // Send locally attached sensor data here 
      Serial.println("loop runs");
       digitalWrite(8, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);              // wait for a second
      digitalWrite(8, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);              // wait for a second
    }
    

    This is the output with #define MY_GATEWAY_SERIAL line.
    0_1474716279452_javaw_2016-09-24_04-22-42.png

    Without #define MY_GATEWAY_SERIAL, it doesn't show anything on the serial monitor.



  • I don't have access to my computer now I will try it when I have it.

    @palande.vaibhav said:

    @ayo
    did you try commenting #define MY_GATEWAY_SERIAL and running your Blink code?
    Can you please try that?



  • @palande.vaibhav said:

    @mfalkvidd
    Thanx for the suggestion. It's worse than I thought.

    Here is the code:

    
    //MySensors
    // Enable debug prints
    //#define MY_DEBUG
    
    //// Enable and select radio type attached
    #define MY_RADIO_NRF24
    ////#define MY_RADIO_RFM69
    
    #define MY_GATEWAY_SERIAL
    
    #include <SPI.h>
    #include <MySensors.h>
    
    // Initialize motion message
    //MyMessage msg(1, V_LIGHT);
    
    void setup() { 
      // Setup locally attached sensors
      pinMode(8, OUTPUT);
      Serial.println("Setup runs");
    }
    
    void presentation() {
     // Present locally attached sensors 
     Serial.println("presentation runs");
    }
    
    void loop() { 
      // Send locally attached sensor data here 
      Serial.println("loop runs");
       digitalWrite(8, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);              // wait for a second
      digitalWrite(8, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);              // wait for a second
    }
    

    This is the output with #define MY_GATEWAY_SERIAL line.
    0_1474716279452_javaw_2016-09-24_04-22-42.png

    Without #define MY_GATEWAY_SERIAL, it doesn't show anything on the serial monitor.

    @mfalkvidd Any update on this?


  • Mod

    @palande.vaibhav no, I haven't got any ideas on what could be wrong. Sorry.



  • @ayo Did you try running the code?



  • @mfalkvidd
    Is it only me?
    Can you please try this on your setup as time permits?
    I have a manual install of the library 2.0
    I want to use this for one of my projects and I am dead stuck.



  • @mfalkvidd
    I have to keep #define MY_GATEWAY_SERIAL line in the code for both gateway and sensor nodes.
    Now since I have #define MY_GATEWAY_SERIAL line in the code for both gateway and sensor node, both of them are initializing as gateways.
    And this causes them not to be able to communicate with each other.
    Please help
    0_1474801920068_javaw_2016-09-25_04-11-40.png



  • So I tried the whole code thing again as you have requested and I notice something weird happening to the device.
    This is the code below

    //// Enable debug prints to serial monitor
    //#define MY_DEBUG 
    //
    //
    //// Enable and select radio type attached
    #define MY_RADIO_NRF24
    ////#define MY_RADIO_RFM69
    //
    //// Set LOW transmit power level as default, if you have an amplified NRF-module and
    //// power your radio separately with a good regulator you can turn up PA level. 
    //#define MY_RF24_PA_LEVEL RF24_PA_LOW
    //
    //// Enable serial gateway
    //#define MY_GATEWAY_SERIAL
    
    #include <SPI.h>
    #include <MySensors.h>  
    
    void setup() { 
      // Setup locally attached sensors
      pinMode(8, OUTPUT);
    }
    
    void presentation() {
     // Present locally attached sensors 
     Serial.println("Presentation Runs");
    }
    
    void loop() { 
      // Send locally attached sensor data here 
       digitalWrite(8, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);              // wait for a second
      digitalWrite(8, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);              // wait for a second
      Serial.println("Loop is running");
    

    }

    After I commented out #define MY_GATEWAY_SERIAL nothing really happens on the serial monitor as you have said.
    No blinking nor display on the monitor.

    So I went back to the code and enable #define MY_DEBUG to see what was actually happening....

    THEN..I figured out what was happening
    I uploaded the new code with #define MY_Debug uncomment and #define MY_Gateway_Serial still commented out I got this one the serial monitor

    Starting sensor (RNNNA-, 2.0.0)
    TSM:INIT
    TSM:RADIO:OK
    TSM:FPAR
    TSP:MSG:SEND 255-255-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
    TSM:FPAR
    TSP:MSG:SEND 255-255-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
    TSM:FPAR
    TSP:MSG:SEND 255-255-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
    TSM:FPAR
    TSP:MSG:SEND 255-255-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
    !TSM:FPAR:FAIL
    !TSM:FAILURE
    TSM:PDT
    TSM:INIT
    TSM:RADIO:OK
    TSM:FPAR
    TSP:MSG:SEND 255-255-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
    TSM:FPAR
    TSP:MSG:SEND 255-255-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
    TSM:FPAR
    TSP:MSG:SEND 255-255-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:
    

    From the result, the device is working as a node and trying to communicate with the parent/gateway and it enters an endless retry loop that keeps trying to communicate with the gateway. This is the reason i suppose nothing seems to be working because it is stuck trying to connect to the parent.
    The Addition of #define MY_GATEWAY_SERIAL makes it already a gateway/parent device and avoids that endless loop thing.

    @palande.vaibhav said:

    @ayo Did you try running the code?



  • I think one way to go about making it work is to edit that element of the mysensor main code that makes it enter an infinite retry loop is to is to make it retry for about maybe 3 times if no connection still it should raise a flag and leaves the loop and continue into the main code.



  • @ayo
    But adding #define MY_GATEWAY_SERIAL to the code for the sensor node will make it a gateway. Right? Please check my last post where I posted the screenshots of this making both of them initialize as the gateway.

    And if both are gateways they won't communicate



  • Yes they won't communicate

    @palande.vaibhav said:

    @ayo
    But adding #define MY_GATEWAY_SERIAL to the code for the sensor node will make it a gateway. Right? Please check my last post where I posted the screenshots of this making both of them initialize as the gateway.

    And if both are gateways they won't communicate



  • @ayo
    Then this makes library 2.0 completely useless cause we always have to use MY_GATEWAY_SERIAL and so can't create sensor nodes.

    If you also confirm this then I am gonna report this as a bug.



  • No it is not like that.

    You can create sensor nodes without the MY_Gateway_Serial thing, you just have to make sure that you have one device acting as a gateway device and the rest as a sensor node and everything will work very fine.

    The reason you are having problem is because you are only building with one device and the library requires at-least 2 devices to work.

    @palande.vaibhav said:

    @ayo
    Then this makes library 2.0 completely useless cause we always have to use MY_GATEWAY_SERIAL and so can't create sensor nodes.

    If you also confirm this then I am gonna report this as a bug.



  • @ayo
    How can I make sensor nodes with the MY_GATEWAY_SERIAL line in the code. This just makes the device a gateway. How do I make it a sensor node with that line included?

    Just having two different devices in the same code will work??

    Like in this code:

    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * DESCRIPTION
     *
     * Interrupt driven binary switch example with dual interrupts
     * Author: Patrick 'Anticimex' Fallberg
     * Connect one button or door/window reed switch between 
     * digitial I/O pin 3 (BUTTON_PIN below) and GND and the other
     * one in similar fashion on digital I/O pin 2.
     * This example is designed to fit Arduino Nano/Pro Mini
     * 
     */
    
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    //#define MY_GATEWAY_SERIAL
    
    #define MY_NODE_ID 1
    
    #include <SPI.h>
    #include <MySensors.h>
    
    #define SKETCH_NAME "Binary Sensor"
    #define SKETCH_MAJOR_VER "1"
    #define SKETCH_MINOR_VER "0"
    
    #define PRIMARY_CHILD_ID 3
    #define SECONDARY_CHILD_ID 4
    
    #define PRIMARY_BUTTON_PIN 2   // Arduino Digital I/O pin for button/reed switch
    #define SECONDARY_BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch
    
    #if (PRIMARY_BUTTON_PIN < 2 || PRIMARY_BUTTON_PIN > 3)
    #error PRIMARY_BUTTON_PIN must be either 2 or 3 for interrupts to work
    #endif
    #if (SECONDARY_BUTTON_PIN < 2 || SECONDARY_BUTTON_PIN > 3)
    #error SECONDARY_BUTTON_PIN must be either 2 or 3 for interrupts to work
    #endif
    #if (PRIMARY_BUTTON_PIN == SECONDARY_BUTTON_PIN)
    #error PRIMARY_BUTTON_PIN and BUTTON_PIN2 cannot be the same
    #endif
    #if (PRIMARY_CHILD_ID == SECONDARY_CHILD_ID)
    #error PRIMARY_CHILD_ID and SECONDARY_CHILD_ID cannot be the same
    #endif
     
    
    // Change to V_LIGHT if you use S_LIGHT in presentation below
    MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED);
    MyMessage msg2(SECONDARY_CHILD_ID, V_TRIPPED);
    
    void setup()  
    {  
      // Setup the buttons
      pinMode(PRIMARY_BUTTON_PIN, INPUT);
      pinMode(SECONDARY_BUTTON_PIN, INPUT);
      pinMode(8,OUTPUT);
    
      // Activate internal pull-ups
      digitalWrite(PRIMARY_BUTTON_PIN, HIGH);
      digitalWrite(SECONDARY_BUTTON_PIN, HIGH);
    
      Serial.begin(115200);
    }
    
    void presentation() {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER "." SKETCH_MINOR_VER);
    
       Register binary input sensor to sensor_node (they will be created as child devices)
       You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage. 
       If S_LIGHT is used, remember to update variable type you send in. See "msg" above.
      present(PRIMARY_CHILD_ID, S_DOOR);  
      present(SECONDARY_CHILD_ID, S_DOOR);  
    }
    
    // Loop will iterate on changes on the BUTTON_PINs
    void loop() 
    {
      uint8_t value;
      static uint8_t sentValue=2;
      static uint8_t sentValue2=2;
    
      // Short delay to allow buttons to properly settle
      //sleep(5);
      
      value = digitalRead(PRIMARY_BUTTON_PIN);
      
      if (value != sentValue) {
         // Value has changed from last transmission, send the updated value
         send(msg.set(value==HIGH ? 1 : 0));
         digitalWrite(8,!(digitalRead(8)));
    
         String string = "Value changed to: ";
    
         Serial.println(string += value);
         sentValue = value;
      }
    
      value = digitalRead(SECONDARY_BUTTON_PIN);
      
      if (value != sentValue2) {
         // Value has changed from last transmission, send the updated value
         send(msg2.set(value==HIGH ? 1 : 0));
         sentValue2 = value;
      }
    
      // Sleep until something happens with the sensor
      sleep(PRIMARY_BUTTON_PIN-2, CHANGE, SECONDARY_BUTTON_PIN-2, CHANGE, 0);
      //sleep(0,CHANGE,0);
    } 
    


  • I was able to make the blinking thing run with #Define MY_GATEWAY_SERIAL commented out by having another Arduino Uno runing the gateway serial program. Basically you will need two devices setup to work or you could make use of this hack
    too which will also make your device work too without having to connect to the parent.

    Go to your library folder and find the mysensors library folder open it and look for the core folder open the MySensorCore.cpp file make sure you have a backup of that file before opening it.

    Find this section of the code

    #if defined(MY_RADIO_FEATURE)
    		// Save static parent id in eeprom (used by bootloader)
    		hwWriteConfig(EEPROM_PARENT_NODE_ID_ADDRESS, MY_PARENT_NODE_ID);
    		debug(PSTR("Starting Connection Process\n"));
    		transportInitialize();
    		// My modification should be removed for later
    		debug(PSTR("Starting Connection Process 2\n"));
    		int counter = 0;
    		while (!isTransportOK()) {
    			hwWatchdogReset();
    			transportProcess();
    			//debug(PSTR("Trying to connect to parent \n"));
    			#if defined(ARDUINO_ARCH_ESP8266)
    				yield();
    			#endif
    			counter++;
    			if (counter >= 3) // exit after 3 attempts to connect
    				break;
    		}
    		debug(PSTR("Starting Connection Process 3\n"));
    	#endif
    

    You can replace that section with those or just make those modification you see.
    Save and try to upload your program again with the #define MY_Gateway_Serial thing commented out and the program will still run.

    What that modification does is to exit the loop after 3 connection attempts.



  • I meant without the MY_Gateway_Serial thing
    @palande.vaibhav said:

    @ayo
    How can I make sensor nodes with the MY_GATEWAY_SERIAL line in the code. This just makes the device a gateway. How do I make it a sensor node with that line included?

    Just having two different devices in the same code will work??

    Like in this code:

    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * DESCRIPTION
     *
     * Interrupt driven binary switch example with dual interrupts
     * Author: Patrick 'Anticimex' Fallberg
     * Connect one button or door/window reed switch between 
     * digitial I/O pin 3 (BUTTON_PIN below) and GND and the other
     * one in similar fashion on digital I/O pin 2.
     * This example is designed to fit Arduino Nano/Pro Mini
     * 
     */
    
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    //#define MY_GATEWAY_SERIAL
    
    #define MY_NODE_ID 1
    
    #include <SPI.h>
    #include <MySensors.h>
    
    #define SKETCH_NAME "Binary Sensor"
    #define SKETCH_MAJOR_VER "1"
    #define SKETCH_MINOR_VER "0"
    
    #define PRIMARY_CHILD_ID 3
    #define SECONDARY_CHILD_ID 4
    
    #define PRIMARY_BUTTON_PIN 2   // Arduino Digital I/O pin for button/reed switch
    #define SECONDARY_BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch
    
    #if (PRIMARY_BUTTON_PIN < 2 || PRIMARY_BUTTON_PIN > 3)
    #error PRIMARY_BUTTON_PIN must be either 2 or 3 for interrupts to work
    #endif
    #if (SECONDARY_BUTTON_PIN < 2 || SECONDARY_BUTTON_PIN > 3)
    #error SECONDARY_BUTTON_PIN must be either 2 or 3 for interrupts to work
    #endif
    #if (PRIMARY_BUTTON_PIN == SECONDARY_BUTTON_PIN)
    #error PRIMARY_BUTTON_PIN and BUTTON_PIN2 cannot be the same
    #endif
    #if (PRIMARY_CHILD_ID == SECONDARY_CHILD_ID)
    #error PRIMARY_CHILD_ID and SECONDARY_CHILD_ID cannot be the same
    #endif
     
    
    // Change to V_LIGHT if you use S_LIGHT in presentation below
    MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED);
    MyMessage msg2(SECONDARY_CHILD_ID, V_TRIPPED);
    
    void setup()  
    {  
      // Setup the buttons
      pinMode(PRIMARY_BUTTON_PIN, INPUT);
      pinMode(SECONDARY_BUTTON_PIN, INPUT);
      pinMode(8,OUTPUT);
    
      // Activate internal pull-ups
      digitalWrite(PRIMARY_BUTTON_PIN, HIGH);
      digitalWrite(SECONDARY_BUTTON_PIN, HIGH);
    
      Serial.begin(115200);
    }
    
    void presentation() {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER "." SKETCH_MINOR_VER);
    
       Register binary input sensor to sensor_node (they will be created as child devices)
       You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage. 
       If S_LIGHT is used, remember to update variable type you send in. See "msg" above.
      present(PRIMARY_CHILD_ID, S_DOOR);  
      present(SECONDARY_CHILD_ID, S_DOOR);  
    }
    
    // Loop will iterate on changes on the BUTTON_PINs
    void loop() 
    {
      uint8_t value;
      static uint8_t sentValue=2;
      static uint8_t sentValue2=2;
    
      // Short delay to allow buttons to properly settle
      //sleep(5);
      
      value = digitalRead(PRIMARY_BUTTON_PIN);
      
      if (value != sentValue) {
         // Value has changed from last transmission, send the updated value
         send(msg.set(value==HIGH ? 1 : 0));
         digitalWrite(8,!(digitalRead(8)));
    
         String string = "Value changed to: ";
    
         Serial.println(string += value);
         sentValue = value;
      }
    
      value = digitalRead(SECONDARY_BUTTON_PIN);
      
      if (value != sentValue2) {
         // Value has changed from last transmission, send the updated value
         send(msg2.set(value==HIGH ? 1 : 0));
         sentValue2 = value;
      }
    
      // Sleep until something happens with the sensor
      sleep(PRIMARY_BUTTON_PIN-2, CHANGE, SECONDARY_BUTTON_PIN-2, CHANGE, 0);
      //sleep(0,CHANGE,0);
    } 
    


  • @ayo

    Oh I get it now. Now I understand. I must have a gateway and at least one sensor node running for this to work. If there is no gateway then sensor nodes don't work because of the constant loop trying to find a parent.

    My problem was I was trying to write and run the code with just the sensor node.

    I will also do the modifications you mentioned to the core files.

    Thanx a lot for your help. I really appreciate it. 👍



  • That's correct 🙂


Log in to reply
 

Suggested Topics

71
Online

11.4k
Users

11.1k
Topics

112.7k
Posts