Skip to content

Commit ae9332b

Browse files
committed
Merge pull request arduino#31 from fallberg/development
Development
2 parents dd50aa9 + c13425d commit ae9332b

File tree

3 files changed

+117
-43
lines changed

3 files changed

+117
-43
lines changed

libraries/MySensors/MySensor.cpp

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -465,43 +465,49 @@ int MySensor::getInternalTemp(void)
465465
return result/10000;
466466
}
467467

468-
int continueTimer = true;
468+
int8_t pinIntTrigger = 0;
469469
void wakeUp() //place to send the interrupts
470470
{
471-
continueTimer = false;
471+
pinIntTrigger = 1;
472+
}
473+
void wakeUp2() //place to send the second interrupts
474+
{
475+
pinIntTrigger = 2;
472476
}
473477

474478
void MySensor::internalSleep(unsigned long ms) {
475-
while (continueTimer && ms >= 8000) { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); ms -= 8000; }
476-
if (continueTimer && ms >= 4000) { LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF); ms -= 4000; }
477-
if (continueTimer && ms >= 2000) { LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF); ms -= 2000; }
478-
if (continueTimer && ms >= 1000) { LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); ms -= 1000; }
479-
if (continueTimer && ms >= 500) { LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); ms -= 500; }
480-
if (continueTimer && ms >= 250) { LowPower.powerDown(SLEEP_250MS, ADC_OFF, BOD_OFF); ms -= 250; }
481-
if (continueTimer && ms >= 125) { LowPower.powerDown(SLEEP_120MS, ADC_OFF, BOD_OFF); ms -= 120; }
482-
if (continueTimer && ms >= 64) { LowPower.powerDown(SLEEP_60MS, ADC_OFF, BOD_OFF); ms -= 60; }
483-
if (continueTimer && ms >= 32) { LowPower.powerDown(SLEEP_30MS, ADC_OFF, BOD_OFF); ms -= 30; }
484-
if (continueTimer && ms >= 16) { LowPower.powerDown(SLEEP_15Ms, ADC_OFF, BOD_OFF); ms -= 15; }
479+
while (!pinIntTrigger && ms >= 8000) { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); ms -= 8000; }
480+
if (!pinIntTrigger && ms >= 4000) { LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF); ms -= 4000; }
481+
if (!pinIntTrigger && ms >= 2000) { LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF); ms -= 2000; }
482+
if (!pinIntTrigger && ms >= 1000) { LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); ms -= 1000; }
483+
if (!pinIntTrigger && ms >= 500) { LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); ms -= 500; }
484+
if (!pinIntTrigger && ms >= 250) { LowPower.powerDown(SLEEP_250MS, ADC_OFF, BOD_OFF); ms -= 250; }
485+
if (!pinIntTrigger && ms >= 125) { LowPower.powerDown(SLEEP_120MS, ADC_OFF, BOD_OFF); ms -= 120; }
486+
if (!pinIntTrigger && ms >= 64) { LowPower.powerDown(SLEEP_60MS, ADC_OFF, BOD_OFF); ms -= 60; }
487+
if (!pinIntTrigger && ms >= 32) { LowPower.powerDown(SLEEP_30MS, ADC_OFF, BOD_OFF); ms -= 30; }
488+
if (!pinIntTrigger && ms >= 16) { LowPower.powerDown(SLEEP_15Ms, ADC_OFF, BOD_OFF); ms -= 15; }
485489
}
486490

487491
void MySensor::sleep(unsigned long ms) {
488492
// Let serial prints finish (debug, log etc)
489493
Serial.flush();
490494
RF24::powerDown();
491-
continueTimer = true;
495+
pinIntTrigger = 0;
492496
internalSleep(ms);
493497
}
494498

495-
bool MySensor::sleep(int interrupt, int mode, unsigned long ms) {
499+
bool MySensor::sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
496500
// Let serial prints finish (debug, log etc)
497501
bool pinTriggeredWakeup = true;
498502
Serial.flush();
499503
RF24::powerDown();
500-
attachInterrupt(interrupt, wakeUp, mode); //Interrupt on pin 3 for any change in solar power
504+
attachInterrupt(interrupt, wakeUp, mode);
501505
if (ms>0) {
502-
continueTimer = true;
506+
pinIntTrigger = 0;
503507
sleep(ms);
504-
pinTriggeredWakeup = !continueTimer;
508+
if (0 == pinIntTrigger) {
509+
pinTriggeredWakeup = false;
510+
}
505511
} else {
506512
Serial.flush();
507513
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
@@ -510,7 +516,32 @@ bool MySensor::sleep(int interrupt, int mode, unsigned long ms) {
510516
return pinTriggeredWakeup;
511517
}
512518

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);
513537

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

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

libraries/MySensors/MySensor.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,20 @@ class MySensor : public RF24
219219
* @param ms Number of milliseconds to sleep or 0 to sleep forever
220220
* @return true if wake up was triggered by pin change and false means timer woke it up.
221221
*/
222-
bool sleep(int interrupt, int mode, unsigned long ms=0);
222+
bool sleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
223+
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);
223236

224237
/**
225238
* getInternalTemp

libraries/MySensors/examples/BinarySwitchSensorInt/BinarySwitchSensorInt.ino

Lines changed: 55 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,90 @@
1-
// Interrupt driven binary switch example
1+
// Interrupt driven binary switch example with dual interrupts
22
// Author: Patrick 'Anticimex' Fallberg
3-
// Connect button or door/window reed switch between
4-
// digitial I/O pin 3 (BUTTON_PIN below) and GND.
3+
// Connect one button or door/window reed switch between
4+
// digitial I/O pin 3 (BUTTON_PIN below) and GND and the other
5+
// one in similar fashion on digital I/O pin 2.
56
// This example is designed to fit Arduino Nano/Pro Mini
67

78
#include <MySensor.h>
89
#include <SPI.h>
910

10-
#define CHILD_ID 3
11-
#define BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch
11+
#define SKETCH_NAME "Binary Sensor"
12+
#define SKETCH_MAJOR_VER "1"
13+
#define SKETCH_MINOR_VER "0"
1214

13-
#if (BUTTON_PIN < 2 || BUTTON_PIN > 3)
14-
#error BUTTON_PIN must be either 2 or 3 for interrupts to work
15-
#endif
15+
#define PRIMARY_CHILD_ID 3
16+
#define SECONDARY_CHILD_ID 4
17+
18+
#define PRIMARY_BUTTON_PIN 2 // Arduino Digital I/O pin for button/reed switch
19+
#define SECONDARY_BUTTON_PIN 3 // Arduino Digital I/O pin for button/reed switch
1620

17-
MySensor gw;
21+
#if (PRIMARY_BUTTON_PIN < 2 || PRIMARY_BUTTON_PIN > 3)
22+
#error PRIMARY_BUTTON_PIN must be either 2 or 3 for interrupts to work
23+
#endif
24+
#if (SECONDARY_BUTTON_PIN < 2 || SECONDARY_BUTTON_PIN > 3)
25+
#error SECONDARY_BUTTON_PIN must be either 2 or 3 for interrupts to work
26+
#endif
27+
#if (PRIMARY_BUTTON_PIN == SECONDARY_BUTTON_PIN)
28+
#error PRIMARY_BUTTON_PIN and BUTTON_PIN2 cannot be the same
29+
#endif
30+
#if (PRIMARY_CHILD_ID == SECONDARY_CHILD_ID)
31+
#error PRIMARY_CHILD_ID and SECONDARY_CHILD_ID cannot be the same
32+
#endif
33+
34+
MySensor sensor_node;
1835

1936
// Change to V_LIGHT if you use S_LIGHT in presentation below
20-
MyMessage msg(CHILD_ID,V_TRIPPED);
37+
MyMessage msg(PRIMARY_CHILD_ID, V_TRIPPED);
38+
MyMessage msg2(SECONDARY_CHILD_ID, V_TRIPPED);
2139

2240
void setup()
2341
{
24-
gw.begin();
42+
sensor_node.begin();
2543

26-
// Setup the button
27-
pinMode(BUTTON_PIN,INPUT);
28-
// Activate internal pull-up
29-
digitalWrite(BUTTON_PIN,HIGH);
44+
// Setup the buttons
45+
pinMode(PRIMARY_BUTTON_PIN, INPUT);
46+
pinMode(SECONDARY_BUTTON_PIN, INPUT);
47+
48+
// Activate internal pull-ups
49+
digitalWrite(PRIMARY_BUTTON_PIN, HIGH);
50+
digitalWrite(SECONDARY_BUTTON_PIN, HIGH);
3051

3152
// Send the sketch version information to the gateway and Controller
32-
gw.sendSketchInfo("Binary Sensor", "1.0");
53+
sensor_node.sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER"."SKETCH_MINOR_VER);
3354

34-
// Register binary input sensor to gw (they will be created as child devices)
55+
// Register binary input sensor to sensor_node (they will be created as child devices)
3556
// You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage.
3657
// If S_LIGHT is used, remember to update variable type you send in. See "msg" above.
37-
gw.present(CHILD_ID, S_DOOR);
58+
sensor_node.present(PRIMARY_CHILD_ID, S_DOOR);
59+
sensor_node.present(SECONDARY_CHILD_ID, S_DOOR);
3860
}
3961

40-
// Loop will iterate on changes on the BUTTON_PIN
62+
// Loop will iterate on changes on the BUTTON_PINs
4163
void loop()
4264
{
4365
uint8_t value;
4466
static uint8_t sentValue=2;
67+
static uint8_t sentValue2=2;
4568

46-
// Short delay to allow button to properly settle
47-
gw.sleep(5);
69+
// Short delay to allow buttons to properly settle
70+
sensor_node.sleep(5);
4871

49-
value = digitalRead(BUTTON_PIN);
72+
value = digitalRead(PRIMARY_BUTTON_PIN);
5073

5174
if (value != sentValue) {
5275
// Value has changed from last transmission, send the updated value
53-
gw.send(msg.set(value==HIGH ? 1 : 0));
76+
sensor_node.send(msg.set(value==HIGH ? 1 : 0));
5477
sentValue = value;
5578
}
5679

80+
value = digitalRead(SECONDARY_BUTTON_PIN);
81+
82+
if (value != sentValue2) {
83+
// Value has changed from last transmission, send the updated value
84+
sensor_node.send(msg2.set(value==HIGH ? 1 : 0));
85+
sentValue2 = value;
86+
}
87+
5788
// Sleep until something happens with the sensor
58-
gw.sleep(BUTTON_PIN-2, CHANGE, 0);
89+
sensor_node.sleep(PRIMARY_BUTTON_PIN-2, CHANGE, SECONDARY_BUTTON_PIN-2, CHANGE, 0);
5990
}
60-

0 commit comments

Comments
 (0)