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. Development
  3. Push button interrupt now functioning properly

Push button interrupt now functioning properly

Scheduled Pinned Locked Moved Development
9 Posts 2 Posters 3.6k Views 4 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.
  • rchampR Offline
    rchampR Offline
    rchamp
    wrote on last edited by
    #1

    Hi there, I just finished building my push button sensor to act as a doorbell for my system.

    I used the basic binary switch sensor example as my basis. I have it connected to pin 3 on my arduino pro mini clone. When reading the serial logs, i learned that the pin registers high (1) when not pushed, and low (0) when pushed. So, i changed the send from 1:0 to 0:1 to send the correct state to Vera. all works fine there.

    When i tried to implement the sleep with interrupt, it seems as if the arduino sleeps indefinitely and does not wake upon state change (button push).

    Any idea as to why?

    Here is my 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
     *
     * Simple binary switch example 
     * Connect button or door/window reed switch between 
     * digitial I/O pin 3 (BUTTON_PIN below) and GND.
     * http://www.mysensors.org/build/binary
     */
    
    
    #include <MySensor.h>
    #include <SPI.h>
    #include <Bounce2.h>
    
    #define CHILD_ID 3
    #define BUTTON_PIN  3  // Arduino Digital I/O pin for button/reed switch
    #define NODE_ID 20
    #define SLEEP_TIME 120000
    
    MySensor gw;
    Bounce debouncer = Bounce(); 
    int oldValue=-1;
    
    // Change to V_LIGHT if you use S_LIGHT in presentation below
    MyMessage msg(CHILD_ID,V_TRIPPED);
    
    void setup()  
    {  
      gw.begin(NULL, NODE_ID, false);
    
     // Setup the button
      pinMode(BUTTON_PIN,INPUT);
      // Activate internal pull-up
      digitalWrite(BUTTON_PIN,HIGH);
      
      // After setting up the button, setup debouncer
      debouncer.attach(BUTTON_PIN);
      debouncer.interval(5);
      
      // Register binary input sensor to gw (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.
      gw.present(CHILD_ID, S_DOOR);  
    }
    
    
    //  Check if digital input has changed and send in new value
    void loop() 
    {
      debouncer.update();
      // Get the update value
      int value = debouncer.read();
     
      if (value != oldValue) {
         // Send in the new value
         Serial.println("Value = ");
         Serial.print(value);
         gw.send(msg.set(value==HIGH ? 0 : 1));
         oldValue = value;
      }
      // Sleep until something happens with the sensor
      gw.sleep(BUTTON_PIN-2, CHANGE, SLEEP_TIME);
    } 
    
    
    rchampR martinhjelmareM 2 Replies Last reply
    0
    • rchampR rchamp

      Hi there, I just finished building my push button sensor to act as a doorbell for my system.

      I used the basic binary switch sensor example as my basis. I have it connected to pin 3 on my arduino pro mini clone. When reading the serial logs, i learned that the pin registers high (1) when not pushed, and low (0) when pushed. So, i changed the send from 1:0 to 0:1 to send the correct state to Vera. all works fine there.

      When i tried to implement the sleep with interrupt, it seems as if the arduino sleeps indefinitely and does not wake upon state change (button push).

      Any idea as to why?

      Here is my 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
       *
       * Simple binary switch example 
       * Connect button or door/window reed switch between 
       * digitial I/O pin 3 (BUTTON_PIN below) and GND.
       * http://www.mysensors.org/build/binary
       */
      
      
      #include <MySensor.h>
      #include <SPI.h>
      #include <Bounce2.h>
      
      #define CHILD_ID 3
      #define BUTTON_PIN  3  // Arduino Digital I/O pin for button/reed switch
      #define NODE_ID 20
      #define SLEEP_TIME 120000
      
      MySensor gw;
      Bounce debouncer = Bounce(); 
      int oldValue=-1;
      
      // Change to V_LIGHT if you use S_LIGHT in presentation below
      MyMessage msg(CHILD_ID,V_TRIPPED);
      
      void setup()  
      {  
        gw.begin(NULL, NODE_ID, false);
      
       // Setup the button
        pinMode(BUTTON_PIN,INPUT);
        // Activate internal pull-up
        digitalWrite(BUTTON_PIN,HIGH);
        
        // After setting up the button, setup debouncer
        debouncer.attach(BUTTON_PIN);
        debouncer.interval(5);
        
        // Register binary input sensor to gw (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.
        gw.present(CHILD_ID, S_DOOR);  
      }
      
      
      //  Check if digital input has changed and send in new value
      void loop() 
      {
        debouncer.update();
        // Get the update value
        int value = debouncer.read();
       
        if (value != oldValue) {
           // Send in the new value
           Serial.println("Value = ");
           Serial.print(value);
           gw.send(msg.set(value==HIGH ? 0 : 1));
           oldValue = value;
        }
        // Sleep until something happens with the sensor
        gw.sleep(BUTTON_PIN-2, CHANGE, SLEEP_TIME);
      } 
      
      
      rchampR Offline
      rchampR Offline
      rchamp
      wrote on last edited by
      #2

      @rchamp

      to add to this, is it an issue with the debouncer and the interrupt? i'm still a bit mystified about the debouncer library

      1 Reply Last reply
      0
      • rchampR rchamp

        Hi there, I just finished building my push button sensor to act as a doorbell for my system.

        I used the basic binary switch sensor example as my basis. I have it connected to pin 3 on my arduino pro mini clone. When reading the serial logs, i learned that the pin registers high (1) when not pushed, and low (0) when pushed. So, i changed the send from 1:0 to 0:1 to send the correct state to Vera. all works fine there.

        When i tried to implement the sleep with interrupt, it seems as if the arduino sleeps indefinitely and does not wake upon state change (button push).

        Any idea as to why?

        Here is my 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
         *
         * Simple binary switch example 
         * Connect button or door/window reed switch between 
         * digitial I/O pin 3 (BUTTON_PIN below) and GND.
         * http://www.mysensors.org/build/binary
         */
        
        
        #include <MySensor.h>
        #include <SPI.h>
        #include <Bounce2.h>
        
        #define CHILD_ID 3
        #define BUTTON_PIN  3  // Arduino Digital I/O pin for button/reed switch
        #define NODE_ID 20
        #define SLEEP_TIME 120000
        
        MySensor gw;
        Bounce debouncer = Bounce(); 
        int oldValue=-1;
        
        // Change to V_LIGHT if you use S_LIGHT in presentation below
        MyMessage msg(CHILD_ID,V_TRIPPED);
        
        void setup()  
        {  
          gw.begin(NULL, NODE_ID, false);
        
         // Setup the button
          pinMode(BUTTON_PIN,INPUT);
          // Activate internal pull-up
          digitalWrite(BUTTON_PIN,HIGH);
          
          // After setting up the button, setup debouncer
          debouncer.attach(BUTTON_PIN);
          debouncer.interval(5);
          
          // Register binary input sensor to gw (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.
          gw.present(CHILD_ID, S_DOOR);  
        }
        
        
        //  Check if digital input has changed and send in new value
        void loop() 
        {
          debouncer.update();
          // Get the update value
          int value = debouncer.read();
         
          if (value != oldValue) {
             // Send in the new value
             Serial.println("Value = ");
             Serial.print(value);
             gw.send(msg.set(value==HIGH ? 0 : 1));
             oldValue = value;
          }
          // Sleep until something happens with the sensor
          gw.sleep(BUTTON_PIN-2, CHANGE, SLEEP_TIME);
        } 
        
        
        martinhjelmareM Offline
        martinhjelmareM Offline
        martinhjelmare
        Plugin Developer
        wrote on last edited by
        #3

        @rchamp

        Hi!

        The deboncer Bounce doesn't go well in combination with sleeping in my experience. Sleep for a short while in the loop before reading the pin, instead, to make the bounce settle.

        There's an example using this method among the examples in the mysensors library, called binary switch sleep something...

        1 Reply Last reply
        0
        • rchampR Offline
          rchampR Offline
          rchamp
          wrote on last edited by
          #4

          I'm trying out that sketch now. I'm getting weird results in the serial log. I'm going to try different interupt options instead of CHANGE to see if that helps

          1 Reply Last reply
          0
          • rchampR Offline
            rchampR Offline
            rchamp
            wrote on last edited by
            #5

            I'm getting some better results. Right now i have a .sleep(20) prior to reading the input.

            I also set the interrupt to detect on FALLING edge. Seems to be more stable.

            However, about one out of every 10 times i push the button i get a "1, 0,1" instead of a "1,0" .

            I then changed the pinMode to "INPUT_PULLUP" vs just "INPUT". I also changed the interrupt condition back to "CHANGE" and that seemed to do the trick to reliably capture button presses. Thanks for the quick response!!

            Here's a snapshot of my working code for reference for others that may experience my trouble

            /**
             * 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
             * 
             */
            
            
            #include <MySensor.h>
            #include <SPI.h>
            
            #define SKETCH_NAME "Binary Sensor"
            #define SKETCH_MAJOR_VER "1"
            #define SKETCH_MINOR_VER "0"
            
            #define PRIMARY_CHILD_ID 3
            
            #define PRIMARY_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
             
            MySensor sensor_node;
            
            // Change to V_LIGHT if you use S_LIGHT in presentation below
            MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED);
            
            void setup()  
            {  
              sensor_node.begin();
            
              // Setup the buttons
              pinMode(PRIMARY_BUTTON_PIN, INPUT_PULLUP);
            
              // Activate internal pull-ups
              digitalWrite(PRIMARY_BUTTON_PIN, HIGH);
              
              // Send the sketch version information to the gateway and Controller
              sensor_node.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.
              sensor_node.present(PRIMARY_CHILD_ID, S_DOOR);  
            }
            
            // Loop will iterate on changes on the BUTTON_PINs
            void loop() 
            {
              uint8_t value;
              static uint8_t sentValue=2;
            
              // Short delay to allow buttons to properly settle
              sensor_node.sleep(20);
              
              value = digitalRead(PRIMARY_BUTTON_PIN);
              
              if (value != sentValue) {
                 // Value has changed from last transmission, send the updated value
                 sensor_node.send(msg.set(value==HIGH ? 0 : 1));
                 sentValue = value;
              }
            
              // Sleep until something happens with the sensor
              sensor_node.sleep(PRIMARY_BUTTON_PIN-2, CHANGE, 0);
            } 
            
            martinhjelmareM 1 Reply Last reply
            0
            • rchampR rchamp

              I'm getting some better results. Right now i have a .sleep(20) prior to reading the input.

              I also set the interrupt to detect on FALLING edge. Seems to be more stable.

              However, about one out of every 10 times i push the button i get a "1, 0,1" instead of a "1,0" .

              I then changed the pinMode to "INPUT_PULLUP" vs just "INPUT". I also changed the interrupt condition back to "CHANGE" and that seemed to do the trick to reliably capture button presses. Thanks for the quick response!!

              Here's a snapshot of my working code for reference for others that may experience my trouble

              /**
               * 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
               * 
               */
              
              
              #include <MySensor.h>
              #include <SPI.h>
              
              #define SKETCH_NAME "Binary Sensor"
              #define SKETCH_MAJOR_VER "1"
              #define SKETCH_MINOR_VER "0"
              
              #define PRIMARY_CHILD_ID 3
              
              #define PRIMARY_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
               
              MySensor sensor_node;
              
              // Change to V_LIGHT if you use S_LIGHT in presentation below
              MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED);
              
              void setup()  
              {  
                sensor_node.begin();
              
                // Setup the buttons
                pinMode(PRIMARY_BUTTON_PIN, INPUT_PULLUP);
              
                // Activate internal pull-ups
                digitalWrite(PRIMARY_BUTTON_PIN, HIGH);
                
                // Send the sketch version information to the gateway and Controller
                sensor_node.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.
                sensor_node.present(PRIMARY_CHILD_ID, S_DOOR);  
              }
              
              // Loop will iterate on changes on the BUTTON_PINs
              void loop() 
              {
                uint8_t value;
                static uint8_t sentValue=2;
              
                // Short delay to allow buttons to properly settle
                sensor_node.sleep(20);
                
                value = digitalRead(PRIMARY_BUTTON_PIN);
                
                if (value != sentValue) {
                   // Value has changed from last transmission, send the updated value
                   sensor_node.send(msg.set(value==HIGH ? 0 : 1));
                   sentValue = value;
                }
              
                // Sleep until something happens with the sensor
                sensor_node.sleep(PRIMARY_BUTTON_PIN-2, CHANGE, 0);
              } 
              
              martinhjelmareM Offline
              martinhjelmareM Offline
              martinhjelmare
              Plugin Developer
              wrote on last edited by
              #6

              @rchamp

              You shouldn't need to write the pin to HIGH if you have it as INPUT_PULLUP. But whatever works. :thumbsup:

              1 Reply Last reply
              0
              • rchampR Offline
                rchampR Offline
                rchamp
                wrote on last edited by
                #7

                I made that change and removed writing the pin to HIGH.

                However, in both cases, while i'm correctly seeing reads in the serial monitor, I'm not getting any status change on the motion created in VERA. I did a clean inclusion to vera (the node and sensor were never added to vera prior) and did the normal, include, reload and then turn on and off the sensor to get the sensor name and version details)

                Serial monitor reports normal, but not vera.

                Ideas?!

                1 Reply Last reply
                0
                • rchampR Offline
                  rchampR Offline
                  rchamp
                  wrote on last edited by
                  #8

                  strange. I changed the NODE_ID to 1 vs using the default AUTO selection from the gateway, and now I am seeing status in Vera. i think the gateway is having issues properly assigning node IDs. Will have to look into that some other time. Not a big deal for me as I have an excel table of all of my nodes anyway.

                  here's some photos of my doorbell node
                  alt text

                  alt text

                  martinhjelmareM 1 Reply Last reply
                  0
                  • rchampR rchamp

                    strange. I changed the NODE_ID to 1 vs using the default AUTO selection from the gateway, and now I am seeing status in Vera. i think the gateway is having issues properly assigning node IDs. Will have to look into that some other time. Not a big deal for me as I have an excel table of all of my nodes anyway.

                    here's some photos of my doorbell node
                    alt text

                    alt text

                    martinhjelmareM Offline
                    martinhjelmareM Offline
                    martinhjelmare
                    Plugin Developer
                    wrote on last edited by
                    #9

                    @rchamp

                    I'm not familiar with how the Vera works. The gateway doesn't assign node ids, it's the controller that has to do that. I don't know if Vera supports that or not. Someone more versed in Vera should answer this.

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


                    19

                    Online

                    11.7k

                    Users

                    11.2k

                    Topics

                    113.0k

                    Posts


                    Copyright 2019 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