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. DHT plus two relays

DHT plus two relays

Scheduled Pinned Locked Moved Troubleshooting
5 Posts 3 Posters 1.1k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • N Offline
    N Offline
    Newzwaver
    wrote on last edited by mfalkvidd
    #1

    HI Everyone,

    I have my temp/hum sensor in my AV cab and what two computer fans to cool it down. I have tried this and it originally worked with one relay and I got creative and screwed it up. When i tried to get it back to the original version i couldn't as I yes saved over it. I have checked on the forum and see projects like this but they don't appear to work. Can should one give a few pointers?

    #define MY_DEBUG
    #define MY_RADIO_NRF24
    #define MY_REPEATER_FEATURE
    #define MY_NODE_ID 29
    
    #include <MyConfig.h>
    #include <MySensors.h>
    #include <SPI.h>
    #include <DHT.h>
    
    
    #define DHT_DATA_PIN 3
    #define RELAY_1  4 
    #define CHILD_ID_HUM 28
    #define CHILD_ID_TEMP 29
    #define NUMBER_OF_RELAYS 1
    #define RELAY_ON 1 
    #define RELAY_OFF 0
    #define SENSOR_TEMP_OFFSET 0
    
    static const uint64_t UPDATE_INTERVAL = 40000;
    static const uint8_t FORCE_UPDATE_N_READS = 10;
    
    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_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    pinMode(pin, OUTPUT);
    digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
    }
    }
    
    void presentation()
    {
    sendSketchInfo("TempHumRelay", "1.2");
      present(CHILD_ID_HUM, S_HUM);
      present(CHILD_ID_TEMP, S_TEMP);
      metric = getControllerConfig().isMetric;
      for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
      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(dht.getMinimumSamplingPeriod());
    }
    void loop()
    {
       dht.readSensor(true);
      float temperature = dht.getTemperature();
      if (isnan(temperature)) {
        Serial.println("Failed reading temperature from DHT!");
      } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
        lastTemp = temperature;
        if (!metric) {
          temperature = dht.toFahrenheit(temperature);
        }
        nNoUpdatesTemp = 0;
        temperature += SENSOR_TEMP_OFFSET;
        send(msgTemp.set(temperature, 1));
    
        #ifdef MY_DEBUG
        Serial.print("T: ");
        Serial.println(temperature);
        #endif
      } else {
        nNoUpdatesTemp++;
      }
      float humidity = dht.getHumidity();
      if (isnan(humidity)) {
        Serial.println("Failed reading humidity from DHT");
      } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
        lastHum = humidity;
        nNoUpdatesHum = 0;
        send(msgHum.set(humidity, 1));
    
        #ifdef MY_DEBUG
        Serial.print("H: ");
        Serial.println(humidity);
        #endif
      } else {
        nNoUpdatesHum++;
      }
      sleep(UPDATE_INTERVAL); 
    }
    void receive(const MyMessage &message)
    {
      if (message.type==V_STATUS) {
        digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
        saveState(message.sensor, message.getBool());
        Serial.print("Incoming change for sensor:");
        Serial.print(message.sensor);
        Serial.print(", New status: ");
        Serial.println(message.getBool());
      }  }
    
    mfalkviddM 1 Reply Last reply
    0
    • N Newzwaver

      HI Everyone,

      I have my temp/hum sensor in my AV cab and what two computer fans to cool it down. I have tried this and it originally worked with one relay and I got creative and screwed it up. When i tried to get it back to the original version i couldn't as I yes saved over it. I have checked on the forum and see projects like this but they don't appear to work. Can should one give a few pointers?

      #define MY_DEBUG
      #define MY_RADIO_NRF24
      #define MY_REPEATER_FEATURE
      #define MY_NODE_ID 29
      
      #include <MyConfig.h>
      #include <MySensors.h>
      #include <SPI.h>
      #include <DHT.h>
      
      
      #define DHT_DATA_PIN 3
      #define RELAY_1  4 
      #define CHILD_ID_HUM 28
      #define CHILD_ID_TEMP 29
      #define NUMBER_OF_RELAYS 1
      #define RELAY_ON 1 
      #define RELAY_OFF 0
      #define SENSOR_TEMP_OFFSET 0
      
      static const uint64_t UPDATE_INTERVAL = 40000;
      static const uint8_t FORCE_UPDATE_N_READS = 10;
      
      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_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
      pinMode(pin, OUTPUT);
      digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
      }
      }
      
      void presentation()
      {
      sendSketchInfo("TempHumRelay", "1.2");
        present(CHILD_ID_HUM, S_HUM);
        present(CHILD_ID_TEMP, S_TEMP);
        metric = getControllerConfig().isMetric;
        for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        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(dht.getMinimumSamplingPeriod());
      }
      void loop()
      {
         dht.readSensor(true);
        float temperature = dht.getTemperature();
        if (isnan(temperature)) {
          Serial.println("Failed reading temperature from DHT!");
        } else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
          lastTemp = temperature;
          if (!metric) {
            temperature = dht.toFahrenheit(temperature);
          }
          nNoUpdatesTemp = 0;
          temperature += SENSOR_TEMP_OFFSET;
          send(msgTemp.set(temperature, 1));
      
          #ifdef MY_DEBUG
          Serial.print("T: ");
          Serial.println(temperature);
          #endif
        } else {
          nNoUpdatesTemp++;
        }
        float humidity = dht.getHumidity();
        if (isnan(humidity)) {
          Serial.println("Failed reading humidity from DHT");
        } else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS) {
          lastHum = humidity;
          nNoUpdatesHum = 0;
          send(msgHum.set(humidity, 1));
      
          #ifdef MY_DEBUG
          Serial.print("H: ");
          Serial.println(humidity);
          #endif
        } else {
          nNoUpdatesHum++;
        }
        sleep(UPDATE_INTERVAL); 
      }
      void receive(const MyMessage &message)
      {
        if (message.type==V_STATUS) {
          digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
          saveState(message.sensor, message.getBool());
          Serial.print("Incoming change for sensor:");
          Serial.print(message.sensor);
          Serial.print(", New status: ");
          Serial.println(message.getBool());
        }  }
      
      mfalkviddM Offline
      mfalkviddM Offline
      mfalkvidd
      Mod
      wrote on last edited by
      #2

      @Newzwaver in what way doesn't it work? It would be easier to help you if we knew what to look for :-)

      My best guess so far is that the node goes to sleep, which means it can not receive changes to the relays.

      1 Reply Last reply
      0
      • dbemowskD Offline
        dbemowskD Offline
        dbemowsk
        wrote on last edited by
        #3

        I am only speculating, but I think that he is missing the MySensors part of things. It sounds like he wants to run two relays with a temp/hum sensor and that's it. So he tries a MySensors sketch and without a gateway to respond, the sketch just hangs waiting for a gateway to connect to. Again, I could be wrong.

        Vera Plus running UI7 with MySensors, Sonoffs and 1-Wire devices
        Visit my website for more Bits, Bytes and Ramblings from me: http://dan.bemowski.info/

        1 Reply Last reply
        0
        • N Offline
          N Offline
          Newzwaver
          wrote on last edited by
          #4

          This works whether its correct or not it is working again.
          // Enable debug prints to serial monitor
          #define MY_DEBUG

          // Enable and select radio type attached
          #define MY_RADIO_NRF24
          #define MY_NODE_ID 31
          // Enable repeater functionality for this node
          #define MY_REPEATER_FEATURE

          #include <MyConfig.h>
          #include <MySensors.h>
          #include <SPI.h>
          #include <DHT.h>

          #define DHT_DATA_PIN 3
          #define RELAY_1 4 // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
          #define CHILD_ID_HUM 28
          #define CHILD_ID_TEMP 27
          #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 = 10000;

          // 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;

          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_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 presentation()
          {
          // Send the sketch version information to the gateway and Controller
          sendSketchInfo("TempHum2Relay", "1.1B");
          // 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_1; 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)
          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_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());

          } }

          dbemowskD 1 Reply Last reply
          0
          • N Newzwaver

            This works whether its correct or not it is working again.
            // Enable debug prints to serial monitor
            #define MY_DEBUG

            // Enable and select radio type attached
            #define MY_RADIO_NRF24
            #define MY_NODE_ID 31
            // Enable repeater functionality for this node
            #define MY_REPEATER_FEATURE

            #include <MyConfig.h>
            #include <MySensors.h>
            #include <SPI.h>
            #include <DHT.h>

            #define DHT_DATA_PIN 3
            #define RELAY_1 4 // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
            #define CHILD_ID_HUM 28
            #define CHILD_ID_TEMP 27
            #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 = 10000;

            // 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;

            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_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 presentation()
            {
            // Send the sketch version information to the gateway and Controller
            sendSketchInfo("TempHum2Relay", "1.1B");
            // 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_1; 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)
            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_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());

            } }

            dbemowskD Offline
            dbemowskD Offline
            dbemowsk
            wrote on last edited by
            #5

            @Newzwaver When you post code, it helps out a lot if you use the code tag button </> before pasting in your code.

            The other alternative which is basically what the code tag button does is to put 3 tick marks ( ``` ) before and after your code.

            It keeps the code indented and makes it MUCH easier to read.

            Vera Plus running UI7 with MySensors, Sonoffs and 1-Wire devices
            Visit my website for more Bits, Bytes and Ramblings from me: http://dan.bemowski.info/

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


            31

            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