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. My Project
  3. Battery Operated Door Magnet Sensor

Battery Operated Door Magnet Sensor

Scheduled Pinned Locked Moved My Project
8 Posts 5 Posters 5.8k Views 5 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.
  • sghazaghS Offline
    sghazaghS Offline
    sghazagh
    wrote on last edited by sghazagh
    #1

    Hi guys,
    I have created a circuit base on this "https://forum.mysensors.org/topic/486/my-2aa-battery-sensor" and it works fine.
    However, I have changed the code slightly to only read the battery state to calculated the battery percentage only when status of door switch changed.

    I know I have to sleep the arduino and radio to save battery but don't know where I have sleep it.
    My code is attached can you please advise me how can I change the code to be able to read the status of door change as quick as possible without delay and also be able to read/calculate battery percentage as well.

    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
    */
    
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG
    
    //Fixed NodeID in Domoticz
    #define MY_NODE_ID 8
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    #include <SPI.h>
    #include <MySensors.h>
    #include <Bounce2.h>
    
    #define CHILD_ID 5
    #define BUTTON_PIN  3  // Arduino Digital I/O pin for button/reed switch
    
    Bounce debouncer = Bounce();
    int oldValue = -1;
    
    int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
    
    unsigned long SLEEP_TIME = 900000;  // sleep time between reads (seconds * 1000 milliseconds)
    int oldBatteryPcnt = 0;
    
    // Change to V_LIGHT if you use S_LIGHT in presentation below
    MyMessage msg(CHILD_ID, V_TRIPPED);
    
    void setup()
    {
    
      // use the 1.1 V internal reference
      #if defined(__AVR_ATmega2560__)
        analogReference(INTERNAL1V1);
      #else
        analogReference(INTERNAL);
      #endif
    
      // 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);
    }
    
    void presentation() {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Enterance-Door-Sensor", "1.0");
    
      // 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.
      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
        send(msg.set(value == HIGH ? 1 : 0));
        oldValue = value;
        BatteryMeasurment();
      }
     ////// sleep(SLEEP_TIME);    //Can I add it here, in this case does the door sensor response quickly to any state change?
    }
    
    void BatteryMeasurment(){
        
      // get the battery Voltage
      int sensorValue = analogRead(BATTERY_SENSE_PIN);
      #ifdef MY_DEBUG
        Serial.println(sensorValue);
      #endif
      
        // 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;
      
      #ifdef MY_DEBUG
        float batteryV  = sensorValue * 0.003363075;
        Serial.print("Battery Voltage: ");
        Serial.print(batteryV);
        Serial.println(" V");
      
        Serial.print("Battery percent: ");
        Serial.print(batteryPcnt);
        Serial.println(" %");
      #endif
      
        if (oldBatteryPcnt != batteryPcnt) {
          // Power up radio after sleep
          sendBatteryLevel(batteryPcnt);
          oldBatteryPcnt = batteryPcnt;
        }
    
    }
    
    

    If it's wrong, how can I attach the pin 3 , which is door contact switch pin, to an interrupt to responds as soon as state changes?
    Please note that the radio IRQ is connected to pin 2 of Arduino already!

    Many thanks,

    M 1 Reply Last reply
    0
    • sghazaghS sghazagh

      Hi guys,
      I have created a circuit base on this "https://forum.mysensors.org/topic/486/my-2aa-battery-sensor" and it works fine.
      However, I have changed the code slightly to only read the battery state to calculated the battery percentage only when status of door switch changed.

      I know I have to sleep the arduino and radio to save battery but don't know where I have sleep it.
      My code is attached can you please advise me how can I change the code to be able to read the status of door change as quick as possible without delay and also be able to read/calculate battery percentage as well.

      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
      */
      
      
      // Enable debug prints to serial monitor
      #define MY_DEBUG
      
      //Fixed NodeID in Domoticz
      #define MY_NODE_ID 8
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      //#define MY_RADIO_RFM69
      
      #include <SPI.h>
      #include <MySensors.h>
      #include <Bounce2.h>
      
      #define CHILD_ID 5
      #define BUTTON_PIN  3  // Arduino Digital I/O pin for button/reed switch
      
      Bounce debouncer = Bounce();
      int oldValue = -1;
      
      int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
      
      unsigned long SLEEP_TIME = 900000;  // sleep time between reads (seconds * 1000 milliseconds)
      int oldBatteryPcnt = 0;
      
      // Change to V_LIGHT if you use S_LIGHT in presentation below
      MyMessage msg(CHILD_ID, V_TRIPPED);
      
      void setup()
      {
      
        // use the 1.1 V internal reference
        #if defined(__AVR_ATmega2560__)
          analogReference(INTERNAL1V1);
        #else
          analogReference(INTERNAL);
        #endif
      
        // 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);
      }
      
      void presentation() {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Enterance-Door-Sensor", "1.0");
      
        // 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.
        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
          send(msg.set(value == HIGH ? 1 : 0));
          oldValue = value;
          BatteryMeasurment();
        }
       ////// sleep(SLEEP_TIME);    //Can I add it here, in this case does the door sensor response quickly to any state change?
      }
      
      void BatteryMeasurment(){
          
        // get the battery Voltage
        int sensorValue = analogRead(BATTERY_SENSE_PIN);
        #ifdef MY_DEBUG
          Serial.println(sensorValue);
        #endif
        
          // 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;
        
        #ifdef MY_DEBUG
          float batteryV  = sensorValue * 0.003363075;
          Serial.print("Battery Voltage: ");
          Serial.print(batteryV);
          Serial.println(" V");
        
          Serial.print("Battery percent: ");
          Serial.print(batteryPcnt);
          Serial.println(" %");
        #endif
        
          if (oldBatteryPcnt != batteryPcnt) {
            // Power up radio after sleep
            sendBatteryLevel(batteryPcnt);
            oldBatteryPcnt = batteryPcnt;
          }
      
      }
      
      

      If it's wrong, how can I attach the pin 3 , which is door contact switch pin, to an interrupt to responds as soon as state changes?
      Please note that the radio IRQ is connected to pin 2 of Arduino already!

      Many thanks,

      M Offline
      M Offline
      m26872
      Hardware Contributor
      wrote on last edited by
      #2

      @sghazagh You have to use sleep with interrupt but you can't use sleep at all with debounce library. Look at this example for how to do it: https://github.com/mysensors/MySensors/blob/development/examples/BinarySwitchSleepSensor/BinarySwitchSleepSensor.ino
      (The sleep(5) -debounce delay can be extende a bit in my opinion though.)

      sghazaghS 1 Reply Last reply
      0
      • T Offline
        T Offline
        Takero
        Hardware Contributor
        wrote on last edited by Takero
        #3

        Look at my node: I used HW-Debounce and deep sleep.
        Sketch inside.

        https://www.openhardware.io/view/266/DoorWindow-Sensor

        1 Reply Last reply
        0
        • M m26872

          @sghazagh You have to use sleep with interrupt but you can't use sleep at all with debounce library. Look at this example for how to do it: https://github.com/mysensors/MySensors/blob/development/examples/BinarySwitchSleepSensor/BinarySwitchSleepSensor.ino
          (The sleep(5) -debounce delay can be extende a bit in my opinion though.)

          sghazaghS Offline
          sghazaghS Offline
          sghazagh
          wrote on last edited by
          #4

          @m26872 Thank you very much mate.
          I just added the battery reporting part and it works like a charm.

          Many many thanks...

          C T 2 Replies Last reply
          0
          • sghazaghS sghazagh

            @m26872 Thank you very much mate.
            I just added the battery reporting part and it works like a charm.

            Many many thanks...

            C Offline
            C Offline
            carleki
            wrote on last edited by
            #5

            @sghazagh said:

            @m26872 Thank you very much mate.
            I just added the battery reporting part and it works like a charm.

            Many many thanks...
            Did you add 1MOhm resistor between the Input pin and the reed switch ?

            sghazaghS 1 Reply Last reply
            0
            • C carleki

              @sghazagh said:

              @m26872 Thank you very much mate.
              I just added the battery reporting part and it works like a charm.

              Many many thanks...
              Did you add 1MOhm resistor between the Input pin and the reed switch ?

              sghazaghS Offline
              sghazaghS Offline
              sghazagh
              wrote on last edited by sghazagh
              #6

              @carmelo42 Yes, I did.
              See this page: https://forum.mysensors.org/topic/486/my-2aa-battery-sensor (Edit 2 image)
              I used this as a base. Except, instead of DH22, I used magnetic sensor connected to pin 3 and GND of Arduino Pro mini.

              1 Reply Last reply
              0
              • C Offline
                C Offline
                carleki
                wrote on last edited by
                #7

                Thanks a lot for your answer :)

                I must be an idiot but ... I can't compile your sketch ... Which version of MySensors lib are you using ? (I'm with 1.5.4)

                1 Reply Last reply
                0
                • sghazaghS sghazagh

                  @m26872 Thank you very much mate.
                  I just added the battery reporting part and it works like a charm.

                  Many many thanks...

                  T Offline
                  T Offline
                  tomix
                  wrote on last edited by
                  #8

                  @sghazagh Hi I am new. How to do reporting part of the battery.
                  Thanks

                  1 Reply Last reply
                  0

                  Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                  Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                  With your input, this post could be even better 💗

                  Register Login
                  Reply
                  • Reply as topic
                  Log in to reply
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes


                  12

                  Online

                  12.0k

                  Users

                  11.2k

                  Topics

                  113.4k

                  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