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. Troubleshooting
  3. Door switch - sleep

Door switch - sleep

Scheduled Pinned Locked Moved Troubleshooting
6 Posts 5 Posters 3.8k 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.
  • I Offline
    I Offline
    insomnia
    wrote on last edited by insomnia
    #1

    I use this sketch for a door switch and i wan't to make it battery powered and also wan't to make the arduino go to sleep. Is this possible and how do i do that?
    gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME); Doesn't work with interrupt in this sketch

    #include <MySensor.h>
    #include <SPI.h>
    #include <Bounce2.h>
    
    
    #define CHILD_ID1 3
    #define BUTTON_PIN1  3  // Arduino Digital I/O pin for button/reed switch
    #define CHILD_ID2 4
    #define BUTTON_PIN2  4  // Arduino Digital I/O pin for button/reed switch
    #define CHILD_ID3 5
    #define BUTTON_PIN3  5  // Arduino Digital I/O pin for button/reed switch
    
    
    
    MySensor gw;
    Bounce debouncer1 = Bounce(); 
    Bounce debouncer2 = Bounce(); // debouncer for the second switch
    Bounce debouncer3 = Bounce(); // debouncer for the third switch
    
    int oldValue1=-1;
    int oldValue2=-1; // second switch needs to have it's own old state
    int oldValue3=-1; // second switch needs to have it's own old state
    int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
    unsigned long SLEEP_TIME = 900000; // Sleep time between reports (in milliseconds)
    int oldBatteryPcnt = 0;
    
    // Change to V_LIGHT if you use S_LIGHT in presentation below
    MyMessage msg1(CHILD_ID1,V_TRIPPED), msg2(CHILD_ID2,V_TRIPPED),msg3(CHILD_ID3,V_TRIPPED);
    
    
    
    void setup()  
    {  
      gw.begin();
    
       // use the 1.1 V internal reference
    #if defined(__AVR_ATmega2560__)
       analogReference(INTERNAL1V1);
    #else
       analogReference(INTERNAL);
    #endif
     
      gw.begin();
    
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Door Sensor Battery meter", "1.0");
    
     // Setup the button
      pinMode(BUTTON_PIN1,INPUT_PULLUP ); // You can assign pinmode and use pullup in one statement.
      pinMode(BUTTON_PIN2,INPUT_PULLUP);
      pinMode(BUTTON_PIN3,INPUT_PULLUP);
      
      // Activate internal pull-up
     // digitalWrite(BUTTON_PIN1,HIGH);
    //  digitalWrite(BUTTON_PIN2,HIGH);
    //  digitalWrite(BUTTON_PIN3,HIGH);
      
      // After setting up the button, setup debouncer1
      debouncer1.attach(BUTTON_PIN1);
      debouncer1.interval(5);
      debouncer2.attach(BUTTON_PIN2);
      debouncer2.interval(5);
      debouncer3.attach(BUTTON_PIN3);
      debouncer3.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_ID1, S_DOOR);
      gw.present(CHILD_ID2, S_DOOR);
      gw.present(CHILD_ID3, S_DOOR);  
    }
    
    
    //  Check if digital input has changed and send in new value
    void loop() 
    {
      // get the battery Voltage
       int sensorValue = analogRead(BATTERY_SENSE_PIN);
       #ifdef 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
       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
         gw.sendBatteryLevel(batteryPcnt);
         oldBatteryPcnt = batteryPcnt;
       } 
      // Check if the first switch state has changed
      debouncer1.update();
      // Get the update value
      int value = debouncer1.read();
     
      if (value != oldValue1) {
         // Send in the new value
         gw.send(msg1.set(value==HIGH ? 1 : 0));
    //     gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
    //     gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
         oldValue1 = value;
      }
      
      // Check if the 2nd switch state has changed
      debouncer2.update();
      // Get the update value
      value = debouncer2.read(); // no need to redeclare it (I removed int)
     
      if (value != oldValue2) {
         // Send in the new value
    //     gw.send(msg1.set(value==HIGH ? 1 : 0));
           gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
    //     gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
         oldValue2 = value;
      }
      
      // Check if the third switch state has changed
      debouncer3.update();
      // Get the update value
      value = debouncer3.read(); // no need to redeclare it (I removed int)
     
      if (value != oldValue3) {
         // Send in the new value
    //     gw.send(msg1.set(value==HIGH ? 1 : 0));
    //     gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
         gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
         oldValue3 = value;
      }
       // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
      gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
    } ```
    D S M 3 Replies Last reply
    0
    • I insomnia

      I use this sketch for a door switch and i wan't to make it battery powered and also wan't to make the arduino go to sleep. Is this possible and how do i do that?
      gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME); Doesn't work with interrupt in this sketch

      #include <MySensor.h>
      #include <SPI.h>
      #include <Bounce2.h>
      
      
      #define CHILD_ID1 3
      #define BUTTON_PIN1  3  // Arduino Digital I/O pin for button/reed switch
      #define CHILD_ID2 4
      #define BUTTON_PIN2  4  // Arduino Digital I/O pin for button/reed switch
      #define CHILD_ID3 5
      #define BUTTON_PIN3  5  // Arduino Digital I/O pin for button/reed switch
      
      
      
      MySensor gw;
      Bounce debouncer1 = Bounce(); 
      Bounce debouncer2 = Bounce(); // debouncer for the second switch
      Bounce debouncer3 = Bounce(); // debouncer for the third switch
      
      int oldValue1=-1;
      int oldValue2=-1; // second switch needs to have it's own old state
      int oldValue3=-1; // second switch needs to have it's own old state
      int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
      unsigned long SLEEP_TIME = 900000; // Sleep time between reports (in milliseconds)
      int oldBatteryPcnt = 0;
      
      // Change to V_LIGHT if you use S_LIGHT in presentation below
      MyMessage msg1(CHILD_ID1,V_TRIPPED), msg2(CHILD_ID2,V_TRIPPED),msg3(CHILD_ID3,V_TRIPPED);
      
      
      
      void setup()  
      {  
        gw.begin();
      
         // use the 1.1 V internal reference
      #if defined(__AVR_ATmega2560__)
         analogReference(INTERNAL1V1);
      #else
         analogReference(INTERNAL);
      #endif
       
        gw.begin();
      
        // Send the sketch version information to the gateway and Controller
        gw.sendSketchInfo("Door Sensor Battery meter", "1.0");
      
       // Setup the button
        pinMode(BUTTON_PIN1,INPUT_PULLUP ); // You can assign pinmode and use pullup in one statement.
        pinMode(BUTTON_PIN2,INPUT_PULLUP);
        pinMode(BUTTON_PIN3,INPUT_PULLUP);
        
        // Activate internal pull-up
       // digitalWrite(BUTTON_PIN1,HIGH);
      //  digitalWrite(BUTTON_PIN2,HIGH);
      //  digitalWrite(BUTTON_PIN3,HIGH);
        
        // After setting up the button, setup debouncer1
        debouncer1.attach(BUTTON_PIN1);
        debouncer1.interval(5);
        debouncer2.attach(BUTTON_PIN2);
        debouncer2.interval(5);
        debouncer3.attach(BUTTON_PIN3);
        debouncer3.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_ID1, S_DOOR);
        gw.present(CHILD_ID2, S_DOOR);
        gw.present(CHILD_ID3, S_DOOR);  
      }
      
      
      //  Check if digital input has changed and send in new value
      void loop() 
      {
        // get the battery Voltage
         int sensorValue = analogRead(BATTERY_SENSE_PIN);
         #ifdef 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
         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
           gw.sendBatteryLevel(batteryPcnt);
           oldBatteryPcnt = batteryPcnt;
         } 
        // Check if the first switch state has changed
        debouncer1.update();
        // Get the update value
        int value = debouncer1.read();
       
        if (value != oldValue1) {
           // Send in the new value
           gw.send(msg1.set(value==HIGH ? 1 : 0));
      //     gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
      //     gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
           oldValue1 = value;
        }
        
        // Check if the 2nd switch state has changed
        debouncer2.update();
        // Get the update value
        value = debouncer2.read(); // no need to redeclare it (I removed int)
       
        if (value != oldValue2) {
           // Send in the new value
      //     gw.send(msg1.set(value==HIGH ? 1 : 0));
             gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
      //     gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
           oldValue2 = value;
        }
        
        // Check if the third switch state has changed
        debouncer3.update();
        // Get the update value
        value = debouncer3.read(); // no need to redeclare it (I removed int)
       
        if (value != oldValue3) {
           // Send in the new value
      //     gw.send(msg1.set(value==HIGH ? 1 : 0));
      //     gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
           gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
           oldValue3 = value;
        }
         // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
        gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
      } ```
      D Offline
      D Offline
      Dwalt
      wrote on last edited by
      #2

      @insomnia

      You need to declare your interrupts to use the interrupt-from-sleep function. Right now it looks like your sketch is sleeping 15 minutes and then checking your door sensors and going back to sleep..

      Veralite UI5 :: IBoard Ethernet GW :: MyS 1.5

      1 Reply Last reply
      0
      • I Offline
        I Offline
        insomnia
        wrote on last edited by
        #3

        Like this
        #define INTERRUPT DIGITAL_INPUT_SENSOR-3
        #define INTERRUPT DIGITAL_INPUT_SENSOR-4
        #define INTERRUPT DIGITAL_INPUT_SENSOR-5

        Is this correct?

        M 1 Reply Last reply
        0
        • I insomnia

          Like this
          #define INTERRUPT DIGITAL_INPUT_SENSOR-3
          #define INTERRUPT DIGITAL_INPUT_SENSOR-4
          #define INTERRUPT DIGITAL_INPUT_SENSOR-5

          Is this correct?

          M Offline
          M Offline
          mbj
          wrote on last edited by
          #4

          @insomnia I can not see any defined interrupt or the interrupt related function in your code. Starting with the Arduino docs is often helpful why I suggest taking a look at https://www.arduino.cc/en/Reference/AttachInterrupt. For only one switch a hardware interrupt will work fine.

          If you need to monitor a few more switches and you use an Arduino with 328P processor there are only 2 hardware interrupts available. Then the pin change interrupts may help but the task is getting more complicated, see for example http://playground.arduino.cc/Main/PinChangeInterrupt but there are libraries like https://github.com/GreyGnome/EnableInterrupt (which I so far not have tested).

          Then there are ways of dealing with heaps of interrupts as well but that is far beyond my knowledge.

          1 Reply Last reply
          0
          • I insomnia

            I use this sketch for a door switch and i wan't to make it battery powered and also wan't to make the arduino go to sleep. Is this possible and how do i do that?
            gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME); Doesn't work with interrupt in this sketch

            #include <MySensor.h>
            #include <SPI.h>
            #include <Bounce2.h>
            
            
            #define CHILD_ID1 3
            #define BUTTON_PIN1  3  // Arduino Digital I/O pin for button/reed switch
            #define CHILD_ID2 4
            #define BUTTON_PIN2  4  // Arduino Digital I/O pin for button/reed switch
            #define CHILD_ID3 5
            #define BUTTON_PIN3  5  // Arduino Digital I/O pin for button/reed switch
            
            
            
            MySensor gw;
            Bounce debouncer1 = Bounce(); 
            Bounce debouncer2 = Bounce(); // debouncer for the second switch
            Bounce debouncer3 = Bounce(); // debouncer for the third switch
            
            int oldValue1=-1;
            int oldValue2=-1; // second switch needs to have it's own old state
            int oldValue3=-1; // second switch needs to have it's own old state
            int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
            unsigned long SLEEP_TIME = 900000; // Sleep time between reports (in milliseconds)
            int oldBatteryPcnt = 0;
            
            // Change to V_LIGHT if you use S_LIGHT in presentation below
            MyMessage msg1(CHILD_ID1,V_TRIPPED), msg2(CHILD_ID2,V_TRIPPED),msg3(CHILD_ID3,V_TRIPPED);
            
            
            
            void setup()  
            {  
              gw.begin();
            
               // use the 1.1 V internal reference
            #if defined(__AVR_ATmega2560__)
               analogReference(INTERNAL1V1);
            #else
               analogReference(INTERNAL);
            #endif
             
              gw.begin();
            
              // Send the sketch version information to the gateway and Controller
              gw.sendSketchInfo("Door Sensor Battery meter", "1.0");
            
             // Setup the button
              pinMode(BUTTON_PIN1,INPUT_PULLUP ); // You can assign pinmode and use pullup in one statement.
              pinMode(BUTTON_PIN2,INPUT_PULLUP);
              pinMode(BUTTON_PIN3,INPUT_PULLUP);
              
              // Activate internal pull-up
             // digitalWrite(BUTTON_PIN1,HIGH);
            //  digitalWrite(BUTTON_PIN2,HIGH);
            //  digitalWrite(BUTTON_PIN3,HIGH);
              
              // After setting up the button, setup debouncer1
              debouncer1.attach(BUTTON_PIN1);
              debouncer1.interval(5);
              debouncer2.attach(BUTTON_PIN2);
              debouncer2.interval(5);
              debouncer3.attach(BUTTON_PIN3);
              debouncer3.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_ID1, S_DOOR);
              gw.present(CHILD_ID2, S_DOOR);
              gw.present(CHILD_ID3, S_DOOR);  
            }
            
            
            //  Check if digital input has changed and send in new value
            void loop() 
            {
              // get the battery Voltage
               int sensorValue = analogRead(BATTERY_SENSE_PIN);
               #ifdef 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
               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
                 gw.sendBatteryLevel(batteryPcnt);
                 oldBatteryPcnt = batteryPcnt;
               } 
              // Check if the first switch state has changed
              debouncer1.update();
              // Get the update value
              int value = debouncer1.read();
             
              if (value != oldValue1) {
                 // Send in the new value
                 gw.send(msg1.set(value==HIGH ? 1 : 0));
            //     gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
            //     gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
                 oldValue1 = value;
              }
              
              // Check if the 2nd switch state has changed
              debouncer2.update();
              // Get the update value
              value = debouncer2.read(); // no need to redeclare it (I removed int)
             
              if (value != oldValue2) {
                 // Send in the new value
            //     gw.send(msg1.set(value==HIGH ? 1 : 0));
                   gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
            //     gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
                 oldValue2 = value;
              }
              
              // Check if the third switch state has changed
              debouncer3.update();
              // Get the update value
              value = debouncer3.read(); // no need to redeclare it (I removed int)
             
              if (value != oldValue3) {
                 // Send in the new value
            //     gw.send(msg1.set(value==HIGH ? 1 : 0));
            //     gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
                 gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
                 oldValue3 = value;
              }
               // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
              gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
            } ```
            S Offline
            S Offline
            Sparkman
            Hero Member
            wrote on last edited by
            #5

            @insomnia Take a look at this article as it describes how to use one interrupt pin for multiple swirches: http://www.gammon.com.au/forum/?id=11091.

            Cheers
            Al

            1 Reply Last reply
            0
            • I insomnia

              I use this sketch for a door switch and i wan't to make it battery powered and also wan't to make the arduino go to sleep. Is this possible and how do i do that?
              gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME); Doesn't work with interrupt in this sketch

              #include <MySensor.h>
              #include <SPI.h>
              #include <Bounce2.h>
              
              
              #define CHILD_ID1 3
              #define BUTTON_PIN1  3  // Arduino Digital I/O pin for button/reed switch
              #define CHILD_ID2 4
              #define BUTTON_PIN2  4  // Arduino Digital I/O pin for button/reed switch
              #define CHILD_ID3 5
              #define BUTTON_PIN3  5  // Arduino Digital I/O pin for button/reed switch
              
              
              
              MySensor gw;
              Bounce debouncer1 = Bounce(); 
              Bounce debouncer2 = Bounce(); // debouncer for the second switch
              Bounce debouncer3 = Bounce(); // debouncer for the third switch
              
              int oldValue1=-1;
              int oldValue2=-1; // second switch needs to have it's own old state
              int oldValue3=-1; // second switch needs to have it's own old state
              int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
              unsigned long SLEEP_TIME = 900000; // Sleep time between reports (in milliseconds)
              int oldBatteryPcnt = 0;
              
              // Change to V_LIGHT if you use S_LIGHT in presentation below
              MyMessage msg1(CHILD_ID1,V_TRIPPED), msg2(CHILD_ID2,V_TRIPPED),msg3(CHILD_ID3,V_TRIPPED);
              
              
              
              void setup()  
              {  
                gw.begin();
              
                 // use the 1.1 V internal reference
              #if defined(__AVR_ATmega2560__)
                 analogReference(INTERNAL1V1);
              #else
                 analogReference(INTERNAL);
              #endif
               
                gw.begin();
              
                // Send the sketch version information to the gateway and Controller
                gw.sendSketchInfo("Door Sensor Battery meter", "1.0");
              
               // Setup the button
                pinMode(BUTTON_PIN1,INPUT_PULLUP ); // You can assign pinmode and use pullup in one statement.
                pinMode(BUTTON_PIN2,INPUT_PULLUP);
                pinMode(BUTTON_PIN3,INPUT_PULLUP);
                
                // Activate internal pull-up
               // digitalWrite(BUTTON_PIN1,HIGH);
              //  digitalWrite(BUTTON_PIN2,HIGH);
              //  digitalWrite(BUTTON_PIN3,HIGH);
                
                // After setting up the button, setup debouncer1
                debouncer1.attach(BUTTON_PIN1);
                debouncer1.interval(5);
                debouncer2.attach(BUTTON_PIN2);
                debouncer2.interval(5);
                debouncer3.attach(BUTTON_PIN3);
                debouncer3.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_ID1, S_DOOR);
                gw.present(CHILD_ID2, S_DOOR);
                gw.present(CHILD_ID3, S_DOOR);  
              }
              
              
              //  Check if digital input has changed and send in new value
              void loop() 
              {
                // get the battery Voltage
                 int sensorValue = analogRead(BATTERY_SENSE_PIN);
                 #ifdef 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
                 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
                   gw.sendBatteryLevel(batteryPcnt);
                   oldBatteryPcnt = batteryPcnt;
                 } 
                // Check if the first switch state has changed
                debouncer1.update();
                // Get the update value
                int value = debouncer1.read();
               
                if (value != oldValue1) {
                   // Send in the new value
                   gw.send(msg1.set(value==HIGH ? 1 : 0));
              //     gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
              //     gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
                   oldValue1 = value;
                }
                
                // Check if the 2nd switch state has changed
                debouncer2.update();
                // Get the update value
                value = debouncer2.read(); // no need to redeclare it (I removed int)
               
                if (value != oldValue2) {
                   // Send in the new value
              //     gw.send(msg1.set(value==HIGH ? 1 : 0));
                     gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
              //     gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
                   oldValue2 = value;
                }
                
                // Check if the third switch state has changed
                debouncer3.update();
                // Get the update value
                value = debouncer3.read(); // no need to redeclare it (I removed int)
               
                if (value != oldValue3) {
                   // Send in the new value
              //     gw.send(msg1.set(value==HIGH ? 1 : 0));
              //     gw.send(msg2.set(value==HIGH ? 1 : 0)); // this is where you turn the second switch in your controller
                   gw.send(msg3.set(value==HIGH ? 1 : 0));  // this is where you turn the third switch in your controller
                   oldValue3 = value;
                }
                 // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
                gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
              } ```
              M Offline
              M Offline
              m26872
              Hardware Contributor
              wrote on last edited by m26872
              #6

              @insomnia
              Have you seen the basic MySensors example BinarySwitchSleepSensor ?

              (Personally I use a longer button settle delay though.)

              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


              19

              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