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. Combining relay and temperature sketch

Combining relay and temperature sketch

Scheduled Pinned Locked Moved Troubleshooting
76 Posts 9 Posters 14.2k Views 12 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.
  • B bluezr1

    @rejoe2 said in Combining relay and temperature sketch:

    Thanks Newzwaver

    You wouldn't happen to have a sketch with the DS18B20? I have both DHTs and DS18B20s but plan on using this to turn on and off a fan to keep my AV equipment cool. So I'm not that concerned about humidity although it wouldn't be deal breaker if it did.

    Thanks,

    rejoe2R Offline
    rejoe2R Offline
    rejoe2
    wrote on last edited by
    #45

    @bluezr1 Sure... But imo it is easier to stick with the given examples, they may be much easier to understand than e.g. this one:grin:

    Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

    sinczeS 1 Reply Last reply
    0
    • rejoe2R rejoe2

      @bluezr1 Sure... But imo it is easier to stick with the given examples, they may be much easier to understand than e.g. this one:grin:

      sinczeS Offline
      sinczeS Offline
      sincze
      MySensors Evangelist
      wrote on last edited by
      #46

      @rejoe2 NIce example thanks.

      rejoe2R sinczeS 2 Replies Last reply
      0
      • sinczeS sincze

        @rejoe2 NIce example thanks.

        rejoe2R Offline
        rejoe2R Offline
        rejoe2
        wrote on last edited by
        #47

        @sincze Thanks too.
        Just to mention: I don't use the internal functionality for the servo any more - this part didn't work to my personal satisfaction.
        If you're interested: The RS485 variant in the repo is even more complex - it uses three Pins for 1wire with different timings, but may require some tweeks in the libs to compile.

        Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

        1 Reply Last reply
        0
        • B Offline
          B Offline
          bluezr1
          wrote on last edited by bluezr1
          #48

          Thank you so much Newzwaver. I've been trying to combine two sketches together and this is my first successful one. I may never be as good as most of the people on this forum, although I don't plan on stopping with combining more than one sensor to one node -- need to get rid of my double nodes I have in various places. :)

          When I ran your sketch and the relays didn't show up in vera. So after I copied and pasted from the relay sketch posted by hek under void presentation, I ended up with errors. So after comparing the two (yours to hek's) I ended up with this that seems to be working.

          As of right now I'm looking into what rejoe2 said about using wait instead of sleep, unless I'll be fine with what I have?

          /**
           * The MySensors Arduino library handles the wireless radio link and protocol
           * between your home built sensors/actuators and HA controller of choice.
           * The sensors forms a self healing radio network with optional repeaters. Each
           * repeater and gateway builds a routing tables in EEPROM which keeps track of the
           * network topology allowing messages to be routed to nodes.
           *
           * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
           * Copyright (C) 2013-2015 Sensnology AB
           * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
           *
           * Documentation: http://www.mysensors.org
           * Support Forum: http://forum.mysensors.org
           *
           * This program is free software; you can redistribute it and/or
           * modify it under the terms of the GNU General Public License
           * version 2 as published by the Free Software Foundation.
           *
           *******************************
           *
           * REVISION HISTORY
           * Version 1.0: Henrik EKblad
           * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
           * 
           * DESCRIPTION
           * This sketch provides an example of how to implement a humidity/temperature
           * sensor using a DHT11/DHT-22.
           *  
           * For more information, please visit:
           * http://www.mysensors.org/build/humidity
           * 
           */
          
          // Enable debug prints
          #define MY_DEBUG
          
          // Enable and select radio type attached 
          #define MY_RADIO_NRF24
          //#define MY_RADIO_RFM69
          //#define MY_RS485
          
          // Enable repeater functionality for this node
          //#define MY_REPEATER_FEATURE
          
          #define MY_NODE_ID 10
          #include <SPI.h>
          #include <MySensors.h>  
          #include <DHT.h>
          
            
          // Set this to the pin you connected the DHT's data pin to
          #define DHT_DATA_PIN 3
          
          //#define RELAY1_PIN  4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
          //#define RELAY2_PIN  5  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
          
          #define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
          #define NUMBER_OF_RELAYS 2 // Total number of attached relays
          #define RELAY_ON 1  // GPIO value to write to turn on attached relay
          #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
          
          // Set this offset if the sensor has a permanent small offset to the real temperatures
          #define SENSOR_TEMP_OFFSET 0
          
          // Sleep time between sensor updates (in milliseconds)
          // Must be >1000ms for DHT22 and >2000ms for DHT11
          static const uint64_t UPDATE_INTERVAL = 1000;
          
          // Force sending an update of the temperature after n sensor reads, so a controller showing the
          // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
          // the value didn't change since;
          // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
          static const uint8_t FORCE_UPDATE_N_READS = 10;
          
          #define CHILD_ID_HUM 28
          #define CHILD_ID_TEMP 30
          
          float lastTemp;
          float lastHum;
          uint8_t nNoUpdatesTemp;
          uint8_t nNoUpdatesHum;
          bool metric = true;
          
          MyMessage msgHum(CHILD_ID_HUM, V_HUM);
          MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
          DHT dht;
          void before()
          {
              for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                  // Then set relay pins in output mode
                  pinMode(pin, OUTPUT);
                  // Set relay to last known state (using eeprom storage)
                  digitalWrite(pin, loadState(sensor)?RELAY_OFF:RELAY_ON);
              }
          }
          
          void presentation()  
          { 
            // Send the sketch version information to the gateway
            sendSketchInfo("AVCABRelayTempAndHumidity", "1.1");
          
            // Register all sensors to gw (they will be created as child devices)
            present(CHILD_ID_HUM, S_HUM);
            present(CHILD_ID_TEMP, S_TEMP);
            
              for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                  // Register all sensors to gw (they will be created as child devices)
                  present(sensor, S_BINARY);
              }
          
            metric = getControllerConfig().isMetric;
          }
          
          
          void setup()
          {
            dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
            if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
              Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
            }
            // Sleep for the time of the minimum sampling period to give the sensor time to power up
            // (otherwise, timeout errors might occure for the first reading)
            sleep(dht.getMinimumSamplingPeriod());
          }
          
          void loop()      
          {
            // Force reading sensor, so it works also after sleep()
            dht.readSensor(true);
          
            // Get temperature from DHT library
            float temperature = dht.getTemperature();
            if (isnan(temperature)) {
              Serial.println("Failed reading temperature from DHT!");
            } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
              // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
              lastTemp = temperature;
              if (!metric) {
                temperature = dht.toFahrenheit(temperature);
              }
              // Reset no updates counter
              nNoUpdatesTemp = 0;
              temperature += SENSOR_TEMP_OFFSET;
              send(msgTemp.set(temperature, 1));
          
              #ifdef MY_DEBUG
              Serial.print("T: ");
              Serial.println(temperature);
              #endif
            } else {
              // Increase no update counter if the temperature stayed the same
              nNoUpdatesTemp++;
            }
          
            // Get humidity from DHT library
            float humidity = dht.getHumidity();
            if (isnan(humidity)) {
              Serial.println("Failed reading humidity from DHT");
            } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
              // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
              lastHum = humidity;
              // Reset no updates counter
              nNoUpdatesHum = 0;
              send(msgHum.set(humidity, 1));
          
              #ifdef MY_DEBUG
              Serial.print("H: ");
              Serial.println(humidity);
              #endif
            } else {
              // Increase no update counter if the humidity stayed the same
              nNoUpdatesHum++;
            }
          
            // Sleep for a while to save energy
            sleep(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(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_OFF:RELAY_ON);
                  // Store state in eeprom
                  saveState(message.sensor, message.getBool());
                  // Write some debug info
                  Serial.print("Incoming change for sensor:");
                  Serial.print(message.sensor);
                  Serial.print(", New status: ");
                  Serial.println(message.getBool());
              }
          }```
          rejoe2R 1 Reply Last reply
          0
          • B bluezr1

            Thank you so much Newzwaver. I've been trying to combine two sketches together and this is my first successful one. I may never be as good as most of the people on this forum, although I don't plan on stopping with combining more than one sensor to one node -- need to get rid of my double nodes I have in various places. :)

            When I ran your sketch and the relays didn't show up in vera. So after I copied and pasted from the relay sketch posted by hek under void presentation, I ended up with errors. So after comparing the two (yours to hek's) I ended up with this that seems to be working.

            As of right now I'm looking into what rejoe2 said about using wait instead of sleep, unless I'll be fine with what I have?

            /**
             * The MySensors Arduino library handles the wireless radio link and protocol
             * between your home built sensors/actuators and HA controller of choice.
             * The sensors forms a self healing radio network with optional repeaters. Each
             * repeater and gateway builds a routing tables in EEPROM which keeps track of the
             * network topology allowing messages to be routed to nodes.
             *
             * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
             * Copyright (C) 2013-2015 Sensnology AB
             * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
             *
             * Documentation: http://www.mysensors.org
             * Support Forum: http://forum.mysensors.org
             *
             * This program is free software; you can redistribute it and/or
             * modify it under the terms of the GNU General Public License
             * version 2 as published by the Free Software Foundation.
             *
             *******************************
             *
             * REVISION HISTORY
             * Version 1.0: Henrik EKblad
             * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
             * 
             * DESCRIPTION
             * This sketch provides an example of how to implement a humidity/temperature
             * sensor using a DHT11/DHT-22.
             *  
             * For more information, please visit:
             * http://www.mysensors.org/build/humidity
             * 
             */
            
            // Enable debug prints
            #define MY_DEBUG
            
            // Enable and select radio type attached 
            #define MY_RADIO_NRF24
            //#define MY_RADIO_RFM69
            //#define MY_RS485
            
            // Enable repeater functionality for this node
            //#define MY_REPEATER_FEATURE
            
            #define MY_NODE_ID 10
            #include <SPI.h>
            #include <MySensors.h>  
            #include <DHT.h>
            
              
            // Set this to the pin you connected the DHT's data pin to
            #define DHT_DATA_PIN 3
            
            //#define RELAY1_PIN  4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
            //#define RELAY2_PIN  5  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
            
            #define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
            #define NUMBER_OF_RELAYS 2 // Total number of attached relays
            #define RELAY_ON 1  // GPIO value to write to turn on attached relay
            #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
            
            // Set this offset if the sensor has a permanent small offset to the real temperatures
            #define SENSOR_TEMP_OFFSET 0
            
            // Sleep time between sensor updates (in milliseconds)
            // Must be >1000ms for DHT22 and >2000ms for DHT11
            static const uint64_t UPDATE_INTERVAL = 1000;
            
            // Force sending an update of the temperature after n sensor reads, so a controller showing the
            // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
            // the value didn't change since;
            // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
            static const uint8_t FORCE_UPDATE_N_READS = 10;
            
            #define CHILD_ID_HUM 28
            #define CHILD_ID_TEMP 30
            
            float lastTemp;
            float lastHum;
            uint8_t nNoUpdatesTemp;
            uint8_t nNoUpdatesHum;
            bool metric = true;
            
            MyMessage msgHum(CHILD_ID_HUM, V_HUM);
            MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
            DHT dht;
            void before()
            {
                for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                    // Then set relay pins in output mode
                    pinMode(pin, OUTPUT);
                    // Set relay to last known state (using eeprom storage)
                    digitalWrite(pin, loadState(sensor)?RELAY_OFF:RELAY_ON);
                }
            }
            
            void presentation()  
            { 
              // Send the sketch version information to the gateway
              sendSketchInfo("AVCABRelayTempAndHumidity", "1.1");
            
              // Register all sensors to gw (they will be created as child devices)
              present(CHILD_ID_HUM, S_HUM);
              present(CHILD_ID_TEMP, S_TEMP);
              
                for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                    // Register all sensors to gw (they will be created as child devices)
                    present(sensor, S_BINARY);
                }
            
              metric = getControllerConfig().isMetric;
            }
            
            
            void setup()
            {
              dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
              if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
              }
              // Sleep for the time of the minimum sampling period to give the sensor time to power up
              // (otherwise, timeout errors might occure for the first reading)
              sleep(dht.getMinimumSamplingPeriod());
            }
            
            void loop()      
            {
              // Force reading sensor, so it works also after sleep()
              dht.readSensor(true);
            
              // Get temperature from DHT library
              float temperature = dht.getTemperature();
              if (isnan(temperature)) {
                Serial.println("Failed reading temperature from DHT!");
              } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                lastTemp = temperature;
                if (!metric) {
                  temperature = dht.toFahrenheit(temperature);
                }
                // Reset no updates counter
                nNoUpdatesTemp = 0;
                temperature += SENSOR_TEMP_OFFSET;
                send(msgTemp.set(temperature, 1));
            
                #ifdef MY_DEBUG
                Serial.print("T: ");
                Serial.println(temperature);
                #endif
              } else {
                // Increase no update counter if the temperature stayed the same
                nNoUpdatesTemp++;
              }
            
              // Get humidity from DHT library
              float humidity = dht.getHumidity();
              if (isnan(humidity)) {
                Serial.println("Failed reading humidity from DHT");
              } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                lastHum = humidity;
                // Reset no updates counter
                nNoUpdatesHum = 0;
                send(msgHum.set(humidity, 1));
            
                #ifdef MY_DEBUG
                Serial.print("H: ");
                Serial.println(humidity);
                #endif
              } else {
                // Increase no update counter if the humidity stayed the same
                nNoUpdatesHum++;
              }
            
              // Sleep for a while to save energy
              sleep(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(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_OFF:RELAY_ON);
                    // Store state in eeprom
                    saveState(message.sensor, message.getBool());
                    // Write some debug info
                    Serial.print("Incoming change for sensor:");
                    Serial.print(message.sensor);
                    Serial.print(", New status: ");
                    Serial.println(message.getBool());
                }
            }```
            rejoe2R Offline
            rejoe2R Offline
            rejoe2
            wrote on last edited by
            #49

            @bluezr1 Great to hear about you having first positive results.

            Nevertheless, imo the sketch you posted is designed against some basic principles.

            First: all main functions should be placed in the loop() section (not present in this sketch). The posted sketch does all the measurements within an exceptional routine called receive(). This should be reserved for all functionality that really is related to receive any info from controller side - obviously doing measurements does not belong to that category.

            I also started as complete noob to coding around 30 months ago and just followed the examples (mostly from Build section), so be assured: you will also learn how to do this just by following these examples and ask yourself why things are solved the way they are.

            If you need a good example of a combined sketch, have a look at the atmospheric pressure one (or the DHT (humidity?) sketch you have used here): They already have two children... From the BME180-Preassure you may follow the route to the BME280 examples available in the forum here or in my repo (#98, RS485).

            Btw: In the header section of your sketch there are also two defines left not necessary (just as a info, this does not cause any trouble for the moment).

            Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

            B 1 Reply Last reply
            1
            • sinczeS sincze

              @rejoe2 NIce example thanks.

              sinczeS Offline
              sinczeS Offline
              sincze
              MySensors Evangelist
              wrote on last edited by
              #50

              haha combining sketches... frees up some hardware ;-) for other stuff.

              0_1512839095158_WhatsApp Image 2017-12-09 at 18.04.14.jpeg

              rejoe2R 1 Reply Last reply
              0
              • rejoe2R rejoe2

                @bluezr1 Great to hear about you having first positive results.

                Nevertheless, imo the sketch you posted is designed against some basic principles.

                First: all main functions should be placed in the loop() section (not present in this sketch). The posted sketch does all the measurements within an exceptional routine called receive(). This should be reserved for all functionality that really is related to receive any info from controller side - obviously doing measurements does not belong to that category.

                I also started as complete noob to coding around 30 months ago and just followed the examples (mostly from Build section), so be assured: you will also learn how to do this just by following these examples and ask yourself why things are solved the way they are.

                If you need a good example of a combined sketch, have a look at the atmospheric pressure one (or the DHT (humidity?) sketch you have used here): They already have two children... From the BME180-Preassure you may follow the route to the BME280 examples available in the forum here or in my repo (#98, RS485).

                Btw: In the header section of your sketch there are also two defines left not necessary (just as a info, this does not cause any trouble for the moment).

                B Offline
                B Offline
                bluezr1
                wrote on last edited by
                #51

                @rejoe2 I listened to what you said and then went back over it, it's working much better now. What you said "why things are solved the way they are" made me stand back for a moment. I do Maintenance for a living and work on everything from HVAC, boilers, Kitchen equipment to hanging drywall. There's always one thing I always tell myself when troubleshooting something, what's the sequence of operation. Well I'm not to savvy with writing code although the same principles applies. Maybe I just needed someone to tell me that, I don't know.

                Anyways, thank you

                I updated the sketch I posted in my last post with the changes I made.

                1 Reply Last reply
                0
                • sinczeS sincze

                  haha combining sketches... frees up some hardware ;-) for other stuff.

                  0_1512839095158_WhatsApp Image 2017-12-09 at 18.04.14.jpeg

                  rejoe2R Offline
                  rejoe2R Offline
                  rejoe2
                  wrote on last edited by
                  #52

                  @sincze Does not only free HW for other stuff, but also makes things easier once they work as expected. I have to admitt this in some cases may need hard work to get to that point.
                  What's the "other stuff" showed on your picture?

                  @bluezr1 Looks like a big step ahead!

                  Imo next step in your code should be to have a look at the remarks I already posted and replace the sleep() by wait(). By now, you have a rather fast update rate of your values, this may not be necessary and also may lead to a early wear-out of your DHT (?):

                  @rejoe2 said in Combining relay and temperature sketch:

                  Imo better aproach:
                  Use the https://www.arduino.cc/en/tutorial/BlinkWithoutDelay - principle. Additionally a wait() is used instead of sleep() for the time to fulfill measurements (DS18B20 in my case).
                  If you need a working implementation of the blink-without-delay function within MySensors, see the https://www.mysensors.org/build/pulse_power example.

                  Please keep in mind changing existent posts like you did may lead to irritation wrt to the remarks in following posts. You may better show the resulting code as an update in your next answer and add a remark wrt. to enhancements in the earlier one.

                  Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

                  B 1 Reply Last reply
                  0
                  • rejoe2R rejoe2

                    @sincze Does not only free HW for other stuff, but also makes things easier once they work as expected. I have to admitt this in some cases may need hard work to get to that point.
                    What's the "other stuff" showed on your picture?

                    @bluezr1 Looks like a big step ahead!

                    Imo next step in your code should be to have a look at the remarks I already posted and replace the sleep() by wait(). By now, you have a rather fast update rate of your values, this may not be necessary and also may lead to a early wear-out of your DHT (?):

                    @rejoe2 said in Combining relay and temperature sketch:

                    Imo better aproach:
                    Use the https://www.arduino.cc/en/tutorial/BlinkWithoutDelay - principle. Additionally a wait() is used instead of sleep() for the time to fulfill measurements (DS18B20 in my case).
                    If you need a working implementation of the blink-without-delay function within MySensors, see the https://www.mysensors.org/build/pulse_power example.

                    Please keep in mind changing existent posts like you did may lead to irritation wrt to the remarks in following posts. You may better show the resulting code as an update in your next answer and add a remark wrt. to enhancements in the earlier one.

                    B Offline
                    B Offline
                    bluezr1
                    wrote on last edited by
                    #53

                    @rejoe2 Just so I know that I’m not heading down the wrong path and wasting everyone’s time, I should be looking into the use of millis correct?

                    rejoe2R 1 Reply Last reply
                    0
                    • B bluezr1

                      @rejoe2 Just so I know that I’m not heading down the wrong path and wasting everyone’s time, I should be looking into the use of millis correct?

                      rejoe2R Offline
                      rejoe2R Offline
                      rejoe2
                      wrote on last edited by
                      #54

                      @bluezr1 Yes, millis() is the right thing to look for (or the simpleTimer2-lib, that internally does the same things). But keep in mind: sleep() and millis() don't fit well together, as after every sleep() millis() will be reset... Use wait() instead of sleep() in case you need short periods eg. between initialising and completion of measurements.

                      Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

                      1 Reply Last reply
                      1
                      • B Offline
                        B Offline
                        bluezr1
                        wrote on last edited by bluezr1
                        #55

                        This is where I'm currently at, it seems to be working really well. Thanks rejoe2

                        /**
                         * The MySensors Arduino library handles the wireless radio link and protocol
                         * between your home built sensors/actuators and HA controller of choice.
                         * The sensors forms a self healing radio network with optional repeaters. Each
                         * repeater and gateway builds a routing tables in EEPROM which keeps track of the
                         * network topology allowing messages to be routed to nodes.
                         *
                         * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
                         * Copyright (C) 2013-2015 Sensnology AB
                         * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
                         *
                         * Documentation: http://www.mysensors.org
                         * Support Forum: http://forum.mysensors.org
                         *
                         * This program is free software; you can redistribute it and/or
                         * modify it under the terms of the GNU General Public License
                         * version 2 as published by the Free Software Foundation.
                         *
                         *******************************
                         *
                         * REVISION HISTORY
                         * Version 1.0: Henrik EKblad
                         * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
                         * 
                         * DESCRIPTION
                         * This sketch provides an example of how to implement a humidity/temperature
                         * sensor using a DHT11/DHT-22.
                         *  
                         * For more information, please visit:
                         * http://www.mysensors.org/build/humidity
                         * 
                         */
                        
                        // Enable debug prints
                        #define MY_DEBUG
                        
                        // Enable and select radio type attached 
                        #define MY_RADIO_NRF24
                        //#define MY_RADIO_RFM69
                        //#define MY_RS485
                        
                        #define MY_NODE_ID 19
                        #include <SPI.h>
                        #include <MySensors.h>  
                        #include <DHT.h>
                        
                        // Set this to the pin you connected the DHT's data pin to
                        #define DHT_DATA_PIN 3
                        
                        // Set this offset if the sensor has a permanent small offset to the real temperatures
                        #define SENSOR_TEMP_OFFSET 0
                        
                        // Sleep time between sensor updates (in milliseconds)
                        // Must be >1000ms for DHT22 and >2000ms for DHT11
                        static const uint64_t UPDATE_INTERVAL = 60000;
                        
                        // Force sending an update of the temperature after n sensor reads, so a controller showing the
                        // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
                        // the value didn't change since;
                        // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
                        static const uint8_t FORCE_UPDATE_N_READS = 10;
                        
                        #define CHILD_ID_HUM 10
                        #define CHILD_ID_TEMP 11
                        
                        float lastTemp;
                        float lastHum;
                        uint8_t nNoUpdatesTemp;
                        uint8_t nNoUpdatesHum;
                        bool metric = true;
                        
                        MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                        MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                        DHT dht;
                        
                        #define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
                        #define NUMBER_OF_RELAYS 2 // Total number of attached relays
                        #define RELAY_ON 1  // GPIO value to write to turn on attached relay
                        #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
                        
                        
                        void before()
                        {
                            for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                                // Then set relay pins in output mode
                                pinMode(pin, OUTPUT);
                                // Set relay to last known state (using eeprom storage)
                                digitalWrite(pin, loadState(sensor)?RELAY_OFF:RELAY_ON);
                            }
                        }
                        
                        void presentation()  
                        { 
                          // Send the sketch version information to the gateway
                          sendSketchInfo("TempRELAY", "1.1");
                        
                          // Register all sensors to gw (they will be created as child devices)
                          present(CHILD_ID_HUM, S_HUM);
                          present(CHILD_ID_TEMP, S_TEMP);
                        
                          metric = getControllerConfig().isMetric;
                        
                          for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                                // Register all sensors to gw (they will be created as child devices)
                                present(sensor, S_BINARY);
                            }
                        }
                        
                        
                        void setup()
                        {
                          dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                          if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                            Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                          }
                          // Sleep for the time of the minimum sampling period to give the sensor time to power up
                          // (otherwise, timeout errors might occure for the first reading)
                          wait(dht.getMinimumSamplingPeriod());
                        }
                        
                        
                        void loop()      
                        {  
                          // Force reading sensor, so it works also after sleep()
                          dht.readSensor(true);
                        
                          // Get temperature from DHT library
                          float temperature = dht.getTemperature();
                          if (isnan(temperature)) {
                            Serial.println("Failed reading temperature from DHT!");
                          } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                            // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                            lastTemp = temperature;
                            if (!metric) {
                              temperature = dht.toFahrenheit(temperature);
                            }
                            // Reset no updates counter
                            nNoUpdatesTemp = 0;
                            temperature += SENSOR_TEMP_OFFSET;
                            send(msgTemp.set(temperature, 1));
                        
                            #ifdef MY_DEBUG
                            Serial.print("T: ");
                            Serial.println(temperature);
                            #endif
                          } else {
                            // Increase no update counter if the temperature stayed the same
                            nNoUpdatesTemp++;
                          }
                        
                          // Get humidity from DHT library
                          float humidity = dht.getHumidity();
                          if (isnan(humidity)) {
                            Serial.println("Failed reading humidity from DHT");
                          } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                            // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                            lastHum = humidity;
                            // Reset no updates counter
                            nNoUpdatesHum = 0;
                            send(msgHum.set(humidity, 1));
                        
                            #ifdef MY_DEBUG
                            Serial.print("H: ");
                            Serial.println(humidity);
                            #endif
                          } else {
                            // Increase no update counter if the humidity stayed the same
                            nNoUpdatesHum++;
                          }
                        
                          // Sleep for a while to save energy
                          wait(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(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_OFF:RELAY_ON);
                                // Store state in eeprom
                                saveState(message.sensor, message.getBool());
                                // Write some debug info
                                Serial.print("Incoming change for sensor:");
                                Serial.print(message.sensor);
                                Serial.print(", New status: ");
                                Serial.println(message.getBool());
                            }
                        }```
                        rejoe2R 1 Reply Last reply
                        0
                        • B bluezr1

                          This is where I'm currently at, it seems to be working really well. Thanks rejoe2

                          /**
                           * The MySensors Arduino library handles the wireless radio link and protocol
                           * between your home built sensors/actuators and HA controller of choice.
                           * The sensors forms a self healing radio network with optional repeaters. Each
                           * repeater and gateway builds a routing tables in EEPROM which keeps track of the
                           * network topology allowing messages to be routed to nodes.
                           *
                           * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
                           * Copyright (C) 2013-2015 Sensnology AB
                           * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
                           *
                           * Documentation: http://www.mysensors.org
                           * Support Forum: http://forum.mysensors.org
                           *
                           * This program is free software; you can redistribute it and/or
                           * modify it under the terms of the GNU General Public License
                           * version 2 as published by the Free Software Foundation.
                           *
                           *******************************
                           *
                           * REVISION HISTORY
                           * Version 1.0: Henrik EKblad
                           * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
                           * 
                           * DESCRIPTION
                           * This sketch provides an example of how to implement a humidity/temperature
                           * sensor using a DHT11/DHT-22.
                           *  
                           * For more information, please visit:
                           * http://www.mysensors.org/build/humidity
                           * 
                           */
                          
                          // Enable debug prints
                          #define MY_DEBUG
                          
                          // Enable and select radio type attached 
                          #define MY_RADIO_NRF24
                          //#define MY_RADIO_RFM69
                          //#define MY_RS485
                          
                          #define MY_NODE_ID 19
                          #include <SPI.h>
                          #include <MySensors.h>  
                          #include <DHT.h>
                          
                          // Set this to the pin you connected the DHT's data pin to
                          #define DHT_DATA_PIN 3
                          
                          // Set this offset if the sensor has a permanent small offset to the real temperatures
                          #define SENSOR_TEMP_OFFSET 0
                          
                          // Sleep time between sensor updates (in milliseconds)
                          // Must be >1000ms for DHT22 and >2000ms for DHT11
                          static const uint64_t UPDATE_INTERVAL = 60000;
                          
                          // Force sending an update of the temperature after n sensor reads, so a controller showing the
                          // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
                          // the value didn't change since;
                          // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
                          static const uint8_t FORCE_UPDATE_N_READS = 10;
                          
                          #define CHILD_ID_HUM 10
                          #define CHILD_ID_TEMP 11
                          
                          float lastTemp;
                          float lastHum;
                          uint8_t nNoUpdatesTemp;
                          uint8_t nNoUpdatesHum;
                          bool metric = true;
                          
                          MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                          MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                          DHT dht;
                          
                          #define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
                          #define NUMBER_OF_RELAYS 2 // Total number of attached relays
                          #define RELAY_ON 1  // GPIO value to write to turn on attached relay
                          #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
                          
                          
                          void before()
                          {
                              for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                                  // Then set relay pins in output mode
                                  pinMode(pin, OUTPUT);
                                  // Set relay to last known state (using eeprom storage)
                                  digitalWrite(pin, loadState(sensor)?RELAY_OFF:RELAY_ON);
                              }
                          }
                          
                          void presentation()  
                          { 
                            // Send the sketch version information to the gateway
                            sendSketchInfo("TempRELAY", "1.1");
                          
                            // Register all sensors to gw (they will be created as child devices)
                            present(CHILD_ID_HUM, S_HUM);
                            present(CHILD_ID_TEMP, S_TEMP);
                          
                            metric = getControllerConfig().isMetric;
                          
                            for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                                  // Register all sensors to gw (they will be created as child devices)
                                  present(sensor, S_BINARY);
                              }
                          }
                          
                          
                          void setup()
                          {
                            dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                            if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                              Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                            }
                            // Sleep for the time of the minimum sampling period to give the sensor time to power up
                            // (otherwise, timeout errors might occure for the first reading)
                            wait(dht.getMinimumSamplingPeriod());
                          }
                          
                          
                          void loop()      
                          {  
                            // Force reading sensor, so it works also after sleep()
                            dht.readSensor(true);
                          
                            // Get temperature from DHT library
                            float temperature = dht.getTemperature();
                            if (isnan(temperature)) {
                              Serial.println("Failed reading temperature from DHT!");
                            } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                              // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                              lastTemp = temperature;
                              if (!metric) {
                                temperature = dht.toFahrenheit(temperature);
                              }
                              // Reset no updates counter
                              nNoUpdatesTemp = 0;
                              temperature += SENSOR_TEMP_OFFSET;
                              send(msgTemp.set(temperature, 1));
                          
                              #ifdef MY_DEBUG
                              Serial.print("T: ");
                              Serial.println(temperature);
                              #endif
                            } else {
                              // Increase no update counter if the temperature stayed the same
                              nNoUpdatesTemp++;
                            }
                          
                            // Get humidity from DHT library
                            float humidity = dht.getHumidity();
                            if (isnan(humidity)) {
                              Serial.println("Failed reading humidity from DHT");
                            } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                              // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                              lastHum = humidity;
                              // Reset no updates counter
                              nNoUpdatesHum = 0;
                              send(msgHum.set(humidity, 1));
                          
                              #ifdef MY_DEBUG
                              Serial.print("H: ");
                              Serial.println(humidity);
                              #endif
                            } else {
                              // Increase no update counter if the humidity stayed the same
                              nNoUpdatesHum++;
                            }
                          
                            // Sleep for a while to save energy
                            wait(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(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_OFF:RELAY_ON);
                                  // Store state in eeprom
                                  saveState(message.sensor, message.getBool());
                                  // Write some debug info
                                  Serial.print("Incoming change for sensor:");
                                  Serial.print(message.sensor);
                                  Serial.print(", New status: ");
                                  Serial.println(message.getBool());
                              }
                          }```
                          rejoe2R Offline
                          rejoe2R Offline
                          rejoe2
                          wrote on last edited by
                          #56

                          @bluezr1 Looks already really good.
                          Question: does the receive() work while the loop does the wait()? I'm not sure about that, because I am used to do the millis()-nonblocking-loop.

                          Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

                          B 1 Reply Last reply
                          0
                          • rejoe2R rejoe2

                            @bluezr1 Looks already really good.
                            Question: does the receive() work while the loop does the wait()? I'm not sure about that, because I am used to do the millis()-nonblocking-loop.

                            B Offline
                            B Offline
                            bluezr1
                            wrote on last edited by
                            #57

                            @rejoe2 I hope that this answers your question. I use Vera as my home controller and tried multiple times turning (sometimes randomly) on and off both relays without any misses as soon as Vera allowed me. Meaning, Vera won’t let you instantly turn a device on and then off or vise versa.

                            Do you think I’ll be ok the way it is or should I keep working on this project?

                            rejoe2R 1 Reply Last reply
                            0
                            • B bluezr1

                              @rejoe2 I hope that this answers your question. I use Vera as my home controller and tried multiple times turning (sometimes randomly) on and off both relays without any misses as soon as Vera allowed me. Meaning, Vera won’t let you instantly turn a device on and then off or vise versa.

                              Do you think I’ll be ok the way it is or should I keep working on this project?

                              rejoe2R Offline
                              rejoe2R Offline
                              rejoe2
                              wrote on last edited by
                              #58

                              @bluezr1 As it seems to work to your satisfaction, you may leave it as is.
                              FHEM as a controller allows direct interaction with switching devices, and it is really astonishing to hear Vera may have some restrictions wrt. that.

                              But I didn't test your code in my setup, this is why I asked about your observations.

                              I may be wrong, but imo, the code isn't yet perfect, so you might keep that in mind for the future in case you run into trouble. In case you need some sort of timer for other projects, you would miss the opportunity to learn how to use this...

                              Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

                              B 1 Reply Last reply
                              1
                              • rejoe2R rejoe2

                                @bluezr1 As it seems to work to your satisfaction, you may leave it as is.
                                FHEM as a controller allows direct interaction with switching devices, and it is really astonishing to hear Vera may have some restrictions wrt. that.

                                But I didn't test your code in my setup, this is why I asked about your observations.

                                I may be wrong, but imo, the code isn't yet perfect, so you might keep that in mind for the future in case you run into trouble. In case you need some sort of timer for other projects, you would miss the opportunity to learn how to use this...

                                B Offline
                                B Offline
                                bluezr1
                                wrote on last edited by bluezr1
                                #59

                                @rejoe2 It's working

                                Although I'm not sure if this part makes sense?

                                static const uint64_t UPDATE_INTERVAL = 60000;
                                unsigned long interval = 60000;
                                unsigned long previousMillis = 0;```
                                
                                /**
                                 * The MySensors Arduino library handles the wireless radio link and protocol
                                 * between your home built sensors/actuators and HA controller of choice.
                                 * The sensors forms a self healing radio network with optional repeaters. Each
                                 * repeater and gateway builds a routing tables in EEPROM which keeps track of the
                                 * network topology allowing messages to be routed to nodes.
                                 *
                                 * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
                                 * Copyright (C) 2013-2015 Sensnology AB
                                 * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
                                 *
                                 * Documentation: http://www.mysensors.org
                                 * Support Forum: http://forum.mysensors.org
                                 *
                                 * This program is free software; you can redistribute it and/or
                                 * modify it under the terms of the GNU General Public License
                                 * version 2 as published by the Free Software Foundation.
                                 *
                                 *******************************
                                 *
                                 * REVISION HISTORY
                                 * Version 1.0: Henrik EKblad
                                 * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
                                 * 
                                 * DESCRIPTION
                                 * This sketch provides an example of how to implement a humidity/temperature
                                 * sensor using a DHT11/DHT-22.
                                 *  
                                 * For more information, please visit:
                                 * http://www.mysensors.org/build/humidity
                                 * 
                                 */
                                
                                // Enable debug prints
                                #define MY_DEBUG
                                
                                // Enable and select radio type attached 
                                #define MY_RADIO_NRF24
                                //#define MY_RADIO_RFM69
                                //#define MY_RS485
                                
                                #define MY_NODE_ID 20
                                #include <SPI.h>
                                #include <MySensors.h>  
                                #include <DHT.h>
                                
                                // Set this to the pin you connected the DHT's data pin to
                                #define DHT_DATA_PIN 3
                                
                                // Set this offset if the sensor has a permanent small offset to the real temperatures
                                #define SENSOR_TEMP_OFFSET 0
                                
                                // Sleep time between sensor updates (in milliseconds)
                                // Must be >1000ms for DHT22 and >2000ms for DHT11
                                static const uint64_t UPDATE_INTERVAL = 60000;
                                unsigned long interval = 60000;
                                unsigned long previousMillis = 0;
                                
                                // Force sending an update of the temperature after n sensor reads, so a controller showing the
                                // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
                                // the value didn't change since;
                                // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
                                static const uint8_t FORCE_UPDATE_N_READS = 10;
                                
                                #define CHILD_ID_HUM 10
                                #define CHILD_ID_TEMP 11
                                
                                float lastTemp;
                                float lastHum;
                                uint8_t nNoUpdatesTemp;
                                uint8_t nNoUpdatesHum;
                                bool metric = true;
                                
                                MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                                MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                                DHT dht;
                                
                                #define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
                                #define NUMBER_OF_RELAYS 2 // Total number of attached relays
                                #define RELAY_ON 1  // GPIO value to write to turn on attached relay
                                #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
                                
                                
                                void before()
                                {
                                    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                                        // Then set relay pins in output mode
                                        pinMode(pin, OUTPUT);
                                        // Set relay to last known state (using eeprom storage)
                                        digitalWrite(pin, loadState(sensor)?RELAY_OFF:RELAY_ON);
                                    }
                                }
                                
                                void presentation()  
                                { 
                                  // Send the sketch version information to the gateway
                                  sendSketchInfo("TempRELAY", "1.1");
                                
                                  // Register all sensors to gw (they will be created as child devices)
                                  present(CHILD_ID_HUM, S_HUM);
                                  present(CHILD_ID_TEMP, S_TEMP);
                                
                                  metric = getControllerConfig().isMetric;
                                
                                  for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                                        // Register all sensors to gw (they will be created as child devices)
                                        present(sensor, S_BINARY);
                                    }
                                }
                                
                                
                                void setup()
                                {
                                  dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                                  if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                                    Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                                  }
                                  // Sleep for the time of the minimum sampling period to give the sensor time to power up
                                  // (otherwise, timeout errors might occure for the first reading)
                                  // wait(dht.getMinimumSamplingPeriod());
                                }
                                
                                
                                void loop()      
                                { 
                                 unsigned long currentMillis = millis();
                                 if ((unsigned long)(currentMillis - previousMillis) >= interval) { 
                                  // Force reading sensor, so it works also after sleep()
                                  dht.readSensor(true);
                                
                                  // Get temperature from DHT library
                                  float temperature = dht.getTemperature();
                                  if (isnan(temperature)) {
                                    Serial.println("Failed reading temperature from DHT!");
                                  } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                                    // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                                    lastTemp = temperature;
                                    if (!metric) {
                                      temperature = dht.toFahrenheit(temperature);
                                    }
                                    // Reset no updates counter
                                    nNoUpdatesTemp = 0;
                                    temperature += SENSOR_TEMP_OFFSET;
                                    send(msgTemp.set(temperature, 1));
                                
                                    #ifdef MY_DEBUG
                                    Serial.print("T: ");
                                    Serial.println(temperature);
                                    #endif
                                  } else {
                                    // Increase no update counter if the temperature stayed the same
                                    nNoUpdatesTemp++;
                                  }
                                
                                  // Get humidity from DHT library
                                  float humidity = dht.getHumidity();
                                  if (isnan(humidity)) {
                                    Serial.println("Failed reading humidity from DHT");
                                  } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                                    // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                                    lastHum = humidity;
                                    // Reset no updates counter
                                    nNoUpdatesHum = 0;
                                    send(msgHum.set(humidity, 1));
                                
                                    #ifdef MY_DEBUG
                                    Serial.print("H: ");
                                    Serial.println(humidity);
                                    #endif
                                  } else {
                                    // Increase no update counter if the humidity stayed the same
                                    nNoUpdatesTemp++;
                                  }
                                  previousMillis = millis();
                                 }
                                }
                                
                                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(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_OFF:RELAY_ON);
                                        // Store state in eeprom
                                        saveState(message.sensor, message.getBool());
                                        // Write some debug info
                                        Serial.print("Incoming change for sensor:");
                                        Serial.print(message.sensor);
                                        Serial.print(", New status: ");
                                        Serial.println(message.getBool());
                                    }
                                }
                                
                                rejoe2R 1 Reply Last reply
                                1
                                • B bluezr1

                                  @rejoe2 It's working

                                  Although I'm not sure if this part makes sense?

                                  static const uint64_t UPDATE_INTERVAL = 60000;
                                  unsigned long interval = 60000;
                                  unsigned long previousMillis = 0;```
                                  
                                  /**
                                   * The MySensors Arduino library handles the wireless radio link and protocol
                                   * between your home built sensors/actuators and HA controller of choice.
                                   * The sensors forms a self healing radio network with optional repeaters. Each
                                   * repeater and gateway builds a routing tables in EEPROM which keeps track of the
                                   * network topology allowing messages to be routed to nodes.
                                   *
                                   * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
                                   * Copyright (C) 2013-2015 Sensnology AB
                                   * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
                                   *
                                   * Documentation: http://www.mysensors.org
                                   * Support Forum: http://forum.mysensors.org
                                   *
                                   * This program is free software; you can redistribute it and/or
                                   * modify it under the terms of the GNU General Public License
                                   * version 2 as published by the Free Software Foundation.
                                   *
                                   *******************************
                                   *
                                   * REVISION HISTORY
                                   * Version 1.0: Henrik EKblad
                                   * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
                                   * 
                                   * DESCRIPTION
                                   * This sketch provides an example of how to implement a humidity/temperature
                                   * sensor using a DHT11/DHT-22.
                                   *  
                                   * For more information, please visit:
                                   * http://www.mysensors.org/build/humidity
                                   * 
                                   */
                                  
                                  // Enable debug prints
                                  #define MY_DEBUG
                                  
                                  // Enable and select radio type attached 
                                  #define MY_RADIO_NRF24
                                  //#define MY_RADIO_RFM69
                                  //#define MY_RS485
                                  
                                  #define MY_NODE_ID 20
                                  #include <SPI.h>
                                  #include <MySensors.h>  
                                  #include <DHT.h>
                                  
                                  // Set this to the pin you connected the DHT's data pin to
                                  #define DHT_DATA_PIN 3
                                  
                                  // Set this offset if the sensor has a permanent small offset to the real temperatures
                                  #define SENSOR_TEMP_OFFSET 0
                                  
                                  // Sleep time between sensor updates (in milliseconds)
                                  // Must be >1000ms for DHT22 and >2000ms for DHT11
                                  static const uint64_t UPDATE_INTERVAL = 60000;
                                  unsigned long interval = 60000;
                                  unsigned long previousMillis = 0;
                                  
                                  // Force sending an update of the temperature after n sensor reads, so a controller showing the
                                  // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
                                  // the value didn't change since;
                                  // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
                                  static const uint8_t FORCE_UPDATE_N_READS = 10;
                                  
                                  #define CHILD_ID_HUM 10
                                  #define CHILD_ID_TEMP 11
                                  
                                  float lastTemp;
                                  float lastHum;
                                  uint8_t nNoUpdatesTemp;
                                  uint8_t nNoUpdatesHum;
                                  bool metric = true;
                                  
                                  MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                                  MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                                  DHT dht;
                                  
                                  #define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
                                  #define NUMBER_OF_RELAYS 2 // Total number of attached relays
                                  #define RELAY_ON 1  // GPIO value to write to turn on attached relay
                                  #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
                                  
                                  
                                  void before()
                                  {
                                      for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                                          // Then set relay pins in output mode
                                          pinMode(pin, OUTPUT);
                                          // Set relay to last known state (using eeprom storage)
                                          digitalWrite(pin, loadState(sensor)?RELAY_OFF:RELAY_ON);
                                      }
                                  }
                                  
                                  void presentation()  
                                  { 
                                    // Send the sketch version information to the gateway
                                    sendSketchInfo("TempRELAY", "1.1");
                                  
                                    // Register all sensors to gw (they will be created as child devices)
                                    present(CHILD_ID_HUM, S_HUM);
                                    present(CHILD_ID_TEMP, S_TEMP);
                                  
                                    metric = getControllerConfig().isMetric;
                                  
                                    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                                          // Register all sensors to gw (they will be created as child devices)
                                          present(sensor, S_BINARY);
                                      }
                                  }
                                  
                                  
                                  void setup()
                                  {
                                    dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                                    if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                                      Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                                    }
                                    // Sleep for the time of the minimum sampling period to give the sensor time to power up
                                    // (otherwise, timeout errors might occure for the first reading)
                                    // wait(dht.getMinimumSamplingPeriod());
                                  }
                                  
                                  
                                  void loop()      
                                  { 
                                   unsigned long currentMillis = millis();
                                   if ((unsigned long)(currentMillis - previousMillis) >= interval) { 
                                    // Force reading sensor, so it works also after sleep()
                                    dht.readSensor(true);
                                  
                                    // Get temperature from DHT library
                                    float temperature = dht.getTemperature();
                                    if (isnan(temperature)) {
                                      Serial.println("Failed reading temperature from DHT!");
                                    } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                                      // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                                      lastTemp = temperature;
                                      if (!metric) {
                                        temperature = dht.toFahrenheit(temperature);
                                      }
                                      // Reset no updates counter
                                      nNoUpdatesTemp = 0;
                                      temperature += SENSOR_TEMP_OFFSET;
                                      send(msgTemp.set(temperature, 1));
                                  
                                      #ifdef MY_DEBUG
                                      Serial.print("T: ");
                                      Serial.println(temperature);
                                      #endif
                                    } else {
                                      // Increase no update counter if the temperature stayed the same
                                      nNoUpdatesTemp++;
                                    }
                                  
                                    // Get humidity from DHT library
                                    float humidity = dht.getHumidity();
                                    if (isnan(humidity)) {
                                      Serial.println("Failed reading humidity from DHT");
                                    } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                                      // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                                      lastHum = humidity;
                                      // Reset no updates counter
                                      nNoUpdatesHum = 0;
                                      send(msgHum.set(humidity, 1));
                                  
                                      #ifdef MY_DEBUG
                                      Serial.print("H: ");
                                      Serial.println(humidity);
                                      #endif
                                    } else {
                                      // Increase no update counter if the humidity stayed the same
                                      nNoUpdatesTemp++;
                                    }
                                    previousMillis = millis();
                                   }
                                  }
                                  
                                  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(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_OFF:RELAY_ON);
                                          // Store state in eeprom
                                          saveState(message.sensor, message.getBool());
                                          // Write some debug info
                                          Serial.print("Incoming change for sensor:");
                                          Serial.print(message.sensor);
                                          Serial.print(", New status: ");
                                          Serial.println(message.getBool());
                                      }
                                  }
                                  
                                  rejoe2R Offline
                                  rejoe2R Offline
                                  rejoe2
                                  wrote on last edited by
                                  #60

                                  @bluezr1 Looks like you did a working non-blocking loop :grin:
                                  Didn't do a too close look to all things, but the only header definition that seems to be no longer necessary is the UPDATE_INTERVAL, as this variable isn't used any longer.

                                  But beside that small remark: :clap:

                                  Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

                                  1 Reply Last reply
                                  1
                                  • B Offline
                                    B Offline
                                    bluezr1
                                    wrote on last edited by bluezr1
                                    #61

                                    <<edit>>It was me, my bad, it's working.

                                    For some reason if I pull a wire for the relay it'll still show a change within Vera. I can turn them on and off and they'll show up as if they were turned on and off. Before if I pulled a wire to the relays vera wouldn't show any changes.

                                    Thank you so much rejoe2 for not just giving me the answers but by pushing me to do it myself. You pointed me to where I needed to be and I thank you for that.

                                    Now you got me wanting to learn even more. :)

                                    rejoe2R 1 Reply Last reply
                                    0
                                    • B Offline
                                      B Offline
                                      bluezr1
                                      wrote on last edited by
                                      #62

                                      Wanted to post it incase someone else wants to use it.

                                      /**
                                       * The MySensors Arduino library handles the wireless radio link and protocol
                                       * between your home built sensors/actuators and HA controller of choice.
                                       * The sensors forms a self healing radio network with optional repeaters. Each
                                       * repeater and gateway builds a routing tables in EEPROM which keeps track of the
                                       * network topology allowing messages to be routed to nodes.
                                       *
                                       * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
                                       * Copyright (C) 2013-2015 Sensnology AB
                                       * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
                                       *
                                       * Documentation: http://www.mysensors.org
                                       * Support Forum: http://forum.mysensors.org
                                       *
                                       * This program is free software; you can redistribute it and/or
                                       * modify it under the terms of the GNU General Public License
                                       * version 2 as published by the Free Software Foundation.
                                       *
                                       *******************************
                                       *
                                       * REVISION HISTORY
                                       * Version 1.0: Henrik EKblad
                                       * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
                                       * 
                                       * DESCRIPTION
                                       * This sketch provides an example of how to implement a humidity/temperature
                                       * sensor using a DHT11/DHT-22.
                                       *  
                                       * For more information, please visit:
                                       * http://www.mysensors.org/build/humidity
                                       * 
                                       */
                                      
                                      // Enable debug prints
                                      #define MY_DEBUG
                                      
                                      // Enable and select radio type attached 
                                      #define MY_RADIO_NRF24
                                      //#define MY_RADIO_RFM69
                                      //#define MY_RS485
                                      
                                      #define MY_NODE_ID 20
                                      #include <SPI.h>
                                      #include <MySensors.h>  
                                      #include <DHT.h>
                                      
                                      // Set this to the pin you connected the DHT's data pin to
                                      #define DHT_DATA_PIN 3
                                      
                                      // Set this offset if the sensor has a permanent small offset to the real temperatures
                                      #define SENSOR_TEMP_OFFSET 0
                                      
                                      // Sleep time between sensor updates (in milliseconds)
                                      // Must be >1000ms for DHT22 and >2000ms for DHT11
                                      //static const uint64_t UPDATE_INTERVAL = 60000;
                                      unsigned long interval = 60000;
                                      unsigned long previousMillis = 0;
                                      
                                      // Force sending an update of the temperature after n sensor reads, so a controller showing the
                                      // timestamp of the last update doesn't show something like 3 hours in the unlikely case, that
                                      // the value didn't change since;
                                      // i.e. the sensor would force sending an update every UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
                                      static const uint8_t FORCE_UPDATE_N_READS = 10;
                                      
                                      #define CHILD_ID_HUM 10
                                      #define CHILD_ID_TEMP 11
                                      
                                      float lastTemp;
                                      float lastHum;
                                      uint8_t nNoUpdatesTemp;
                                      uint8_t nNoUpdatesHum;
                                      bool metric = true;
                                      
                                      MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                                      MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                                      DHT dht;
                                      
                                      #define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
                                      #define NUMBER_OF_RELAYS 2 // Total number of attached relays
                                      #define RELAY_ON 0  // GPIO value to write to turn on attached relay
                                      #define RELAY_OFF 1 // GPIO value to write to turn off attached relay
                                      
                                      
                                      void before()
                                      {
                                          for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                                              // Then set relay pins in output mode
                                              pinMode(pin, OUTPUT);
                                              // Set relay to last known state (using eeprom storage)
                                              digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
                                          }
                                      }
                                      
                                      void presentation()  
                                      { 
                                        // Send the sketch version information to the gateway
                                        sendSketchInfo("TempRELAY", "1.1");
                                      
                                        // Register all sensors to gw (they will be created as child devices)
                                        present(CHILD_ID_HUM, S_HUM);
                                        present(CHILD_ID_TEMP, S_TEMP);
                                      
                                        metric = getControllerConfig().isMetric;
                                      
                                        for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
                                              // Register all sensors to gw (they will be created as child devices)
                                              present(sensor, S_BINARY);
                                          }
                                      }
                                      
                                      
                                      void setup()
                                      {
                                        dht.setup(DHT_DATA_PIN); // set data pin of DHT sensor
                                        //if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {
                                         // Serial.println("Warning: UPDATE_INTERVAL is smaller than supported by the sensor!");
                                        //}
                                        // Sleep for the time of the minimum sampling period to give the sensor time to power up
                                        // (otherwise, timeout errors might occure for the first reading)
                                        // wait(dht.getMinimumSamplingPeriod());
                                      }
                                      
                                      
                                      void loop()      
                                      { 
                                       unsigned long currentMillis = millis();
                                       if ((unsigned long)(currentMillis - previousMillis) >= interval) { 
                                        // Force reading sensor, so it works also after sleep()
                                        dht.readSensor(true);
                                      
                                        // Get temperature from DHT library
                                        float temperature = dht.getTemperature();
                                        if (isnan(temperature)) {
                                          Serial.println("Failed reading temperature from DHT!");
                                        } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
                                          // Only send temperature if it changed since the last measurement or if we didn't send an update for n times
                                          lastTemp = temperature;
                                          if (!metric) {
                                            temperature = dht.toFahrenheit(temperature);
                                          }
                                          // Reset no updates counter
                                          nNoUpdatesTemp = 0;
                                          temperature += SENSOR_TEMP_OFFSET;
                                          send(msgTemp.set(temperature, 1));
                                      
                                          #ifdef MY_DEBUG
                                          Serial.print("T: ");
                                          Serial.println(temperature);
                                          #endif
                                        } else {
                                          // Increase no update counter if the temperature stayed the same
                                          nNoUpdatesTemp++;
                                        }
                                      
                                        // Get humidity from DHT library
                                        float humidity = dht.getHumidity();
                                        if (isnan(humidity)) {
                                          Serial.println("Failed reading humidity from DHT");
                                        } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
                                          // Only send humidity if it changed since the last measurement or if we didn't send an update for n times
                                          lastHum = humidity;
                                          // Reset no updates counter
                                          nNoUpdatesHum = 0;
                                          send(msgHum.set(humidity, 1));
                                      
                                          #ifdef MY_DEBUG
                                          Serial.print("H: ");
                                          Serial.println(humidity);
                                          #endif
                                        } else {
                                          // Increase no update counter if the humidity stayed the same
                                          nNoUpdatesTemp++;
                                        }
                                        previousMillis = millis();
                                       }
                                      }
                                      
                                      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(message.sensor-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
                                              // Store state in eeprom
                                              saveState(message.sensor, 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
                                      1
                                      • B bluezr1

                                        <<edit>>It was me, my bad, it's working.

                                        For some reason if I pull a wire for the relay it'll still show a change within Vera. I can turn them on and off and they'll show up as if they were turned on and off. Before if I pulled a wire to the relays vera wouldn't show any changes.

                                        Thank you so much rejoe2 for not just giving me the answers but by pushing me to do it myself. You pointed me to where I needed to be and I thank you for that.

                                        Now you got me wanting to learn even more. :)

                                        rejoe2R Offline
                                        rejoe2R Offline
                                        rejoe2
                                        wrote on last edited by
                                        #63

                                        @bluezr1 said in Combining relay and temperature sketch:

                                        Thank you so much rejoe2 for not just giving me the answers but by pushing me to do it myself. You pointed me to where I needed to be and I thank you for that.

                                        Now you got me wanting to learn even more. :)
                                        Thanks also a lot for your positive feedback - seems there are more and more people interested in quick fixes, but imo, it's by far better to "learn how to fish".

                                        For the next steps, I'd recommend to do some more "combinded sketching", based on the existing build examples - but you'll find that easy once you did the next two of them :grin:

                                        One more interesting thing may be working with interrups in non-blocking sketches - please mind the needed type of variable definition to avoid irritating effects ;-)

                                        Then you might run into trouble as combining things needs more PINs - then you are forced to have a look on the next level of abstraction: array functions ;-) . For a start, you may analyse the multi-button-relay-sketch somwhere around here in the forum.

                                        Then you are at least on my level of knowledge within one week :grin:

                                        Controller: FHEM; MySensors: 2.3.1, RS485,nRF24,RFM69, serial Gateways

                                        1 Reply Last reply
                                        1
                                        • pepsonP Offline
                                          pepsonP Offline
                                          pepson
                                          wrote on last edited by
                                          #64

                                          Hi
                                          I need help... I want use sketch for 2 relay and sensor temp Dallas SD18b20.
                                          I have working sketch for 2xrelay and put to it sketch from mysensors
                                          https://www.mysensors.org/build/temp

                                          for Dallas but it not working. Not showing temp from Dallas. In DOmotcz on Gateway show only Binary from relay. Not Show Temp.

                                          /**
                                             DESCRIPTION
                                             Sketch for 2x relay with buttons monostable. After back power all relays set OFF and send correct status OFF to controller.  
                                          */
                                          
                                          // Enable debug prints to serial monitor
                                          #define MY_DEBUG
                                          
                                          // Enable and select radio type attached
                                          #define MY_RADIO_RFM69
                                          #define MY_RFM69_FREQUENCY RF69_868MHZ
                                          #define MY_IS_RFM69HW
                                          
                                          // Enabled repeater feature for this node
                                          #define MY_REPEATER_FEATURE
                                          
                                          // Node id defaults to AUTO (tries to fetch id from controller)
                                          #define MY_NODE_ID AUTO
                                          
                                          #include <SPI.h>
                                          #include <MySensors.h>
                                          #include <Bounce2.h>
                                          #include <DallasTemperature.h>
                                          #include <OneWire.h>
                                          
                                          // Define Relays
                                          #define RELAY_ON 0  // GPIO value to write to turn on attached relay
                                          #define RELAY_OFF 1  // GPIO value to write to turn off attached relay
                                          
                                          // Define Sensor ID's
                                          #define SSR_A_ID 1   // Id of the sensor child
                                          #define SSR_B_ID 2   // Id of the sensor child
                                          
                                          // Define buttons and relays
                                          const int buttonPinA = 3;
                                          const int buttonPinB = 4;
                                          const int relayPinA = 5;
                                          const int relayPinB = 6;
                                          
                                          // Define Variables
                                          int oldValueA = 0;
                                          int oldValueB = 0;
                                          bool stateA = false;
                                          bool stateB = false;
                                          int trigger = 0;
                                          
                                          // Define Sensors Temperature
                                          #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
                                          
                                          #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); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
                                          DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 
                                          float lastTemperature[MAX_ATTACHED_DS18B20];
                                          int numSensors=0;
                                          bool receivedConfig = false;
                                          bool metric = true;
                                          
                                          Bounce debouncerA = Bounce();
                                          Bounce debouncerB = Bounce();
                                          
                                          MyMessage msgA(SSR_A_ID, V_STATUS);
                                          MyMessage msgB(SSR_B_ID, V_STATUS);
                                          // Initialize temperature message
                                          MyMessage msg(0,V_TEMP);
                                          
                                          void before()
                                          {
                                            // Startup up the OneWire library
                                            sensors.begin();
                                          }
                                          
                                          void setup()
                                          {
                                          
                                            pinMode(buttonPinA, INPUT_PULLUP); // Setup the button Activate internal pull-up
                                            pinMode(buttonPinB, INPUT_PULLUP); // Setup the button Activate internal pull-up
                                          
                                          
                                            // After setting up the buttons, setup debouncer
                                            debouncerA.attach(buttonPinA);
                                            debouncerA.interval(5);
                                            debouncerB.attach(buttonPinB);
                                            debouncerB.interval(5);
                                          
                                            // Make sure relays are off when starting up
                                            digitalWrite(relayPinA, RELAY_OFF);
                                            digitalWrite(relayPinB, RELAY_OFF);
                                            // Then set relay pins in output mode
                                            pinMode(relayPinA, OUTPUT);
                                            pinMode(relayPinB, OUTPUT);
                                          
                                            // requestTemperatures() will not block current thread
                                            sensors.setWaitForConversion(false);
                                          
                                          }
                                          
                                          void presentation()  {
                                            // Send the sketch version information to the gateway and Controller
                                            sendSketchInfo("2xRelay monostable + temp. DS18b20", "2.1.1");
                                          
                                            // Register all sensors to gw (they will be created as child devices)
                                            present(SSR_A_ID, S_LIGHT);
                                            present(SSR_B_ID, S_LIGHT);
                                          
                                            // 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++) {   
                                               present(i, S_TEMP);
                                            }
                                          
                                          }
                                          
                                          
                                          void loop()
                                          {
                                          if (trigger == 0){
                                            send(msgA.set(false)); // Send off state for relayA to ensure controller knows the switch is off
                                            send(msgB.set(false)); // Send off state for relayB to ensure controller knows the switch is off
                                            trigger = 1;
                                          }
                                            
                                            debouncerA.update();
                                            // Get the update value
                                            int valueA = debouncerA.read();
                                            if (valueA != oldValueA && valueA == 0) {
                                              send(msgA.set(stateA ? false : true), true); // Send new state and request ack back
                                          
                                            }
                                            oldValueA = valueA;
                                           
                                          
                                            debouncerB.update();
                                            // Get the update value
                                            int valueB = debouncerB.read();
                                            if (valueB != oldValueB && valueB == 0) {
                                              send(msgB.set(stateB ? false : true), true); // Send new state and request ack back
                                          
                                            }
                                            oldValueB = valueB;
                                          
                                             // Fetch temperatures from Dallas sensors
                                            sensors.requestTemperatures();
                                          
                                            // query conversion time and sleep until conversion completed
                                            int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
                                            // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
                                            sleep(conversionTime);
                                          
                                            // 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>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
                                          
                                              // Only send data if temperature has changed and no error
                                              #if COMPARE_TEMP == 1
                                              if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
                                              #else
                                              if (temperature != -127.00 && temperature != 85.00) {
                                              #endif
                                          
                                                // Send in the new temperature
                                                send(msg.setSensor(i).set(temperature,1));
                                                // Save new temperatures for next compare
                                                lastTemperature[i]=temperature;
                                              }
                                            }
                                            sleep(SLEEP_TIME);
                                          }
                                          
                                          void receive(const MyMessage &message) {
                                            // We only expect one type of message from controller. But we better check anyway.
                                            if (message.type == V_STATUS) {
                                                
                                              switch (message.sensor) {
                                                case 1:
                                                  stateA = message.getBool();
                                                  digitalWrite(message.sensor + 4, stateA ? RELAY_ON : RELAY_OFF);
                                                  
                                                  break;
                                                case 2:
                                                  stateB = message.getBool();
                                                  digitalWrite(message.sensor + 4, stateB ? RELAY_ON : RELAY_OFF);
                                                  
                                                  break;
                                                
                                              }
                                             
                                                // Write some debug info
                                              Serial.print("Incoming change for sensor:");
                                              Serial.println(message.sensor);
                                              Serial.print("from node:");
                                              Serial.println(message.sender);
                                              Serial.print(", New status: ");
                                              Serial.println(message.getBool());
                                            }
                                          }```
                                          
                                          
                                          Please help me
                                          rejoe2R 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          13

                                          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