Battery Operated Door Magnet Sensor

  • Hi guys,
    I have created a circuit base on this "" 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 <>
       Copyright (C) 2013-2015 Sensnology AB
       Full contributor list:
       Support Forum:
       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.
       Simple binary switch example
       Connect button or door/window reed switch between
       digitial I/O pin 3 (BUTTON_PIN below) and GND.
    // 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__)
      // Setup the button
      pinMode(BUTTON_PIN, INPUT);
      // Activate internal pull-up
      digitalWrite(BUTTON_PIN, HIGH);
      // After setting up the button, setup debouncer
    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()
      // Get the update value
      int value =;
      if (value != oldValue) {
        // Send in the new value
        send(msg.set(value == HIGH ? 1 : 0));
        oldValue = value;
     ////// 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
        // 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.println(" V");
        Serial.print("Battery percent: ");
        Serial.println(" %");
        if (oldBatteryPcnt != batteryPcnt) {
          // Power up radio after sleep
          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,

  • Hardware Contributor

    @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:
    (The sleep(5) -debounce delay can be extende a bit in my opinion though.)

  • Hardware Contributor

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

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

    Many many thanks...

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

  • @carmelo42 Yes, I did.
    See this page: (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.

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

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

Log in to reply

Suggested Topics

  • 42
  • 1
  • 4
  • 4
  • 5
  • 7
  • 4
  • 2