Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. Momentary button to control lights

Momentary button to control lights

Scheduled Pinned Locked Moved Troubleshooting
29 Posts 6 Posters 7.0k Views 7 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • MasMatM Offline
    MasMatM Offline
    MasMat
    wrote on last edited by
    #15

    All right. Been banging my head at this all day again.
    I seem to be sending the message from the node OK, but the receiving node appears to have intermittent problems. And for some reason, my gateway reboots at some "combinations".
    I have gone thru the send-node & receive-node code tens of times.
    Help & ideas appreciated. Plz excuse the finnish in the code :)

    Send-node

    // 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_NODE_ID 7
    
    #include <MySensors.h>
    
    //destination specs
    #define WC_SENSOR_ID 3
    #define WC_NODE_ID 3
    
    int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
    int oldBatteryPcnt = 0;
    
    #define CHILD_ID_BUTTON1 3
    #define BUTTON_PIN 2   //pin for button
    //#define INTERRUPT BUTTON_PIN
    
    MyMessage msg(CHILD_ID_BUTTON1, V_STATUS);
    
    int tripped = 1;
    int lastStatus = 1;
    int numberPushes = 0;
    int sentCounter = 0;
    
    int light1 = LOW;      // the current state of the output pin
    int reading;           // the current reading from the input pin
    int previous = HIGH;    // the previous reading from the input pin
    
    // the follow variables are long's because the time, measured in miliseconds,
    // will quickly become a bigger number than can be stored in an int.
    long time = 0;         // the last time the output pin was toggled
    long debounce = 400;   // the debounce time, increase if the output flickers
    long batteryinterval = 10000;
    
    
    void setup()
    {
    	// Setup the buttons
    	pinMode(BUTTON_PIN, INPUT);
    	//pinMode(SECONDARY_BUTTON_PIN, INPUT);
    
    	// Activate internal pull-ups
    	digitalWrite(BUTTON_PIN, HIGH);
    	//digitalWrite(SECONDARY_BUTTON_PIN, HIGH);
    
      // use the 1.1 V internal reference
      #if defined(__AVR_ATmega2560__)
      analogReference(INTERNAL1V1);
      #else
      analogReference(INTERNAL);
      #endif
    }
    
    void presentation()
    {
      sendSketchInfo("WCNappiBAT", "v290717");
    	present(CHILD_ID_BUTTON1, S_BINARY);
    }
    
    void loop()
    {
    reading = digitalRead(BUTTON_PIN);
      if (reading == LOW && previous == HIGH) {
        send(MyMessage(CHILD_ID_BUTTON1, V_STATUS).setSensor(WC_SENSOR_ID).setDestination(WC_NODE_ID).set(true));
        Serial.println("Toggling..");
        sentCounter++;
        }
    
    previous = reading;
    
    if (sentCounter % 10 == 0) {
        
     int sensorValue = analogRead(BATTERY_SENSE_PIN);
    
      // 1M, 470K divider across battery and using internal ADC ref of 1.1V
      // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
      // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
      // 3.44/1023 = Volts per bit = 0.003363075
    
      int batteryPcnt = sensorValue / 10;
    
      float batteryV  = sensorValue * 0.003363075;
      Serial.print("Battery Voltage: ");
      Serial.print(batteryV);
      Serial.println(" V");
    
      Serial.print("Battery percent: ");
      Serial.print(batteryPcnt);
      Serial.println(" %");
    
      sendBatteryLevel(batteryPcnt);
      }
      
      delay (200);
      
        // Sleep until something happens with the sensor
      sleep(BUTTON_PIN-2, CHANGE, 0);
    }
    

    And the receiving end.
    In the code is preparations for my second "remote"

    // 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_NODE_ID 3
    
    // Enable repeater functionality for this node
    //#define MY_REPEATER_FEATURE
    
    #include <MySensors.h>
    
    #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #define NUMBER_OF_RELAYS 6 // Total number of attached relays
    #define RELAY_ON 0  // GPIO value to write to turn on attached relay
    #define RELAY_OFF 1 // GPIO value to write to turn off attached relay
    #define RELAY_7 14   //pin A0 
    #define RELAY_8 15   //pin A1
    
    bool stateWC = 0;
    bool stateKei = 0;
    bool stateRuo = 0;
    
    void before()
    {
    	for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    		// Then set relay pins in output mode
    		pinMode(pin, OUTPUT);
    		// Set relay to last known state (using eeprom storage)
    		digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
    	}
     pinMode(RELAY_7, OUTPUT);
     digitalWrite(RELAY_7, loadState(7)?RELAY_ON:RELAY_OFF);
     pinMode(RELAY_8, OUTPUT);
     digitalWrite(RELAY_8, loadState(8)?RELAY_ON:RELAY_OFF);
    }
    
    MyMessage msgWC(3, V_STATUS);
    MyMessage msgKei(1, V_STATUS);
    MyMessage msgRuo(2, V_STATUS);
    
    void setup()
    {
    
    }
    
    void presentation()
    {
    	// Send the sketch version information to the gateway and Controller
    	sendSketchInfo("TeknRele8x", "v29072017");
    
    	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)
    		present(sensor, S_BINARY);
    	}
     present(7, S_BINARY);
     present(8, S_BINARY);
    }
    
    
    void loop()
    {
    
    }
    
    void receive(const MyMessage &message)
    {
    	// We only expect one type of message from controller. But we better check anyway.
    	if (message.type==V_STATUS) {                             	// Change relay state
       if (message.sensor == 7) {
       digitalWrite(RELAY_7, message.getBool()?RELAY_ON:RELAY_OFF);    //Write to A0
       // Store state in eeprom
        saveState(message.sensor, message.getBool());
       }
       if (message.sensor == 8) {
        digitalWrite(RELAY_8, message.getBool()?RELAY_ON:RELAY_OFF);   //Write to A1
        // Store state in eeprom
        saveState(message.sensor, message.getBool());
       }
       if (message.sender == 7) {                      //Message from WC remote
       stateWC = !stateWC;                             // toggle light state
       digitalWrite(5, stateWC?RELAY_ON:RELAY_OFF);    // 5 is RELAY_3 pin 
       // Store state in eeprom
        saveState(message.sensor, stateWC);
        send(msgWC.set(stateWC), false);             //Msg gateway aware of the change. No ack
       }
       if (message.sender == 8) {
        switch (message.sensor) {
          case 1:                                     //message for kitchen
            stateKei = !stateKei;
            digitalWrite(message.sensor, stateKei?RELAY_ON:RELAY_OFF);
            saveState(message.sensor, stateKei);
            send(msgKei.set(stateKei), false);             //Msg gateway aware of the change. No ack
            break;
          case 2:                                    //message for dining table
            stateRuo = !stateRuo;
            digitalWrite(message.sensor, stateRuo?RELAY_ON:RELAY_OFF);
            saveState(message.sensor, stateRuo);
            send(msgRuo.set(stateRuo), false);             //Msg gateway aware of the change. No ack
            break;
          }
        }
       }
    		digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
    		// Store state in eeprom
    		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());
    	}
    
    
    

    To add, I would say there's nothing special in either serial output. I can elborate if nothing else appears.
    Thanks everybody!

    Boots33B 1 Reply Last reply
    0
    • MasMatM MasMat

      All right. Been banging my head at this all day again.
      I seem to be sending the message from the node OK, but the receiving node appears to have intermittent problems. And for some reason, my gateway reboots at some "combinations".
      I have gone thru the send-node & receive-node code tens of times.
      Help & ideas appreciated. Plz excuse the finnish in the code :)

      Send-node

      // 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_NODE_ID 7
      
      #include <MySensors.h>
      
      //destination specs
      #define WC_SENSOR_ID 3
      #define WC_NODE_ID 3
      
      int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
      int oldBatteryPcnt = 0;
      
      #define CHILD_ID_BUTTON1 3
      #define BUTTON_PIN 2   //pin for button
      //#define INTERRUPT BUTTON_PIN
      
      MyMessage msg(CHILD_ID_BUTTON1, V_STATUS);
      
      int tripped = 1;
      int lastStatus = 1;
      int numberPushes = 0;
      int sentCounter = 0;
      
      int light1 = LOW;      // the current state of the output pin
      int reading;           // the current reading from the input pin
      int previous = HIGH;    // the previous reading from the input pin
      
      // the follow variables are long's because the time, measured in miliseconds,
      // will quickly become a bigger number than can be stored in an int.
      long time = 0;         // the last time the output pin was toggled
      long debounce = 400;   // the debounce time, increase if the output flickers
      long batteryinterval = 10000;
      
      
      void setup()
      {
      	// Setup the buttons
      	pinMode(BUTTON_PIN, INPUT);
      	//pinMode(SECONDARY_BUTTON_PIN, INPUT);
      
      	// Activate internal pull-ups
      	digitalWrite(BUTTON_PIN, HIGH);
      	//digitalWrite(SECONDARY_BUTTON_PIN, HIGH);
      
        // use the 1.1 V internal reference
        #if defined(__AVR_ATmega2560__)
        analogReference(INTERNAL1V1);
        #else
        analogReference(INTERNAL);
        #endif
      }
      
      void presentation()
      {
        sendSketchInfo("WCNappiBAT", "v290717");
      	present(CHILD_ID_BUTTON1, S_BINARY);
      }
      
      void loop()
      {
      reading = digitalRead(BUTTON_PIN);
        if (reading == LOW && previous == HIGH) {
          send(MyMessage(CHILD_ID_BUTTON1, V_STATUS).setSensor(WC_SENSOR_ID).setDestination(WC_NODE_ID).set(true));
          Serial.println("Toggling..");
          sentCounter++;
          }
      
      previous = reading;
      
      if (sentCounter % 10 == 0) {
          
       int sensorValue = analogRead(BATTERY_SENSE_PIN);
      
        // 1M, 470K divider across battery and using internal ADC ref of 1.1V
        // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
        // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
        // 3.44/1023 = Volts per bit = 0.003363075
      
        int batteryPcnt = sensorValue / 10;
      
        float batteryV  = sensorValue * 0.003363075;
        Serial.print("Battery Voltage: ");
        Serial.print(batteryV);
        Serial.println(" V");
      
        Serial.print("Battery percent: ");
        Serial.print(batteryPcnt);
        Serial.println(" %");
      
        sendBatteryLevel(batteryPcnt);
        }
        
        delay (200);
        
          // Sleep until something happens with the sensor
        sleep(BUTTON_PIN-2, CHANGE, 0);
      }
      

      And the receiving end.
      In the code is preparations for my second "remote"

      // 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_NODE_ID 3
      
      // Enable repeater functionality for this node
      //#define MY_REPEATER_FEATURE
      
      #include <MySensors.h>
      
      #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
      #define NUMBER_OF_RELAYS 6 // Total number of attached relays
      #define RELAY_ON 0  // GPIO value to write to turn on attached relay
      #define RELAY_OFF 1 // GPIO value to write to turn off attached relay
      #define RELAY_7 14   //pin A0 
      #define RELAY_8 15   //pin A1
      
      bool stateWC = 0;
      bool stateKei = 0;
      bool stateRuo = 0;
      
      void before()
      {
      	for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
      		// Then set relay pins in output mode
      		pinMode(pin, OUTPUT);
      		// Set relay to last known state (using eeprom storage)
      		digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
      	}
       pinMode(RELAY_7, OUTPUT);
       digitalWrite(RELAY_7, loadState(7)?RELAY_ON:RELAY_OFF);
       pinMode(RELAY_8, OUTPUT);
       digitalWrite(RELAY_8, loadState(8)?RELAY_ON:RELAY_OFF);
      }
      
      MyMessage msgWC(3, V_STATUS);
      MyMessage msgKei(1, V_STATUS);
      MyMessage msgRuo(2, V_STATUS);
      
      void setup()
      {
      
      }
      
      void presentation()
      {
      	// Send the sketch version information to the gateway and Controller
      	sendSketchInfo("TeknRele8x", "v29072017");
      
      	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)
      		present(sensor, S_BINARY);
      	}
       present(7, S_BINARY);
       present(8, S_BINARY);
      }
      
      
      void loop()
      {
      
      }
      
      void receive(const MyMessage &message)
      {
      	// We only expect one type of message from controller. But we better check anyway.
      	if (message.type==V_STATUS) {                             	// Change relay state
         if (message.sensor == 7) {
         digitalWrite(RELAY_7, message.getBool()?RELAY_ON:RELAY_OFF);    //Write to A0
         // Store state in eeprom
          saveState(message.sensor, message.getBool());
         }
         if (message.sensor == 8) {
          digitalWrite(RELAY_8, message.getBool()?RELAY_ON:RELAY_OFF);   //Write to A1
          // Store state in eeprom
          saveState(message.sensor, message.getBool());
         }
         if (message.sender == 7) {                      //Message from WC remote
         stateWC = !stateWC;                             // toggle light state
         digitalWrite(5, stateWC?RELAY_ON:RELAY_OFF);    // 5 is RELAY_3 pin 
         // Store state in eeprom
          saveState(message.sensor, stateWC);
          send(msgWC.set(stateWC), false);             //Msg gateway aware of the change. No ack
         }
         if (message.sender == 8) {
          switch (message.sensor) {
            case 1:                                     //message for kitchen
              stateKei = !stateKei;
              digitalWrite(message.sensor, stateKei?RELAY_ON:RELAY_OFF);
              saveState(message.sensor, stateKei);
              send(msgKei.set(stateKei), false);             //Msg gateway aware of the change. No ack
              break;
            case 2:                                    //message for dining table
              stateRuo = !stateRuo;
              digitalWrite(message.sensor, stateRuo?RELAY_ON:RELAY_OFF);
              saveState(message.sensor, stateRuo);
              send(msgRuo.set(stateRuo), false);             //Msg gateway aware of the change. No ack
              break;
            }
          }
         }
      		digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
      		// Store state in eeprom
      		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());
      	}
      
      
      

      To add, I would say there's nothing special in either serial output. I can elborate if nothing else appears.
      Thanks everybody!

      Boots33B Offline
      Boots33B Offline
      Boots33
      Hero Member
      wrote on last edited by
      #16

      @MasMat said in Momentary button to control lights:

      All right. Been banging my head at this all day again.
      I seem to be sending the message from the node OK, but the receiving node appears to have intermittent problems.

      Yes your send message should be ok. You are sending a V_STATUS message from node 7 sensor 3 to node 3 sensor 3

      And for some reason, my gateway reboots at some "combinations".

      Not sure what could be causing that but you will need to sort that out to get stability. I have not experienced any issues with my gateway using node to node.

      I have gone thru the send-node & receive-node code tens of times.
      Help & ideas appreciated. Plz excuse the finnish in the code

      You will need to add code to separate the incoming messages from your controller and remotes as they will need to be treated differently. Messages from your controller will have the gateway (node 0) as the sender so this can be used.

      You have a lot going on in your receive function so maybe just put the code for the one node you are trying at the moment so it is easier to troubleshoot.

      Try something like this

      void receive(const MyMessage &message)
      {
        if (message.type == V_STATUS) {
         if (message.sender == 0) {                                        // check if message is from gateway (node 0)
          switch (message.sensor) {
              case 3:                                                      //incoming message is for WC relay (sensor 3) 
                stateWC = message.getBool();                               // get the new state
                digitalWrite(5, stateWC ? RELAY_ON : RELAY_OFF);           // 5 is RELAY_3 pin
                saveState(message.sensor, stateWC);                        // save sensor state
                break;
                
              /*-----Add case statements for other realys as needed ----*/
              
            }
          }
        else  {                                                           // message is not from gateway so must be from a remote
          switch (message.sender) {
              case 7:                                                     //incoming message is from WC remote (node 7)  
                stateWC = !stateWC;                                       // toggle light state
                digitalWrite(5, stateWC?RELAY_ON:RELAY_OFF);              // 5 is RELAY_3 pin         
                saveState(message.sensor, stateWC);                       // Store state in eeprom
                send(msgWC.set(stateWC), false);                          //Msg gateway aware of the change. No ack
                break;
                
              /*-----Add case statements for other remote nodes as needed ----*/
             
            }
          }
      
          // Write some debug info
          #ifdef MY_DEBUG
          Serial.print("Incoming change for sensor:");
          Serial.println(message.sensor);
          Serial.print("from node:");
          Serial.println(message.sender);
          Serial.print(" New status: ");
          Serial.println(message.getBool());
          #endif
        }
      }
      
      MasMatM 3 Replies Last reply
      0
      • Boots33B Boots33

        @MasMat said in Momentary button to control lights:

        All right. Been banging my head at this all day again.
        I seem to be sending the message from the node OK, but the receiving node appears to have intermittent problems.

        Yes your send message should be ok. You are sending a V_STATUS message from node 7 sensor 3 to node 3 sensor 3

        And for some reason, my gateway reboots at some "combinations".

        Not sure what could be causing that but you will need to sort that out to get stability. I have not experienced any issues with my gateway using node to node.

        I have gone thru the send-node & receive-node code tens of times.
        Help & ideas appreciated. Plz excuse the finnish in the code

        You will need to add code to separate the incoming messages from your controller and remotes as they will need to be treated differently. Messages from your controller will have the gateway (node 0) as the sender so this can be used.

        You have a lot going on in your receive function so maybe just put the code for the one node you are trying at the moment so it is easier to troubleshoot.

        Try something like this

        void receive(const MyMessage &message)
        {
          if (message.type == V_STATUS) {
           if (message.sender == 0) {                                        // check if message is from gateway (node 0)
            switch (message.sensor) {
                case 3:                                                      //incoming message is for WC relay (sensor 3) 
                  stateWC = message.getBool();                               // get the new state
                  digitalWrite(5, stateWC ? RELAY_ON : RELAY_OFF);           // 5 is RELAY_3 pin
                  saveState(message.sensor, stateWC);                        // save sensor state
                  break;
                  
                /*-----Add case statements for other realys as needed ----*/
                
              }
            }
          else  {                                                           // message is not from gateway so must be from a remote
            switch (message.sender) {
                case 7:                                                     //incoming message is from WC remote (node 7)  
                  stateWC = !stateWC;                                       // toggle light state
                  digitalWrite(5, stateWC?RELAY_ON:RELAY_OFF);              // 5 is RELAY_3 pin         
                  saveState(message.sensor, stateWC);                       // Store state in eeprom
                  send(msgWC.set(stateWC), false);                          //Msg gateway aware of the change. No ack
                  break;
                  
                /*-----Add case statements for other remote nodes as needed ----*/
               
              }
            }
        
            // Write some debug info
            #ifdef MY_DEBUG
            Serial.print("Incoming change for sensor:");
            Serial.println(message.sensor);
            Serial.print("from node:");
            Serial.println(message.sender);
            Serial.print(" New status: ");
            Serial.println(message.getBool());
            #endif
          }
        }
        
        MasMatM Offline
        MasMatM Offline
        MasMat
        wrote on last edited by
        #17

        @Boots33 That looks really clean. And you're right I have to comment out the stuff that's pre-prepared.
        The node is installed in a really tricky place and reprogramming is difficult (hence trying to solve everything beforehand). One day I'll learn to build & test first, install second...

        This morning I tested the setup again, with old settings and noticed the correct relay "fires" but doesnt really toggle. If I switch it off, it will come on but stay on regardless of presses. So the right node is receiving.

        I'll revise the code and re-test in a few...

        1 Reply Last reply
        0
        • Boots33B Boots33

          @MasMat said in Momentary button to control lights:

          All right. Been banging my head at this all day again.
          I seem to be sending the message from the node OK, but the receiving node appears to have intermittent problems.

          Yes your send message should be ok. You are sending a V_STATUS message from node 7 sensor 3 to node 3 sensor 3

          And for some reason, my gateway reboots at some "combinations".

          Not sure what could be causing that but you will need to sort that out to get stability. I have not experienced any issues with my gateway using node to node.

          I have gone thru the send-node & receive-node code tens of times.
          Help & ideas appreciated. Plz excuse the finnish in the code

          You will need to add code to separate the incoming messages from your controller and remotes as they will need to be treated differently. Messages from your controller will have the gateway (node 0) as the sender so this can be used.

          You have a lot going on in your receive function so maybe just put the code for the one node you are trying at the moment so it is easier to troubleshoot.

          Try something like this

          void receive(const MyMessage &message)
          {
            if (message.type == V_STATUS) {
             if (message.sender == 0) {                                        // check if message is from gateway (node 0)
              switch (message.sensor) {
                  case 3:                                                      //incoming message is for WC relay (sensor 3) 
                    stateWC = message.getBool();                               // get the new state
                    digitalWrite(5, stateWC ? RELAY_ON : RELAY_OFF);           // 5 is RELAY_3 pin
                    saveState(message.sensor, stateWC);                        // save sensor state
                    break;
                    
                  /*-----Add case statements for other realys as needed ----*/
                  
                }
              }
            else  {                                                           // message is not from gateway so must be from a remote
              switch (message.sender) {
                  case 7:                                                     //incoming message is from WC remote (node 7)  
                    stateWC = !stateWC;                                       // toggle light state
                    digitalWrite(5, stateWC?RELAY_ON:RELAY_OFF);              // 5 is RELAY_3 pin         
                    saveState(message.sensor, stateWC);                       // Store state in eeprom
                    send(msgWC.set(stateWC), false);                          //Msg gateway aware of the change. No ack
                    break;
                    
                  /*-----Add case statements for other remote nodes as needed ----*/
                 
                }
              }
          
              // Write some debug info
              #ifdef MY_DEBUG
              Serial.print("Incoming change for sensor:");
              Serial.println(message.sensor);
              Serial.print("from node:");
              Serial.println(message.sender);
              Serial.print(" New status: ");
              Serial.println(message.getBool());
              #endif
            }
          }
          
          MasMatM Offline
          MasMatM Offline
          MasMat
          wrote on last edited by
          #18
          This post is deleted!
          1 Reply Last reply
          0
          • Boots33B Boots33

            @MasMat said in Momentary button to control lights:

            All right. Been banging my head at this all day again.
            I seem to be sending the message from the node OK, but the receiving node appears to have intermittent problems.

            Yes your send message should be ok. You are sending a V_STATUS message from node 7 sensor 3 to node 3 sensor 3

            And for some reason, my gateway reboots at some "combinations".

            Not sure what could be causing that but you will need to sort that out to get stability. I have not experienced any issues with my gateway using node to node.

            I have gone thru the send-node & receive-node code tens of times.
            Help & ideas appreciated. Plz excuse the finnish in the code

            You will need to add code to separate the incoming messages from your controller and remotes as they will need to be treated differently. Messages from your controller will have the gateway (node 0) as the sender so this can be used.

            You have a lot going on in your receive function so maybe just put the code for the one node you are trying at the moment so it is easier to troubleshoot.

            Try something like this

            void receive(const MyMessage &message)
            {
              if (message.type == V_STATUS) {
               if (message.sender == 0) {                                        // check if message is from gateway (node 0)
                switch (message.sensor) {
                    case 3:                                                      //incoming message is for WC relay (sensor 3) 
                      stateWC = message.getBool();                               // get the new state
                      digitalWrite(5, stateWC ? RELAY_ON : RELAY_OFF);           // 5 is RELAY_3 pin
                      saveState(message.sensor, stateWC);                        // save sensor state
                      break;
                      
                    /*-----Add case statements for other realys as needed ----*/
                    
                  }
                }
              else  {                                                           // message is not from gateway so must be from a remote
                switch (message.sender) {
                    case 7:                                                     //incoming message is from WC remote (node 7)  
                      stateWC = !stateWC;                                       // toggle light state
                      digitalWrite(5, stateWC?RELAY_ON:RELAY_OFF);              // 5 is RELAY_3 pin         
                      saveState(message.sensor, stateWC);                       // Store state in eeprom
                      send(msgWC.set(stateWC), false);                          //Msg gateway aware of the change. No ack
                      break;
                      
                    /*-----Add case statements for other remote nodes as needed ----*/
                   
                  }
                }
            
                // Write some debug info
                #ifdef MY_DEBUG
                Serial.print("Incoming change for sensor:");
                Serial.println(message.sensor);
                Serial.print("from node:");
                Serial.println(message.sender);
                Serial.print(" New status: ");
                Serial.println(message.getBool());
                #endif
              }
            }
            
            MasMatM Offline
            MasMatM Offline
            MasMat
            wrote on last edited by
            #19

            @Boots33 So, added some tuff to keep the other relays working.
            The issue now is bouncing apparently.
            The send-node has delay but seems to fire a bunch of 1's (and 0's for some reason...?).
            Here's the lastest on the receiving end:

            void receive(const MyMessage &message)
            {
              if (message.type == V_STATUS) {
               if (message.sender == 0) {                                        // check if message is from gateway (node 0)
                switch (message.sensor) {
                    case 3:                                                      //incoming message is for WC relay (sensor 3) 
                      stateWC = message.getBool();                               // get the new state
                      digitalWrite(5, stateWC ? RELAY_ON : RELAY_OFF);           // 5 is RELAY_3 pin
                      saveState(message.sensor, stateWC);                        // save sensor state
                      break;
                    case 7:
                      digitalWrite(RELAY_7, message.getBool()?RELAY_ON:RELAY_OFF); //Write to A0
                      saveState(message.sensor, message.getBool());
                      break;
                    case 8:
                      digitalWrite(RELAY_8, message.getBool()?RELAY_ON:RELAY_OFF); //Write to A1
                      saveState(message.sensor, message.getBool());
                      break;
                    default:
                      digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
                      saveState(message.sensor, message.getBool());
                      break;
                    /*-----Add case statements for other realys as needed ----*/
                    
                  }
                }
              else  {                                                           // message is not from gateway so must be from a remote
                switch (message.sender) {
                    case 7:                                                     //incoming message is from WC remote (node 7)  
                      stateWC = !stateWC;                                       // toggle light state
                      digitalWrite(5, stateWC?RELAY_ON:RELAY_OFF);              // 5 is RELAY_3 pin         
                      saveState(message.sensor, stateWC);                       // Store state in eeprom
                      send(msgWC.set(stateWC), false);                          //Msg gateway aware of the change. No ack
                      break;
                      
                    /*-----Add case statements for other remote nodes as needed ----*/
                   
                  }
                }
            
                // Write some debug info
                #ifdef MY_DEBUG
                Serial.print("Incoming change for sensor:");
                Serial.println(message.sensor);
                Serial.print("from node:");
                Serial.println(message.sender);
                Serial.print(" New status: ");
                Serial.println(message.getBool());
                #endif
              }
            }
            

            The send-node is still

            #define MY_DEBUG
            
            // Enable and select radio type attached
            #define MY_RADIO_NRF24
            #define MY_NODE_ID 7
            
            #include <MySensors.h>
            
            //destination specs
            #define WC_SENSOR_ID 3
            #define WC_NODE_ID 3
            
            int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
            int oldBatteryPcnt = 0;
            
            #define CHILD_ID_BUTTON1 3
            #define BUTTON_PIN 2   //pin for button
            //#define INTERRUPT BUTTON_PIN
            
            MyMessage msg(CHILD_ID_BUTTON1, V_STATUS);
            
            int sentCounter = 0;
            
            int reading;           // the current reading from the input pin
            int previous = HIGH;    // the previous reading from the input pin 
            
            void setup()
            {
            	// Setup the buttons
            	pinMode(BUTTON_PIN, INPUT);
            
            	// Activate internal pull-ups
            	digitalWrite(BUTTON_PIN, HIGH);
            
              // use the 1.1 V internal reference
              #if defined(__AVR_ATmega2560__)
              analogReference(INTERNAL1V1);
              #else
              analogReference(INTERNAL);
              #endif
            }
            
            void presentation()
            {
              sendSketchInfo("WCNappiBAT", "v290717");
            	present(CHILD_ID_BUTTON1, S_BINARY);
            }
            
            void loop()
            {
            reading = digitalRead(BUTTON_PIN);
              if (reading == LOW && previous == HIGH) {
                send(MyMessage(CHILD_ID_BUTTON1, V_STATUS).setSensor(WC_SENSOR_ID).setDestination(WC_NODE_ID).set("1"));
                Serial.println("Toggling remote node ");
                Serial.print(WC_NODE_ID);
                Serial.print(", sensor ");
                Serial.println(WC_SENSOR_ID);
                sentCounter++;
                }
            
            previous = reading;
            
            if (sentCounter % 10 == 0) {
                
             int sensorValue = analogRead(BATTERY_SENSE_PIN);
            
              // 3.44/1023 = Volts per bit = 0.003363075
            
              int batteryPcnt = sensorValue / 10;
            
              float batteryV  = sensorValue * 0.003363075;
              Serial.print("Battery Voltage: ");
              Serial.print(batteryV);
              Serial.println(" V");
            
              Serial.print("Battery percent: ");
              Serial.print(batteryPcnt);
              Serial.println(" %");
            
              sendBatteryLevel(batteryPcnt);
              }
              
              delay (400);
              
                // Sleep until something happens with the sensor
              sleep(0, CHANGE, 0);
            }
            
            Boots33B 1 Reply Last reply
            0
            • MasMatM MasMat

              @Boots33 So, added some tuff to keep the other relays working.
              The issue now is bouncing apparently.
              The send-node has delay but seems to fire a bunch of 1's (and 0's for some reason...?).
              Here's the lastest on the receiving end:

              void receive(const MyMessage &message)
              {
                if (message.type == V_STATUS) {
                 if (message.sender == 0) {                                        // check if message is from gateway (node 0)
                  switch (message.sensor) {
                      case 3:                                                      //incoming message is for WC relay (sensor 3) 
                        stateWC = message.getBool();                               // get the new state
                        digitalWrite(5, stateWC ? RELAY_ON : RELAY_OFF);           // 5 is RELAY_3 pin
                        saveState(message.sensor, stateWC);                        // save sensor state
                        break;
                      case 7:
                        digitalWrite(RELAY_7, message.getBool()?RELAY_ON:RELAY_OFF); //Write to A0
                        saveState(message.sensor, message.getBool());
                        break;
                      case 8:
                        digitalWrite(RELAY_8, message.getBool()?RELAY_ON:RELAY_OFF); //Write to A1
                        saveState(message.sensor, message.getBool());
                        break;
                      default:
                        digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
                        saveState(message.sensor, message.getBool());
                        break;
                      /*-----Add case statements for other realys as needed ----*/
                      
                    }
                  }
                else  {                                                           // message is not from gateway so must be from a remote
                  switch (message.sender) {
                      case 7:                                                     //incoming message is from WC remote (node 7)  
                        stateWC = !stateWC;                                       // toggle light state
                        digitalWrite(5, stateWC?RELAY_ON:RELAY_OFF);              // 5 is RELAY_3 pin         
                        saveState(message.sensor, stateWC);                       // Store state in eeprom
                        send(msgWC.set(stateWC), false);                          //Msg gateway aware of the change. No ack
                        break;
                        
                      /*-----Add case statements for other remote nodes as needed ----*/
                     
                    }
                  }
              
                  // Write some debug info
                  #ifdef MY_DEBUG
                  Serial.print("Incoming change for sensor:");
                  Serial.println(message.sensor);
                  Serial.print("from node:");
                  Serial.println(message.sender);
                  Serial.print(" New status: ");
                  Serial.println(message.getBool());
                  #endif
                }
              }
              

              The send-node is still

              #define MY_DEBUG
              
              // Enable and select radio type attached
              #define MY_RADIO_NRF24
              #define MY_NODE_ID 7
              
              #include <MySensors.h>
              
              //destination specs
              #define WC_SENSOR_ID 3
              #define WC_NODE_ID 3
              
              int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
              int oldBatteryPcnt = 0;
              
              #define CHILD_ID_BUTTON1 3
              #define BUTTON_PIN 2   //pin for button
              //#define INTERRUPT BUTTON_PIN
              
              MyMessage msg(CHILD_ID_BUTTON1, V_STATUS);
              
              int sentCounter = 0;
              
              int reading;           // the current reading from the input pin
              int previous = HIGH;    // the previous reading from the input pin 
              
              void setup()
              {
              	// Setup the buttons
              	pinMode(BUTTON_PIN, INPUT);
              
              	// Activate internal pull-ups
              	digitalWrite(BUTTON_PIN, HIGH);
              
                // use the 1.1 V internal reference
                #if defined(__AVR_ATmega2560__)
                analogReference(INTERNAL1V1);
                #else
                analogReference(INTERNAL);
                #endif
              }
              
              void presentation()
              {
                sendSketchInfo("WCNappiBAT", "v290717");
              	present(CHILD_ID_BUTTON1, S_BINARY);
              }
              
              void loop()
              {
              reading = digitalRead(BUTTON_PIN);
                if (reading == LOW && previous == HIGH) {
                  send(MyMessage(CHILD_ID_BUTTON1, V_STATUS).setSensor(WC_SENSOR_ID).setDestination(WC_NODE_ID).set("1"));
                  Serial.println("Toggling remote node ");
                  Serial.print(WC_NODE_ID);
                  Serial.print(", sensor ");
                  Serial.println(WC_SENSOR_ID);
                  sentCounter++;
                  }
              
              previous = reading;
              
              if (sentCounter % 10 == 0) {
                  
               int sensorValue = analogRead(BATTERY_SENSE_PIN);
              
                // 3.44/1023 = Volts per bit = 0.003363075
              
                int batteryPcnt = sensorValue / 10;
              
                float batteryV  = sensorValue * 0.003363075;
                Serial.print("Battery Voltage: ");
                Serial.print(batteryV);
                Serial.println(" V");
              
                Serial.print("Battery percent: ");
                Serial.print(batteryPcnt);
                Serial.println(" %");
              
                sendBatteryLevel(batteryPcnt);
                }
                
                delay (400);
                
                  // Sleep until something happens with the sensor
                sleep(0, CHANGE, 0);
              }
              
              Boots33B Offline
              Boots33B Offline
              Boots33
              Hero Member
              wrote on last edited by
              #20

              @MasMat You could try increasing your delay time out to several seconds to see what happens (probably should use wait instead of delay as well) and maybe comment out the sleep line too. This may at least give you an idea of where to start.

              perhaps post some of the serial monitor output from the node.

              MasMatM 1 Reply Last reply
              0
              • Boots33B Boots33

                @MasMat You could try increasing your delay time out to several seconds to see what happens (probably should use wait instead of delay as well) and maybe comment out the sleep line too. This may at least give you an idea of where to start.

                perhaps post some of the serial monitor output from the node.

                MasMatM Offline
                MasMatM Offline
                MasMat
                wrote on last edited by MasMat
                #21

                @Boots33 I increased it already but it didnt help. I can comment out the sleep but eventually I will need it because the sensor is obviously bat powered.
                I also tested putting delay before the read to let things stabilize. Tried 50 but same behavior.
                Im not really familiar with using the interrupts. Is my syntax correct in the sleep-line? I read somewhere that pin2 =interrupt0? Or use sleep (0, falling, 0)? Instead of "change"?

                Boots33B 1 Reply Last reply
                0
                • MasMatM MasMat

                  @Boots33 I increased it already but it didnt help. I can comment out the sleep but eventually I will need it because the sensor is obviously bat powered.
                  I also tested putting delay before the read to let things stabilize. Tried 50 but same behavior.
                  Im not really familiar with using the interrupts. Is my syntax correct in the sleep-line? I read somewhere that pin2 =interrupt0? Or use sleep (0, falling, 0)? Instead of "change"?

                  Boots33B Offline
                  Boots33B Offline
                  Boots33
                  Hero Member
                  wrote on last edited by
                  #22

                  @MasMat said in Momentary button to control lights:

                  @Boots33 I increased it already but it didnt help. I can comment out the sleep but eventually I will need it because the sensor is obviously bat powered.

                  You still need to find the cause of the multiple sends so comment out sleep and see if that is the cause. It is an easy thing to try.

                  I also tested putting delay before the read to let things stabilize. Tried 50 but same behavior.
                  Im not really familiar with using the interrupts. Is my syntax correct in the sleep-line? I read somewhere that pin2 =interrupt0? Or use sleep (0, falling, 0)? Instead of "change"?

                  I have no battery powered nodes so probably not the best person to ask on the use of sleep. I would definitely try

                  sleep(0, FALLING, 0);
                  

                  and see what that brings.
                  If you comment out sleep and the node works as expected then it may be worth starting a new thread focusing on the sleep problem, at least that may bring the problem to the attention of others who have used sleep before.

                  Again serial output may shed further light on what is going wrong.

                  1 Reply Last reply
                  0
                  • MasMatM Offline
                    MasMatM Offline
                    MasMat
                    wrote on last edited by
                    #23

                    Fighting with this after a while.
                    I got the serial output from the sending node, but it appears to send the message only once.
                    However when I checked the gateway it seems to receive and forward the message three times. Then it reboots. Power issue? I have a NRF24-LA on the gateway so could that be pulling too much juice?

                    Could there be a signalling bounce?

                    Serial output from when I clicked the button on the remote:

                    0;255;3;0;9;TSF:MSG:READ,7-7-3,s=3,c=1,t=2,pt=0,l=1,sg=0:1
                    0;255;3;0;9;TSF:MSG:REL MSG
                    0;255;3;0;9;TSF:MSG:SEND,7-0-9-3,s=3,c=1,t=2,pt=0,l=1,sg=0,ft=0,st=OK:1
                    0;255;3;0;9;TSF:MSG:READ,7-7-3,s=3,c=1,t=2,pt=0,l=1,sg=0:1
                    0;255;3;0;9;TSF:MSG:REL MSG
                    0;255;3;0;9;TSF:MSG:SEND,7-0-9-3,s=3,c=1,t=2,pt=0,l=1,sg=0,ft=0,st=OK:1
                    0;255;3;0;9;TSF:MSG:READ,7-7-3,s=3,c=1,t=2,pt=0,l=1,sg=0:1
                    0;255;3;0;9;TSF:MSG:REL MSG
                    0;255;3;0;9;!TSF:MSG:SEND,7-0-9-3,s=3,c=1,t=2,pt=0,l=1,sg=0,ft=0,st=NACK:1
                    0;255;3;0;9;MCO:BGN:INIT GW,CP=RNNGA--,VER=2.1.1
                    0;255;3;0;9;TSM:INIT
                    0;255;3;0;9;TSF:WUR:MS=0
                    0;255;3;0;9;TSM:INIT:TSP OK
                    0;255;3;0;9;TSM:INIT:GW MODE
                    0;255;3;0;9;TSM:READY:ID=0,PAR=0,DIS=0
                    0;255;3;0;9;MCO:REG:NOT NEEDED
                    0;255;3;0;9;TSF:MSG:READ,3-9-0,s=3,c=1,t=2,pt=1,l=1,sg=0:0
                    IP: 192.168.0.201
                    0;255;3;0;9;MCO:BGN:STP
                    0;255;3;0;9;MCO:BGN:INIT OK,TSP=1
                    IP: 192.168.0.201
                    0;255;3;0;9;Attempting MQTT connection...
                    0;255;3;0;9;MQTT connected```
                    1 Reply Last reply
                    0
                    • gohanG Offline
                      gohanG Offline
                      gohan
                      Mod
                      wrote on last edited by
                      #24

                      you could try to update mysensors to 2.2 from development branch

                      MasMatM 1 Reply Last reply
                      0
                      • gohanG gohan

                        you could try to update mysensors to 2.2 from development branch

                        MasMatM Offline
                        MasMatM Offline
                        MasMat
                        wrote on last edited by
                        #25

                        @gohan I'm just gonna let my n00b flag fly here....
                        How do I do that? Arduino IDE library?

                        To combat the reboots, I'm rebuilding the GW with adequate power and capacitors.
                        Hopefully that will solve some problems.

                        1 Reply Last reply
                        0
                        • gohanG Offline
                          gohanG Offline
                          gohan
                          Mod
                          wrote on last edited by
                          #26

                          Just download the library from github and replace the mysensors folder in the library folder on your pc

                          MasMatM 1 Reply Last reply
                          0
                          • gohanG gohan

                            Just download the library from github and replace the mysensors folder in the library folder on your pc

                            MasMatM Offline
                            MasMatM Offline
                            MasMat
                            wrote on last edited by
                            #27

                            @gohan OK. Doesn't sound too hard. Does that mean I also have to update the GW? All my other nodes as well? Or are they backwards compatible?

                            1 Reply Last reply
                            0
                            • gohanG Offline
                              gohanG Offline
                              gohan
                              Mod
                              wrote on last edited by
                              #28

                              Start from gw and see if you are getting any changes. Later you may update the nodes if you want.

                              1 Reply Last reply
                              0
                              • dbemowskD Offline
                                dbemowskD Offline
                                dbemowsk
                                wrote on last edited by
                                #29

                                My gateway is a serial gateway built with an easy newbie PCB and a pro mini.
                                What I did when I upgraded my 1.4 setup to 2.0, I pulled my pro mini that I had flashed with the 1.4 setup and put a new pro mini in that had 2.0. That way if there were any problems, I could easily swap the 1.4 pro mini back in to easily be back where I started.

                                Likewise when replacing your library, pull the MySensors folder out of your arduino libraries folder to keep as a backup until you know things will work. That way if you have to revert back, you can easily swap back the old MySensors folder. You have to completely remove it from the libraries folder though, you can't just rename it to something else.

                                Vera Plus running UI7 with MySensors, Sonoffs and 1-Wire devices
                                Visit my website for more Bits, Bytes and Ramblings from me: http://dan.bemowski.info/

                                1 Reply Last reply
                                2
                                Reply
                                • Reply as topic
                                Log in to reply
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes


                                18

                                Online

                                11.7k

                                Users

                                11.2k

                                Topics

                                113.1k

                                Posts


                                Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                • Login

                                • Don't have an account? Register

                                • Login or register to search.
                                • First post
                                  Last post
                                0
                                • MySensors
                                • OpenHardware.io
                                • Categories
                                • Recent
                                • Tags
                                • Popular