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
#define PIR_POWER 18 //PIR powered by D18
#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
#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
char * buff="justAnEmptyString";
#ifdef PIRPRESENT
boolean PIR_MOTION_RELAY=false;
#endif
void setup(void)
{
#ifdef SERIAL_EN
@ -217,7 +221,7 @@ void setup(void)
#ifdef PIRPRESENT
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(LED_RM, LOW);
#endif
@ -234,6 +238,10 @@ byte offIndex=0;
unsigned long lastMotionTime=0;
#endif
void PIR_ONOFF(byte state) {
digitalWrite(PIR_POWER, state);
}
void loop()
{
if(Serial.available())
@ -253,6 +261,16 @@ void loop()
DEBUGln(radio.RSSI);
}
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
{
@ -273,11 +291,28 @@ void loop()
if (btnState != btnLastState[btnIndex] && now-btnLastPress[btnIndex] >= BUTTON_BOUNCE_MS) //button event happened
{
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 (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;
action(btnIndex, mode[btnIndex]==ON ? OFF : ON);
checkSYNC(0);