UPDATED code with 3 ISR routines...
Need help with code - when using 3 attachInterrupt statements, one of them does not seem to fire.
The idea is to use interrupts to wake the Arduino Micro & the XBee board to transmit a character to 4 receiver units. They will activate relays that ring a bell or turn on/off lights.
Both light buttons (on & off) are working as expected. Button is pressed, "system" wakes up, code is sent and response is received. The bell button does not trigger the ISR routine. Yet when I tried it alone on a Nano board it worked.
Since I need to monitor when the bell button is pressed to ring it but also when it's released to stop the noise, I used a CHANGE isr.
Would appreciate help / ideas on why is not working or what I did wrong here.
Thanks,
Dan
#include <avr/sleep.h>
// Declare pin numbers for feedback LEDs 1 thru 4
const int LED1_pin = 10;
const int LED2_pin = 16;
const int LED3_pin = 14;
const int LED4_pin = 15;
// Declare pin numbers for bell and light buttons and power
const int BTN_Bell = 7;
const int BTN_Light_ON = 2;
const int BTN_Light_OFF = 3;
const int Xbee_Pwr_Toggle = 19;
int BTN_Bell_state = 1;
int previousBTN_Bell_state = 0;
unsigned long previousMillis = 0;
const long AwakeDuration = 3000;
volatile int Pressed_BTN_num = 0;
void setup()
{
// all unused pins to output low
// pins are not consecutive numbers, I want pin# 4,5,6,8,9,10,14,15,16,18,19,20,21
for (int i = 4; i <= 6; i++) {
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
for (int i = 8; i <= 10; i++) {
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
for (int i = 14; i <= 16; i++) {
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
for (int i = 18; i <= 21; i++) {
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
pinMode(LED1_pin, OUTPUT);
pinMode(LED2_pin, OUTPUT);
pinMode(LED3_pin, OUTPUT);
pinMode(LED4_pin, OUTPUT);
pinMode(Xbee_Pwr_Toggle, OUTPUT);
pinMode(BTN_Bell, INPUT_PULLUP);
pinMode(BTN_Light_ON, INPUT_PULLUP);
pinMode(BTN_Light_OFF, INPUT_PULLUP);
// Open Serial com ports to send data via Xbee board,
Serial1.begin(9600);
}
void sleepNow()
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
attachInterrupt(digitalPinToInterrupt(BTN_Bell), wakeUpBell, CHANGE);
attachInterrupt(digitalPinToInterrupt(BTN_Light_ON), wakeUpLightON, LOW);
attachInterrupt(digitalPinToInterrupt(BTN_Light_OFF), wakeUpLightOFF, LOW);
// disable ADC
ADCSRA = 0;
sleep_mode();
}
void wakeUpBell()
{
sleep_disable();
if (digitalRead(BTN_Bell) == LOW){
Pressed_BTN_num = 3;
}
else {
Pressed_BTN_num = 4;
}
digitalWrite(Xbee_Pwr_Toggle, HIGH);
}
void wakeUpLightON()
{
sleep_disable();
Pressed_BTN_num = 2;
digitalWrite(Xbee_Pwr_Toggle, HIGH);
}
void wakeUpLightOFF()
{
sleep_disable();
Pressed_BTN_num = 1;
digitalWrite(Xbee_Pwr_Toggle, HIGH);
}
void loop()
{
// button send portion to remote units
// on button press turn remote light (relay) on or off or ring bell
switch (Pressed_BTN_num) {
case 1: // Light OFF btn pressed
Serial1.write('Z');
delay(50); // long delay to avoid sending multiple presses
Pressed_BTN_num = 0;
break;
case 2: // Light ON btn pressed
Serial1.write('L');
delay(50); // long delay to avoid sending multiple presses
Pressed_BTN_num = 0;
break;
case 3: // Bell btn is pressed
Serial1.println('B');
delay(50); // long delay to avoid sending multiple presses
Pressed_BTN_num = 0;
break;
case 4: // Bell btn is released
Serial1.println('O');
delay(50); // long delay to avoid sending multiples
Pressed_BTN_num = 0;
break;
default:
unsigned long currentMillis = millis();
if (Pressed_BTN_num == 0 && currentMillis - previousMillis > AwakeDuration) {
digitalWrite(Xbee_Pwr_Toggle, LOW);
sleepNow();
delay(25); // time to wake system & Xbee
currentMillis = millis(); // reset time loop now that all is awake
previousMillis = currentMillis;
}
break;
}
// feedback section from remote units - who got the message ?
// turn corresponding LED on or off to know that remote light is on or off
if (Serial1.available() > 0) {
char Msg = Serial1.read();
switch (Msg) {
case '1': // If received '1' station 1 at OFF
digitalWrite(LED1_pin, LOW);
break;
case '2': // If received '2' station 2 at OFF
digitalWrite(LED2_pin, LOW);
break;
case '3': // If received '3' station 3 at OFF
digitalWrite(LED3_pin, LOW);
break;
case '4': // If received '4' station 4 at OFF
digitalWrite(LED4_pin, LOW);
break;
case '5': // If received '5' station 1 at ON
digitalWrite(LED1_pin, HIGH);
break;
case '6': // If received '6' station 2 at ON
digitalWrite(LED2_pin, HIGH);
break;
case '7': // If received '7' station 3 at ON
digitalWrite(LED3_pin, HIGH);
break;
case '8': // If received '8' station 4 at ON
digitalWrite(LED4_pin, HIGH);
break;
}
}
}