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. 2 or more DHT11 - Sensors on one Arduino NANO MYSENSOR

2 or more DHT11 - Sensors on one Arduino NANO MYSENSOR

Scheduled Pinned Locked Moved Development
dht11mysensors
11 Posts 4 Posters 12.9k 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.
  • michlb1982M Offline
    michlb1982M Offline
    michlb1982
    wrote on last edited by
    #1

    Hello I'm a newby with programming and arduino but i like the things i can do with mysensors and the fhem on my raspberry... so i want to use a Humidity-MYSENSOR but i want to plut 2 or more of the DHT11 on one sensor...
    i tried to create a code based on the humidity-mysensor code but i failed...
    maybe someone can help me?
    is it possible to use more than one dht11 on one arduino???

    thanks for help
    mike

    SparkmanS 1 Reply Last reply
    0
    • michlb1982M michlb1982

      Hello I'm a newby with programming and arduino but i like the things i can do with mysensors and the fhem on my raspberry... so i want to use a Humidity-MYSENSOR but i want to plut 2 or more of the DHT11 on one sensor...
      i tried to create a code based on the humidity-mysensor code but i failed...
      maybe someone can help me?
      is it possible to use more than one dht11 on one arduino???

      thanks for help
      mike

      SparkmanS Offline
      SparkmanS Offline
      Sparkman
      Hero Member
      wrote on last edited by
      #2

      @michlb1982 Hi Mike, yes it's possible. Why don't you post the code you have created so that feedback can be provided for it.

      Cheers
      Al

      1 Reply Last reply
      0
      • michlb1982M Offline
        michlb1982M Offline
        michlb1982
        wrote on last edited by
        #3

        hello
        well, i tried to do it by my self but, as i said, I'm a programming newbee...
        here my code

        #include <SPI.h>
        #include <MySensor.h>  
        #include <DHT.h>  
        
        #define CHILD_ID_HUM 0
        #define CHILD_ID_TEMP 1
        const int HUMIDITY_SENSOR_DIGITAL_PIN[] = {8, 7};
        #define NUMBER_OF_SENSORS 2
        unsigned long SLEEP_TIME = 15000; // Sleep time between reads (in milliseconds)
        
        MySensor gw;
        DHT dht;
        float lastTemp;
        float lastHum;
        boolean metric = true; 
        MyMessage msgHum(CHILD_ID_HUM, V_HUM);
        MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
        
        
        void setup()  
        { 
          gw.begin();
          dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN[pin]); 
        
          // Send the Sketch Version Information to the Gateway
          gw.sendSketchInfo("Humidity", "1.0");
        
          // Register all sensors to gw (they will be created as child devices)
          gw.present(CHILD_ID_HUM, S_HUM);
          gw.present(CHILD_ID_TEMP, S_TEMP);
          
          metric = gw.getConfig().isMetric;
        }
        
        void loop()      
        {  
          delay(dht.getMinimumSamplingPeriod());
        
          float temperature = dht.getTemperature();
          if (isnan(temperature)) {
              Serial.println("Failed reading temperature from DHT");
          } else if (temperature != lastTemp) {
            lastTemp = temperature;
            if (!metric) {
              temperature = dht.toFahrenheit(temperature);
            }
            gw.send(msgTemp.set(temperature, 1));
            Serial.print("T: ");
            Serial.println(temperature);
          }
          
          float humidity = dht.getHumidity();
          if (isnan(humidity)) {
              Serial.println("Failed reading humidity from DHT");
          } else if (humidity != lastHum) {
              lastHum = humidity;
              gw.send(msgHum.set(humidity, 1));
              Serial.print("H: ");
              Serial.println(humidity);
          }
        
          gw.sleep(SLEEP_TIME); //sleep a bit
        }
        
        
        

        i found a relaycode and i thought that could work for the DHT11 too... ?!

        // Example sketch showing how to control physical relays. 
        // This example will remember relay state even after power failure.
        
        #include <MySensor.h>
        #include <SPI.h>
        
        const int RELAY[] = {A0, A1, A2, A3};// Arduio Digital I/O pin number for first relay (second on pin+1 etc)
        #define NUMBER_OF_RELAYS 4 // 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
        
        MySensor gw;
        
        void setup()  
        {   
          // Initialize library and add callback for incoming messages
          gw.begin(incomingMessage, AUTO, true);
          // Send the sketch version information to the gateway and Controller
          gw.sendSketchInfo("Relay", "1.4");
        
          // Fetch relay status
          for (int sensor=1, pin=0; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
            // Register all sensors to gw (they will be created as child devices)
            gw.present(sensor, S_LIGHT);
            // Then set relay pins in output mode
            pinMode(RELAY[pin], OUTPUT);   
            // Set relay to last known state (using eeprom storage) 
            digitalWrite(RELAY[pin], gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
          }
        }
        
        
        void loop() 
        {
          // Alway process incoming messages whenever possible
          gw.process();
        }
        
        void incomingMessage(const MyMessage &message) {
          // We only expect one type of message from controller. But we better check anyway.
           if (message.type==V_LIGHT) {
             // Change relay state
             digitalWrite(RELAY[message.sensor-1], message.getBool()?RELAY_ON:RELAY_OFF);
             // Store state in eeprom
             gw.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());
           } 
        }
        
        

        the problem i have, is that i don't know how to "call" one pin after the other to readout the data and send them each to the gateway....

        maybe you have an idea....

        thank you !

        1 Reply Last reply
        0
        • BulldogLowellB Offline
          BulldogLowellB Offline
          BulldogLowell
          Contest Winner
          wrote on last edited by
          #4

          @michlb1982 said:

          DHT dht;

          DHT dht;
          

          that line creates (constructs) an instance of the DHT object. If you want two DHT devices, you will need to construct two DHT objects in the program:

          DHT dht0;
          DHT dht1;
          

          then you need to do something like this:

          dht0.setup(HUMIDITY_SENSOR_DIGITAL_PIN[0]); 
          dht1.setup(HUMIDITY_SENSOR_DIGITAL_PIN[1]); 
          

          then in your program, you access each of them accordingly:

          float humidity0 = dht0.getHumidity();
          

          I hope that helps...

          1 Reply Last reply
          0
          • SparkmanS Offline
            SparkmanS Offline
            Sparkman
            Hero Member
            wrote on last edited by
            #5

            To add to what BulldogLowell posted, you also need to duplicate the MySensors calls. The code below is untested and is not a real elegant way to do it, but should get you going in the right direction.

            #include <SPI.h>
            #include <MySensor.h>  
            #include <DHT.h>  
            
            #define CHILD_ID1_HUM 0
            #define CHILD_ID1_TEMP 1
            #define CHILD_ID2_HUM 2
            #define CHILD_ID2_TEMP 3
            const int HUMIDITY_SENSOR1_DIGITAL_PIN = 8;
            const int HUMIDITY_SENSOR2_DIGITAL_PIN = 9;
            
            unsigned long SLEEP_TIME = 15000; // Sleep time between reads (in milliseconds)
            
            MySensor gw;
            DHT dht1;
            DHT dht2;
            float lastTemp1;
            float lastHum1;
            float lastTemp2;
            float lastHum2;
            boolean metric = true; 
            MyMessage msgHum1(CHILD1_ID_HUM, V_HUM);
            MyMessage msgTemp1(CHILD1_ID_TEMP, V_TEMP);
            MyMessage msgHum2(CHILD2_ID_HUM, V_HUM);
            MyMessage msgTemp2(CHILD2_ID_TEMP, V_TEMP);
            
            void setup()  
            { 
              gw.begin();
              dht1.setup(HUMIDITY_SENSOR1_DIGITAL_PIN); 
              dht2.setup(HUMIDITY_SENSOR2_DIGITAL_PIN); 
            
              // Send the Sketch Version Information to the Gateway
              gw.sendSketchInfo("Humidity", "1.0");
            
              // Register all sensors to gw (they will be created as child devices)
              gw.present(CHILD_ID1_HUM, S_HUM);
              gw.present(CHILD_ID1_TEMP, S_TEMP);
              gw.present(CHILD_ID2_HUM, S_HUM);
              gw.present(CHILD_ID2_TEMP, S_TEMP);
              
              metric = gw.getConfig().isMetric;
            }
            
            void loop()      
            {  
              delay(dht1.getMinimumSamplingPeriod());
            
              float temperature = dht1.getTemperature();
              if (isnan(temperature)) {
                  Serial.println("Failed reading temperature from DHT");
              } else if (temperature != lastTemp1) {
                lastTemp1 = temperature;
                if (!metric) {
                  temperature = dht1.toFahrenheit(temperature);
                }
                gw.send(msgTemp1.set(temperature, 1));
                Serial.print("T1: ");
                Serial.println(temperature);
              }
              
              float humidity = dht1.getHumidity();
              if (isnan(humidity)) {
                  Serial.println("Failed reading humidity from DHT");
              } else if (humidity != lastHum1) {
                  lastHum1 = humidity;
                  gw.send(msgHum1.set(humidity, 1));
                  Serial.print("H1: ");
                  Serial.println(humidity);
              }
            
              delay(dht2.getMinimumSamplingPeriod());
            
              float temperature = dht2.getTemperature();
              if (isnan(temperature)) {
                  Serial.println("Failed reading temperature from DHT");
              } else if (temperature != lastTemp2) {
                lastTemp = temperature;
                if (!metric) {
                  temperature = dht2.toFahrenheit(temperature);
                }
                gw.send(msgTemp2.set(temperature, 1));
                Serial.print("T2: ");
                Serial.println(temperature);
              }
              
              float humidity = dht2.getHumidity();
              if (isnan(humidity)) {
                  Serial.println("Failed reading humidity from DHT");
              } else if (humidity != lastHum2) {
                  lastHum = humidity;
                  gw.send(msgHum2.set(humidity, 1));
                  Serial.print("H2: ");
                  Serial.println(humidity);
              }
            
              gw.sleep(SLEEP_TIME); //sleep a bit
            }
            
            1 Reply Last reply
            0
            • A Offline
              A Offline
              andriej
              wrote on last edited by
              #6

              But still, even when you duplicate them - they won't properly work in Domoticz, unfortunately.

              :-)

              SparkmanS 1 Reply Last reply
              0
              • A andriej

                But still, even when you duplicate them - they won't properly work in Domoticz, unfortunately.

                SparkmanS Offline
                SparkmanS Offline
                Sparkman
                Hero Member
                wrote on last edited by
                #7

                @andriej said:

                But still, even when you duplicate them - they won't properly work in Domoticz, unfortunately.

                Good thing the OP is using fhem then...

                1 Reply Last reply
                0
                • michlb1982M Offline
                  michlb1982M Offline
                  michlb1982
                  wrote on last edited by
                  #8

                  @Sparkman said:

                  #include <SPI.h>
                  #include <MySensor.h>
                  #include <DHT.h>

                  #define CHILD_ID1_HUM 0
                  #define CHILD_ID1_TEMP 1
                  #define CHILD_ID2_HUM 2
                  #define CHILD_ID2_TEMP 3
                  const int HUMIDITY_SENSOR1_DIGITAL_PIN = 8;
                  const int HUMIDITY_SENSOR2_DIGITAL_PIN = 9;

                  unsigned long SLEEP_TIME = 15000; // Sleep time between reads (in milliseconds)

                  MySensor gw;
                  DHT dht1;
                  DHT dht2;
                  float lastTemp1;
                  float lastHum1;
                  float lastTemp2;
                  float lastHum2;
                  boolean metric = true;
                  MyMessage msgHum1(CHILD1_ID_HUM, V_HUM);
                  MyMessage msgTemp1(CHILD1_ID_TEMP, V_TEMP);
                  MyMessage msgHum2(CHILD2_ID_HUM, V_HUM);
                  MyMessage msgTemp2(CHILD2_ID_TEMP, V_TEMP);

                  void setup()
                  {
                  gw.begin();
                  dht1.setup(HUMIDITY_SENSOR1_DIGITAL_PIN);
                  dht2.setup(HUMIDITY_SENSOR2_DIGITAL_PIN);

                  // Send the Sketch Version Information to the Gateway
                  gw.sendSketchInfo("Humidity", "1.0");

                  // Register all sensors to gw (they will be created as child devices)
                  gw.present(CHILD_ID1_HUM, S_HUM);
                  gw.present(CHILD_ID1_TEMP, S_TEMP);
                  gw.present(CHILD_ID2_HUM, S_HUM);
                  gw.present(CHILD_ID2_TEMP, S_TEMP);

                  metric = gw.getConfig().isMetric;
                  }

                  void loop()
                  {
                  delay(dht1.getMinimumSamplingPeriod());

                  float temperature = dht1.getTemperature();
                  if (isnan(temperature)) {
                  Serial.println("Failed reading temperature from DHT");
                  } else if (temperature != lastTemp1) {
                  lastTemp1 = temperature;
                  if (!metric) {
                  temperature = dht1.toFahrenheit(temperature);
                  }
                  gw.send(msgTemp1.set(temperature, 1));
                  Serial.print("T1: ");
                  Serial.println(temperature);
                  }

                  float humidity = dht1.getHumidity();
                  if (isnan(humidity)) {
                  Serial.println("Failed reading humidity from DHT");
                  } else if (humidity != lastHum1) {
                  lastHum1 = humidity;
                  gw.send(msgHum1.set(humidity, 1));
                  Serial.print("H1: ");
                  Serial.println(humidity);
                  }

                  delay(dht2.getMinimumSamplingPeriod());

                  float temperature = dht2.getTemperature();
                  if (isnan(temperature)) {
                  Serial.println("Failed reading temperature from DHT");
                  } else if (temperature != lastTemp2) {
                  lastTemp = temperature;
                  if (!metric) {
                  temperature = dht2.toFahrenheit(temperature);
                  }
                  gw.send(msgTemp2.set(temperature, 1));
                  Serial.print("T2: ");
                  Serial.println(temperature);
                  }

                  float humidity = dht2.getHumidity();
                  if (isnan(humidity)) {
                  Serial.println("Failed reading humidity from DHT");
                  } else if (humidity != lastHum2) {
                  lastHum = humidity;
                  gw.send(msgHum2.set(humidity, 1));
                  Serial.print("H2: ");
                  Serial.println(humidity);
                  }

                  gw.sleep(SLEEP_TIME); //sleep a bit
                  }

                  thanks for the help, you messed up a little with the number and the names of the nodes but after 5 min i could compile it... now the test starts...

                  SparkmanS 1 Reply Last reply
                  0
                  • michlb1982M michlb1982

                    @Sparkman said:

                    #include <SPI.h>
                    #include <MySensor.h>
                    #include <DHT.h>

                    #define CHILD_ID1_HUM 0
                    #define CHILD_ID1_TEMP 1
                    #define CHILD_ID2_HUM 2
                    #define CHILD_ID2_TEMP 3
                    const int HUMIDITY_SENSOR1_DIGITAL_PIN = 8;
                    const int HUMIDITY_SENSOR2_DIGITAL_PIN = 9;

                    unsigned long SLEEP_TIME = 15000; // Sleep time between reads (in milliseconds)

                    MySensor gw;
                    DHT dht1;
                    DHT dht2;
                    float lastTemp1;
                    float lastHum1;
                    float lastTemp2;
                    float lastHum2;
                    boolean metric = true;
                    MyMessage msgHum1(CHILD1_ID_HUM, V_HUM);
                    MyMessage msgTemp1(CHILD1_ID_TEMP, V_TEMP);
                    MyMessage msgHum2(CHILD2_ID_HUM, V_HUM);
                    MyMessage msgTemp2(CHILD2_ID_TEMP, V_TEMP);

                    void setup()
                    {
                    gw.begin();
                    dht1.setup(HUMIDITY_SENSOR1_DIGITAL_PIN);
                    dht2.setup(HUMIDITY_SENSOR2_DIGITAL_PIN);

                    // Send the Sketch Version Information to the Gateway
                    gw.sendSketchInfo("Humidity", "1.0");

                    // Register all sensors to gw (they will be created as child devices)
                    gw.present(CHILD_ID1_HUM, S_HUM);
                    gw.present(CHILD_ID1_TEMP, S_TEMP);
                    gw.present(CHILD_ID2_HUM, S_HUM);
                    gw.present(CHILD_ID2_TEMP, S_TEMP);

                    metric = gw.getConfig().isMetric;
                    }

                    void loop()
                    {
                    delay(dht1.getMinimumSamplingPeriod());

                    float temperature = dht1.getTemperature();
                    if (isnan(temperature)) {
                    Serial.println("Failed reading temperature from DHT");
                    } else if (temperature != lastTemp1) {
                    lastTemp1 = temperature;
                    if (!metric) {
                    temperature = dht1.toFahrenheit(temperature);
                    }
                    gw.send(msgTemp1.set(temperature, 1));
                    Serial.print("T1: ");
                    Serial.println(temperature);
                    }

                    float humidity = dht1.getHumidity();
                    if (isnan(humidity)) {
                    Serial.println("Failed reading humidity from DHT");
                    } else if (humidity != lastHum1) {
                    lastHum1 = humidity;
                    gw.send(msgHum1.set(humidity, 1));
                    Serial.print("H1: ");
                    Serial.println(humidity);
                    }

                    delay(dht2.getMinimumSamplingPeriod());

                    float temperature = dht2.getTemperature();
                    if (isnan(temperature)) {
                    Serial.println("Failed reading temperature from DHT");
                    } else if (temperature != lastTemp2) {
                    lastTemp = temperature;
                    if (!metric) {
                    temperature = dht2.toFahrenheit(temperature);
                    }
                    gw.send(msgTemp2.set(temperature, 1));
                    Serial.print("T2: ");
                    Serial.println(temperature);
                    }

                    float humidity = dht2.getHumidity();
                    if (isnan(humidity)) {
                    Serial.println("Failed reading humidity from DHT");
                    } else if (humidity != lastHum2) {
                    lastHum = humidity;
                    gw.send(msgHum2.set(humidity, 1));
                    Serial.print("H2: ");
                    Serial.println(humidity);
                    }

                    gw.sleep(SLEEP_TIME); //sleep a bit
                    }

                    thanks for the help, you messed up a little with the number and the names of the nodes but after 5 min i could compile it... now the test starts...

                    SparkmanS Offline
                    SparkmanS Offline
                    Sparkman
                    Hero Member
                    wrote on last edited by
                    #9

                    @michlb1982 Glad you got it working. Do you mind posting the fixed code for reference?

                    Cheers
                    Al

                    1 Reply Last reply
                    0
                    • michlb1982M Offline
                      michlb1982M Offline
                      michlb1982
                      wrote on last edited by
                      #10

                      well it works but not 100% and it needs a lot of time that the relay switches....
                      is there a way to speed up the time between giving the order and the switching of the relay?...

                      here the code

                      #include <SPI.h>
                      #include <MySensor.h>  
                      #include <DHT.h>  
                      
                      //Definition der Sensoren
                      #define CHILD_ID1_HUM 1
                      #define CHILD_ID1_TEMP 1
                      #define CHILD_ID2_HUM 2
                      #define CHILD_ID2_TEMP 2
                      #define CHILD_ID3_HUM 3
                      #define CHILD_ID3_TEMP 3
                      const int HUMIDITY_SENSOR1_DIGITAL_PIN = 8;
                      const int HUMIDITY_SENSOR2_DIGITAL_PIN = 7;
                      const int HUMIDITY_SENSOR3_DIGITAL_PIN = 6;
                      
                      //Definition der Relays
                      const int RELAY[] = {A0, A1, A2, A3};// Arduio Digital I/O pin number for first relay (second on pin+1 etc)
                      #define NUMBER_OF_RELAYS 4 // 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
                      
                      unsigned long SLEEP_TIME = 15*1000; // Sleep time between reads (in milliseconds)
                      
                      MySensor gw;
                      DHT dht1;
                      DHT dht2;
                      DHT dht3;
                      float lastTemp1;
                      float lastHum1;
                      float lastTemp2;
                      float lastHum2;
                      float lastTemp3;
                      float lastHum3;
                      boolean metric = true; 
                      MyMessage msgHum1(CHILD_ID1_HUM, V_HUM);
                      MyMessage msgTemp1(CHILD_ID1_TEMP, V_TEMP);
                      MyMessage msgHum2(CHILD_ID2_HUM, V_HUM);
                      MyMessage msgTemp2(CHILD_ID2_TEMP, V_TEMP);
                      MyMessage msgHum3(CHILD_ID3_HUM, V_HUM);
                      MyMessage msgTemp3(CHILD_ID3_TEMP, V_TEMP);
                      
                      void setup()  
                      { 
                        gw.begin();
                        dht1.setup(HUMIDITY_SENSOR1_DIGITAL_PIN); 
                        dht2.setup(HUMIDITY_SENSOR2_DIGITAL_PIN); 
                        dht3.setup(HUMIDITY_SENSOR3_DIGITAL_PIN); 
                      
                      
                        // Send the Sketch Version Information to the Gateway
                        gw.sendSketchInfo("Humidity", "1.0");
                      
                        // Register all sensors to gw (they will be created as child devices)
                        gw.present(CHILD_ID1_HUM, S_HUM);
                        gw.present(CHILD_ID1_TEMP, S_TEMP);
                        gw.present(CHILD_ID2_HUM, S_HUM);
                        gw.present(CHILD_ID2_TEMP, S_TEMP);
                        gw.present(CHILD_ID3_HUM, S_HUM);
                        gw.present(CHILD_ID3_TEMP, S_TEMP);
                        
                        metric = gw.getConfig().isMetric;
                          // Initialize library and add callback for incoming messages
                        gw.begin(incomingMessage, AUTO, true);
                        // Send the sketch version information to the gateway and Controller
                        gw.sendSketchInfo("Relay", "1.4");
                      
                        // Fetch relay status
                        for (int sensor=1, pin=0; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
                          // Register all sensors to gw (they will be created as child devices)
                          gw.present(sensor, S_LIGHT);
                          // Then set relay pins in output mode
                          pinMode(RELAY[pin], OUTPUT);   
                          // Set relay to last known state (using eeprom storage) 
                          digitalWrite(RELAY[pin], gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
                          //digitalWrite(RELAY[pin], 0);  //schaltet standardmaessig aus
                      }
                      
                      }
                      
                      void loop()      
                      
                      {
                        // Alway process incoming messages whenever possible
                        gw.process();
                      }
                      
                      void incomingMessage(const MyMessage &message) {
                        // We only expect one type of message from controller. But we better check anyway.
                         if (message.type==V_LIGHT) {
                           // Change relay state
                           digitalWrite(RELAY[message.sensor-1], message.getBool()?RELAY_ON:RELAY_OFF);
                           // Store state in eeprom
                           gw.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());
                         }  
                        
                      //DHT 11 Sensor 1
                        delay(dht1.getMinimumSamplingPeriod());
                      
                        float temperature1 = dht1.getTemperature();
                        if (isnan(temperature1)) {
                            Serial.println("Failed reading temperature from DHT");
                        } else if (temperature1 != lastTemp1) {
                          lastTemp1 = temperature1;
                          if (!metric) {
                            temperature1 = dht1.toFahrenheit(temperature1);
                          }
                          gw.send(msgTemp1.set(temperature1, 1));
                          Serial.print("T1: ");
                          Serial.println(temperature1);
                        }
                        
                        float humidity1 = dht1.getHumidity();
                        if (isnan(humidity1)) {
                            Serial.println("Failed reading humidity from DHT");
                        } else if (humidity1 != lastHum1) {
                            lastHum1 = humidity1;
                            gw.send(msgHum1.set(humidity1, 1));
                            Serial.print("H1: ");
                            Serial.println(humidity1);
                        }
                      
                      // DHT11 Sensor 2
                        delay(dht2.getMinimumSamplingPeriod());
                      
                        float temperature2 = dht2.getTemperature();
                        if (isnan(temperature2)) {
                            Serial.println("Failed reading temperature from DHT");
                        } else if (temperature2 != lastTemp2) {
                          lastTemp2 = temperature2;
                          if (!metric) {
                            temperature2 = dht2.toFahrenheit(temperature2);
                          }
                          gw.send(msgTemp2.set(temperature2, 1));
                          Serial.print("T2: ");
                          Serial.println(temperature2);
                        }
                        
                        float humidity2 = dht2.getHumidity();
                        if (isnan(humidity2)) {
                            Serial.println("Failed reading humidity from DHT");
                        } else if (humidity2 != lastHum2) {
                            lastHum2 = humidity2;
                            gw.send(msgHum2.set(humidity2, 1));
                            Serial.print("H2: ");
                            Serial.println(humidity2);
                        }
                        
                      //DHT11 Sensor 3 
                        delay(dht3.getMinimumSamplingPeriod());
                      
                        float temperature3 = dht3.getTemperature();
                        if (isnan(temperature3)) {
                            Serial.println("Failed reading temperature from DHT");
                        } else if (temperature3 != lastTemp3) {
                          lastTemp3 = temperature3;
                          if (!metric) {
                            temperature3 = dht3.toFahrenheit(temperature3);
                          }
                          gw.send(msgTemp3.set(temperature3, 1));
                          Serial.print("T3: ");
                          Serial.println(temperature3);
                        }
                        
                        float humidity3 = dht3.getHumidity();
                        if (isnan(humidity3)) {
                            Serial.println("Failed reading humidity from DHT");
                        } else if (humidity3 != lastHum3) {
                            lastHum3 = humidity3;
                            gw.send(msgHum3.set(humidity3, 1));
                            Serial.print("H3: ");
                            Serial.println(humidity3);
                        }
                      
                        gw.sleep(SLEEP_TIME); //sleep a bit
                      }
                      

                      maybe someone has an idea?

                      the next problem, when i unplug the power and replug it, the relay gets into the last status, i want the relay always off only when i give the order... in case of "off-plowering " it shall be off after replug...
                      did i explained understandable??

                      short: relay = off , order to switch on => relay on , cut off power and replug Relay => still off...

                      SparkmanS 1 Reply Last reply
                      0
                      • michlb1982M michlb1982

                        well it works but not 100% and it needs a lot of time that the relay switches....
                        is there a way to speed up the time between giving the order and the switching of the relay?...

                        here the code

                        #include <SPI.h>
                        #include <MySensor.h>  
                        #include <DHT.h>  
                        
                        //Definition der Sensoren
                        #define CHILD_ID1_HUM 1
                        #define CHILD_ID1_TEMP 1
                        #define CHILD_ID2_HUM 2
                        #define CHILD_ID2_TEMP 2
                        #define CHILD_ID3_HUM 3
                        #define CHILD_ID3_TEMP 3
                        const int HUMIDITY_SENSOR1_DIGITAL_PIN = 8;
                        const int HUMIDITY_SENSOR2_DIGITAL_PIN = 7;
                        const int HUMIDITY_SENSOR3_DIGITAL_PIN = 6;
                        
                        //Definition der Relays
                        const int RELAY[] = {A0, A1, A2, A3};// Arduio Digital I/O pin number for first relay (second on pin+1 etc)
                        #define NUMBER_OF_RELAYS 4 // 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
                        
                        unsigned long SLEEP_TIME = 15*1000; // Sleep time between reads (in milliseconds)
                        
                        MySensor gw;
                        DHT dht1;
                        DHT dht2;
                        DHT dht3;
                        float lastTemp1;
                        float lastHum1;
                        float lastTemp2;
                        float lastHum2;
                        float lastTemp3;
                        float lastHum3;
                        boolean metric = true; 
                        MyMessage msgHum1(CHILD_ID1_HUM, V_HUM);
                        MyMessage msgTemp1(CHILD_ID1_TEMP, V_TEMP);
                        MyMessage msgHum2(CHILD_ID2_HUM, V_HUM);
                        MyMessage msgTemp2(CHILD_ID2_TEMP, V_TEMP);
                        MyMessage msgHum3(CHILD_ID3_HUM, V_HUM);
                        MyMessage msgTemp3(CHILD_ID3_TEMP, V_TEMP);
                        
                        void setup()  
                        { 
                          gw.begin();
                          dht1.setup(HUMIDITY_SENSOR1_DIGITAL_PIN); 
                          dht2.setup(HUMIDITY_SENSOR2_DIGITAL_PIN); 
                          dht3.setup(HUMIDITY_SENSOR3_DIGITAL_PIN); 
                        
                        
                          // Send the Sketch Version Information to the Gateway
                          gw.sendSketchInfo("Humidity", "1.0");
                        
                          // Register all sensors to gw (they will be created as child devices)
                          gw.present(CHILD_ID1_HUM, S_HUM);
                          gw.present(CHILD_ID1_TEMP, S_TEMP);
                          gw.present(CHILD_ID2_HUM, S_HUM);
                          gw.present(CHILD_ID2_TEMP, S_TEMP);
                          gw.present(CHILD_ID3_HUM, S_HUM);
                          gw.present(CHILD_ID3_TEMP, S_TEMP);
                          
                          metric = gw.getConfig().isMetric;
                            // Initialize library and add callback for incoming messages
                          gw.begin(incomingMessage, AUTO, true);
                          // Send the sketch version information to the gateway and Controller
                          gw.sendSketchInfo("Relay", "1.4");
                        
                          // Fetch relay status
                          for (int sensor=1, pin=0; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
                            // Register all sensors to gw (they will be created as child devices)
                            gw.present(sensor, S_LIGHT);
                            // Then set relay pins in output mode
                            pinMode(RELAY[pin], OUTPUT);   
                            // Set relay to last known state (using eeprom storage) 
                            digitalWrite(RELAY[pin], gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
                            //digitalWrite(RELAY[pin], 0);  //schaltet standardmaessig aus
                        }
                        
                        }
                        
                        void loop()      
                        
                        {
                          // Alway process incoming messages whenever possible
                          gw.process();
                        }
                        
                        void incomingMessage(const MyMessage &message) {
                          // We only expect one type of message from controller. But we better check anyway.
                           if (message.type==V_LIGHT) {
                             // Change relay state
                             digitalWrite(RELAY[message.sensor-1], message.getBool()?RELAY_ON:RELAY_OFF);
                             // Store state in eeprom
                             gw.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());
                           }  
                          
                        //DHT 11 Sensor 1
                          delay(dht1.getMinimumSamplingPeriod());
                        
                          float temperature1 = dht1.getTemperature();
                          if (isnan(temperature1)) {
                              Serial.println("Failed reading temperature from DHT");
                          } else if (temperature1 != lastTemp1) {
                            lastTemp1 = temperature1;
                            if (!metric) {
                              temperature1 = dht1.toFahrenheit(temperature1);
                            }
                            gw.send(msgTemp1.set(temperature1, 1));
                            Serial.print("T1: ");
                            Serial.println(temperature1);
                          }
                          
                          float humidity1 = dht1.getHumidity();
                          if (isnan(humidity1)) {
                              Serial.println("Failed reading humidity from DHT");
                          } else if (humidity1 != lastHum1) {
                              lastHum1 = humidity1;
                              gw.send(msgHum1.set(humidity1, 1));
                              Serial.print("H1: ");
                              Serial.println(humidity1);
                          }
                        
                        // DHT11 Sensor 2
                          delay(dht2.getMinimumSamplingPeriod());
                        
                          float temperature2 = dht2.getTemperature();
                          if (isnan(temperature2)) {
                              Serial.println("Failed reading temperature from DHT");
                          } else if (temperature2 != lastTemp2) {
                            lastTemp2 = temperature2;
                            if (!metric) {
                              temperature2 = dht2.toFahrenheit(temperature2);
                            }
                            gw.send(msgTemp2.set(temperature2, 1));
                            Serial.print("T2: ");
                            Serial.println(temperature2);
                          }
                          
                          float humidity2 = dht2.getHumidity();
                          if (isnan(humidity2)) {
                              Serial.println("Failed reading humidity from DHT");
                          } else if (humidity2 != lastHum2) {
                              lastHum2 = humidity2;
                              gw.send(msgHum2.set(humidity2, 1));
                              Serial.print("H2: ");
                              Serial.println(humidity2);
                          }
                          
                        //DHT11 Sensor 3 
                          delay(dht3.getMinimumSamplingPeriod());
                        
                          float temperature3 = dht3.getTemperature();
                          if (isnan(temperature3)) {
                              Serial.println("Failed reading temperature from DHT");
                          } else if (temperature3 != lastTemp3) {
                            lastTemp3 = temperature3;
                            if (!metric) {
                              temperature3 = dht3.toFahrenheit(temperature3);
                            }
                            gw.send(msgTemp3.set(temperature3, 1));
                            Serial.print("T3: ");
                            Serial.println(temperature3);
                          }
                          
                          float humidity3 = dht3.getHumidity();
                          if (isnan(humidity3)) {
                              Serial.println("Failed reading humidity from DHT");
                          } else if (humidity3 != lastHum3) {
                              lastHum3 = humidity3;
                              gw.send(msgHum3.set(humidity3, 1));
                              Serial.print("H3: ");
                              Serial.println(humidity3);
                          }
                        
                          gw.sleep(SLEEP_TIME); //sleep a bit
                        }
                        

                        maybe someone has an idea?

                        the next problem, when i unplug the power and replug it, the relay gets into the last status, i want the relay always off only when i give the order... in case of "off-plowering " it shall be off after replug...
                        did i explained understandable??

                        short: relay = off , order to switch on => relay on , cut off power and replug Relay => still off...

                        SparkmanS Offline
                        SparkmanS Offline
                        Sparkman
                        Hero Member
                        wrote on last edited by
                        #11

                        @michlb1982

                        A couple of things, you put the device to sleep so while it's asleep, it won't respond to the commands to change the relays. Since you are combining relays and sensors, you need to keep the unit awake and find a different way to send the sensor data occasionally. For the relay status, read the comments in the sketch. You are saving the relay state and then reading that on startup. You can eliminate all of that code and just set the relay to off in the setup section.

                        Cheers
                        Al

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


                        10

                        Online

                        11.7k

                        Users

                        11.2k

                        Topics

                        113.0k

                        Posts


                        Copyright 2019 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