Add SwitchMote-PIR auto Motion->ON feature

This commit is contained in:
LowPowerLab 2017-06-09 12:54:18 -04:00
parent 2da600efc5
commit 805bce18b4
1 changed files with 38 additions and 3 deletions

View File

@ -61,7 +61,7 @@
#ifdef PIRPRESENT #ifdef PIRPRESENT
#define PIR_POWER 18 //PIR powered by D18 #define PIR_POWER 18 //PIR powered by D18
#define PIR_OUTPUT 5 //PIR output signal to D5 - SHARED WITH middle button! #define PIR_OUTPUT 5 //PIR output signal to D5 - SHARED WITH middle button!
#define PIR_DEBOUNCE 10000 //PIR signals valid at least this many ms apart #define PIR_DEBOUNCE 6000 //PIR signals valid at least this many ms apart
#define PIR_LED_ON 3000 #define PIR_LED_ON 3000
#endif #endif
// ********************************************************************************** // **********************************************************************************
@ -161,6 +161,10 @@ byte btnLEDGRN[] = {LED_GT, LED_GB};
uint32_t lastSYNC=0; //remember last status change - used to detect & stop loop conditions in circular SYNC scenarios uint32_t lastSYNC=0; //remember last status change - used to detect & stop loop conditions in circular SYNC scenarios
char * buff="justAnEmptyString"; char * buff="justAnEmptyString";
#ifdef PIRPRESENT
boolean PIR_MOTION_RELAY=false;
#endif
void setup(void) void setup(void)
{ {
#ifdef SERIAL_EN #ifdef SERIAL_EN
@ -217,7 +221,7 @@ void setup(void)
#ifdef PIRPRESENT #ifdef PIRPRESENT
pinMode(PIR_POWER, OUTPUT); pinMode(PIR_POWER, OUTPUT);
digitalWrite(PIR_POWER, HIGH); //give power to the PIR PIR_ONOFF(HIGH); //give power to the PIR
digitalWrite(PIR_OUTPUT, LOW); //cancel the pullup activation from BTNM above digitalWrite(PIR_OUTPUT, LOW); //cancel the pullup activation from BTNM above
digitalWrite(LED_RM, LOW); digitalWrite(LED_RM, LOW);
#endif #endif
@ -234,6 +238,10 @@ byte offIndex=0;
unsigned long lastMotionTime=0; unsigned long lastMotionTime=0;
#endif #endif
void PIR_ONOFF(byte state) {
digitalWrite(PIR_POWER, state);
}
void loop() void loop()
{ {
if(Serial.available()) if(Serial.available())
@ -253,6 +261,16 @@ void loop()
DEBUGln(radio.RSSI); DEBUGln(radio.RSSI);
} }
else DEBUGln("MOTION ACK:NOK..."); else DEBUGln("MOTION ACK:NOK...");
if (PIR_MOTION_RELAY)
{
offTimer = millis();
if(mode[offIndex] != ON) //only take action when mode is not already ON
{
action(offIndex, ON, true); //senderID!=GATEWAYID
checkSYNC(0);
}
}
} }
else if (motionDetected && millis()-lastMotionTime > PIR_LED_ON) //RED-LED-MIDDLE light up for 3 sec else if (motionDetected && millis()-lastMotionTime > PIR_LED_ON) //RED-LED-MIDDLE light up for 3 sec
{ {
@ -273,11 +291,28 @@ void loop()
if (btnState != btnLastState[btnIndex] && now-btnLastPress[btnIndex] >= BUTTON_BOUNCE_MS) //button event happened if (btnState != btnLastState[btnIndex] && now-btnLastPress[btnIndex] >= BUTTON_BOUNCE_MS) //button event happened
{ {
btnLastState[btnIndex] = btnState; btnLastState[btnIndex] = btnState;
if (btnState == PRESSED) btnLastPress[btnIndex] = now; if (btnState == PRESSED) btnLastPress[btnIndex] = now;
//if normal button press, do the RELAY/LED action and notify sync-ed SwitchMotes //if normal button press, do the RELAY/LED action and notify sync-ed SwitchMotes
if (btnState == RELEASED && !isSyncMode) if (btnState == RELEASED && !isSyncMode)
{ {
DEBUG("BTN PRESS: ");DEBUGln(btnIndex);
//when PIR is installed, both button pressed toggles PIR ON/OFF
#ifdef PIRPRESENT
if (BTNCOUNT == 2)
{
byte otherBtnIndex = (btnIndex == 0 ? 1:0);
if (digitalRead(btn[otherBtnIndex]) == RELEASED && now-btnLastPress[otherBtnIndex] >= BUTTON_BOUNCE_MS && now-btnLastPress[otherBtnIndex] <= 2*BUTTON_BOUNCE_MS)
{
//other button was also pressed at same time, toggle PIR-motion->RELAY-ON function
PIR_MOTION_RELAY = !PIR_MOTION_RELAY;
DEBUG("PIR_MOTION_RELAY: ");DEBUGln(PIR_MOTION_RELAY);
return; //don't do anything else
}
}
#endif
ignorePress=false; ignorePress=false;
action(btnIndex, mode[btnIndex]==ON ? OFF : ON); action(btnIndex, mode[btnIndex]==ON ? OFF : ON);
checkSYNC(0); checkSYNC(0);