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. General Discussion
  3. Dectect wake up source

Dectect wake up source

Scheduled Pinned Locked Moved General Discussion
12 Posts 5 Posters 1.2k Views 3 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.
  • GeforceGamerG Offline
    GeforceGamerG Offline
    GeforceGamer
    wrote on last edited by
    #1

    Hi,

    is it possible to dectect how my node wakes up? If the wake up cames form the button or by timer?

    this is my sleep code:

    sleep(digitalPinToInterrupt(reedswitch), CHANGE, SLEEP_TIME);
    

    I want to check something like this:

    If (wakeUpByTime == 1)
      {
        Serial.println("Node wakes up by timer");
      }
    
    else
      {
       Serial.println("Node wakes up by Button");
      }
    
    sundberg84S 1 Reply Last reply
    0
    • nagelcN Offline
      nagelcN Offline
      nagelc
      wrote on last edited by
      #2

      Yes. sleep() gives a return code you can use. See the discussion in the API page here:
      https://www.mysensors.org/download/sensor_api_20#sleeping

      1 Reply Last reply
      1
      • GeforceGamerG GeforceGamer

        Hi,

        is it possible to dectect how my node wakes up? If the wake up cames form the button or by timer?

        this is my sleep code:

        sleep(digitalPinToInterrupt(reedswitch), CHANGE, SLEEP_TIME);
        

        I want to check something like this:

        If (wakeUpByTime == 1)
          {
            Serial.println("Node wakes up by timer");
          }
        
        else
          {
           Serial.println("Node wakes up by Button");
          }
        
        sundberg84S Offline
        sundberg84S Offline
        sundberg84
        Hardware Contributor
        wrote on last edited by sundberg84
        #3

        @geforcegamer

        if (interruptReturn == true) {    // Woke up by changing pin
           if woken by interrupt code
        }
        
        if (interruptReturn == false) { // Woke up by timer  (or it's the first run)
        'if not by interrupt
        }
         interruptReturn = sleep(digitalPinToInterrupt(PIR_PIN), RISING, SLEEP_TIME);
        

        From my doorbell sensor: https://github.com/sundberg84/HomeAutomation/blob/master/Sketches MySensors Nrf24l01 radio/DoorBellDec1mhz/DoorBellDec1mhz.ino
        Waiting for en external interrupt, or a timer.

        Im sure there are better/prettier code since thats not my stronge side. But its an example...

        Controller: Proxmox VM - Home Assistant
        MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
        MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
        RFLink GW - Arduino Mega + RFLink Shield, 433mhz

        1 Reply Last reply
        0
        • GeforceGamerG Offline
          GeforceGamerG Offline
          GeforceGamer
          wrote on last edited by
          #4

          @nagelc Thank you.
          @sundberg84 Thanks for the great example. It really helped me a lot. I will try it out the days.

          1 Reply Last reply
          1
          • GeforceGamerG Offline
            GeforceGamerG Offline
            GeforceGamer
            wrote on last edited by
            #5

            unfortunately it does not work with me so. I don't know whats wrong. At the first start of the node it works. But the wakeup by time shows wake up by interrupt and the wake by interrupt shows "wake up by interrupt" too.

            if (interruptReturn == true)     // Woke up by changing pin
              {
                wakeup= 1;
                Serial.println("wake up interrupt");
              }
              if (interruptReturn == false)     // Woke up by Timer
              {
                wakeup= 0;
                Serial.println("wake up timer");
              }
            
            
            interruptReturn = sleep(digitalPinToInterrupt(reedswitch), CHANGE, SLEEP_TIME);
            
            YveauxY 1 Reply Last reply
            0
            • GeforceGamerG GeforceGamer

              unfortunately it does not work with me so. I don't know whats wrong. At the first start of the node it works. But the wakeup by time shows wake up by interrupt and the wake by interrupt shows "wake up by interrupt" too.

              if (interruptReturn == true)     // Woke up by changing pin
                {
                  wakeup= 1;
                  Serial.println("wake up interrupt");
                }
                if (interruptReturn == false)     // Woke up by Timer
                {
                  wakeup= 0;
                  Serial.println("wake up timer");
                }
              
              
              interruptReturn = sleep(digitalPinToInterrupt(reedswitch), CHANGE, SLEEP_TIME);
              
              YveauxY Offline
              YveauxY Offline
              Yveaux
              Mod
              wrote on last edited by Yveaux
              #6

              @geforcegamer what do you use as interrupt source?
              If you use e.g. a hardware button then bouncing of the switch contacts can cause the node to wake up unexpectedly.
              Also, you wake on CHANGE, meaning both a low high and high low transition will wake up your node (e.g. Button press and button release).
              Can you describe your hardware setup?

              http://yveaux.blogspot.nl

              1 Reply Last reply
              1
              • GeforceGamerG Offline
                GeforceGamerG Offline
                GeforceGamer
                wrote on last edited by
                #7

                @Yveaux
                I use an reedswitch as interrupt source. It is use in a bin to measure the level. I use the CHANGE command to always wake up the node. No matter if the lid is opened or closed.

                mfalkviddM 1 Reply Last reply
                0
                • GeforceGamerG GeforceGamer

                  @Yveaux
                  I use an reedswitch as interrupt source. It is use in a bin to measure the level. I use the CHANGE command to always wake up the node. No matter if the lid is opened or closed.

                  mfalkviddM Offline
                  mfalkviddM Offline
                  mfalkvidd
                  Mod
                  wrote on last edited by
                  #8

                  @geforcegamer how is the interruptreturn variable declared? Is it scoped to survive (we can only see part of your code - maybe the value is lost at the end of loop()?

                  1 Reply Last reply
                  0
                  • GeforceGamerG Offline
                    GeforceGamerG Offline
                    GeforceGamer
                    wrote on last edited by GeforceGamer
                    #9
                    bool interruptReturn;
                    
                    void loop()      
                    { 
                      if (interruptReturn == true)     // Woke up by changing pin
                      {
                        offen = 1;
                        Serial.println("aufwachen durch Deckel");
                      }
                      if (interruptReturn == false)     // Woke up by Timer
                      {
                        offen = 0;
                        Serial.println("aufwachen durch Timer");
                      }
                    
                    mfalkviddM 1 Reply Last reply
                    0
                    • GeforceGamerG GeforceGamer
                      bool interruptReturn;
                      
                      void loop()      
                      { 
                        if (interruptReturn == true)     // Woke up by changing pin
                        {
                          offen = 1;
                          Serial.println("aufwachen durch Deckel");
                        }
                        if (interruptReturn == false)     // Woke up by Timer
                        {
                          offen = 0;
                          Serial.println("aufwachen durch Timer");
                        }
                      
                      mfalkviddM Offline
                      mfalkviddM Offline
                      mfalkvidd
                      Mod
                      wrote on last edited by mfalkvidd
                      #10

                      @geforcegamer I think I found the problem. Sleep returns an int, not a bool. Change

                      bool interruptReturn;
                      

                      to

                      int interruptReturn;
                      

                      and change

                      if (interruptReturn == true)     // Woke up by changing pin
                      {
                        offen = 1;
                        Serial.println("aufwachen durch Deckel");
                      }
                      if (interruptReturn == false)     // Woke up by Timer
                      {
                        offen = 0;
                        Serial.println("aufwachen durch Timer");
                      }
                      

                      to

                      if (interruptReturn == MY_WAKE_UP_BY_TIMER)
                      {
                        offen = 0;
                        Serial.println("aufwachen durch Timer");
                      } else  {     // Woke up by interrupt (or MY_SLEEP_NOT_POSSIBLE)
                        offen = 1;
                        Serial.println("aufwachen durch Deckel");
                      }
                      

                      Documentation: https://www.mysensors.org/download/sensor_api_20#sleeping

                      1 Reply Last reply
                      0
                      • GeforceGamerG Offline
                        GeforceGamerG Offline
                        GeforceGamer
                        wrote on last edited by
                        #11

                        @mfalkvidd
                        Thanks alot. Now the wake-up detection works perfectly

                        mfalkviddM 1 Reply Last reply
                        1
                        • GeforceGamerG GeforceGamer

                          @mfalkvidd
                          Thanks alot. Now the wake-up detection works perfectly

                          mfalkviddM Offline
                          mfalkviddM Offline
                          mfalkvidd
                          Mod
                          wrote on last edited by
                          #12

                          @geforcegamer great, thanks for reporting the result.

                          @sundberg84 next time you update your doorbell, maybe you should add the same changes.

                          1 Reply Last reply
                          1
                          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.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