Skip to content

Commit 35788d6

Browse files
committed
Added constructor to sleep() for monitoring two interrupts
The new constructor allows two separate interrupts with two separate trigger policies to wake up device.
1 parent ae35b9a commit 35788d6

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

libraries/MySensors/MySensor.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,10 @@ void wakeUp() //place to send the interrupts
470470
{
471471
pinIntTrigger = 1;
472472
}
473+
void wakeUp2() //place to send the second interrupts
474+
{
475+
pinIntTrigger = 2;
476+
}
473477

474478
void MySensor::internalSleep(unsigned long ms) {
475479
while (!pinIntTrigger && ms >= 8000) { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); ms -= 8000; }
@@ -512,7 +516,32 @@ bool MySensor::sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
512516
return pinTriggeredWakeup;
513517
}
514518

519+
int8_t MySensor::sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
520+
int8_t retVal = 1;
521+
Serial.flush(); // Let serial prints finish (debug, log etc)
522+
RF24::powerDown();
523+
attachInterrupt(interrupt1, wakeUp, mode1);
524+
attachInterrupt(interrupt2, wakeUp2, mode2);
525+
if (ms>0) {
526+
pinIntTrigger = 0;
527+
sleep(ms);
528+
if (0 == pinIntTrigger) {
529+
retVal = -1;
530+
}
531+
} else {
532+
Serial.flush();
533+
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
534+
}
535+
detachInterrupt(interrupt1);
536+
detachInterrupt(interrupt2);
515537

538+
if (1 == pinIntTrigger) {
539+
retVal = (int8_t)interrupt1;
540+
} else if (2 == pinIntTrigger) {
541+
retVal = (int8_t)interrupt2;
542+
}
543+
return retVal;
544+
}
516545

517546
#ifdef DEBUG
518547
void MySensor::debugPrint(const char *fmt, ... ) {

libraries/MySensors/MySensor.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,19 @@ class MySensor : public RF24
221221
*/
222222
bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
223223

224+
/**
225+
* Sleep (PowerDownMode) the Arduino and radio. Wake up on timer or pin change for two separate interrupts.
226+
* See: http://arduino.cc/en/Reference/attachInterrupt for details on modes and which pin
227+
* is assigned to what interrupt. On Nano/Pro Mini: 0=Pin2, 1=Pin3
228+
* @param interrupt1 First interrupt that should trigger the wakeup
229+
* @param mode1 Mode for first interrupt (RISING, FALLING, CHANGE)
230+
* @param interrupt2 Second interrupt that should trigger the wakeup
231+
* @param mode2 Mode for second interrupt (RISING, FALLING, CHANGE)
232+
* @param ms Number of milliseconds to sleep or 0 to sleep forever
233+
* @return Interrupt number wake up was triggered by pin change and negative if timer woke it up.
234+
*/
235+
int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms=0);
236+
224237
/**
225238
* getInternalTemp
226239
*

0 commit comments

Comments
 (0)