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 22.7k 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.
  • rvendrameR Offline
    rvendrameR Offline
    rvendrame
    Hero Member
    wrote on last edited by
    #25

    Yes, it looks fine. What exactly error are you having? From your first serial monitor, it looks like your sensor woke on every 10min aprox, ( 6608 / 11148 / 15441 ).

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

    n3roN 1 Reply Last reply
    0
    • rvendrameR rvendrame

      Yes, it looks fine. What exactly error are you having? From your first serial monitor, it looks like your sensor woke on every 10min aprox, ( 6608 / 11148 / 15441 ).

      n3roN Offline
      n3roN Offline
      n3ro
      wrote on last edited by n3ro
      #26

      @rvendrame
      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 = 600000;        // 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;
      
      
      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()
      {
      
        // Measure battery
        float batteryV = readVcc();
        int batteryPcnt = (((batteryV - MIN_V) / (MAX_V - MIN_V)) * 100 );
        if (batteryPcnt > 100) {
          batteryPcnt = 100;
        }
      
        if (batteryPcnt != oldBatteryPcnt) {
          gw.sendBatteryLevel(batteryPcnt); // Send battery percentage
          oldBatteryPcnt = batteryPcnt;
        }
        Serial.print("---------- Battery: ");
        Serial.println(batteryPcnt);
      
        // 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
      
      
        //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);
        }
        // Light
        int lightLevel = (1023 - analogRead(LIGHT_SENSOR_ANALOG_PIN)) / 10.23;
        //Serial.println(lightLevel);
        if (lightLevel != lastLightLevel) {
          gw.send(msgLight.set(lightLevel));
          lastLightLevel = lightLevel;
          Serial.print("---------- Light: ");
          Serial.println(lightLevel);
        }
        // Sleep until interrupt comes in on motion sensor. Send update every two minute.
        gw.sleep(INTERRUPT, CHANGE, SLEEP_TIME);
      }
      

      i get this output after starting:
      sensor started, id 10
      send: 10-10-0-0 s=255,c=0,t=17,pt=0,l=5,st=ok:1.4.1
      send: 10-10-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
      read: 0-0-10 s=255,c=3,t=6,pt=0,l=1:M
      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
      send: 10-10-0-0 s=255,c=3,t=0,pt=1,l=1,st=ok:100
      ---------- Battery: 100
      ---------- 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:16.6
      ---------- Temp: 16.60
      send: 10-10-0-0 s=2,c=1,t=1,pt=7,l=5,st=ok:43.8
      ---------- Humidity: 43.80
      send: 10-10-0-0 s=4,c=1,t=23,pt=2,l=2,st=ok:39
      ---------- Light: 39
      ---------- Battery: 100
      ---------- PIR: 0
      send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
      send: 10-10-0-0 s=4,c=1,t=23,pt=2,l=2,st=ok:37
      ---------- Light: 37
      ---------- Battery: 100
      ---------- 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=4,c=1,t=23,pt=2,l=2,st=ok:34
      ---------- Light: 34
      ---------- Battery: 100
      ---------- PIR: 0
      send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
      send: 10-10-0-0 s=4,c=1,t=23,pt=2,l=2,st=ok:36
      ---------- Light: 36
      ---------- Battery: 100
      ---------- 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=4,c=1,t=23,pt=2,l=2,st=ok:37
      ---------- Light: 37
      ---------- Battery: 100
      ---------- PIR: 0
      send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
      send: 10-10-0-0 s=4,c=1,t=23,pt=2,l=2,st=ok:38
      ---------- Light: 38

      The DHT gives only output the first start and the pir interrupt works perfect.

      When delay(dht.getMinimumSamplingPeriod()); is activated the DHT works and the pit interrupts the whole time :(
      In this configuration the arduino never sleeps ..

      sensor started, id 10
      send: 10-10-0-0 s=255,c=0,t=17,pt=0,l=5,st=ok:1.4.1
      send: 10-10-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
      read: 0-0-10 s=255,c=3,t=6,pt=0,l=1:M
      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
      send: 10-10-0-0 s=255,c=3,t=0,pt=1,l=1,st=ok:100
      ---------- Battery: 100
      ---------- 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:16.5
      ---------- Temp: 16.50
      send: 10-10-0-0 s=2,c=1,t=1,pt=7,l=5,st=ok:43.9
      ---------- Humidity: 43.90
      send: 10-10-0-0 s=4,c=1,t=23,pt=2,l=2,st=ok:38
      ---------- Light: 38
      ---------- Battery: 100
      ---------- 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:16.6
      ---------- Temp: 16.60
      send: 10-10-0-0 s=2,c=1,t=1,pt=7,l=5,st=ok:43.8
      ---------- Humidity: 43.80
      send: 10-10-0-0 s=4,c=1,t=23,pt=2,l=2,st=ok:37
      ---------- Light: 37
      ---------- Battery: 100
      ---------- PIR: 0
      send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
      send: 10-10-0-0 s=3,c=1,t=0,pt=7,l=5,st=ok:16.5
      ---------- Temp: 16.50
      ---------- Battery: 100
      ---------- PIR: 0
      send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
      ---------- Battery: 100
      ---------- PIR: 0
      send: 10-10-0-0 s=1,c=1,t=16,pt=0,l=1,st=ok:0
      send: 10-10-0-0 s=4,c=1,t=23,pt=2,l=2,st=ok:38

      EDIT: i have changed the sleeptime for testing to a shorter time

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

      1 Reply Last reply
      0
      • rvendrameR rvendrame

        So PIR must connect on PIN 1 and not PIN 3.

        Edit: Better, how did you connect DHT and PIR?

        SweebeeS Offline
        SweebeeS Offline
        Sweebee
        wrote on last edited by
        #27

        @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

        n3roN 1 Reply Last reply
        0
        • rvendrameR Offline
          rvendrameR 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

          n3roN 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

            n3roN Offline
            n3roN 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
            • rvendrameR Offline
              rvendrameR 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
              • rvendrameR rvendrame

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

                n3roN Offline
                n3roN 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
                • rvendrameR Offline
                  rvendrameR 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
                  • n3roN Offline
                    n3roN 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?

                      n3roN 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?

                        n3roN Offline
                        n3roN 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
                        • rvendrameR Offline
                          rvendrameR 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

                          n3roN 1 Reply Last reply
                          0
                          • rvendrameR 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.

                            n3roN Offline
                            n3roN 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
                            • rvendrameR Offline
                              rvendrameR 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

                              n3roN 1 Reply Last reply
                              0
                              • rvendrameR rvendrame

                                Which arduino PIN do you use to connect the PIR?

                                n3roN Offline
                                n3roN 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
                                • rvendrameR Offline
                                  rvendrameR 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).

                                    n3roN 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).

                                      n3roN Offline
                                      n3roN 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

                                      BulldogLowellB 1 Reply Last reply
                                      0
                                      • n3roN 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

                                        BulldogLowellB Offline
                                        BulldogLowellB 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.
                                        }
                                        
                                        n3roN 1 Reply Last reply
                                        0
                                        • BulldogLowellB 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.
                                          }
                                          
                                          n3roN Offline
                                          n3roN 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
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          13

                                          Online

                                          11.7k

                                          Users

                                          11.2k

                                          Topics

                                          113.1k

                                          Posts


                                          Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • MySensors
                                          • OpenHardware.io
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular