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. Multisensor PIR problem [solved]

Multisensor PIR problem [solved]

Scheduled Pinned Locked Moved Troubleshooting
53 Posts 7 Posters 26.3k 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.
  • R Offline
    R Offline
    rvendrame
    Hero Member
    wrote on last edited by
    #28

    if you put the delay() inside that 'if ( mills() > mytime ) ' , what happens?

    Home Assistant / Vera Plus UI7
    ESP8266 GW + mySensors 2.3.2
    Alexa / Google Home

    N 1 Reply Last reply
    0
    • SweebeeS Sweebee

      @rvendrame When the PIR is connected to PIN3 the interrupt is INT1. Pin 1 does not have an interrupt.

      Only pin 2 and pin 3 have an interrupt.

      Pin 2 = int0
      pin 3 = int1

      N Offline
      N Offline
      n3ro
      wrote on last edited by
      #29

      @Sweebee is it possible to fix the problem when DHT is connected to pin 4?

      pimatic + MySensors + Homeduino + z-way
      https://github.com/n3roGit/MySensors_n3ro

      1 Reply Last reply
      0
      • R Offline
        R Offline
        rvendrame
        Hero Member
        wrote on last edited by
        #30

        @n3ro said:

        s it possible to fix the problem when DHT is connected to pin 4?

        It worth a try ...

        Home Assistant / Vera Plus UI7
        ESP8266 GW + mySensors 2.3.2
        Alexa / Google Home

        1 Reply Last reply
        0
        • R rvendrame

          if you put the delay() inside that 'if ( mills() > mytime ) ' , what happens?

          N Offline
          N Offline
          n3ro
          wrote on last edited by
          #31

          @rvendrame
          i have posted it before this post:

          "What is this number? Did you print the milis()?

          send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=fail:0
          6608 <<<<<<"

          in the posted sketch the delay is inside millis

          pimatic + MySensors + Homeduino + z-way
          https://github.com/n3roGit/MySensors_n3ro

          1 Reply Last reply
          0
          • R Offline
            R Offline
            rvendrame
            Hero Member
            wrote on last edited by
            #32

            I didn't find the if ( millis() > my time) in the last sketch you posted ...

            Home Assistant / Vera Plus UI7
            ESP8266 GW + mySensors 2.3.2
            Alexa / Google Home

            1 Reply Last reply
            0
            • N Offline
              N Offline
              n3ro
              wrote on last edited by
              #33

              if i use this

              #include <MySensor.h>
              #include <readVcc.h>
              #include <SPI.h>
              #include <DHT.h>
              
              
              #define NODE_ID 10                       // ID of node
              unsigned long SLEEP_TIME = 10000;        // Sleep time between reports (in milliseconds)
              
              #define CHILD_ID_PIR 1                   // Id of the sensor PIR
              #define CHILD_ID_HUM 2                   // Id of the sensor HUM
              #define CHILD_ID_TEMP 3                  // Id of the sensor TEMP
              #define CHILD_ID_LIGHT 4                 // Id of the sensor LIGHT
              
              #define PIR_SENSOR_DIGITAL 3           // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
              #define INTERRUPT PIR_SENSOR_DIGITAL-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
              #define HUMIDITY_SENSOR_DIGITAL_PIN 2
              #define LIGHT_SENSOR_ANALOG_PIN 0
              
              MySensor gw;
              // Initialize Variables
              MyMessage msgPir(CHILD_ID_PIR, V_TRIPPED);
              MyMessage msgHum(CHILD_ID_HUM, V_HUM);
              MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
              MyMessage msgLight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
              
              DHT dht;
              float lastTemp;
              float lastHum;
              boolean metric = true;
              int oldBatteryPcnt;
              int lastLightLevel;
              long mytime = 0;
              
              
              int MIN_V = 2700; // empty voltage (0%)
              int MAX_V = 3200; // full voltage (100%)
              
              void setup()
              {
                gw.begin(NULL, NODE_ID, false);
              
                //PIR
                // Send the sketch version information to the gateway and Controller
                gw.sendSketchInfo("Motion Sensor", "1.0");
              
                pinMode(PIR_SENSOR_DIGITAL, INPUT);      // sets the motion sensor digital pin as input
                digitalWrite(PIR_SENSOR_DIGITAL, HIGH);
                // Register all sensors to gw (they will be created as child devices)
                gw.present(CHILD_ID_PIR, S_MOTION);
              
                //DHT
                dht.setup(HUMIDITY_SENSOR_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_ID_HUM, S_HUM);
                gw.present(CHILD_ID_TEMP, S_TEMP);
              
                metric = gw.getConfig().isMetric;
              
                //LIGHT
                // Send the sketch version information to the gateway and Controller
                gw.sendSketchInfo("Light Sensor", "1.0");
              
                // Register all sensors to gateway (they will be created as child devices)
                gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
              
              }
              
              void loop()
              {
              
              
              
                // Read digital motion value
                boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                Serial.print("---------- PIR: ");
                Serial.println(tripped);
                gw.send(msgPir.set(tripped ? "1" : "0")); // Send tripped value to gw
              
              
                if ( millis() > mytime )  {
              
                  //DHT
                  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("---------- Temp: ");
                    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("---------- Humidity: ");
                    Serial.println(humidity);
                  }
                  mytime = millis() + dht.getMinimumSamplingPeriod();
              
                }
                // Sleep until interrupt comes in on motion sensor. Send update every two minute.
                gw.sleep(INTERRUPT, CHANGE, SLEEP_TIME);
              }
              

              i get this output:
              send: 10-10-0-0 s=255,c=3,t=11,pt=0,l=13,st=ok:Motion Sensor
              send: 10-10-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
              send: 10-10-0-0 s=1,c=0,t=1,pt=0,l=5,st=ok:1.4.1
              send: 10-10-0-0 s=255,c=3,t=11,pt=0,l=8,st=ok:Humidity
              send: 10-10-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
              send: 10-10-0-0 s=2,c=0,t=7,pt=0,l=5,st=ok:1.4.1
              send: 10-10-0-0 s=3,c=0,t=6,pt=0,l=5,st=ok:1.4.1
              send: 10-10-0-0 s=255,c=3,t=11,pt=0,l=12,st=ok:Light Sensor
              send: 10-10-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
              send: 10-10-0-0 s=4,c=0,t=16,pt=0,l=5,st=ok:1.4.1
              ---------- PIR: 1
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:1
              send: 10-10-0-0 s=3,c=1,t=0,pt=7,l=5,st=ok:17.2
              ---------- Temp: 17.20
              send: 10-10-0-0 s=2,c=1,t=1,pt=7,l=5,st=ok:43.8
              ---------- Humidity: 43.80
              ---------- PIR: 1
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:1
              ---------- PIR: 0
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
              ---------- PIR: 0
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
              ---------- PIR: 0
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
              ---------- PIR: 1
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:1
              ---------- PIR: 0
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
              ---------- PIR: 1
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:1
              ---------- PIR: 0
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
              ---------- PIR: 1
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:1
              ---------- PIR: 0
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
              ---------- PIR: 0
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
              ---------- PIR: 0
              send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0

              pimatic + MySensors + Homeduino + z-way
              https://github.com/n3roGit/MySensors_n3ro

              1 Reply Last reply
              0
              • SweebeeS Offline
                SweebeeS Offline
                Sweebee
                wrote on last edited by
                #34

                This can't work well. Your interrupt is set on pin1 - 2 = int-1?

                What happens when you remove the pir and use a switch instead?

                N 1 Reply Last reply
                0
                • SweebeeS Sweebee

                  This can't work well. Your interrupt is set on pin1 - 2 = int-1?

                  What happens when you remove the pir and use a switch instead?

                  N Offline
                  N Offline
                  n3ro
                  wrote on last edited by
                  #35

                  @Sweebee
                  is #define INTERRUPT PIR_SENSOR_DIGITAL-2 wrong?

                  when i use a switch it looks OK

                  pimatic + MySensors + Homeduino + z-way
                  https://github.com/n3roGit/MySensors_n3ro

                  1 Reply Last reply
                  0
                  • R Offline
                    R Offline
                    rvendrame
                    Hero Member
                    wrote on last edited by
                    #36

                    @n3ro , what is wrong at your last test? The PIR is reporting 0 and 1, and from time to time there is a temp/hum report as well.

                    Home Assistant / Vera Plus UI7
                    ESP8266 GW + mySensors 2.3.2
                    Alexa / Google Home

                    N 1 Reply Last reply
                    0
                    • R rvendrame

                      @n3ro , what is wrong at your last test? The PIR is reporting 0 and 1, and from time to time there is a temp/hum report as well.

                      N Offline
                      N Offline
                      n3ro
                      wrote on last edited by
                      #37

                      @rvendrame in my last test the pir sends endless 0 and dont sleep

                      pimatic + MySensors + Homeduino + z-way
                      https://github.com/n3roGit/MySensors_n3ro

                      1 Reply Last reply
                      0
                      • R Offline
                        R Offline
                        rvendrame
                        Hero Member
                        wrote on last edited by
                        #38

                        Which arduino PIN do you use to connect the PIR?

                        Home Assistant / Vera Plus UI7
                        ESP8266 GW + mySensors 2.3.2
                        Alexa / Google Home

                        N 1 Reply Last reply
                        0
                        • R rvendrame

                          Which arduino PIN do you use to connect the PIR?

                          N Offline
                          N Offline
                          n3ro
                          wrote on last edited by
                          #39

                          @n3ro said:

                          #define PIR_SENSOR_DIGITAL 3

                          :)

                          pimatic + MySensors + Homeduino + z-way
                          https://github.com/n3roGit/MySensors_n3ro

                          1 Reply Last reply
                          0
                          • R Offline
                            R Offline
                            rvendrame
                            Hero Member
                            wrote on last edited by
                            #40

                            Perfect. If it is working fine with a switch --- Maybe your PIN is triggering false positives? Or maybe the PIR output is floating a bit, and arduino is triggering it more than it should?

                            Home Assistant / Vera Plus UI7
                            ESP8266 GW + mySensors 2.3.2
                            Alexa / Google Home

                            1 Reply Last reply
                            0
                            • SweebeeS Offline
                              SweebeeS Offline
                              Sweebee
                              wrote on last edited by Sweebee
                              #41

                              If a switch works than the only could be the pir itself. You have enabled the pull-up resistor so an open collector should not give floats.

                              You already told that a sketch with a pir only worked fine?

                              Well, i can test what happens with my dht22 and a pir tomorrow (with your sketch).

                              N 1 Reply Last reply
                              0
                              • SweebeeS Sweebee

                                If a switch works than the only could be the pir itself. You have enabled the pull-up resistor so an open collector should not give floats.

                                You already told that a sketch with a pir only worked fine?

                                Well, i can test what happens with my dht22 and a pir tomorrow (with your sketch).

                                N Offline
                                N Offline
                                n3ro
                                wrote on last edited by
                                #42

                                @Sweebee thy this would be very nice :)

                                You find my sketch here:
                                https://github.com/n3roGit/MySensors_n3ro/tree/master/MotionSensor_DHT_light_battery_mod

                                pimatic + MySensors + Homeduino + z-way
                                https://github.com/n3roGit/MySensors_n3ro

                                B 1 Reply Last reply
                                0
                                • N n3ro

                                  @Sweebee thy this would be very nice :)

                                  You find my sketch here:
                                  https://github.com/n3roGit/MySensors_n3ro/tree/master/MotionSensor_DHT_light_battery_mod

                                  B Offline
                                  B Offline
                                  BulldogLowell
                                  Contest Winner
                                  wrote on last edited by
                                  #43

                                  @n3ro

                                  you are sending an update on the PIR status every time the arduino wakes from a sleep, which you don't need.

                                  Also, and this probably isn't a problem right now, but will case a problem later, use unsigned subtraction in your millis( ) timers

                                  could not see where you were using the library, so I commented it out below, not having it on my computer

                                  I also made a few more notes in the code:

                                  #include <MySensor.h>
                                  //#include <readVcc.h> // cannot see where you are using this library yet
                                  #include <SPI.h>
                                  #include <DHT.h>
                                  
                                  #define NODE_ID 10                       // ID of node
                                  unsigned long SLEEP_TIME = 10000UL;        // Sleep time between reports (in milliseconds)
                                  
                                  #define CHILD_ID_PIR 1                   // Id of the sensor PIR
                                  #define CHILD_ID_HUM 2                   // Id of the sensor HUM
                                  #define CHILD_ID_TEMP 3                  // Id of the sensor TEMP
                                  #define CHILD_ID_LIGHT 4                 // Id of the sensor LIGHT
                                  
                                  #define PIR_SENSOR_DIGITAL 3           // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
                                  #define INTERRUPT PIR_SENSOR_DIGITAL-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
                                  #define HUMIDITY_SENSOR_DIGITAL_PIN 2
                                  #define LIGHT_SENSOR_ANALOG_PIN 0
                                  
                                  MySensor gw;
                                  // Initialize Variables
                                  MyMessage msgPir(CHILD_ID_PIR, V_TRIPPED);
                                  MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                                  MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                                  MyMessage msgLight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
                                  
                                  DHT dht;
                                  float lastTemp;
                                  float lastHum;
                                  boolean metric = true;
                                  boolean lastTripped = false;
                                  int oldBatteryPcnt;
                                  int lastLightLevel;
                                  unsigned long mytime;
                                  //int MIN_V = 2700; // empty voltage (0%)
                                  //int MAX_V = 3200; // full voltage (100%)
                                  
                                  void setup()
                                  {
                                    gw.begin(NULL, NODE_ID, false);
                                    gw.sendSketchInfo("Motion Sensor", "1.0"); // here you call it motion sensor
                                    pinMode(PIR_SENSOR_DIGITAL, INPUT_PULLUP);
                                    gw.present(CHILD_ID_PIR, S_MOTION);
                                    dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
                                    //gw.sendSketchInfo("Humidity", "1.0"); // here you call it humidity
                                    gw.present(CHILD_ID_HUM, S_HUM);
                                    gw.present(CHILD_ID_TEMP, S_TEMP);
                                    metric = gw.getConfig().isMetric;
                                    //gw.sendSketchInfo("Light Sensor", "1.0");// pick a name for your sketch, it will only be one
                                    gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
                                  }
                                  
                                  void loop()
                                  {
                                    // why send this every time?  
                                    /*
                                    boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                                    Serial.print("---------- PIR: ");
                                    Serial.println(tripped);
                                    gw.send(msgPir.set(tripped ? "1" : "0"));
                                    */
                                    boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                                    if (tripped != lastTripped)  // only need to update controller on a change.
                                    {
                                      gw.send(msgPir.set(tripped? "1" : "0"));
                                      Serial.print("---------- PIR: ");
                                      Serial.println(tripped? "tripped" : " not tripped");
                                      lastTripped = tripped;
                                    }
                                    if ( millis() - mytime >= SLEEP_TIME )  //use UNSIGNED SUBRTACTION im your millis() timers to avoid rollover issues later on down the line
                                    {
                                      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("---------- Temp: ");
                                        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("---------- Humidity: ");
                                        Serial.println(humidity);
                                      }
                                      mytime = millis();
                                    }
                                    gw.sleep(INTERRUPT, CHANGE, SLEEP_TIME); // Sleep until interrupt detected from motion sensor. Send update every SLEEP_TIME.
                                  }
                                  
                                  N 1 Reply Last reply
                                  0
                                  • B BulldogLowell

                                    @n3ro

                                    you are sending an update on the PIR status every time the arduino wakes from a sleep, which you don't need.

                                    Also, and this probably isn't a problem right now, but will case a problem later, use unsigned subtraction in your millis( ) timers

                                    could not see where you were using the library, so I commented it out below, not having it on my computer

                                    I also made a few more notes in the code:

                                    #include <MySensor.h>
                                    //#include <readVcc.h> // cannot see where you are using this library yet
                                    #include <SPI.h>
                                    #include <DHT.h>
                                    
                                    #define NODE_ID 10                       // ID of node
                                    unsigned long SLEEP_TIME = 10000UL;        // Sleep time between reports (in milliseconds)
                                    
                                    #define CHILD_ID_PIR 1                   // Id of the sensor PIR
                                    #define CHILD_ID_HUM 2                   // Id of the sensor HUM
                                    #define CHILD_ID_TEMP 3                  // Id of the sensor TEMP
                                    #define CHILD_ID_LIGHT 4                 // Id of the sensor LIGHT
                                    
                                    #define PIR_SENSOR_DIGITAL 3           // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
                                    #define INTERRUPT PIR_SENSOR_DIGITAL-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
                                    #define HUMIDITY_SENSOR_DIGITAL_PIN 2
                                    #define LIGHT_SENSOR_ANALOG_PIN 0
                                    
                                    MySensor gw;
                                    // Initialize Variables
                                    MyMessage msgPir(CHILD_ID_PIR, V_TRIPPED);
                                    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                                    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                                    MyMessage msgLight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
                                    
                                    DHT dht;
                                    float lastTemp;
                                    float lastHum;
                                    boolean metric = true;
                                    boolean lastTripped = false;
                                    int oldBatteryPcnt;
                                    int lastLightLevel;
                                    unsigned long mytime;
                                    //int MIN_V = 2700; // empty voltage (0%)
                                    //int MAX_V = 3200; // full voltage (100%)
                                    
                                    void setup()
                                    {
                                      gw.begin(NULL, NODE_ID, false);
                                      gw.sendSketchInfo("Motion Sensor", "1.0"); // here you call it motion sensor
                                      pinMode(PIR_SENSOR_DIGITAL, INPUT_PULLUP);
                                      gw.present(CHILD_ID_PIR, S_MOTION);
                                      dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
                                      //gw.sendSketchInfo("Humidity", "1.0"); // here you call it humidity
                                      gw.present(CHILD_ID_HUM, S_HUM);
                                      gw.present(CHILD_ID_TEMP, S_TEMP);
                                      metric = gw.getConfig().isMetric;
                                      //gw.sendSketchInfo("Light Sensor", "1.0");// pick a name for your sketch, it will only be one
                                      gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
                                    }
                                    
                                    void loop()
                                    {
                                      // why send this every time?  
                                      /*
                                      boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                                      Serial.print("---------- PIR: ");
                                      Serial.println(tripped);
                                      gw.send(msgPir.set(tripped ? "1" : "0"));
                                      */
                                      boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                                      if (tripped != lastTripped)  // only need to update controller on a change.
                                      {
                                        gw.send(msgPir.set(tripped? "1" : "0"));
                                        Serial.print("---------- PIR: ");
                                        Serial.println(tripped? "tripped" : " not tripped");
                                        lastTripped = tripped;
                                      }
                                      if ( millis() - mytime >= SLEEP_TIME )  //use UNSIGNED SUBRTACTION im your millis() timers to avoid rollover issues later on down the line
                                      {
                                        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("---------- Temp: ");
                                          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("---------- Humidity: ");
                                          Serial.println(humidity);
                                        }
                                        mytime = millis();
                                      }
                                      gw.sleep(INTERRUPT, CHANGE, SLEEP_TIME); // Sleep until interrupt detected from motion sensor. Send update every SLEEP_TIME.
                                    }
                                    
                                    N Offline
                                    N Offline
                                    n3ro
                                    wrote on last edited by
                                    #44

                                    @BulldogLowell

                                    Hey, its a good idea to send only PIR if changed!
                                    The unused code in the sketch is because i have reduced the used functions to the minimum to debug it better. The full sketch has LDR and battery lifetime output too.

                                    i have added some extra output in the modified sketch:

                                    #include <MySensor.h>
                                    //#include <readVcc.h> // cannot see where you are using this library yet
                                    #include <SPI.h>
                                    #include <DHT.h>
                                    
                                    #define NODE_ID 10                       // ID of node
                                    unsigned long SLEEP_TIME = 10000UL;        // Sleep time between reports (in milliseconds)
                                    
                                    #define CHILD_ID_PIR 1                   // Id of the sensor PIR
                                    #define CHILD_ID_HUM 2                   // Id of the sensor HUM
                                    #define CHILD_ID_TEMP 3                  // Id of the sensor TEMP
                                    #define CHILD_ID_LIGHT 4                 // Id of the sensor LIGHT
                                    
                                    #define PIR_SENSOR_DIGITAL 3           // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
                                    #define INTERRUPT PIR_SENSOR_DIGITAL-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
                                    #define HUMIDITY_SENSOR_DIGITAL_PIN 2
                                    #define LIGHT_SENSOR_ANALOG_PIN 0
                                    
                                    MySensor gw;
                                    // Initialize Variables
                                    MyMessage msgPir(CHILD_ID_PIR, V_TRIPPED);
                                    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                                    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                                    MyMessage msgLight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
                                    
                                    DHT dht;
                                    float lastTemp;
                                    float lastHum;
                                    boolean metric = true;
                                    boolean lastTripped = false;
                                    int oldBatteryPcnt;
                                    int lastLightLevel;
                                    unsigned long mytime;
                                    //int MIN_V = 2700; // empty voltage (0%)
                                    //int MAX_V = 3200; // full voltage (100%)
                                    
                                    void setup()
                                    {
                                      gw.begin(NULL, NODE_ID, false);
                                      gw.sendSketchInfo("Motion Sensor", "1.0"); // here you call it motion sensor
                                      pinMode(PIR_SENSOR_DIGITAL, INPUT_PULLUP);
                                      gw.present(CHILD_ID_PIR, S_MOTION);
                                      dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
                                      //gw.sendSketchInfo("Humidity", "1.0"); // here you call it humidity
                                      gw.present(CHILD_ID_HUM, S_HUM);
                                      gw.present(CHILD_ID_TEMP, S_TEMP);
                                      metric = gw.getConfig().isMetric;
                                      //gw.sendSketchInfo("Light Sensor", "1.0");// pick a name for your sketch, it will only be one
                                      gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
                                    }
                                    
                                    void loop()
                                    {
                                      // why send this every time?
                                      /*
                                      boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                                      Serial.print("---------- PIR: ");
                                      Serial.println(tripped);
                                      gw.send(msgPir.set(tripped ? "1" : "0"));
                                      */
                                      boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                                      if (tripped != lastTripped)  // only need to update controller on a change.
                                      {
                                        gw.send(msgPir.set(tripped ? "1" : "0"));
                                        Serial.print("---------- PIR: ");
                                        Serial.println(tripped ? "tripped" : " not tripped");
                                        lastTripped = tripped;
                                      }
                                      if ( millis() - mytime >= SLEEP_TIME )  //use UNSIGNED SUBRTACTION im your millis() timers to avoid rollover issues later on down the line
                                      {
                                        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("---------- Temp: ");
                                          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("---------- Humidity: ");
                                          Serial.println(humidity);
                                        }
                                        mytime = millis();
                                    
                                      }
                                      else
                                      {
                                        Serial.println("no millis");
                                      }
                                      Serial.println(millis());
                                      Serial.println(mytime);
                                      Serial.println(SLEEP_TIME);
                                      gw.sleep(INTERRUPT, CHANGE, SLEEP_TIME); // Sleep until interrupt detected from motion sensor. Send update every SLEEP_TIME.
                                    }
                                    

                                    send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=fail:0
                                    ---------- PIR: not tripped
                                    no millis
                                    2185
                                    0
                                    10000
                                    no millis
                                    2189
                                    0
                                    10000
                                    no millis
                                    2193
                                    0
                                    10000
                                    no millis
                                    2195
                                    0
                                    10000
                                    no millis
                                    2197
                                    0
                                    10000
                                    no millis
                                    2201
                                    0
                                    10000
                                    no millis
                                    2203
                                    0
                                    10000
                                    no millis
                                    2205
                                    0
                                    10000
                                    no millis
                                    2209
                                    0
                                    10000
                                    no millis
                                    2211
                                    0
                                    10000
                                    no millis

                                    You can see that the "if millis" will never used .:(

                                    pimatic + MySensors + Homeduino + z-way
                                    https://github.com/n3roGit/MySensors_n3ro

                                    1 Reply Last reply
                                    0
                                    • N Offline
                                      N Offline
                                      n3ro
                                      wrote on last edited by
                                      #45

                                      i think millis didnt work with sleep. the counter is not increasing when sleeping..

                                      pimatic + MySensors + Homeduino + z-way
                                      https://github.com/n3roGit/MySensors_n3ro

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

                                        @n3ro said:

                                        delay(dht.getMinimumSamplingPeriod());

                                        you dont need this:

                                        delay(dht.getMinimumSamplingPeriod());
                                        

                                        since you are sleeping longer than the minimum sampling period

                                        try like this, removing the timer, just use the sleep period t update temp/humidity (untested):

                                        #include <MySensor.h>
                                        //#include <readVcc.h> // cannot see where you are using this library yet
                                        #include <SPI.h>
                                        #include <DHT.h>
                                        
                                        #define NODE_ID 10                       // ID of node
                                        unsigned long SLEEP_TIME = 10000UL;        // Sleep time between reports (in milliseconds)
                                        
                                        #define CHILD_ID_PIR 1                   // Id of the sensor PIR
                                        #define CHILD_ID_HUM 2                   // Id of the sensor HUM
                                        #define CHILD_ID_TEMP 3                  // Id of the sensor TEMP
                                        #define CHILD_ID_LIGHT 4                 // Id of the sensor LIGHT
                                        
                                        #define PIR_SENSOR_DIGITAL 3           // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
                                        #define INTERRUPT PIR_SENSOR_DIGITAL-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
                                        #define HUMIDITY_SENSOR_DIGITAL_PIN 2
                                        #define LIGHT_SENSOR_ANALOG_PIN 0
                                        
                                        MySensor gw;
                                        // Initialize Variables
                                        MyMessage msgPir(CHILD_ID_PIR, V_TRIPPED);
                                        MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                                        MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                                        MyMessage msgLight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
                                        
                                        DHT dht;
                                        float lastTemp;
                                        float lastHum;
                                        boolean metric = true;
                                        boolean lastTripped = false;
                                        int oldBatteryPcnt;
                                        int lastLightLevel;
                                        //int MIN_V = 2700; // empty voltage (0%)
                                        //int MAX_V = 3200; // full voltage (100%)
                                        
                                        void setup()
                                        {
                                          gw.begin(NULL, NODE_ID, false);
                                          gw.sendSketchInfo("Motion Sensor", "1.0"); // here you call it motion sensor
                                          pinMode(PIR_SENSOR_DIGITAL, INPUT_PULLUP);
                                          gw.present(CHILD_ID_PIR, S_MOTION);
                                          dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
                                          //gw.sendSketchInfo("Humidity", "1.0"); // here you call it humidity
                                          gw.present(CHILD_ID_HUM, S_HUM);
                                          gw.present(CHILD_ID_TEMP, S_TEMP);
                                          metric = gw.getConfig().isMetric;
                                          //gw.sendSketchInfo("Light Sensor", "1.0");// pick a name for your sketch, it will only be one
                                          gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
                                        }
                                        
                                        void loop()
                                        {
                                          // why send this every time?
                                          /*
                                          boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                                          Serial.print("---------- PIR: ");
                                          Serial.println(tripped);
                                          gw.send(msgPir.set(tripped ? "1" : "0"));
                                          */
                                          boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                                          if (tripped != lastTripped)  // only need to update controller on a change.
                                          {
                                            gw.send(msgPir.set(tripped ? "1" : "0"));
                                            Serial.print("---------- PIR: ");
                                            Serial.println(tripped ? "tripped" : " not tripped");
                                            lastTripped = tripped;
                                          }
                                          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("---------- Temp: ");
                                            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("---------- Humidity: ");
                                            Serial.println(humidity);
                                          }
                                          gw.sleep(INTERRUPT, CHANGE, SLEEP_TIME); // Sleep until interrupt detected from motion sensor. Send update every SLEEP_TIME.
                                        }
                                        
                                        N 1 Reply Last reply
                                        0
                                        • B BulldogLowell

                                          @n3ro said:

                                          delay(dht.getMinimumSamplingPeriod());

                                          you dont need this:

                                          delay(dht.getMinimumSamplingPeriod());
                                          

                                          since you are sleeping longer than the minimum sampling period

                                          try like this, removing the timer, just use the sleep period t update temp/humidity (untested):

                                          #include <MySensor.h>
                                          //#include <readVcc.h> // cannot see where you are using this library yet
                                          #include <SPI.h>
                                          #include <DHT.h>
                                          
                                          #define NODE_ID 10                       // ID of node
                                          unsigned long SLEEP_TIME = 10000UL;        // Sleep time between reports (in milliseconds)
                                          
                                          #define CHILD_ID_PIR 1                   // Id of the sensor PIR
                                          #define CHILD_ID_HUM 2                   // Id of the sensor HUM
                                          #define CHILD_ID_TEMP 3                  // Id of the sensor TEMP
                                          #define CHILD_ID_LIGHT 4                 // Id of the sensor LIGHT
                                          
                                          #define PIR_SENSOR_DIGITAL 3           // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
                                          #define INTERRUPT PIR_SENSOR_DIGITAL-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
                                          #define HUMIDITY_SENSOR_DIGITAL_PIN 2
                                          #define LIGHT_SENSOR_ANALOG_PIN 0
                                          
                                          MySensor gw;
                                          // Initialize Variables
                                          MyMessage msgPir(CHILD_ID_PIR, V_TRIPPED);
                                          MyMessage msgHum(CHILD_ID_HUM, V_HUM);
                                          MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
                                          MyMessage msgLight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
                                          
                                          DHT dht;
                                          float lastTemp;
                                          float lastHum;
                                          boolean metric = true;
                                          boolean lastTripped = false;
                                          int oldBatteryPcnt;
                                          int lastLightLevel;
                                          //int MIN_V = 2700; // empty voltage (0%)
                                          //int MAX_V = 3200; // full voltage (100%)
                                          
                                          void setup()
                                          {
                                            gw.begin(NULL, NODE_ID, false);
                                            gw.sendSketchInfo("Motion Sensor", "1.0"); // here you call it motion sensor
                                            pinMode(PIR_SENSOR_DIGITAL, INPUT_PULLUP);
                                            gw.present(CHILD_ID_PIR, S_MOTION);
                                            dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
                                            //gw.sendSketchInfo("Humidity", "1.0"); // here you call it humidity
                                            gw.present(CHILD_ID_HUM, S_HUM);
                                            gw.present(CHILD_ID_TEMP, S_TEMP);
                                            metric = gw.getConfig().isMetric;
                                            //gw.sendSketchInfo("Light Sensor", "1.0");// pick a name for your sketch, it will only be one
                                            gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
                                          }
                                          
                                          void loop()
                                          {
                                            // why send this every time?
                                            /*
                                            boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                                            Serial.print("---------- PIR: ");
                                            Serial.println(tripped);
                                            gw.send(msgPir.set(tripped ? "1" : "0"));
                                            */
                                            boolean tripped = digitalRead(PIR_SENSOR_DIGITAL) == HIGH;
                                            if (tripped != lastTripped)  // only need to update controller on a change.
                                            {
                                              gw.send(msgPir.set(tripped ? "1" : "0"));
                                              Serial.print("---------- PIR: ");
                                              Serial.println(tripped ? "tripped" : " not tripped");
                                              lastTripped = tripped;
                                            }
                                            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("---------- Temp: ");
                                              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("---------- Humidity: ");
                                              Serial.println(humidity);
                                            }
                                            gw.sleep(INTERRUPT, CHANGE, SLEEP_TIME); // Sleep until interrupt detected from motion sensor. Send update every SLEEP_TIME.
                                          }
                                          
                                          N Offline
                                          N Offline
                                          n3ro
                                          wrote on last edited by
                                          #47

                                          @BulldogLowell
                                          when i use this sketch the PIR works but the DHT cant read:

                                          Failed reading temperature from DHT
                                          Failed reading humidity from DHT

                                          pimatic + MySensors + Homeduino + z-way
                                          https://github.com/n3roGit/MySensors_n3ro

                                          1 Reply Last reply
                                          0

                                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                                          With your input, this post could be even better 💗

                                          Register Login
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          9

                                          Online

                                          12.1k

                                          Users

                                          11.2k

                                          Topics

                                          113.4k

                                          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