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. gw.sleep on battery powered magnet door switch

gw.sleep on battery powered magnet door switch

Scheduled Pinned Locked Moved My Project
42 Posts 13 Posters 13.2k Views 16 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.
  • ChakkieC Chakkie

    @AWI Thanks this clear thinks up but at the same time also confusing too.

    So "-2" activates both 0 and 1 on pin 2 or pin 3 as you mentioned earlier. I always though it represents a pin number.

    AWIA Offline
    AWIA Offline
    AWI
    Hero Member
    wrote on last edited by
    #16

    @Chakkie The function digitalPinToInterrupt(pin) translates the pin number to the attached interrupt like "-2" does but in a reliable and more understandable way.

    ChakkieC 1 Reply Last reply
    0
    • AWIA AWI

      @Chakkie The function digitalPinToInterrupt(pin) translates the pin number to the attached interrupt like "-2" does but in a reliable and more understandable way.

      ChakkieC Offline
      ChakkieC Offline
      Chakkie
      wrote on last edited by
      #17

      @AWI thanks. this looks like more promising.

      Raspberry Pi 2
      Domoticz
      RFXCOM
      ZWAVE Aeon stick
      Coming soon Arduino mysensors GW

      1 Reply Last reply
      0
      • mfalkviddM Offline
        mfalkviddM Offline
        mfalkvidd
        Mod
        wrote on last edited by
        #18

        Pull request done for the development version: https://github.com/mysensors/Arduino/pull/441

        1 Reply Last reply
        3
        • siodS Offline
          siodS Offline
          siod
          wrote on last edited by
          #19

          I would like to build the same but I am still very confused now. Could you upload some pictures so I can make myself an image of how you wirde things together?

          Also I don´t really understand what happens here: gw.sleep(BUTTON_PIN_Deur - 2, CHANGE, BUTTON_PIN_Post - 2, CHANGE, 86400000);

          still learning...

          AWIA 1 Reply Last reply
          0
          • siodS siod

            I would like to build the same but I am still very confused now. Could you upload some pictures so I can make myself an image of how you wirde things together?

            Also I don´t really understand what happens here: gw.sleep(BUTTON_PIN_Deur - 2, CHANGE, BUTTON_PIN_Post - 2, CHANGE, 86400000);

            AWIA Offline
            AWIA Offline
            AWI
            Hero Member
            wrote on last edited by AWI
            #20

            @siod If you are using a "standard" Atmega328 (pro-mini, etc.) don't make it hard for yourself. This processor has two external interrupts (0 & 1) connected to pins 2 & 3. Taking your line of code gw.sleep(BUTTON_PIN_Deur - 2, CHANGE, BUTTON_PIN_Post - 2, CHANGE, 86400000); the arguments are respectively:

            1. Use interrupt "0" (connected to pin 2 is BUTTON_PIN_Deur)
            2. Have is fired on change (i.e Rising and Falling)
            3. Use interrupt "1" (connected to pin 3 is BUTTON_PIN_Post)
            4. Have is fired on change (i.e Rising and Falling)
            5. Wake after every 86400000 ms (24 hrs) if no interrupt fired. To be safe you should use 86400000UL (the UL indicating that it is an Unsigned long type)
            siodS 1 Reply Last reply
            0
            • AWIA AWI

              @siod If you are using a "standard" Atmega328 (pro-mini, etc.) don't make it hard for yourself. This processor has two external interrupts (0 & 1) connected to pins 2 & 3. Taking your line of code gw.sleep(BUTTON_PIN_Deur - 2, CHANGE, BUTTON_PIN_Post - 2, CHANGE, 86400000); the arguments are respectively:

              1. Use interrupt "0" (connected to pin 2 is BUTTON_PIN_Deur)
              2. Have is fired on change (i.e Rising and Falling)
              3. Use interrupt "1" (connected to pin 3 is BUTTON_PIN_Post)
              4. Have is fired on change (i.e Rising and Falling)
              5. Wake after every 86400000 ms (24 hrs) if no interrupt fired. To be safe you should use 86400000UL (the UL indicating that it is an Unsigned long type)
              siodS Offline
              siodS Offline
              siod
              wrote on last edited by
              #21

              @AWI
              Ok thx for explanation, but that means he is using 2 reed switches, right (interrupt at pin2 and int pin3)?

              still learning...

              AWIA 1 Reply Last reply
              0
              • siodS siod

                @AWI
                Ok thx for explanation, but that means he is using 2 reed switches, right (interrupt at pin2 and int pin3)?

                AWIA Offline
                AWIA Offline
                AWI
                Hero Member
                wrote on last edited by
                #22

                @siod I guess so. But don't ask me why. One should be sufficient to detect if the door is open :smile:

                In addition (and for what it is worth). If you use a real low power circuit you can save around a factor 3 on battery lifetime when you get rid of the timed wakeup. The arduino sleeps a lot better when it doesn't have to look at the alarm clock every few ms :zzz:

                siodS ChakkieC 2 Replies Last reply
                0
                • AWIA AWI

                  @siod I guess so. But don't ask me why. One should be sufficient to detect if the door is open :smile:

                  In addition (and for what it is worth). If you use a real low power circuit you can save around a factor 3 on battery lifetime when you get rid of the timed wakeup. The arduino sleeps a lot better when it doesn't have to look at the alarm clock every few ms :zzz:

                  siodS Offline
                  siodS Offline
                  siod
                  wrote on last edited by
                  #23

                  @AWI
                  yes, makes sense, but how should you do this wihout the wakeup ? I guess this is just the disadvantage one must accept...

                  still learning...

                  AWIA 1 Reply Last reply
                  0
                  • siodS siod

                    @AWI
                    yes, makes sense, but how should you do this wihout the wakeup ? I guess this is just the disadvantage one must accept...

                    AWIA Offline
                    AWIA Offline
                    AWI
                    Hero Member
                    wrote on last edited by
                    #24

                    @siod The wakeup function can be disabled by setting the timer values to 0 (or omitting it). There is no purpose in the sketch above for what I can see. If you want to have a kind of "hey I am still alive"/heartbeat feature you need to do a little more (e.g. sending battery level)

                    172pilot1 1 Reply Last reply
                    0
                    • AWIA AWI

                      @siod The wakeup function can be disabled by setting the timer values to 0 (or omitting it). There is no purpose in the sketch above for what I can see. If you want to have a kind of "hey I am still alive"/heartbeat feature you need to do a little more (e.g. sending battery level)

                      172pilot1 Offline
                      172pilot1 Offline
                      172pilot
                      wrote on last edited by
                      #25

                      @AWI I was going to ask about that.. I dont see any reason to wake up every 24 hours just to go back to sleep again.. I assume the radio doesn't have any reason to send a keepalive or anything? So, you can omit that number, and it will sleep until interrupted? That's cool..

                      -Steve

                      AWIA 1 Reply Last reply
                      0
                      • 172pilot1 172pilot

                        @AWI I was going to ask about that.. I dont see any reason to wake up every 24 hours just to go back to sleep again.. I assume the radio doesn't have any reason to send a keepalive or anything? So, you can omit that number, and it will sleep until interrupted? That's cool..

                        -Steve

                        AWIA Offline
                        AWIA Offline
                        AWI
                        Hero Member
                        wrote on last edited by
                        #26

                        @172pilot yes, no reason to wake up. Especially if there is a regular wake-up from interrupt to let the controller know it it is alive

                        1 Reply Last reply
                        0
                        • AWIA AWI

                          @siod I guess so. But don't ask me why. One should be sufficient to detect if the door is open :smile:

                          In addition (and for what it is worth). If you use a real low power circuit you can save around a factor 3 on battery lifetime when you get rid of the timed wakeup. The arduino sleeps a lot better when it doesn't have to look at the alarm clock every few ms :zzz:

                          ChakkieC Offline
                          ChakkieC Offline
                          Chakkie
                          wrote on last edited by Chakkie
                          #27

                          @AWI

                          Thanks for the info. I thought you always have to add the sleep time to the gw.sleep. I will disable the a wake timer by removing the 86400000.

                          @siod I use one switch for the letterbox and one for the door.

                          Raspberry Pi 2
                          Domoticz
                          RFXCOM
                          ZWAVE Aeon stick
                          Coming soon Arduino mysensors GW

                          1 Reply Last reply
                          0
                          • siodS Offline
                            siodS Offline
                            siod
                            wrote on last edited by
                            #28

                            well, as you can see, if you don´t know the libraries exactly you accept things as they are or as they seem to be. I wasn´t aware that you can just set the wakeup function to 0. So this said I would like to thank you @AWI for your patience and your willingness of explaining also the most obvious things! :thumbsup:

                            still learning...

                            1 Reply Last reply
                            1
                            • T Offline
                              T Offline
                              treb0r
                              wrote on last edited by
                              #29

                              The sketch works with both reeds switches (2 windows) but how to integreate it with DS18B20 temp sensor? I also power it with battery, so I would like to check the temp eg every 5min and if it is changed then send the new value to the controler. How to wake up arduino only if any window is opened or temp is changed (after 5 min)
                              Thanks
                              treb0r

                              dynamiteD 172pilot1 2 Replies Last reply
                              0
                              • T treb0r

                                The sketch works with both reeds switches (2 windows) but how to integreate it with DS18B20 temp sensor? I also power it with battery, so I would like to check the temp eg every 5min and if it is changed then send the new value to the controler. How to wake up arduino only if any window is opened or temp is changed (after 5 min)
                                Thanks
                                treb0r

                                dynamiteD Offline
                                dynamiteD Offline
                                dynamite
                                wrote on last edited by
                                #30

                                @treb0r You can either wake up on the interrupt or on a time period:

                                bool sleep(int interrupt, int mode, unsigned long ms=0);

                                interrupt - Interrupt that should trigger the wakeup.
                                mode - RISING, FALLING, CHANGE
                                ms - Number of milliseconds to sleep (or 0 to sleep forever).

                                The sleep method returns true if wake up was triggered by pin change and false means timer woke it up.

                                1 Reply Last reply
                                0
                                • T treb0r

                                  The sketch works with both reeds switches (2 windows) but how to integreate it with DS18B20 temp sensor? I also power it with battery, so I would like to check the temp eg every 5min and if it is changed then send the new value to the controler. How to wake up arduino only if any window is opened or temp is changed (after 5 min)
                                  Thanks
                                  treb0r

                                  172pilot1 Offline
                                  172pilot1 Offline
                                  172pilot
                                  wrote on last edited by
                                  #31

                                  @treb0r the problem is, you need to wake up the arduino to tell the temp sensor to take a new reading, so the best you can do is to trigger on the interrupts for the Windows and then use the timer to wake up and take the temperature reading, and then you'll have to compare to your saved value to decide whether it has been 5 degrees or not, so you can't completely sleep until that happens..

                                  1 Reply Last reply
                                  0
                                  • siodS Offline
                                    siodS Offline
                                    siod
                                    wrote on last edited by siod
                                    #32

                                    Hi guys,

                                    unfortunately I have to answer again to this topic because I don´t get my nodes work longer then up to two weeks. I guess it is still a sleep function problem and the problem persits though I am usin ver 2.0 now. Please have a look at my code, any hint is very appreciated!!

                                    I have attached 2 reed switches which should trigger a wakeup and one Hum/Temp Sensor is attached, too. I would like the device to send temp/hum measurements every 15 minutes, what works, but only for a few days or so. Then I also send battery level, that´s all.

                                    I have 3 devices up and running right now, they all fail once in while...

                                    // Sensor Node Schlafzimmer mit HTU21D Temp/Hum Sensor, Fensterkontakte an Interrupt PINS Digital 5&6. Sleep Time 15 Minutwn, wake up wenn Fenster geöffnet/geschlossen wird.
                                    #define MY_RADIO_NRF24 //MySensor Library auf NRF24 Funkmodul einstellen, muss vor MySensor.h Initialisierung geschehen
                                    // Define Node ID
                                    #define MY_NODE_ID 200
                                    
                                    //Batterysensor
                                    int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
                                    int oldBatteryPcnt = 0;
                                    #define CHILD_ID_BATT 7
                                    
                                    //Kontaktschalter
                                    //#include <Bounce2.h>
                                    #define CHILD1_ID 1 // Kontaktschalter 1
                                    #define CHILD2_ID 2 // Kontaktschalter 2
                                    #define BUTTON1_PIN  2  // Kontaktschalter 1
                                    #define BUTTON2_PIN  3  // Kontaktschalter 2
                                    int oldValueReed1=-1;
                                    int oldValueReed2=-1;
                                    
                                    //Tempsensor
                                    #include <SparkFunHTU21D.h>
                                    #include <Wire.h>
                                    #define CHILD_ID_HUM 3
                                    #define CHILD_ID_TEMP 4
                                    unsigned long SLEEP_TIME = 900000; // Sleep time between reads (in milliseconds)
                                    
                                    #include <MySensors.h>
                                    #include <SPI.h>
                                    
                                    //tempsensor
                                    HTU21D myHumidity;
                                    float lastTemp;
                                    float lastHum;
                                    //boolean metric = true; 
                                    
                                    //Messages
                                    //Battery
                                    MyMessage msgbatt(CHILD_ID_BATT,V_VOLTAGE);
                                    // Kontaktschalter
                                    MyMessage msgReed1(CHILD1_ID,V_TRIPPED); // Kontaktschalter 1
                                    MyMessage msgReed2(CHILD2_ID,V_TRIPPED); // Kontaktschalter 2
                                    //TempMessage
                                    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                                    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                                    
                                    //Presentation; present sensors to gateway!
                                    void presentation(){
                                      // Send the sketch version information to the gateway and Controller
                                      sendSketchInfo("Schlafzimmer Messstation", "2.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(CHILD1_ID, S_DOOR); 
                                      present(CHILD2_ID, S_DOOR); 
                                        
                                      //Tempsensor
                                      present(CHILD_ID_HUM, S_HUM);
                                      present(CHILD_ID_TEMP, S_TEMP); 
                                      //metric = getConfig().isMetric;
                                    
                                      //Battery
                                      present(CHILD_ID_BATT,V_VOLTAGE);
                                    }
                                    
                                    //Setup
                                    void setup()  
                                    {  
                                      //Serial.begin(9600);
                                      Serial.println("Hello!");
                                      //Batterysensor
                                         // use the 1.1 V internal reference
                                    #if defined(__AVR_ATmega2560__)
                                       analogReference(INTERNAL1V1);
                                    #else
                                       analogReference(INTERNAL);
                                    #endif
                                    
                                    //Tempsensor
                                      Serial.println("Setting up TempSensor...");
                                      myHumidity.begin();
                                      Serial.println("...done!");
                                    
                                    // Setup Kontaktschalter 1
                                      pinMode(BUTTON1_PIN,INPUT);
                                        // Activate internal pull-up
                                      digitalWrite(BUTTON1_PIN,HIGH);
                                    // Setup Kontaktschalter 2
                                      pinMode(BUTTON2_PIN,INPUT);
                                      // Activate internal pull-up
                                      digitalWrite(BUTTON2_PIN,HIGH);
                                    }
                                    
                                    //Starte den Loop
                                    void loop() 
                                    {
                                      //Batterysensor
                                      // get the battery Voltage
                                      delay(1000);
                                       int sensorValue = analogRead(BATTERY_SENSE_PIN);
                                       #ifdef DEBUG
                                       #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
                                       float batteryV  = sensorValue * 0.003363075;
                                       int batteryPcnt = sensorValue / 10;
                                    
                                       #ifdef DEBUG
                                       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);
                                         send(msgbatt.set(batteryPcnt));
                                         oldBatteryPcnt = batteryPcnt;
                                       }
                                       
                                      //Kontakstschalter 1
                                       // Short delay to allow buttons to properly settle
                                      sleep(10);
                                      // Get the update value
                                      int valueReed1 = digitalRead(BUTTON1_PIN);
                                     
                                      if (valueReed1 != oldValueReed1) {
                                         // Send in the new value
                                         send(msgReed1.set(valueReed1==HIGH ? 1 : 0));
                                         Serial.println("Button 1 geschaltet");
                                         oldValueReed1 = valueReed1;
                                      }
                                      //Kontakstschalter 2
                                      // Get the update value
                                      int valueReed2 = digitalRead(BUTTON2_PIN);
                                     
                                      if (valueReed2 != oldValueReed2) {
                                         // Send in the new value
                                         send(msgReed2.set(valueReed2==HIGH ? 1 : 0));
                                         Serial.println("Button 2 geschaltet");
                                         oldValueReed2 = valueReed2;
                                      }
                                     
                                     //Tempsensor
                                    Serial.println("Starte Messung...");
                                      
                                        float temp = myHumidity.readTemperature();
                                    
                                      if (isnan(temp)) {
                                          Serial.println("Failed reading temperature from DHT");
                                      } else if (temp != lastTemp) {
                                        lastTemp = temp;
                                        send(msgTemp.set(temp, 1));
                                        Serial.print("T: ");
                                        Serial.println(temp);
                                      }
                                      
                                     float humd = myHumidity.readHumidity();
                                      if (isnan(humd)) {
                                          Serial.println("Failed reading humidity from DHT");
                                      } else if (humd != lastHum) {
                                          lastHum = humd;
                                          send(msgHum.set(humd, 1));
                                          Serial.print("H: ");
                                          Serial.println(humd);
                                      }
                                    
                                     Serial.println("Sleep...");
                                     sleep(BUTTON1_PIN - 2, CHANGE, BUTTON2_PIN - 2, CHANGE, SLEEP_TIME); //sleep a bit 
                                      
                                    } 
                                    
                                    

                                    still learning...

                                    1 Reply Last reply
                                    0
                                    • slingS Offline
                                      slingS Offline
                                      sling
                                      wrote on last edited by
                                      #33

                                      @siod

                                      I'm assuming your batteries are empty when you say fail ?
                                      I built 5 of these last week for my dads place.
                                      I set internal pullups to LOW and soldered a 3,3MOhm resistor between VCC and Pin2.
                                      I'm seeing around 30µA when sleeping on two fresh AA batteries.
                                      With internal pullups that would be around 1ma and that would indeed drain the batteries quite fast.

                                      1 Reply Last reply
                                      0
                                      • siodS Offline
                                        siodS Offline
                                        siod
                                        wrote on last edited by
                                        #34

                                        no Sir, batteries are still at around 90% charged.

                                        still learning...

                                        1 Reply Last reply
                                        0
                                        • N Offline
                                          N Offline
                                          Nicklas Starkel
                                          wrote on last edited by
                                          #35

                                          @siod , I had the same problem.
                                          I actually ordered a original NRF 24 mini and this seemed to solve some of my problems.
                                          i think another problem I'm having is that my batteries has a huge self discharge (old 3.7v 18650)

                                          On a side note.. I'm with @sling .
                                          Loose the pullups and set them LOW´.
                                          I have a 1MOhm resistor between VCC and PIN 2 and PIN 3 (also 2 switches).
                                          Using the pullup HIGH draws around 130uA versus LOW it draws between 7 to 10uA!

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


                                          14

                                          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