I have written the sketch below from examples I found here, but I'm very new to this so think I have made a mistake as it not quite working as I expected and just can't work out why!
I have 8 relays connected to my alarm system that mirror the 8 PIRs in my house that I want to trigger lights from, each relay is connected to an input pin on the Z-Uno (pins 24, 25, and 3 - 8).
I have the relays connected to the Z-Uno ground line, so when they close the input pin on the Z-Uno gets taken to ground, the relays stay closed for 30 seconds when triggered.
All seems to be basically working, except for some reason when Relay 1 closes (connected to pin 24) I get motion notifications in Homeseer for Relay 1 AND Relay 6 (connected to pin 6), but if Relays 2 through to 8 close I only get a motion notification for the single relay, which is what I was expecting.
I have tested the wiring and also the relays and can confirm there are no shorts between the inputs and the relays are operating as expected, so I have to assume it's something I have got wrong in my code.
Here is an example for my Homeseer logs:
This is when the PIR in the hallway is triggered (relay 1) as you can see relay 6 (in another unoccupied room also triggers),
Jul-22 9:40:00 PM Event Event Trigger "Floor Lights Motion Detected - Study"
Jul-22 9:40:00 PM Z-Wave Device: Node 32 Z-Wave Relay 6 - Study Sensor Set to On/Open/Motion
Jul-22 9:40:00 PM Event Event Trigger "Floor Lights Motion Detected - Hallway"
Jul-22 9:40:00 PM Z-Wave Device: Node 32 Z-Wave Relay 1 - Upstairs Hallway Sensor Set to On/Open/Motion
This is when other PIRs in different locations are triggered, as you can see they only trigger the one event:
Jul-22 9:21:03 PM Event Event Trigger "Floor Lights Motion Detected - Lounge"
Jul-22 9:21:03 PM Z-Wave Device: Node 32 Z-Wave Relay 3 - Lounge Sensor Set to On/Open/Motion
Jul-22 9:20:56 PM Event Event Trigger "Floor Lights Motion Detected - Kitchen"
Jul-22 9:20:56 PM Z-Wave Device: Node 32 Z-Wave Relay 4 - Kitchen Sensor Set to On/Open/Motion
So could somebody please have a look at the code below and tell me if I have done something wrong??
Many many thanks
Richard
Code: Select all
// Pin definitions
#define LED_PIN 13
#define MotionInput_1 24
#define MotionInput_2 25
#define MotionInput_3 3
#define MotionInput_4 4
#define MotionInput_5 5
#define MotionInput_6 6
#define MotionInput_7 7
#define MotionInput_8 8
#define RelaxMotionTime 3000 // ~3 sec relax time
#define SWITCH_ON 0xff
#define SWITCH_OFF 0
// Global variables
byte lastMotionValue_1 = 0;
byte lastMotionValue_2 = 0;
byte lastMotionValue_3 = 0;
byte lastMotionValue_4 = 0;
byte lastMotionValue_5 = 0;
byte lastMotionValue_6 = 0;
byte lastMotionValue_7 = 0;
byte lastMotionValue_8 = 0;
word relaxMotion_1 = 0;
word relaxMotion_2 = 0;
word relaxMotion_3 = 0;
word relaxMotion_4 = 0;
word relaxMotion_5 = 0;
word relaxMotion_6 = 0;
word relaxMotion_7 = 0;
word relaxMotion_8 = 0;
ZUNO_SETUP_SLEEPING_MODE(ZUNO_SLEEPING_MODE_ALWAYS_AWAKE);
// Z-Wave channels
ZUNO_SETUP_CHANNELS(
ZUNO_SENSOR_BINARY(ZUNO_SENSOR_BINARY_TYPE_MOTION, getterMotion_1),
ZUNO_SENSOR_BINARY(ZUNO_SENSOR_BINARY_TYPE_MOTION, getterMotion_2),
ZUNO_SENSOR_BINARY(ZUNO_SENSOR_BINARY_TYPE_MOTION, getterMotion_3),
ZUNO_SENSOR_BINARY(ZUNO_SENSOR_BINARY_TYPE_MOTION, getterMotion_4),
ZUNO_SENSOR_BINARY(ZUNO_SENSOR_BINARY_TYPE_MOTION, getterMotion_5),
ZUNO_SENSOR_BINARY(ZUNO_SENSOR_BINARY_TYPE_MOTION, getterMotion_6),
ZUNO_SENSOR_BINARY(ZUNO_SENSOR_BINARY_TYPE_MOTION, getterMotion_7),
ZUNO_SENSOR_BINARY(ZUNO_SENSOR_BINARY_TYPE_MOTION, getterMotion_8)
);
void setup() {
// set up I/O pins.
pinMode(LED_PIN, OUTPUT);
pinMode(MotionInput_1, INPUT_PULLUP);
pinMode(MotionInput_2, INPUT_PULLUP);
pinMode(MotionInput_3, INPUT_PULLUP);
pinMode(MotionInput_4, INPUT_PULLUP);
pinMode(MotionInput_5, INPUT_PULLUP);
pinMode(MotionInput_6, INPUT_PULLUP);
pinMode(MotionInput_7, INPUT_PULLUP);
pinMode(MotionInput_8, INPUT_PULLUP);
}
void loop() {
byte currentMotionValue_1;
byte currentMotionValue_2;
byte currentMotionValue_3;
byte currentMotionValue_4;
byte currentMotionValue_5;
byte currentMotionValue_6;
byte currentMotionValue_7;
byte currentMotionValue_8;
// Trigger motion and wait for relax before report idle
// Input 1
currentMotionValue_1 = !digitalRead(MotionInput_1);
if (currentMotionValue_1) {
if (relaxMotion_1 == 0) {
lastMotionValue_1 = 1;
zunoSendReport(1);
digitalWrite(LED_PIN, HIGH); // turn LED on
}
relaxMotion_1 = RelaxMotionTime;
}
if (lastMotionValue_1 == 1 && relaxMotion_1 == 0) {
lastMotionValue_1 = 0;
zunoSendReport(1);
}
//Input 2
currentMotionValue_2 = !digitalRead(MotionInput_2);
if (currentMotionValue_2) {
if (relaxMotion_2 == 0) {
lastMotionValue_2 = 1;
zunoSendReport(2);
digitalWrite(LED_PIN, HIGH); // turn LED on
}
relaxMotion_2 = RelaxMotionTime;
}
if (lastMotionValue_2 == 1 && relaxMotion_2 == 0) {
lastMotionValue_2 = 0;
zunoSendReport(2);
}
//Input 3
currentMotionValue_3 = !digitalRead(MotionInput_3);
if (currentMotionValue_3) {
if (relaxMotion_3 == 0) {
lastMotionValue_3 = 1;
zunoSendReport(3);
digitalWrite(LED_PIN, HIGH); // turn LED on
}
relaxMotion_3 = RelaxMotionTime;
}
if (lastMotionValue_3 == 1 && relaxMotion_3 == 0) {
lastMotionValue_3 = 0;
zunoSendReport(3);
}
//Input 4
currentMotionValue_4 = !digitalRead(MotionInput_4);
if (currentMotionValue_4) {
if (relaxMotion_4 == 0) {
lastMotionValue_4 = 1;
zunoSendReport(4);
digitalWrite(LED_PIN, HIGH); // turn LED on
}
relaxMotion_4 = RelaxMotionTime;
}
if (lastMotionValue_4 == 1 && relaxMotion_4 == 0) {
lastMotionValue_4 = 0;
zunoSendReport(4);
}
//Input 5
currentMotionValue_5 = !digitalRead(MotionInput_5);
if (currentMotionValue_5) {
if (relaxMotion_5 == 0) {
lastMotionValue_5 = 1;
zunoSendReport(5);
digitalWrite(LED_PIN, HIGH); // turn LED on
}
relaxMotion_5 = RelaxMotionTime;
}
if (lastMotionValue_5 == 1 && relaxMotion_5 == 0) {
lastMotionValue_5 = 0;
zunoSendReport(5);
}
//Input 6
currentMotionValue_6 = !digitalRead(MotionInput_6);
if (currentMotionValue_6) {
if (relaxMotion_6 == 0) {
lastMotionValue_6 = 1;
zunoSendReport(6);
digitalWrite(LED_PIN, HIGH); // turn LED on
}
relaxMotion_6 = RelaxMotionTime;
}
if (lastMotionValue_6 == 1 && relaxMotion_6 == 0) {
lastMotionValue_6 = 0;
zunoSendReport(6);
}
//Input 7
currentMotionValue_7 = !digitalRead(MotionInput_7);
if (currentMotionValue_7) {
if (relaxMotion_7 == 0) {
lastMotionValue_7 = 1;
zunoSendReport(7);
digitalWrite(LED_PIN, HIGH); // turn LED on
}
relaxMotion_7 = RelaxMotionTime;
}
if (lastMotionValue_7 == 1 && relaxMotion_7 == 0) {
lastMotionValue_7 = 0;
zunoSendReport(7);
}
//Input 8
currentMotionValue_8 = !digitalRead(MotionInput_8);
if (currentMotionValue_8) {
if (relaxMotion_8 == 0) {
lastMotionValue_8 = 1;
zunoSendReport(8);
digitalWrite(LED_PIN, HIGH); // turn LED on
}
relaxMotion_8 = RelaxMotionTime;
}
if (lastMotionValue_8 == 1 && relaxMotion_8 == 0) {
lastMotionValue_8 = 0;
zunoSendReport(8);
}
if (relaxMotion_1) relaxMotion_1--;
if (relaxMotion_2) relaxMotion_2--;
if (relaxMotion_3) relaxMotion_3--;
if (relaxMotion_4) relaxMotion_4--;
if (relaxMotion_5) relaxMotion_5--;
if (relaxMotion_6) relaxMotion_6--;
if (relaxMotion_7) relaxMotion_7--;
if (relaxMotion_8) relaxMotion_8--;
if (lastMotionValue_1 == 0 && lastMotionValue_2 == 0 && lastMotionValue_3 == 0 && lastMotionValue_4 == 0 && lastMotionValue_5 == 0 && lastMotionValue_6 == 0 && lastMotionValue_7 == 0 && lastMotionValue_8 == 0) {
digitalWrite(LED_PIN, LOW); // turn LED off
}
}
// Getters and setters
byte getterMotion_1(void) {
return lastMotionValue_1 ? 0xff : 0;
}
byte getterMotion_2(void) {
return lastMotionValue_2 ? 0xff : 0;
}
byte getterMotion_3(void) {
return lastMotionValue_3 ? 0xff : 0;
}
byte getterMotion_4(void) {
return lastMotionValue_4 ? 0xff : 0;
}
byte getterMotion_5(void) {
return lastMotionValue_5 ? 0xff : 0;
}
byte getterMotion_6(void) {
return lastMotionValue_6 ? 0xff : 0;
}
byte getterMotion_7(void) {
return lastMotionValue_7 ? 0xff : 0;
}
byte getterMotion_8(void) {
return lastMotionValue_8 ? 0xff : 0;
}