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. Binary / Temp sensor help - sleep time

Binary / Temp sensor help - sleep time

Scheduled Pinned Locked Moved Development
temperaturesleep timebinary
3 Posts 2 Posters 2.9k Views 1 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.
  • N Offline
    N Offline
    niccodemi
    wrote on last edited by
    #1

    I combined temp and binary (2x) sketches.
    All works ok if I remove "sleep time" but in this case I get flooded with temperature sensor data.
    If "sleep time" is used then binary switches don't change states.

    How to amend sketch to send temp to gw at certain interval ie 30 seconds?

         // 2x binary switch + dallas temp example 
         // Connect button or door/window reed switch between 
         // digitial I/O pin 4,5 (BUTTON_PIN_4/BUTTON_PIN_5 below) and GND.
        // Connect dallas temp sensor to digital pin 3
    
    #include <MySensor.h>
    #include <SPI.h>
    #include <Bounce2.h>
    #include <DallasTemperature.h>
    #include <OneWire.h>
    
    #define CHILD_ID_4 4
    #define CHILD_ID_5 5
    #define BUTTON_PIN_4  4  // Arduino Digital I/O pin for button/reed switch
    #define BUTTON_PIN_5  5  // Arduino Digital I/O pin for button/reed switch
    #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
    #define MAX_ATTACHED_DS18B20 16
    unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    MySensor gw;
    Bounce debouncer = Bounce(); 
    Bounce debouncer_2 = Bounce();
    int oldValue=-1;
    int oldValue_2 =-1;
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors=0;
    boolean receivedConfig = false;
    boolean metric = true; 
    // Initialize temperature message
    MyMessage msg(0,V_TEMP);
    
    // Change to V_LIGHT if you use S_LIGHT in presentation below
    MyMessage msg4(CHILD_ID_4,V_TRIPPED);
    MyMessage msg5(CHILD_ID_5,V_TRIPPED);
    
    void setup()  
    {  
      // Startup OneWire 
      sensors.begin();
      // Startup and initialize MySensors library. Set callback for incoming messages. 
      gw.begin();
      
      // Send the Sketch Version Information to the Gateway
      gw.sendSketchInfo("Door/Temp", "1.0");
      
      // Fetch the number of attached temperature sensors  
      numSensors = sensors.getDeviceCount();
    
      // Present all sensors to controller
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
         gw.present(i, S_TEMP);
      }
    
     // Setup the button
      pinMode(BUTTON_PIN_4,INPUT);
      pinMode(BUTTON_PIN_5,INPUT);
      // Activate internal pull-up
      digitalWrite(BUTTON_PIN_4,HIGH);
      digitalWrite(BUTTON_PIN_5,HIGH);
      
      // After setting up the button, setup debouncer
      debouncer.attach(BUTTON_PIN_4);
      debouncer.interval(5);
      debouncer_2.attach(BUTTON_PIN_5);
      debouncer_2.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_ID_4, S_DOOR);  
      gw.present(CHILD_ID_5, S_DOOR);  
    }
    
    
    //  Check if digital input has changed and send in new value
    void loop() 
    {
      debouncer.update();
      // Get the update value
      int value = debouncer.read();
     
      if (value != oldValue) {
         // Send in the new value
         gw.send(msg4.set(value==HIGH ? 1 : 0));
         oldValue = value;
      }
      debouncer_2.update();
      // Get the update value
      int value_2 = debouncer_2.read();
     
      if (value_2 != oldValue_2) {
         // Send in the new value
         gw.send(msg5.set(value_2==HIGH ? 1 : 0));
         oldValue_2 = value_2;
      }
     // Process incoming messages (like config from server)
      gw.process(); 
    
      // Fetch temperatures from Dallas sensors
      sensors.requestTemperatures(); 
    
      // Read temperatures and send them to controller 
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
     
        // Fetch and round temperature to one decimal
        float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
     
        // Only send data if temperature has changed and no error
        if (lastTemperature[i] != temperature && temperature != -127.00) {
     
          // Send in the new temperature
          gw.send(msg.setSensor(i).set(temperature,1));
          lastTemperature[i]=temperature;
        }
      }
      gw.sleep(SLEEP_TIME);
    } 
    
    BulldogLowellB 1 Reply Last reply
    0
    • N niccodemi

      I combined temp and binary (2x) sketches.
      All works ok if I remove "sleep time" but in this case I get flooded with temperature sensor data.
      If "sleep time" is used then binary switches don't change states.

      How to amend sketch to send temp to gw at certain interval ie 30 seconds?

           // 2x binary switch + dallas temp example 
           // Connect button or door/window reed switch between 
           // digitial I/O pin 4,5 (BUTTON_PIN_4/BUTTON_PIN_5 below) and GND.
          // Connect dallas temp sensor to digital pin 3
      
      #include <MySensor.h>
      #include <SPI.h>
      #include <Bounce2.h>
      #include <DallasTemperature.h>
      #include <OneWire.h>
      
      #define CHILD_ID_4 4
      #define CHILD_ID_5 5
      #define BUTTON_PIN_4  4  // Arduino Digital I/O pin for button/reed switch
      #define BUTTON_PIN_5  5  // Arduino Digital I/O pin for button/reed switch
      #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
      #define MAX_ATTACHED_DS18B20 16
      unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
      OneWire oneWire(ONE_WIRE_BUS);
      DallasTemperature sensors(&oneWire);
      MySensor gw;
      Bounce debouncer = Bounce(); 
      Bounce debouncer_2 = Bounce();
      int oldValue=-1;
      int oldValue_2 =-1;
      float lastTemperature[MAX_ATTACHED_DS18B20];
      int numSensors=0;
      boolean receivedConfig = false;
      boolean metric = true; 
      // Initialize temperature message
      MyMessage msg(0,V_TEMP);
      
      // Change to V_LIGHT if you use S_LIGHT in presentation below
      MyMessage msg4(CHILD_ID_4,V_TRIPPED);
      MyMessage msg5(CHILD_ID_5,V_TRIPPED);
      
      void setup()  
      {  
        // Startup OneWire 
        sensors.begin();
        // Startup and initialize MySensors library. Set callback for incoming messages. 
        gw.begin();
        
        // Send the Sketch Version Information to the Gateway
        gw.sendSketchInfo("Door/Temp", "1.0");
        
        // Fetch the number of attached temperature sensors  
        numSensors = sensors.getDeviceCount();
      
        // Present all sensors to controller
        for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
           gw.present(i, S_TEMP);
        }
      
       // Setup the button
        pinMode(BUTTON_PIN_4,INPUT);
        pinMode(BUTTON_PIN_5,INPUT);
        // Activate internal pull-up
        digitalWrite(BUTTON_PIN_4,HIGH);
        digitalWrite(BUTTON_PIN_5,HIGH);
        
        // After setting up the button, setup debouncer
        debouncer.attach(BUTTON_PIN_4);
        debouncer.interval(5);
        debouncer_2.attach(BUTTON_PIN_5);
        debouncer_2.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_ID_4, S_DOOR);  
        gw.present(CHILD_ID_5, S_DOOR);  
      }
      
      
      //  Check if digital input has changed and send in new value
      void loop() 
      {
        debouncer.update();
        // Get the update value
        int value = debouncer.read();
       
        if (value != oldValue) {
           // Send in the new value
           gw.send(msg4.set(value==HIGH ? 1 : 0));
           oldValue = value;
        }
        debouncer_2.update();
        // Get the update value
        int value_2 = debouncer_2.read();
       
        if (value_2 != oldValue_2) {
           // Send in the new value
           gw.send(msg5.set(value_2==HIGH ? 1 : 0));
           oldValue_2 = value_2;
        }
       // Process incoming messages (like config from server)
        gw.process(); 
      
        // Fetch temperatures from Dallas sensors
        sensors.requestTemperatures(); 
      
        // Read temperatures and send them to controller 
        for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
       
          // Fetch and round temperature to one decimal
          float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
       
          // Only send data if temperature has changed and no error
          if (lastTemperature[i] != temperature && temperature != -127.00) {
       
            // Send in the new temperature
            gw.send(msg.setSensor(i).set(temperature,1));
            lastTemperature[i]=temperature;
          }
        }
        gw.sleep(SLEEP_TIME);
      } 
      
      BulldogLowellB Offline
      BulldogLowellB Offline
      BulldogLowell
      Contest Winner
      wrote on last edited by
      #2

      @niccodemi

      you can try this way... untested but it compiles:

      // 2x binary switch + dallas temp example 
      // Connect button or door/window reed switch between 
      // digitial I/O pin 4,5 (BUTTON_PIN_4/BUTTON_PIN_5 below) and GND.
      // Connect dallas temp sensor to digital pin 3
      
      #include <MySensor.h>
      #include <SPI.h>
      #include <Bounce2.h>
      #include <DallasTemperature.h>
      #include <OneWire.h>
      //
      #define CHILD_ID_4 4
      #define CHILD_ID_5 5
      #define BUTTON_PIN_4  4  // Arduino Digital I/O pin for button/reed switch
      #define BUTTON_PIN_5  5  // Arduino Digital I/O pin for button/reed switch
      #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
      #define MAX_ATTACHED_DS18B20 16
      //
      //unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
      OneWire oneWire(ONE_WIRE_BUS);
      DallasTemperature sensors(&oneWire);
      MySensor gw;
      Bounce debouncer = Bounce(); 
      Bounce debouncer_2 = Bounce();
      int oldValue=-1;
      int oldValue_2 =-1;
      float lastTemperature[MAX_ATTACHED_DS18B20];
      int numSensors=0;
      boolean receivedConfig = false;
      boolean metric = true; 
      //
      MyMessage msg(0,V_TEMP);
      MyMessage msg4(CHILD_ID_4,V_TRIPPED);
      MyMessage msg5(CHILD_ID_5,V_TRIPPED);
      //
      void setup()  
      {  
        sensors.begin();
        gw.begin();
        gw.sendSketchInfo("Door/Temp", "1.0");
        numSensors = sensors.getDeviceCount();
        for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) 
        {   
          gw.present(i, S_TEMP);
        }
        pinMode(BUTTON_PIN_4,INPUT);
        pinMode(BUTTON_PIN_5,INPUT);
        // Activate internal pull-up
        digitalWrite(BUTTON_PIN_4,HIGH);
        digitalWrite(BUTTON_PIN_5,HIGH);
        //
        debouncer.attach(BUTTON_PIN_4);
        debouncer.interval(5);
        debouncer_2.attach(BUTTON_PIN_5);
        debouncer_2.interval(5);
      
        gw.present(CHILD_ID_4, S_DOOR);  
        gw.present(CHILD_ID_5, S_DOOR);  
      }
      //
      void loop() 
      {
        debouncer.update();
        int value = debouncer.read();
        if (value != oldValue) 
        {
          gw.send(msg4.set(value==HIGH ? 1 : 0));
          oldValue = value;
        }
        debouncer_2.update();
        int value_2 = debouncer_2.read();
        if (value_2 != oldValue_2) 
        {
          gw.send(msg5.set(value_2==HIGH ? 1 : 0));
          oldValue_2 = value_2;
        }
        gw.process(); 
        updateTemperature(30);// update time in seconds
        //gw.sleep(SLEEP_TIME);
      }
      
      void updateTemperature(int frequency)
      {
        static unsigned long lastUpdateTime;
        if (millis() - lastUpdateTime >= frequency * 1000UL)
        {
          sensors.requestTemperatures(); 
          for (int i=0; i<numSensors && i< MAX_ATTACHED_DS18B20; i++) 
          {
            float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
            if (lastTemperature[i] != temperature && temperature != -127.00) 
            {
              gw.send(msg.setSensor(i).set(temperature,1));
              lastTemperature[i]=temperature;
            }
          }
          lastUpdateTime += frequency * 1000UL;
        }
      }
      
      N 1 Reply Last reply
      0
      • BulldogLowellB BulldogLowell

        @niccodemi

        you can try this way... untested but it compiles:

        // 2x binary switch + dallas temp example 
        // Connect button or door/window reed switch between 
        // digitial I/O pin 4,5 (BUTTON_PIN_4/BUTTON_PIN_5 below) and GND.
        // Connect dallas temp sensor to digital pin 3
        
        #include <MySensor.h>
        #include <SPI.h>
        #include <Bounce2.h>
        #include <DallasTemperature.h>
        #include <OneWire.h>
        //
        #define CHILD_ID_4 4
        #define CHILD_ID_5 5
        #define BUTTON_PIN_4  4  // Arduino Digital I/O pin for button/reed switch
        #define BUTTON_PIN_5  5  // Arduino Digital I/O pin for button/reed switch
        #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
        #define MAX_ATTACHED_DS18B20 16
        //
        //unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
        OneWire oneWire(ONE_WIRE_BUS);
        DallasTemperature sensors(&oneWire);
        MySensor gw;
        Bounce debouncer = Bounce(); 
        Bounce debouncer_2 = Bounce();
        int oldValue=-1;
        int oldValue_2 =-1;
        float lastTemperature[MAX_ATTACHED_DS18B20];
        int numSensors=0;
        boolean receivedConfig = false;
        boolean metric = true; 
        //
        MyMessage msg(0,V_TEMP);
        MyMessage msg4(CHILD_ID_4,V_TRIPPED);
        MyMessage msg5(CHILD_ID_5,V_TRIPPED);
        //
        void setup()  
        {  
          sensors.begin();
          gw.begin();
          gw.sendSketchInfo("Door/Temp", "1.0");
          numSensors = sensors.getDeviceCount();
          for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) 
          {   
            gw.present(i, S_TEMP);
          }
          pinMode(BUTTON_PIN_4,INPUT);
          pinMode(BUTTON_PIN_5,INPUT);
          // Activate internal pull-up
          digitalWrite(BUTTON_PIN_4,HIGH);
          digitalWrite(BUTTON_PIN_5,HIGH);
          //
          debouncer.attach(BUTTON_PIN_4);
          debouncer.interval(5);
          debouncer_2.attach(BUTTON_PIN_5);
          debouncer_2.interval(5);
        
          gw.present(CHILD_ID_4, S_DOOR);  
          gw.present(CHILD_ID_5, S_DOOR);  
        }
        //
        void loop() 
        {
          debouncer.update();
          int value = debouncer.read();
          if (value != oldValue) 
          {
            gw.send(msg4.set(value==HIGH ? 1 : 0));
            oldValue = value;
          }
          debouncer_2.update();
          int value_2 = debouncer_2.read();
          if (value_2 != oldValue_2) 
          {
            gw.send(msg5.set(value_2==HIGH ? 1 : 0));
            oldValue_2 = value_2;
          }
          gw.process(); 
          updateTemperature(30);// update time in seconds
          //gw.sleep(SLEEP_TIME);
        }
        
        void updateTemperature(int frequency)
        {
          static unsigned long lastUpdateTime;
          if (millis() - lastUpdateTime >= frequency * 1000UL)
          {
            sensors.requestTemperatures(); 
            for (int i=0; i<numSensors && i< MAX_ATTACHED_DS18B20; i++) 
            {
              float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
              if (lastTemperature[i] != temperature && temperature != -127.00) 
              {
                gw.send(msg.setSensor(i).set(temperature,1));
                lastTemperature[i]=temperature;
              }
            }
            lastUpdateTime += frequency * 1000UL;
          }
        }
        
        N Offline
        N Offline
        niccodemi
        wrote on last edited by
        #3

        @BulldogLowell thank you, I uploaded it and so far it works fine.

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


        18

        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