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. Motion Sensor stopped working on combined sketch ( Hum, Temp, Motion + Bat Level )

Motion Sensor stopped working on combined sketch ( Hum, Temp, Motion + Bat Level )

Scheduled Pinned Locked Moved Troubleshooting
3 Posts 3 Posters 928 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.
  • rhuehnR Offline
    rhuehnR Offline
    rhuehn
    wrote on last edited by rhuehn
    #1

    Hello:

    **Please see edit BELOW:

    It appears that after a while the motion sensor actually works.... It's something to do with the sleep time....

    What I am trying to do is have the sensor sleep as much as possible to save battery, BUT should always trigger on motion movement. I think I have an error with sleep values and that is affecting the motion sensor from triggering.

    If anyone could recommend a way to sleep the unit as much as possible ( 3 in 1 Temp, Hum, Motion, + Bat reporting ), but always trigger when motion is around that would be greatly appreciated.**

    Sorry if this is a bit of a newbie question, but I can't figure out why my motion sensor stopped working in my sketch? It works fine if I upload the basic mysensors motion sensor sketch, but as it is combined in this code, it no longer reports any motion movement back ( physically waving my hand in front of it has no reaction ). I have tried to combine the following code, and also trying to make it as ultra lower power as possible, as it will be a small battery operated ( 3 x AA Batts ) pro mini, 8Mhz, 3.3v . Can anyone please suggest what I have done wrong? Below is the code:

    
    #define MY_NODE_ID 31
    // Enable debug prints
    #define MY_DEBUG
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    #include <SPI.h>
    #include <MySensor.h>  
    #include <DHT.h>  
    #include <Vcc.h>
    
    
    #define CHILD_ID_TEMP 1               // Child id for temperatur
    #define CHILD_ID_HUM 0                // Child id for humidity
    #define CHILD_ID_VOLT 3               // Child id for battery reading
    #define HUMIDITY_SENSOR_DIGITAL_PIN 7 // Where is my DHT22 data pin connected to
    
    #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
    #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
    #define CHILD_ID 2   // Id of the sensor child
    
    int node_id=31;                        // What is my node id
    
    unsigned long SLEEP_TIME =30000UL;    // Sleep time between reads (in milliseconds)
    int sleepcycle=1;                     // Counter to count the amout of time not sending data
    int humoffset=2;                      // only data is send if humidity is changed for this amout
    int tempoffset=0.5;                   // only data is if temperature is changed for this amout 
    int gwsendtimout=20;                  // each 20*sleep_time (10 minutes) data will be send
    
    const float VccMin   = 1.5;           // Minimum expected Vcc level, in Volts.
    const float VccMax   = 3.2;           // Maximum expected Vcc level, in Volts.
    const float VccCorrection = 1.0/1.0;  // Measured Vcc by multimeter divided by reported Vcc
    
    Vcc vcc(VccCorrection);
    
    MySensor gw;
    DHT dht;
    //Store last values
    float lastTemp = 0 ;                  
    float lastHum = 0 ;
    float batteryV=0;
    int oldBatteryPcnt = 0;             
    boolean lastTripped = false ;
    boolean metric = true; 
    
    boolean gwsend = true;              // to determin if data has to be send
    
    MyMessage msgHum(CHILD_ID_HUM, V_HUM);
    MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
    MyMessage msgVolt(CHILD_ID_VOLT, V_VOLTAGE);
    MyMessage msg(CHILD_ID, V_TRIPPED);
    
    
    void setup()  
    { 
      gw.begin(NULL,31,false);
      dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN); 
    
      // Send the Sketch Version Information to the Gateway
      gw.sendSketchInfo("Kitchen", "Sensor",true);
    
      pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
     
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID_HUM, S_HUM,"Kitchen Humidity");
      gw.present(CHILD_ID_TEMP, S_TEMP,"Kitchen Temperatuur");
      gw.present(CHILD_ID_VOLT, S_MULTIMETER,"Kitchen Battery voltage");
      gw.present(CHILD_ID, S_MOTION,"Kitchen Motion Sensor");
       
      metric = gw.getConfig().isMetric;
    }
    
    void loop()      
    
    {  
      // get the battery Voltage
       batteryV  = vcc.Read_Volts();
       int batteryPcnt = vcc.Read_Perc(VccMin, VccMax);
    
       if (oldBatteryPcnt != batteryPcnt) {
         // Power up radio after sleep
         gwsend=true;
         oldBatteryPcnt = batteryPcnt;
       }
        
      delay(dht.getMinimumSamplingPeriod());
    
      float temp1 = dht.getTemperature();
      float humidity = dht.getHumidity();
    
      if (isnan(temp1)) {
    //      Serial.println("Failed reading temperature from DHT");
      } else if ((temp1 <= lastTemp-tempoffset)||(temp1 >= lastTemp+tempoffset)) {
        lastTemp = temp1;
        if (!metric) {
          temp1 = dht.toFahrenheit(temp1);
        }
        gwsend=true;
      }
    
      if (isnan(humidity)) {
        //      Serial.println("Failed reading humidity from DHT");
      } else if ((humidity <= lastHum-humoffset)||(humidity >= lastHum+humoffset)) {
          lastHum = humidity;
          gwsend=true;
        }
    
      // Read digital motion value
      boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; 
      Serial.println(tripped);
      gwsend=true;
      
      if (sleepcycle>gwsendtimout){
        gwsend=true;
       }
    
    if (gwsend){     
        gw.sendBatteryLevel(oldBatteryPcnt);
        gw.send(msgVolt.set(batteryV, 1));
        gw.send(msgTemp.set(lastTemp, 1));  
        gw.send(msgHum.set(lastHum, 1));
        gw.send(msg.set(tripped?"1":"0"));  // Send tripped value to gw
        
        gwsend=false;
        sleepcycle=1;
      }
      sleepcycle++;  
      gw.sleep(SLEEP_TIME);
    }
    

    Debug Below:

    send: 31-31-0-0 s=255,c=3,t=15,pt=2,l=2,sg=0,st=ok:0
    send: 31-31-0-0 s=255,c=0,t=17,pt=0,l=5,sg=0,st=ok:1.5.4
    send: 31-31-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0
    sensor started, id=31, parent=0, distance=1
    send: 31-31-0-0 s=255,c=3,t=11,pt=0,l=7,sg=0,st=ok:Kitchen
    send: 31-31-0-0 s=255,c=3,t=12,pt=0,l=6,sg=0,st=ok:Sensor
    send: 31-31-0-0 s=0,c=0,t=7,pt=0,l=16,sg=0,st=ok:Kitchen Humidity
    send: 31-31-0-0 s=1,c=0,t=6,pt=0,l=19,sg=0,st=ok:Kitchen Temperatuur
    send: 31-31-0-0 s=3,c=0,t=30,pt=0,l=23,sg=0,st=ok:Kitchen Battery voltage
    send: 31-31-0-0 s=2,c=0,t=1,pt=0,l=21,sg=0,st=ok:Kitchen Motion Sensor
    0
    send: 31-31-0-0 s=255,c=3,t=0,pt=1,l=1,sg=0,st=ok:100
    send: 31-31-0-0 s=3,c=1,t=38,pt=7,l=5,sg=0,st=ok:3.4
    send: 31-31-0-0 s=1,c=1,t=0,pt=7,l=5,sg=0,st=ok:19.0
    send: 31-31-0-0 s=0,c=1,t=1,pt=7,l=5,sg=0,st=ok:24.0
    send: 31-31-0-0 s=2,c=1,t=16,pt=0,l=1,sg=0,st=ok:0
    
    

    If I upload an older sketch, or even the basic motion sensor sketch, no issues, so it's not a hardware issue, just the combination of sketches broke the motion sensor readings ( 0 or 1 )

    Thanks very much

    1 Reply Last reply
    0
    • T Offline
      T Offline
      TimO
      Hero Member
      wrote on last edited by
      #2

      You don't activate the interrupt while sleeping. Look at the basic motion example, where the sleep method is called.

      1 Reply Last reply
      0
      • Dave DanD Offline
        Dave DanD Offline
        Dave Dan
        wrote on last edited by
        #3

        Yeah, @TimO Is right.

        Check the code example here http://www.mysensors.org/build/motion and look for the gw.sleep sentence.

        I have a similar sensor and this is what I have in my scketch:

        gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);

        The problem with your sentenc is that the sleep command is not overridden by the motion detection. You need to include the interruption as part of the sleep command.

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


        26

        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