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. Development
  3. Can I have multiple sleep/interrupt events in the one sketch?

Can I have multiple sleep/interrupt events in the one sketch?

Scheduled Pinned Locked Moved Development
3 Posts 2 Posters 1.5k 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.
  • G Offline
    G Offline
    gadgetman
    wrote on last edited by gadgetman
    #1

    I have a prototype battery relay node working, where using smart sleep I am able to turn on a relay (currently just a connected LED) and off from the controller, with a lag in actuation equal to the smart sleep duration.

    What I would now like to do is to introduce a secondary function where the node is able to turn the relay off after a preset period if no off command is received from the controller. Is this possible by introducing another sleep timer? If so how could I do this (as opposed to having a controller rule send the off command).

    Here's my quick and dirty test sketch - hacked from the relay node example.

    // Enable debug prints to serial monitor
    #define MY_DEBUG
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    #define MY_RF24_PA_LEVEL RF24_PA_LOW
    
    // Enable repeater functionality for this node
    // #define MY_REPEATER_FEATURE
    
    #include <MySensors.h>
    #define MY_SMART_SLEEP_WAIT_DURATION_MS 1000
    
    
    //#define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #define LEDpin 5
    
    //#define NUMBER_OF_RELAYS 1 // Total number of attached relays
    //#define RELAY_ON 1  // GPIO value to write to turn on attached relay
    #define LED_ON 1
    
    //#define RELAY_OFF 0 // GPIO value to write to turn off attached relay
    #define LED_OFF 0
    
    #define VMIN 1.9 // Battery monitor lower level. Vmin_radio=1.9V
    #define VMAX 3.0 // " " " high level. Vmin<Vmax<=3.44
    int BATTERY_SENSE_PIN = A1;  // select the input pin for the battery sense point
    int oldBatteryPcnt = 0;
    
    // Sleep time between sensor updates (in milliseconds)
    static const uint64_t UPDATE_INTERVAL = 60000;
    
    #define child 1
    
    void before()
    {
        //for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Then set relay pins in output mode
        pinMode(LEDpin, OUTPUT);
        // Set relay to last known state (using eeprom storage)
        digitalWrite(LEDpin, loadState(LEDpin)?LED_ON:LED_OFF);
      }
    //}
    
    
    void setup()
    {
       analogReference(INTERNAL);     // use the 1.1 V internal reference for battery level measuring
    
    }
    
    
    void presentation()
    {
         // Send the sketch version information to the gateway and Controller
         sendSketchInfo("Relay", "1.0");
    
         //  for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
         // Register all sensors to gw (they will be created as child devices)
         present(child, S_BINARY);
      }
    //}
    
    void loop()
    {
    // 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
    
    
        float batteryV  = sensorValue * 0.003347095;
        int batteryPcnt = static_cast<int>(((batteryV-VMIN)/(VMAX-VMIN))*100); 
    
    #ifdef MY_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);
            oldBatteryPcnt = batteryPcnt;
        }
    
      // Sleep for a while to save energy (using martsleep)
    smartSleep(UPDATE_INTERVAL); 
      }
    
    void receive(const MyMessage &message)
    {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.type==V_STATUS) {
        // Change relay state
        digitalWrite(LEDpin, message.getBool()?LED_ON:LED_OFF);
        // Store state in eeprom
        saveState(LEDpin, message.getBool());
        // Write some debug info
        Serial.print("Incoming change for sensor:");
        Serial.print(message.sensor);
        Serial.print(", New status: ");
        Serial.println(message.getBool());
      }
    }
    
    1 Reply Last reply
    0
    • gohanG Offline
      gohanG Offline
      gohan
      Mod
      wrote on last edited by
      #2

      you could count how many times you have ran the loop, if your turn off time is a multiple of sleeptime, when you receive a switch on command you just reset the counter.

      G 1 Reply Last reply
      2
      • gohanG gohan

        you could count how many times you have ran the loop, if your turn off time is a multiple of sleeptime, when you receive a switch on command you just reset the counter.

        G Offline
        G Offline
        gadgetman
        wrote on last edited by
        #3

        @gohan Lol you're absolutely right! I should have thought of that earlier - thanks!

        1 Reply Last reply
        1

        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


        8

        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