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.4k 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.
  • gohanG Offline
    gohanG Offline
    gohan
    Mod
    wrote on last edited by
    #2

    maybe you have something wrong in presentation. Pls post your code. How come you need this many sensors?

    Tim76T 1 Reply Last reply
    0
    • gohanG gohan

      maybe you have something wrong in presentation. Pls post your code. How come you need this many sensors?

      Tim76T Offline
      Tim76T Offline
      Tim76
      wrote on last edited by
      #3

      @gohan thx for your fast reply...
      I wasn't anywhere near my laptop, so I couldn't post the code.

      the reason for that many sensors is:

      pretty big greenhouse with a few aquaponics and hydroponics systems.
      for instance, I have 4 vertical towers from wich I want to monitor the water temp and the temp inside the pvs towers.
      that alone are allready 2 temp sensors and a relay for the pump.....

      Tim76T 1 Reply Last reply
      0
      • Tim76T Tim76

        @gohan thx for your fast reply...
        I wasn't anywhere near my laptop, so I couldn't post the code.

        the reason for that many sensors is:

        pretty big greenhouse with a few aquaponics and hydroponics systems.
        for instance, I have 4 vertical towers from wich I want to monitor the water temp and the temp inside the pvs towers.
        that alone are allready 2 temp sensors and a relay for the pump.....

        Tim76T Offline
        Tim76T Offline
        Tim76
        wrote on last edited by Tim76
        #4

        hereby the code that doesn't seem to work...

        // Enable debug prints to serial monitor
        //#define MY_DEBUG 
        
        #define MY_RF24_CE_PIN 49
        #define MY_RF24_CS_PIN 53
        
        // Enable and select radio type attached
        #define MY_RADIO_NRF24
        //#define MY_RADIO_RFM69
        #define MY_NODE_ID 5
        #include <SPI.h>
        #include <MySensors.h>  
        #include <DallasTemperature.h>
        #include <OneWire.h>
        
        #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;
        // Initialize temperature message
        MyMessage msg(0,V_TEMP);
        
        #define RELAY_1  30  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
        #define NUMBER_OF_RELAYS 16 // 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()
        {
          // Startup up the OneWire library
          sensors.begin();
          for (int sensor=1, pin=RELAY_1; 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 setup()  
        { 
          // requestTemperatures() will not block current thread
          sensors.setWaitForConversion(false);
        }
        
        void presentation() {
          // Send the sketch version information to the gateway and Controller
          sendSketchInfo("Temperature Sensor", "1.1");
        
          // Fetch the number of attached temperature sensors  
          numSensors = sensors.getDeviceCount();
        
          // Present all sensors to controller
          for (int i=17; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
             present(i, S_TEMP);
             
          for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
           // Register all sensors to gw (they will be created as child devices)
            present(sensor, S_BINARY);
          }
          }
        }
        
        void loop()     
        {     
          // 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;
            }
          }
         
        }
        
        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_1, 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());
          }
           sleep(SLEEP_TIME);
        }
        
        1 Reply Last reply
        0
        • gohanG Offline
          gohanG Offline
          gohan
          Mod
          wrote on last edited by
          #5

          I think there is an error in the presentation function: you need to close the first for cycle before the second one, otherwise it will present 2 relays for every Dallas sensor.

          Tim76T 1 Reply Last reply
          0
          • gohanG gohan

            I think there is an error in the presentation function: you need to close the first for cycle before the second one, otherwise it will present 2 relays for every Dallas sensor.

            Tim76T Offline
            Tim76T Offline
            Tim76
            wrote on last edited by
            #6

            @gohan again, thx for your fast reply,

            How could I miss that...😳😳 lol...
            I'll try it later today....

            Thx upfront!

            Timu

            1 Reply Last reply
            0
            • gohanG Offline
              gohanG Offline
              gohan
              Mod
              wrote on last edited by
              #7

              When doing copy/paste of code it can happen to anyone :)

              Tim76T 1 Reply Last reply
              0
              • gohanG gohan

                When doing copy/paste of code it can happen to anyone :)

                Tim76T Offline
                Tim76T Offline
                Tim76
                wrote on last edited by
                #8

                @gohan apparently..... 😂😂😉

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  Mad6969
                  wrote on last edited by
                  #9

                  Hello,

                  I'm trying to do the same thing but with just one relay and a DHT22. So I combined the "air humidity sensor" sketch and the "relay with button" one.

                  Each sketch works fine, but when I combine them, I get an error form the DHT
                  "Failed reading humidity from DHT
                  Failed reading temperature from DHT!"

                  But sometimes, I get the temp/hum in the serial monitor. I first thought that I misswired something, but it work perfectly with the other sketch.

                  So.. I (obviously) missed something in the program and I can't see what (probably something stupid, I'm new to arduino and mysensors.)

                  Here's my code (basicly a copy/paste of the two sketches). Any advice?

                  /**
                  * 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
                  
                  #include <SPI.h>
                  #include <MySensors.h>  
                  #include <DHT.h>
                  
                  //Relay sketch
                  #include <Bounce2.h>
                  
                  
                  // Set this to the pin you connected the DHT's data pin to
                  #define DHT_DATA_PIN 8
                  
                  // 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 2
                  #define CHILD_ID_TEMP 3
                  
                  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;
                  
                  //Relay Sketch
                  
                  #define RELAY_PIN  4  // Arduino Digital I/O pin number for relay 
                  #define BUTTON_PIN  5  // Arduino Digital I/O pin number for button 
                  #define CHILD_ID 1   // Id of the sensor child
                  #define RELAY_ON 1
                  #define RELAY_OFF 0
                  
                  Bounce debouncer = Bounce(); 
                  int oldValue=0;
                  bool state;
                  
                  MyMessage msg(CHILD_ID,V_LIGHT);
                  
                  
                  void presentation()  
                  { 
                  // Send the sketch version information to the gateway
                  sendSketchInfo("Test403", "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;
                  
                  present(CHILD_ID, S_LIGHT);
                  
                  }
                  
                  
                  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());
                  
                  // Setup the button
                   pinMode(BUTTON_PIN,INPUT);
                   // Activate internal pull-up
                   digitalWrite(BUTTON_PIN,HIGH);
                   
                   // After setting up the button, setup debouncer
                   debouncer.attach(BUTTON_PIN);
                   debouncer.interval(5);
                  
                   // Make sure relays are off when starting up
                   digitalWrite(RELAY_PIN, RELAY_OFF);
                   // Then set relay pins in output mode
                   pinMode(RELAY_PIN, OUTPUT);   
                       
                   // Set relay to last known state (using eeprom storage) 
                   state = loadState(CHILD_ID);
                   digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
                  
                  
                  }
                  
                  
                  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++;
                  }
                  
                  //Relay voidloop
                  debouncer.update();
                  // Get the update value
                  int value = debouncer.read();
                  if (value != oldValue && value==0) {
                      send(msg.set(state?false:true), true); // Send new state and request ack back
                  }
                  oldValue = value;
                  } 
                  
                  void receive(const MyMessage &message) {
                  // We only expect one type of message from controller. But we better check anyway.
                  if (message.isAck()) {
                     Serial.println("This is an ack from gateway");
                  }
                  
                  if (message.type == V_LIGHT) {
                     // Change relay state
                     state = message.getBool();
                     digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF);
                     // Store state in eeprom
                     saveState(CHILD_ID, state);
                    
                     // Write some debug info
                     Serial.print("Incoming change for sensor:");
                     Serial.print(message.sensor);
                     Serial.print(", New status: ");
                     Serial.println(message.getBool());
                   } 
                  }
                  
                  1 Reply Last reply
                  0
                  • gohanG Offline
                    gohanG Offline
                    gohan
                    Mod
                    wrote on last edited by
                    #10

                    try to put a wait(500) at end of loop function, or even wait(1000)

                    Tim76T M 2 Replies Last reply
                    0
                    • gohanG gohan

                      try to put a wait(500) at end of loop function, or even wait(1000)

                      Tim76T Offline
                      Tim76T Offline
                      Tim76
                      wrote on last edited by
                      #11
                      This post is deleted!
                      1 Reply Last reply
                      0
                      • gohanG gohan

                        try to put a wait(500) at end of loop function, or even wait(1000)

                        M Offline
                        M Offline
                        Mad6969
                        wrote on last edited by
                        #12

                        @gohan said in Combining relay and temperature sketch:

                        wait(1000)

                        Oh.. like I said : something stupid..

                        Thanks a lot. :-)

                        I also had "#define MY_NODE_ID 7", because I couldn't see the relay on my Vera.

                        1 Reply Last reply
                        0
                        • gohanG Offline
                          gohanG Offline
                          gohan
                          Mod
                          wrote on last edited by
                          #13

                          DHT sensor doesn't like to work very quickly, it needs some resting time between measurements :D

                          Tim76T 1 Reply Last reply
                          0
                          • gohanG gohan

                            DHT sensor doesn't like to work very quickly, it needs some resting time between measurements :D

                            Tim76T Offline
                            Tim76T Offline
                            Tim76
                            wrote on last edited by Tim76
                            #14

                            @gohan modfied my code..... still the same.... I get 16 children (relays) and no temp...... I have 4 ds18b20's connected.....
                            And I get the error switch command on the relays....😑😑

                            gohanG 1 Reply Last reply
                            0
                            • M Offline
                              M Offline
                              Mad6969
                              wrote on last edited by
                              #15

                              Ok, now I have another problem.

                              When I build the relay/dht node, I first made the thing work with the relay with button actuator sketch alone (the DHT was plugged, but it was an additional feature I wanted to add).

                              Now, it seems that my power source doesn't have enough power to make the relay to close. The led on my relay board blinks when the relay is on and off, but nothing.

                              That's weird.. I'll try running the relay sketch alone, just to see.

                              1 Reply Last reply
                              0
                              • Tim76T Tim76

                                @gohan modfied my code..... still the same.... I get 16 children (relays) and no temp...... I have 4 ds18b20's connected.....
                                And I get the error switch command on the relays....😑😑

                                gohanG Offline
                                gohanG Offline
                                gohan
                                Mod
                                wrote on last edited by
                                #16

                                @Tim76 ok, let's go back to the beginning. Try with one sensors only, if everything works then add one relay, then add the second and keep adding the sensors until you see something wrong. You need to go step by step, otherwise with all that stuff you have it will be impossible to debug.

                                Tim76T 2 Replies Last reply
                                0
                                • gohanG gohan

                                  @Tim76 ok, let's go back to the beginning. Try with one sensors only, if everything works then add one relay, then add the second and keep adding the sensors until you see something wrong. You need to go step by step, otherwise with all that stuff you have it will be impossible to debug.

                                  Tim76T Offline
                                  Tim76T Offline
                                  Tim76
                                  wrote on last edited by
                                  #17

                                  @gohan ok

                                  1 Reply Last reply
                                  0
                                  • gohanG gohan

                                    @Tim76 ok, let's go back to the beginning. Try with one sensors only, if everything works then add one relay, then add the second and keep adding the sensors until you see something wrong. You need to go step by step, otherwise with all that stuff you have it will be impossible to debug.

                                    Tim76T Offline
                                    Tim76T Offline
                                    Tim76
                                    wrote on last edited by Tim76
                                    #18

                                    @gohan both sketches work perfectly stand alone.... but I think the problem lies within the assingment of the child id's...
                                    James Bruce talks about this "bug" in his video on how to combine sketches.....
                                    They relay sketch assigns from 1 to 16
                                    And the temp sketch assigns from 0 to 15
                                    So they both try to use the same id's for their children when you try to combine them....
                                    I need a way to get around that and have relays on 1-16 and temp on 17 to 32......
                                    Or there might just be the same "bug" in the temperature sketch.....😬😬 wich might mean that they can't be combined for now......😒😒

                                    1 Reply Last reply
                                    0
                                    • gohanG Offline
                                      gohanG Offline
                                      gohan
                                      Mod
                                      wrote on last edited by
                                      #19

                                      if use something like this in presentation?

                                      for (int i=1; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                                           present(i+3, S_TEMP);
                                      

                                      you get the idea, just shift the child id of the dallas sensors and leave the first 4-5 IDs for relays

                                      Tim76T 2 Replies Last reply
                                      0
                                      • gohanG gohan

                                        if use something like this in presentation?

                                        for (int i=1; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                                             present(i+3, S_TEMP);
                                        

                                        you get the idea, just shift the child id of the dallas sensors and leave the first 4-5 IDs for relays

                                        Tim76T Offline
                                        Tim76T Offline
                                        Tim76
                                        wrote on last edited by
                                        #20

                                        @gohan aha! Will be trying that later tonight..... I'll keep you posted! 😊 Thx man!

                                        1 Reply Last reply
                                        0
                                        • gohanG gohan

                                          if use something like this in presentation?

                                          for (int i=1; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                                               present(i+3, S_TEMP);
                                          

                                          you get the idea, just shift the child id of the dallas sensors and leave the first 4-5 IDs for relays

                                          Tim76T Offline
                                          Tim76T Offline
                                          Tim76
                                          wrote on last edited by
                                          #21

                                          @gohan soooooo...... I tried this:

                                          void presentation() {
                                            // Send the sketch version information to the gateway and Controller
                                            sendSketchInfo("Temperature Sensor", "1.1");
                                          
                                            // Fetch the number of attached temperature sensors  
                                            numSensors = sensors.getDeviceCount();
                                          
                                            // Present all sensors to controller
                                            for (int i=1; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                                               present(i+16, S_TEMP);
                                            }
                                            for (int sensor=1, pin=RELAY_1; 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);
                                            }
                                          }
                                          
                                          

                                          now I get the temp sensors with child id's 1 to 16 and no relays at all

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


                                          17

                                          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