Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Development
  3. Multiple DH22 sensors

Multiple DH22 sensors

Scheduled Pinned Locked Moved Development
7 Posts 3 Posters 1.5k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Jasper van WindenJ Offline
    Jasper van WindenJ Offline
    Jasper van Winden
    wrote on last edited by
    #1

    Hi Guys,

    Recently I've made my first sensor based on a Pro mini with DH22. (And ethernet gateway) I can read the data with Domoticz.

    Now I wanted to go one step further and connect multiple (3) DH22 sensors to one Pro mini. (Fore use in more intelligent home ventilation system) Electrical seems not to be much more difficult took input pin 3, 4, and 5, but progamming is (for me).

    I managed to recieve date for three sensors. The problem is the data send for al three sensors is identical. Serial plotter shows sending / recieving is ok, and Domoticz shows the three sensors. (With identical values.)
    I guess it may has something to do with this part:

    MyMessage msgHum1(CHILD_ID_HUM1, V_HUM);
    MyMessage msgTemp1(CHILD_ID_TEMP1, V_TEMP);
    MyMessage msgHum2(CHILD_ID_HUM2, V_HUM);
    MyMessage msgTemp2(CHILD_ID_TEMP2, V_TEMP);
    MyMessage msgHum3(CHILD_ID_HUM3, V_HUM);
    MyMessage msgTemp3(CHILD_ID_TEMP3, V_TEMP);

    Or with the part:
    float temperature1 = dht.getTemperature();
    (because how does the progamm knows what pin)

    Could anyone be so kind to give me some pointers

    Thank you

    /**
     * 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.
    
     */
     
    #include <SPI.h>
    #include <MySensor.h>  
    #include <DHT.h>  
    
    #define CHILD_ID_HUM1 0
    #define CHILD_ID_TEMP1 1
    #define HUMIDITY_SENSOR_1_DIGITAL_PIN 3
    
    #define CHILD_ID_HUM2 3
    #define CHILD_ID_TEMP2 4
    #define HUMIDITY_SENSOR_2_DIGITAL_PIN 4
    
    #define CHILD_ID_HUM3 5
    #define CHILD_ID_TEMP3 6
    #define HUMIDITY_SENSOR_3_DIGITAL_PIN 5
    unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
    
    MySensor gw;
    DHT dht;
    float lastTemp1;
    float lastHum1;
    float lastTemp2;
    float lastHum2;
    float lastTemp3;
    float lastHum3;
    boolean metric = true;
     
    MyMessage msgHum1(CHILD_ID_HUM1, V_HUM);
    MyMessage msgTemp1(CHILD_ID_TEMP1, V_TEMP);
    MyMessage msgHum2(CHILD_ID_HUM2, V_HUM);
    MyMessage msgTemp2(CHILD_ID_TEMP2, V_TEMP);
    MyMessage msgHum3(CHILD_ID_HUM3, V_HUM);
    MyMessage msgTemp3(CHILD_ID_TEMP3, V_TEMP);
    
    void setup()  
    { 
      gw.begin();
      dht.setup(HUMIDITY_SENSOR_1_DIGITAL_PIN); 
      dht.setup(HUMIDITY_SENSOR_2_DIGITAL_PIN);
      dht.setup(HUMIDITY_SENSOR_3_DIGITAL_PIN);
    
      // Send the Sketch Version Information to the Gateway
      gw.sendSketchInfo("HumiditySensorDrieineen", "1.0");
    
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID_HUM1, S_HUM);
      gw.present(CHILD_ID_TEMP1, S_TEMP);
      gw.present(CHILD_ID_HUM2, S_HUM);
      gw.present(CHILD_ID_TEMP2, S_TEMP);
      gw.present(CHILD_ID_HUM3, S_HUM);
      gw.present(CHILD_ID_TEMP3, S_TEMP);
    
      metric = gw.getConfig().isMetric;
    }
    
    void loop()      
    {  
      delay(dht.getMinimumSamplingPeriod());
    
      float temperature1 = dht.getTemperature();
      if (isnan(temperature1)) {
          Serial.println("Failed reading temperature from DHT1");
      } else if (temperature1 != lastTemp1) {
        lastTemp1 = temperature1;
        if (!metric) {
          temperature1 = dht.toFahrenheit(temperature1);
        }
        gw.send(msgTemp1.set(temperature1, 1));
        Serial.print("T: ");
        Serial.println(temperature1);
      }
      
      float humidity1 = dht.getHumidity();
      if (isnan(humidity1)) {
          Serial.println("Failed reading humidity from DHT1");
      } else if (humidity1 != lastHum1) {
          lastHum1 = humidity1;
          gw.send(msgHum1.set(humidity1, 1));
          Serial.print("H: ");
          Serial.println(humidity1);
      }
    
      float temperature2 = dht.getTemperature();
      if (isnan(temperature2)) {
          Serial.println("Failed reading temperature from DHT2");
      } else if (temperature2 != lastTemp2) {
        lastTemp2 = temperature2;
        if (!metric) {
          temperature2 = dht.toFahrenheit(temperature2);
        }
        gw.send(msgTemp2.set(temperature2, 1));
        Serial.print("T: ");
        Serial.println(temperature2);
      }
      
      float humidity2 = dht.getHumidity();
      if (isnan(humidity2)) {
          Serial.println("Failed reading humidity from DHT2");
      } else if (humidity2 != lastHum2) {
          lastHum2 = humidity2;
          gw.send(msgHum2.set(humidity2, 1));
          Serial.print("H: ");
          Serial.println(humidity2);
      }
    
       float temperature3 = dht.getTemperature();
      if (isnan(temperature3)) {
          Serial.println("Failed reading temperature from DHT3");
      } else if (temperature3 != lastTemp3) {
        lastTemp3 = temperature3;
        if (!metric) {
          temperature3 = dht.toFahrenheit(temperature3);
        }
        gw.send(msgTemp3.set(temperature3, 1));
        Serial.print("T: ");
        Serial.println(temperature3);
      }
      
      float humidity3 = dht.getHumidity();
      if (isnan(humidity3)) {
          Serial.println("Failed reading humidity from DHT3");
      } else if (humidity3 != lastHum3) {
          lastHum3 = humidity3;
          gw.send(msgHum3.set(humidity3, 1));
          Serial.print("H: ");
          Serial.println(humidity3);
      }
    
      gw.sleep(SLEEP_TIME); //sleep a bit
    }```
    
    TheoLT 1 Reply Last reply
    0
    • Jasper van WindenJ Jasper van Winden

      Hi Guys,

      Recently I've made my first sensor based on a Pro mini with DH22. (And ethernet gateway) I can read the data with Domoticz.

      Now I wanted to go one step further and connect multiple (3) DH22 sensors to one Pro mini. (Fore use in more intelligent home ventilation system) Electrical seems not to be much more difficult took input pin 3, 4, and 5, but progamming is (for me).

      I managed to recieve date for three sensors. The problem is the data send for al three sensors is identical. Serial plotter shows sending / recieving is ok, and Domoticz shows the three sensors. (With identical values.)
      I guess it may has something to do with this part:

      MyMessage msgHum1(CHILD_ID_HUM1, V_HUM);
      MyMessage msgTemp1(CHILD_ID_TEMP1, V_TEMP);
      MyMessage msgHum2(CHILD_ID_HUM2, V_HUM);
      MyMessage msgTemp2(CHILD_ID_TEMP2, V_TEMP);
      MyMessage msgHum3(CHILD_ID_HUM3, V_HUM);
      MyMessage msgTemp3(CHILD_ID_TEMP3, V_TEMP);

      Or with the part:
      float temperature1 = dht.getTemperature();
      (because how does the progamm knows what pin)

      Could anyone be so kind to give me some pointers

      Thank you

      /**
       * 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.
      
       */
       
      #include <SPI.h>
      #include <MySensor.h>  
      #include <DHT.h>  
      
      #define CHILD_ID_HUM1 0
      #define CHILD_ID_TEMP1 1
      #define HUMIDITY_SENSOR_1_DIGITAL_PIN 3
      
      #define CHILD_ID_HUM2 3
      #define CHILD_ID_TEMP2 4
      #define HUMIDITY_SENSOR_2_DIGITAL_PIN 4
      
      #define CHILD_ID_HUM3 5
      #define CHILD_ID_TEMP3 6
      #define HUMIDITY_SENSOR_3_DIGITAL_PIN 5
      unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
      
      MySensor gw;
      DHT dht;
      float lastTemp1;
      float lastHum1;
      float lastTemp2;
      float lastHum2;
      float lastTemp3;
      float lastHum3;
      boolean metric = true;
       
      MyMessage msgHum1(CHILD_ID_HUM1, V_HUM);
      MyMessage msgTemp1(CHILD_ID_TEMP1, V_TEMP);
      MyMessage msgHum2(CHILD_ID_HUM2, V_HUM);
      MyMessage msgTemp2(CHILD_ID_TEMP2, V_TEMP);
      MyMessage msgHum3(CHILD_ID_HUM3, V_HUM);
      MyMessage msgTemp3(CHILD_ID_TEMP3, V_TEMP);
      
      void setup()  
      { 
        gw.begin();
        dht.setup(HUMIDITY_SENSOR_1_DIGITAL_PIN); 
        dht.setup(HUMIDITY_SENSOR_2_DIGITAL_PIN);
        dht.setup(HUMIDITY_SENSOR_3_DIGITAL_PIN);
      
        // Send the Sketch Version Information to the Gateway
        gw.sendSketchInfo("HumiditySensorDrieineen", "1.0");
      
        // Register all sensors to gw (they will be created as child devices)
        gw.present(CHILD_ID_HUM1, S_HUM);
        gw.present(CHILD_ID_TEMP1, S_TEMP);
        gw.present(CHILD_ID_HUM2, S_HUM);
        gw.present(CHILD_ID_TEMP2, S_TEMP);
        gw.present(CHILD_ID_HUM3, S_HUM);
        gw.present(CHILD_ID_TEMP3, S_TEMP);
      
        metric = gw.getConfig().isMetric;
      }
      
      void loop()      
      {  
        delay(dht.getMinimumSamplingPeriod());
      
        float temperature1 = dht.getTemperature();
        if (isnan(temperature1)) {
            Serial.println("Failed reading temperature from DHT1");
        } else if (temperature1 != lastTemp1) {
          lastTemp1 = temperature1;
          if (!metric) {
            temperature1 = dht.toFahrenheit(temperature1);
          }
          gw.send(msgTemp1.set(temperature1, 1));
          Serial.print("T: ");
          Serial.println(temperature1);
        }
        
        float humidity1 = dht.getHumidity();
        if (isnan(humidity1)) {
            Serial.println("Failed reading humidity from DHT1");
        } else if (humidity1 != lastHum1) {
            lastHum1 = humidity1;
            gw.send(msgHum1.set(humidity1, 1));
            Serial.print("H: ");
            Serial.println(humidity1);
        }
      
        float temperature2 = dht.getTemperature();
        if (isnan(temperature2)) {
            Serial.println("Failed reading temperature from DHT2");
        } else if (temperature2 != lastTemp2) {
          lastTemp2 = temperature2;
          if (!metric) {
            temperature2 = dht.toFahrenheit(temperature2);
          }
          gw.send(msgTemp2.set(temperature2, 1));
          Serial.print("T: ");
          Serial.println(temperature2);
        }
        
        float humidity2 = dht.getHumidity();
        if (isnan(humidity2)) {
            Serial.println("Failed reading humidity from DHT2");
        } else if (humidity2 != lastHum2) {
            lastHum2 = humidity2;
            gw.send(msgHum2.set(humidity2, 1));
            Serial.print("H: ");
            Serial.println(humidity2);
        }
      
         float temperature3 = dht.getTemperature();
        if (isnan(temperature3)) {
            Serial.println("Failed reading temperature from DHT3");
        } else if (temperature3 != lastTemp3) {
          lastTemp3 = temperature3;
          if (!metric) {
            temperature3 = dht.toFahrenheit(temperature3);
          }
          gw.send(msgTemp3.set(temperature3, 1));
          Serial.print("T: ");
          Serial.println(temperature3);
        }
        
        float humidity3 = dht.getHumidity();
        if (isnan(humidity3)) {
            Serial.println("Failed reading humidity from DHT3");
        } else if (humidity3 != lastHum3) {
            lastHum3 = humidity3;
            gw.send(msgHum3.set(humidity3, 1));
            Serial.print("H: ");
            Serial.println(humidity3);
        }
      
        gw.sleep(SLEEP_TIME); //sleep a bit
      }```
      
      TheoLT Offline
      TheoLT Offline
      TheoL
      Contest Winner
      wrote on last edited by
      #2

      @Jasper-van-Winden It can't know that. You'll need three instances of DHT. I changed your sketch so that it should work. At least it compiles I don't have three D22 that I can use to test.

      I've appended // <--- by Theo to each line I've changed.

      /**
         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.
      
      */
      
      #include <SPI.h>
      #include <MySensor.h>
      #include <DHT.h>
      
      #define CHILD_ID_HUM1 0
      #define CHILD_ID_TEMP1 1
      #define HUMIDITY_SENSOR_1_DIGITAL_PIN 3
      
      #define CHILD_ID_HUM2 3
      #define CHILD_ID_TEMP2 4
      #define HUMIDITY_SENSOR_2_DIGITAL_PIN 4
      
      #define CHILD_ID_HUM3 5
      #define CHILD_ID_TEMP3 6
      #define HUMIDITY_SENSOR_3_DIGITAL_PIN 5
      unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
      
      MySensor gw;
      
      DHT dht1; // <--- by Theo
      DHT dht2; // <--- by Theo
      DHT dht3; // <--- by Theo
      
      
      float lastTemp1;
      float lastHum1;
      float lastTemp2;
      float lastHum2;
      float lastTemp3;
      float lastHum3;
      boolean metric = true;
      
      MyMessage msgHum1(CHILD_ID_HUM1, V_HUM);
      MyMessage msgTemp1(CHILD_ID_TEMP1, V_TEMP);
      MyMessage msgHum2(CHILD_ID_HUM2, V_HUM);
      MyMessage msgTemp2(CHILD_ID_TEMP2, V_TEMP);
      MyMessage msgHum3(CHILD_ID_HUM3, V_HUM);
      MyMessage msgTemp3(CHILD_ID_TEMP3, V_TEMP);
      
      void setup()
      {
        gw.begin();
        dht1.setup(HUMIDITY_SENSOR_1_DIGITAL_PIN); // <--- by Theo
        dht2.setup(HUMIDITY_SENSOR_2_DIGITAL_PIN); // <--- by Theo
        dht3.setup(HUMIDITY_SENSOR_3_DIGITAL_PIN); // <--- by Theo
      
        // Send the Sketch Version Information to the Gateway
        gw.sendSketchInfo("HumiditySensorDrieineen", "1.0");
      
        // Register all sensors to gw (they will be created as child devices)
        gw.present(CHILD_ID_HUM1, S_HUM);
        gw.wait( 55 ); // <--- by Theo
        gw.present(CHILD_ID_TEMP1, S_TEMP);
        gw.wait( 55 ); // <--- by Theo
        gw.present(CHILD_ID_HUM2, S_HUM);
        gw.wait( 55 ); // <--- by Theo
        gw.present(CHILD_ID_TEMP2, S_TEMP);
        gw.wait( 55 ); // <--- by Theo
        gw.present(CHILD_ID_HUM3, S_HUM);
        gw.wait( 55 ); // <--- by Theo
        gw.present(CHILD_ID_TEMP3, S_TEMP);
        gw.wait( 55 ); // <--- by Theo
      
        metric = gw.getConfig().isMetric;
      }
      
      void loop()
      {
        delay(dht1.getMinimumSamplingPeriod());
      
        float temperature1 = dht1.getTemperature(); // <--- by Theo
        if (isnan(temperature1)) {
          Serial.println("Failed reading temperature from DHT1");
        } else if (temperature1 != lastTemp1) {
          lastTemp1 = temperature1;
          if (!metric) {
            temperature1 = dht1.toFahrenheit(temperature1); // <--- by Theo
          }
          gw.send(msgTemp1.set(temperature1, 1));
          Serial.print("T: ");
          Serial.println(temperature1);
        }
      
        float humidity1 = dht1.getHumidity(); // <--- by Theo
        if (isnan(humidity1)) {
          Serial.println("Failed reading humidity from DHT1");
        } else if (humidity1 != lastHum1) {
          lastHum1 = humidity1;
          gw.send(msgHum1.set(humidity1, 1));
          Serial.print("H: ");
          Serial.println(humidity1);
        }
      
        float temperature2 = dht2.getTemperature(); // <--- by Theo
        if (isnan(temperature2)) {
          Serial.println("Failed reading temperature from DHT2");
        } else if (temperature2 != lastTemp2) {
          lastTemp2 = temperature2;
          if (!metric) {
            temperature2 = dht2.toFahrenheit(temperature2); // <--- by Theo
          }
          gw.send(msgTemp2.set(temperature2, 1));
          Serial.print("T: ");
          Serial.println(temperature2);
        }
      
        float humidity2 = dht2.getHumidity(); // <--- by Theo
        if (isnan(humidity2)) {
          Serial.println("Failed reading humidity from DHT2");
        } else if (humidity2 != lastHum2) {
          lastHum2 = humidity2;
          gw.send(msgHum2.set(humidity2, 1));
          Serial.print("H: ");
          Serial.println(humidity2);
        }
      
        float temperature3 = dht3.getTemperature(); // <--- by Theo
        if (isnan(temperature3)) {
          Serial.println("Failed reading temperature from DHT3");
        } else if (temperature3 != lastTemp3) {
          lastTemp3 = temperature3;
          if (!metric) {
            temperature3 = dht3.toFahrenheit(temperature3); // <--- by Theo
          }
          gw.send(msgTemp3.set(temperature3, 1));
          Serial.print("T: ");
          Serial.println(temperature3);
        }
      
        float humidity3 = dht3.getHumidity(); // <--- by Theo
        if (isnan(humidity3)) {
          Serial.println("Failed reading humidity from DHT3");
        } else if (humidity3 != lastHum3) {
          lastHum3 = humidity3;
          gw.send(msgHum3.set(humidity3, 1));
          Serial.print("H: ");
          Serial.println(humidity3);
        }
      
        //  gw.sleep(SLEEP_TIME); //sleep a bit  // // <--- by Theo
        gw.wait(SLEEP_TIME); //sleep a bit  // // <--- by Theo
      }
      
      1 Reply Last reply
      2
      • TheoLT Offline
        TheoLT Offline
        TheoL
        Contest Winner
        wrote on last edited by
        #3

        The code could be made much more efficient by using Arrays for instance. Or using a threshold for sending values I have a library for that on my gitgub. And posted an article about on this forum.

        But this should give you an idea of what you'd need to achieve what you want. And I guessed that it's easier for you to see what you needed to do if I just altered your code.

        Jasper van WindenJ 1 Reply Last reply
        0
        • TheoLT TheoL

          The code could be made much more efficient by using Arrays for instance. Or using a threshold for sending values I have a library for that on my gitgub. And posted an article about on this forum.

          But this should give you an idea of what you'd need to achieve what you want. And I guessed that it's easier for you to see what you needed to do if I just altered your code.

          Jasper van WindenJ Offline
          Jasper van WindenJ Offline
          Jasper van Winden
          wrote on last edited by
          #4

          @TheoL

          Thx for your changes, I now understand were I went wrong. I gave it a quick try and it seems to work!

          I understand comments about arrays. Will try to improve the code now I have some understanding of it.

          Thank you verry much for your qick reply

          Thank you erry

          1 Reply Last reply
          1
          • Jasper van WindenJ Offline
            Jasper van WindenJ Offline
            Jasper van Winden
            wrote on last edited by
            #5

            Sorry one question. Why the waiting time in register all sensors to gateway?

            TheoLT mfalkviddM 2 Replies Last reply
            0
            • Jasper van WindenJ Jasper van Winden

              Sorry one question. Why the waiting time in register all sensors to gateway?

              TheoLT Offline
              TheoLT Offline
              TheoL
              Contest Winner
              wrote on last edited by
              #6

              @Jasper-van-Winden In my experience the radio sometimes can't handle the speed of the Arduino. Especially in MySensors 1.5, haven't tested it with 2.0.

              This results in missing messages, and not all of your sensors will be shown in your controller.

              1 Reply Last reply
              0
              • Jasper van WindenJ Jasper van Winden

                Sorry one question. Why the waiting time in register all sensors to gateway?

                mfalkviddM Offline
                mfalkviddM Offline
                mfalkvidd
                Mod
                wrote on last edited by
                #7

                @Jasper-van-Winden the wait has helped in many cases. Nobody is 100% sure why. Maybe it gives the capacitors and the power supply time to recover from the power used when sending. Maybe it is somethong else. But it often helps :)

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


                12

                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