Window / motion sensor: noob help on sketc
-
Hello,
I've spent many months reading this great forum and i'm ready to build my first project.
I'm using VeraLite as controller with a serial gateway (USB) and i would like to build a window/motion sensor battery operated (2AA).For the sensors I collected all the stuff:
-
list itemArduino Pro mini
-
list item2AA battery holder
-
list itemDC-DC Step up regulator
-
list itemRadio NRF24L01+ (directly linked to the step-up for power)
-
list itemMotion HC SR501 (to PIN2 not used by radio)
-
list itemReed switch
I hacked the Nano by broking the LED (since i wasn't able to desolder it)
Now i have some problem with the sketch, since i tried to fuse 2 different sketches (door/window and motion)
Can someone help me?
#include <MySensor.h> #include <SPI.h> unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds) #define SKETCH_NAME "Binary / Motion Sensor" #define SKETCH_MAJOR_VER "2" #define SKETCH_MINOR_VER "0" #define PRIMARY_CHILD_ID 4 #define PRIMARY_BUTTON_PIN 2 // Arduino Digital I/O pin for button/reed switch #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) // initialize motion sensor MySensor gw; // Initialize motion message MyMessage msg(CHILD_ID, V_TRIPPED); //initialize window sensor MySensor sensor_node; // Change to V_LIGHT if you use S_LIGHT in presentation below MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED); void setup() { sensor_node.begin(); // Setup the Window pinMode(PRIMARY_BUTTON_PIN, INPUT); // Activate internal pull-ups digitalWrite(PRIMARY_BUTTON_PIN, HIGH); // Send the sketch version information to the gateway and Controller sensor_node.sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER "." SKETCH_MINOR_VER); // Register binary input sensor to sensor_node (they will be created as child devices) // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage. // If S_LIGHT is used, remember to update variable type you send in. See "msg" above. sensor_node.present(PRIMARY_CHILD_ID, S_DOOR); } { gw.begin(); 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, S_MOTION); } // Loop will iterate on changes on the BUTTON_PINs void loop() { uint8_t value; static uint8_t sentValue=2; // Short delay to allow buttons to properly settle sensor_node.sleep(5); value = digitalRead(PRIMARY_BUTTON_PIN); if (value != sentValue) { // Value has changed from last transmission, send the updated value sensor_node.send(msg.set(value==HIGH ? 1 : 0)); sentValue = value; } // Read digital motion value boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; Serial.println(tripped); gw.send(msg.set(tripped?"1":"0")); // Send tripped value to gw // Sleep until something happens with the window sensor sensor_node.sleep(PRIMARY_BUTTON_PIN-2, CHANGE, 0); // Sleep until motion interrupt comes in on motion sensor. Send update every two minute. gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME); }
-
-
What is the problem, any error codes or serial output?
-
@tenaciousmetal I think something went wrong in combining the two sketches. You are instantiating (defining) two nodes in one sketch. What you should do is have one node, "gw" for example and define two children/sensors. I tried to make some changes in your sketch that should lead you in the right direction. (marked with "AWI", not tested there can be a few syntax errors)
#include <MySensor.h> #include <SPI.h> unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds) #define SKETCH_NAME "Binary / Motion Sensor" #define SKETCH_MAJOR_VER "2" #define SKETCH_MINOR_VER "0" #define PRIMARY_CHILD_ID 4 #define PRIMARY_BUTTON_PIN 2 // Arduino Digital I/O pin for button/reed switch #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) // initialize motion sensor MySensor gw; // Initialize motion message MyMessage msg(CHILD_ID, V_TRIPPED); //initialize window sensor (AWI: don't define the node twice) //MySensor sensor_node; // Change to V_LIGHT if you use S_LIGHT in presentation below MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED); void setup() { //sensor_node.begin(); (AWI: define the "gw" node here) gw.begin() ; // Setup the Window & Activate internal pull-ups pinMode(PRIMARY_BUTTON_PIN, INPUT_PULLUP); // Activate internal pull-ups (AWI: combined in previous definition) // digitalWrite(PRIMARY_BUTTON_PIN, HIGH); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER "." SKETCH_MINOR_VER); // Register binary input sensor to sensor_node (they will be created as child devices) // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage. // If S_LIGHT is used, remember to update variable type you send in. See "msg" above. gw.present(PRIMARY_CHILD_ID, S_DOOR); // gw.begin(); (AWI: no need for another begin) 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, S_MOTION); } // Loop will iterate on changes on the BUTTON_PINs void loop() { uint8_t value; static uint8_t sentValue=2; // Short delay to allow buttons to properly settle gw.sleep(5); value = digitalRead(PRIMARY_BUTTON_PIN); if (value != sentValue) { // Value has changed from last transmission, send the updated value gw.send(msg.set(value==HIGH ? 1 : 0)); sentValue = value; } // Read digital motion value boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; Serial.println(tripped); gw.send(msg.set(tripped?"1":"0")); // Send tripped value to gw // Sleep until something happens with the window sensor (AWI: combine with other sleep) //sensor_node.sleep(PRIMARY_BUTTON_PIN-2, CHANGE, 0); // Sleep until motion interrupt comes in on motion sensor. Send update every two minute. gw.sleep(INTERRUPT, CHANGE, PRIMARY_BUTTON_PIN-2, CHANGE, SLEEP_TIME); }