💬 Motion Sensor
-
Hi all
I have build a node with this setup.
It is an Arduino Pro Mini with a SR501 and a RFL01. Arduino and sensor converted to 3.3V.
Motion is detected like it should, no trouble.But everytime my arduino hits this :
// Sleep until interrupt comes in on motion sensor. Send update every two minute. sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME);the node returns a "high"... meaning there's motion (where there is not actually)
So my notification board gets a new entry every two minutes...Is this normal beahaviour ? (Hope not!!! ;) )
-
Hi ben999
I don't know what your sketch looks like but in my implementation I catch the movement in a boolean variable called tripped which I use to set the message sent to the controller.// Read digital motion value boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; send(msgm.set(tripped?"1":"0")); // Send tripped value to gwThen I do some other stuff based on tripped being true or false.
Before the node goes to sleep I reset tripped. Otherwise I will get the old value back next time the node wakes up after SLEEP_TIME regardless if there is movement or not.// Sleep until interrupt comes in on motion sensor but send update every minute. tripped = false; //reset tripped sleep(INTERRUPT,CHANGE, SLEEP_TIME);It goes without saying that SLEEP_TIME will have to be longer than the reset time of the sensor itself. My sensor element resets in about 20 seconds, which puts a lower limit to SLEEP_TIME.
-
Hi all
I have build a node with this setup.
It is an Arduino Pro Mini with a SR501 and a RFL01. Arduino and sensor converted to 3.3V.
Motion is detected like it should, no trouble.But everytime my arduino hits this :
// Sleep until interrupt comes in on motion sensor. Send update every two minute. sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME);the node returns a "high"... meaning there's motion (where there is not actually)
So my notification board gets a new entry every two minutes...Is this normal beahaviour ? (Hope not!!! ;) )
So my notification board gets a new entry every two minutes...
The SLEEP_TIME define tells your board to wake up every two minutes regardless of whether there is an interrupt. If you want longer, increase this value. I think you can also set it to 0 to only wake on interrupts.
-
Hi ben999
I don't know what your sketch looks like but in my implementation I catch the movement in a boolean variable called tripped which I use to set the message sent to the controller.// Read digital motion value boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; send(msgm.set(tripped?"1":"0")); // Send tripped value to gwThen I do some other stuff based on tripped being true or false.
Before the node goes to sleep I reset tripped. Otherwise I will get the old value back next time the node wakes up after SLEEP_TIME regardless if there is movement or not.// Sleep until interrupt comes in on motion sensor but send update every minute. tripped = false; //reset tripped sleep(INTERRUPT,CHANGE, SLEEP_TIME);It goes without saying that SLEEP_TIME will have to be longer than the reset time of the sensor itself. My sensor element resets in about 20 seconds, which puts a lower limit to SLEEP_TIME.
@bgunnarb
Thank you very much for your message
I addedtripped = false;to my sketch but that didn't change the general behaviour : sensor still give false trigger when coming out of sleep period...@Graham
Thank you very much for your message as wellI might not have described my problem precisely enough :
Motion sensor will be used as part of an house alarm
I have set up a very simple rule for now (home.rules) stating thatwhen sensor changed from CLOSED to OPEN then sendBroadcastNotification(to me)This works fine and node comes out of sleep when motion triggers the interrupt. All fine.
Trouble is when we get to the end of the sleeptime... node comes out of sleep and i get a "tripped" that sends me a notification (or later on will set the siren on!!!)
@Graham 's idea is pretty good: keep node asleep forever until interrupt kicks in...
But nodes do have temperature, humidity and battery statuses to share...I tried to load the basic sketch (ignoring temp, hum and batt) but node still behaves the same... :(
Does it not do the same at yours ?
#define MY_RADIO_NRF24 #include <MySensors.h> unsigned long SLEEP_TIME = 120000; #define DIGITAL_INPUT_SENSOR 3 #define CHILD_ID 1 MyMessage msg(CHILD_ID, V_TRIPPED); void setup() { pinMode(DIGITAL_INPUT_SENSOR, INPUT); } void presentation() { sendSketchInfo("Motion Sensor", "1.0"); present(CHILD_ID, S_MOTION); } void loop() { bool tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; send(msg.set(tripped?"1":"0")); sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME); }Thanks a lot for your help
-
@bgunnarb
Thank you very much for your message
I addedtripped = false;to my sketch but that didn't change the general behaviour : sensor still give false trigger when coming out of sleep period...@Graham
Thank you very much for your message as wellI might not have described my problem precisely enough :
Motion sensor will be used as part of an house alarm
I have set up a very simple rule for now (home.rules) stating thatwhen sensor changed from CLOSED to OPEN then sendBroadcastNotification(to me)This works fine and node comes out of sleep when motion triggers the interrupt. All fine.
Trouble is when we get to the end of the sleeptime... node comes out of sleep and i get a "tripped" that sends me a notification (or later on will set the siren on!!!)
@Graham 's idea is pretty good: keep node asleep forever until interrupt kicks in...
But nodes do have temperature, humidity and battery statuses to share...I tried to load the basic sketch (ignoring temp, hum and batt) but node still behaves the same... :(
Does it not do the same at yours ?
#define MY_RADIO_NRF24 #include <MySensors.h> unsigned long SLEEP_TIME = 120000; #define DIGITAL_INPUT_SENSOR 3 #define CHILD_ID 1 MyMessage msg(CHILD_ID, V_TRIPPED); void setup() { pinMode(DIGITAL_INPUT_SENSOR, INPUT); } void presentation() { sendSketchInfo("Motion Sensor", "1.0"); present(CHILD_ID, S_MOTION); } void loop() { bool tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; send(msg.set(tripped?"1":"0")); sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME); }Thanks a lot for your help
@ben999 The sketch you have will report the state of the pin every 2 minutes as well as when interrupted by motion.
If the SR501 is still within its timeout after the last motion detected, the pin will still be high. Eventually, (the maximum length of time is about 10 minutes) the pin should go low. If it doesn't, there is a fault with the SR501.
The timeout can be adjusted by one of the dials (see http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-hc-sr501-motion-sensor-tutorial/#Time_Delay_Adjustment). I'm not sure what the shortest period is, but it is probably less than two minutes, which would send 0 in the next message.
You would, however, get another interrupt if more motion occurred before the two minutes are up.
-
@Graham Thank you for your reply
SR501 seem to work fine on two fronts:
- the arduino IDE serial monitor shows the SR501 going ON then OFF after 5s (as per dial)
- same serial monitor shows that sensor gets motion when it occurs...
I'll have a go with another node just to be sure
Thanks again for your help (both of you :) )
-
If I wanted to add two PIRs to one sensor-node would this sketch work?
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * REVISION HISTORY * Version 1.0 - Henrik Ekblad * * DESCRIPTION * Motion Sensor example using HC-SR501 * http://www.mysensors.org/build/motion * */ // Enable debug prints // #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 //#define MY_RADIO_RFM69 #include <MySensors.h> unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds) #define DIGITAL_INPUT_SENSOR_1 2 #define DIGITAL_INPUT_SENSOR_2 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!) #define CHILD_ID_1 1 // Id of the sensor child #define CHILD_ID_2 2 // Id of the sensor child // Initialize motion message MyMessage msg(CHILD_ID_1, V_TRIPPED); void setup() { pinMode(DIGITAL_INPUT_SENSOR_1, INPUT); // sets the motion sensor digital pin as input pinMode(DIGITAL_INPUT_SENSOR_2, INPUT); // sets the motion sensor digital pin as input } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Motion Sensor_Dual", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID_1, S_MOTION); present(CHILD_ID_2, S_MOTION); } void loop() { // Read digital motion value bool tripped_1 = digitalRead(DIGITAL_INPUT_SENSOR_1) == HIGH; bool tripped_2 = digitalRead(DIGITAL_INPUT_SENSOR_2) == HIGH; Serial.println(tripped_1 || tripped_2); if(tripped_1){ send(msg.set(tripped_1?"1":"0")); // Send tripped value to gw } if(tripped_2){ send(msg.set(tripped_2?"1":"0")); // Send tripped value to gw } // Sleep until interrupt comes in on motion sensor. Send update every two minute. sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR_1 || DIGITAL_INPUT_SENSOR_1), CHANGE, SLEEP_TIME); }I know PIN 2 is supposed to be connected to the radio but I read somewhere that it is not used.
-
@Graham Thank you for your reply
SR501 seem to work fine on two fronts:
- the arduino IDE serial monitor shows the SR501 going ON then OFF after 5s (as per dial)
- same serial monitor shows that sensor gets motion when it occurs...
I'll have a go with another node just to be sure
Thanks again for your help (both of you :) )
-
Does anyone know why my sensor only reacts when I move my hand just in front of it. From a distance it does not work. Has tested with different HC-SR501 PIR and adjusted also and various radio but all gave the same result.
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * REVISION HISTORY * Version 1.0 - Henrik Ekblad * * DESCRIPTION * Motion Sensor example using HC-SR501 * http://www.mysensors.org/build/motion * */ // Enable debug prints // #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 //#define MY_RADIO_RFM69 #include <SPI.h> #include <MySensors.h> unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds) #define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!) #define CHILD_ID 1 // Id of the sensor child // Initialize motion message MyMessage msg(CHILD_ID, V_TRIPPED); void setup() { pinMode(DIGITAL_INPUT_SENSOR, INPUT); // sets the motion sensor digital pin as input } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Motion Sensor", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID, S_MOTION); } void loop() { // Read digital motion value boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; Serial.println(tripped); send(msg.set(tripped?"1":"0")); // Send tripped value to gw // Sleep until interrupt comes in on motion sensor. Send update every two minute. sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME); } -
Does anyone know why my sensor only reacts when I move my hand just in front of it. From a distance it does not work. Has tested with different HC-SR501 PIR and adjusted also and various radio but all gave the same result.
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * ******************************* * * REVISION HISTORY * Version 1.0 - Henrik Ekblad * * DESCRIPTION * Motion Sensor example using HC-SR501 * http://www.mysensors.org/build/motion * */ // Enable debug prints // #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 //#define MY_RADIO_RFM69 #include <SPI.h> #include <MySensors.h> unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds) #define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!) #define CHILD_ID 1 // Id of the sensor child // Initialize motion message MyMessage msg(CHILD_ID, V_TRIPPED); void setup() { pinMode(DIGITAL_INPUT_SENSOR, INPUT); // sets the motion sensor digital pin as input } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Motion Sensor", "1.0"); // Register all sensors to gw (they will be created as child devices) present(CHILD_ID, S_MOTION); } void loop() { // Read digital motion value boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; Serial.println(tripped); send(msg.set(tripped?"1":"0")); // Send tripped value to gw // Sleep until interrupt comes in on motion sensor. Send update every two minute. sleep(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME); } -
Hi all,
The motion sensor project is my first using Arduino and MySensors! I've managed to get the Gateway all up and running and the motion sensor to communicate with it (using the standard ino file from the project page), but I seem to have a couple of issues:
- Despite the default sleep time it seems to be communicating with the Gateway constantly.
- Permanently displayed as in an 'On' state in Domoticz.
I've tried adjusting the sensitivity and time but it doesn't seem to make a difference.
I don't know which bit is supposed to contain the values which I can decipher with the serial protocol guide so apologies if the answer is staring me in the face!
Gateway received
0;255;3;0;9;TSF:MSG:READ,1-1-0,s=1,c=1,t=16,pt=0,l=1,sg=0:1
1;1;1;0;16;1Node sent
0
1383086 TSF:MSG:SEND,1-1-0-0,s=1,c=1,t=16,pt=0,l=1,sg=0,ft=0,st=OK:0
1383106 MCO:SLP:MS=120000,SMS=0,I1=1,M1=1,I2=255,M2=255
1383120 MCO:SLP:TPD
1383127 MCO:SLP:WUP=1Any help would be appreciated :)
-
try to use a 10uF or bigger capacitor on the 5v and GND, I had issues with mine triggering randomly and after using a stable 5v supply it got back to normal: in fact later on when I added the capacitor to help the NRF24 radio it also stabilized the 5V for the sensor and it is now working fine.
Did you try to use just a sleep(2000) without the interrupt? Just to check if it is going to sleep correctly -
I have found in my experiments with the PIR motion sensor that at least the type that I am using is extremely sensitive to ripple in the Vcc voltage.
First of all, it is unstable as the feed voltage approaches 5V and then it triggers spontaneously again and again. I then tried to rise the voltage to around 11V which is the voltage that the battery eliminator gives. But that voltage has a ripple of 0.1 volt amplitude so this triggers the sensor again and again also since the arduino introduces small changes in the voltage when it processes the script.
The solution was to install a LM317 voltage regulator to bring down the voltage to 8V which is then ripple free and stable. Now the PIR works very well and does not give false triggers.
The arduino is fed from a separate voltage regulator giving 5V. I tried to connect the battery eliminator directly to RAW but that released the smoke from the on-board voltage regulator and as you know, when you let the smoke out from components, they no longer work. :grinning:
Apparently the battery eliminator also produces some voltage spikes that are not healthy.
-
Hi all,
The motion sensor project is my first using Arduino and MySensors! I've managed to get the Gateway all up and running and the motion sensor to communicate with it (using the standard ino file from the project page), but I seem to have a couple of issues:
- Despite the default sleep time it seems to be communicating with the Gateway constantly.
- Permanently displayed as in an 'On' state in Domoticz.
I've tried adjusting the sensitivity and time but it doesn't seem to make a difference.
I don't know which bit is supposed to contain the values which I can decipher with the serial protocol guide so apologies if the answer is staring me in the face!
Gateway received
0;255;3;0;9;TSF:MSG:READ,1-1-0,s=1,c=1,t=16,pt=0,l=1,sg=0:1
1;1;1;0;16;1Node sent
0
1383086 TSF:MSG:SEND,1-1-0-0,s=1,c=1,t=16,pt=0,l=1,sg=0,ft=0,st=OK:0
1383106 MCO:SLP:MS=120000,SMS=0,I1=1,M1=1,I2=255,M2=255
1383120 MCO:SLP:TPD
1383127 MCO:SLP:WUP=1Any help would be appreciated :)
@Kieren-Perry said in 💬 Motion Sensor:
Hi all,
The motion sensor project is my first using Arduino and MySensors! I've managed to get the Gateway all up and running and the motion sensor to communicate with it (using the standard ino file from the project page), but I seem to have a couple of issues:
- Despite the default sleep time it seems to be communicating with the Gateway constantly.
- Permanently displayed as in an 'On' state in Domoticz.
I've tried adjusting the sensitivity and time but it doesn't seem to make a difference.
I don't know which bit is supposed to contain the values which I can decipher with the serial protocol guide so apologies if the answer is staring me in the face!
Gateway received
0;255;3;0;9;TSF:MSG:READ,1-1-0,s=1,c=1,t=16,pt=0,l=1,sg=0:1
1;1;1;0;16;1Node sent
0
1383086 TSF:MSG:SEND,1-1-0-0,s=1,c=1,t=16,pt=0,l=1,sg=0,ft=0,st=OK:0
1383106 MCO:SLP:MS=120000,SMS=0,I1=1,M1=1,I2=255,M2=255
1383120 MCO:SLP:TPD
1383127 MCO:SLP:WUP=1Any help would be appreciated :)
Thanks for all your comments! Tried the capacitor route but no dice. In the end, connected a 9v battery to the jack and the PIR to the VIN as the voltage from the 5v pin and USB was a little below what it should have been.
-
If I want something to run for 10 seconds after a motion have been detected, how would I make this happend?
-
I have never used timers but I looked at the blink without delay sketch from the arduino website. Do I replace the if -statement with a while loop?
const int ledPin = LED_BUILTIN;// the number of the LED pin // Variables will change : int ledState = LOW; // ledState used to set the LED // Generally, you should use "unsigned long" for variables that hold time // The value will quickly become too large for an int to store unsigned long previousMillis = 0; // will store last time LED was updated // constants won't change : const long interval = 1000; // interval at which to blink (milliseconds) void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT); } void loop() { // here is where you'd put code that needs to be running all the time. // check to see if it's time to blink the LED; that is, if the // difference between the current time and last time you blinked // the LED is bigger than the interval at which you want to // blink the LED. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); } }