Push button interrupt now functioning properly



  • 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);
    } 
    
    


  • @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


  • Plugin Developer

    @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...



  • 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



  • 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);
    } 
    

  • Plugin Developer

    @rchamp

    You shouldn't need to write the pin to HIGH if you have it as INPUT_PULLUP. But whatever works. đź‘Ť



  • 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?!



  • 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


  • Plugin Developer

    @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.


Log in to reply
 

Suggested Topics

9
Online

11.4k
Users

11.1k
Topics

112.7k
Posts