@thucar @gohan
Thank you both. Everything is working as designed now. For now, I am just going to stick with the code below. I will put the interrupts in on the next version.
/**
* 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
* Combo sketch built from original motion sensor sketch combined with code from the Relay actuator sketch
* 2x Motion Sensors to be used as garage doors status usualy with reed switches
* 2x Relays to control garage doors
* NOTE! this sketch automaticaly turns the relays back off after a door control has been sent to it
* How long the relays are on is defined vith the variable "RELAY_ONTIME" the default is 300 milliseconds
* http://www.mysensors.org/build/relay
*/
/*
arduino Pro mini 5V 16MHz ????
*/
#define MY_RADIO_NRF24
#define MY_DEBUG // Enables debug messages in the serial log
// Set MY_NODE_ID to something unique in your sensor network (1-254)
// or set to AUTO if you want gw to assign a MY_NODE_ID for you.
#define MY_NODE_ID AUTO
#define SN "DualGarageDoor"
#define SV "1.5"
//#define MY_RF24_CE_PIN 9 // Radio specific settings for RF24
//#define MY_RF24_CS_PIN 10 // Radio specific settings for RF24 (you'll find similar config for RFM69)
//#define MY_RF24_PA_LEVEL RF24_PA_MAX
#include <MyConfig.h>
#include <MySensors.h>
#include <SPI.h>
// Enable repeater functionality for this node
#define MY_REPEATER_FEATURE
#define DIGITAL_INPUT_SENSOR 3 // The digital input for PIR.
#define DIGITAL_INPUT_SENSORA 4 // The digital input for Door 1
#define DIGITAL_INPUT_SENSORB 5 // The digital input for Door 2
#define LIGHT_SENSOR_ANALOG_PIN 0 //light sensor
//#define INTERRUPT DIGITAL_INPUT_SENSORA-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
#define CHILD_ID_PIR 40 // Id of the sensor child
#define CHILD_ID_RELAY 30 //Id of relay
#define CHILD_ID_DOORA 21 // Id of the sensor child
#define CHILD_ID_DOORB 20 // Id of the sensor child
#define CHILD_ID_LIGHT 10 //light sensor
#define RELAY_PIN 6 // Arduino Digital I/O pin number for first relay
#define NUMBER_OF_RELAYS 1 // Total number of attached relays
//define what is on and off for the relay
#define RELAY_ON 1
#define RELAY_OFF 0
//define what is on and off for the reed switches
#define DOOR_CLOSED 0
#define DOOR_OPEN 1
int RELAY_ONTIME = 1000; //delay before turning relay back off
int lastLightLevel; //light sensor
boolean oldValueA = 0;
boolean oldValueB = 0;
boolean trippedA = 0;
boolean trippedB = 0;
uint32_t SLEEP_TIME = 10000; // Sleep time between reads (in milliseconds)
MyMessage msg1(CHILD_ID_DOORA, V_LOCK_STATUS);
MyMessage msg2(CHILD_ID_DOORB, V_LOCK_STATUS);
MyMessage msg4(CHILD_ID_LIGHT, V_LIGHT_LEVEL); //light sensor
MyMessage msg3(CHILD_ID_PIR, V_TRIPPED); //PIR
void before()
{
for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
// Then set relay pins in output mode
pinMode(pin, OUTPUT);
// Set relay to last known state (using eeprom storage)
digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
}
}
void setup()
{
pinMode(DIGITAL_INPUT_SENSORA, INPUT); // sets the motion sensor digital pin as input
pinMode(DIGITAL_INPUT_SENSORB, INPUT); // sets the motion sensor digital pin as input
// Activate internal pull-up
digitalWrite(DIGITAL_INPUT_SENSORA, HIGH);
digitalWrite(DIGITAL_INPUT_SENSORB, HIGH);
digitalWrite(RELAY_PIN, RELAY_OFF);
pinMode(RELAY_PIN, OUTPUT);
pinMode(DIGITAL_INPUT_SENSOR, INPUT); // sets the motion sensor digital pin as input
}
void presentation()
{
// Send the Sketch Version Information to the Gateway
Serial.println("Presentation");
sendSketchInfo(SN, SV);
for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++)
{
present(sensor, S_BINARY);
}
{
trippedA = digitalRead(DIGITAL_INPUT_SENSORA);
trippedB = digitalRead(DIGITAL_INPUT_SENSORB);
//Serial.print("Door A status: ");
//Serial.println(trippedA);
//Serial.print("Door B status: ");
//Serial.println(trippedB);
send(msg1.set(trippedA ? DOOR_CLOSED : DOOR_OPEN));
send(msg2.set(trippedB ? DOOR_CLOSED : DOOR_OPEN));
oldValueA = trippedA;
oldValueB = trippedB;
}
{
// Register all sensors to gw (they will be created as child devices)
present(CHILD_ID_DOORA, S_LOCK);
present(CHILD_ID_DOORB, S_LOCK);
present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
present(CHILD_ID_PIR, S_MOTION);
}
}
void loop()
{
{
// Read digital reed switch value
trippedA = digitalRead(DIGITAL_INPUT_SENSORA);
trippedB = digitalRead(DIGITAL_INPUT_SENSORB);
// Send value only if changed
if(trippedA != oldValueA)
{
//Serial.print("Door A status: ");
//Serial.println(trippedA);
send(msg1.set(trippedA ? DOOR_CLOSED : DOOR_OPEN));
//gw.sendVariable(CHILD_ID_DOORA, V_LOCK_STATUS, trippedA?DOOR_CLOSED:DOOR_OPEN); // Send value change to gw
delay(1000);
oldValueA = trippedA;
}
// Send value only if changed
if(trippedB != oldValueB)
{
//Serial.print("Door B status: ");
//Serial.println(trippedB);
send(msg2.set(trippedB ? DOOR_CLOSED : DOOR_OPEN));
//gw.sendVariable(CHILD_ID_DOORB, V_LOCK_STATUS, trippedB?DOOR_CLOSED:DOOR_OPEN); // Send value change to gw
delay(1000);
oldValueB = trippedB;
}
}
{
int16_t lightLevel = (1023-analogRead(LIGHT_SENSOR_ANALOG_PIN))/10.23;
//Serial.println(lightLevel);
if (abs(lightLevel - lastLightLevel)>20) {
send(msg4.set(lightLevel));
lastLightLevel = lightLevel;
}
}
{
// Read digital motion value
bool tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH;
Serial.println(tripped);
send(msg3.set(tripped?"1":"0")); // Send tripped value to gw
// Sleep until interrupt comes in on motion sensor. Send update every two minute.
wait(digitalPinToInterrupt(DIGITAL_INPUT_SENSOR), CHANGE, SLEEP_TIME);
}
}
void receive(const MyMessage &message)
{
// We only expect one type of message from controller. But we better check anyway.
if (message.type==V_STATUS) {
// Change relay state
digitalWrite(RELAY_PIN, RELAY_ON);
wait(RELAY_ONTIME);
digitalWrite(RELAY_PIN, RELAY_OFF);
wait(2000);
}
}