The code should set the controller to sleep, then on pin 3 going low it will wake and turn on the LEDs and go back to sleep. However on startup it displays the LEDs and becomes unresponsive to the button I have connected to the interrupt pin. What have I done wrong?
#include <ezButton.h>
#include "LowPower.h"
//code to run the watch user timer2 micros function and power saving mode
unsigned long ledStarted = 0;
const long interval = 2000000;
int h=1; //set hour
int m=03; //set minute
int s=37; //set second
int flag=1; //PM 1 AM 0
const int buttonpin =3; //button pin PD3 D3
int buttonpress = 0;
static uint32_t last_time, now = 0; // RTC
volatile unsigned long overflowCount; // Overflow count
const int interruptPin = 3;
ezButton button(buttonpin);
void setinput(){
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
pinMode(13, INPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
pinMode(2, INPUT);
}
void wakeUp()
{
setinput();
switch (h) { //display hour
case 1:
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
digitalWrite(A3, LOW);
digitalWrite(A4, HIGH);
break;
case 2:
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
digitalWrite(A3, HIGH);
digitalWrite(A4, LOW);
break;
case 3:
pinMode(A3, OUTPUT);
pinMode(A5, OUTPUT);
digitalWrite(A3, LOW);
digitalWrite(A5, HIGH);
break;
case 4:
pinMode(A3, OUTPUT);
pinMode(A5, OUTPUT);
digitalWrite(A3, HIGH);
digitalWrite(A5, LOW);
break;
case 5:
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
digitalWrite(A4, LOW);
digitalWrite(A5, HIGH);
break;
case 6:
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
digitalWrite(A4, HIGH);
digitalWrite(A5, LOW);
break;
case 7:
pinMode(A3, OUTPUT);
pinMode(2, OUTPUT);
digitalWrite(A3, LOW);
digitalWrite(2, HIGH);
break;
case 8:
pinMode(A3, OUTPUT);
pinMode(2, OUTPUT);
digitalWrite(A3, HIGH);
digitalWrite(2, LOW);
break;
case 9:
pinMode(A5, OUTPUT);
pinMode(2, OUTPUT);
digitalWrite(A5, LOW);
digitalWrite(2, HIGH);
break;
case 10:
pinMode(A5, OUTPUT);
pinMode(2, OUTPUT);
digitalWrite(A5, HIGH);
digitalWrite(2, LOW);
break;
case 11:
pinMode(A4, OUTPUT);
pinMode(2, OUTPUT);
break;
case 12:
pinMode(A4, OUTPUT);
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
digitalWrite(A4, HIGH);
break;
}
switch (m) { //display minute
case 1:
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
break;
case 2:
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
break;
case 3:
pinMode(8, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(8,HIGH);
digitalWrite(12,LOW);
break;
case 4:
pinMode(8, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(8,LOW);
digitalWrite(12,HIGH);
break;
case 5:
pinMode(8, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(8,HIGH);
digitalWrite(13,LOW);
break;
case 6:
pinMode(8, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(8,LOW);
digitalWrite(13,HIGH);
break;
case 7:
pinMode(8, OUTPUT);
pinMode(A0, OUTPUT);
digitalWrite(8,HIGH);
digitalWrite(A0,LOW);
break;
case 8:
pinMode(8, OUTPUT);
pinMode(A0, OUTPUT);
digitalWrite(8,LOW);
digitalWrite(A0,HIGH);
break;
case 9:
pinMode(8, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(8,HIGH);
digitalWrite(A1,LOW);
break;
case 10:
pinMode(8, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(8,LOW);
digitalWrite(A1,HIGH);
break;
case 11:
pinMode(8, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(8,LOW);
digitalWrite(A2,HIGH);
break;
case 12:
pinMode(8, OUTPUT);
pinMode(10, OUTPUT);
digitalWrite(8,HIGH);
digitalWrite(10,LOW);
break;
case 13:
pinMode(8, OUTPUT);
pinMode(10, OUTPUT);
digitalWrite(8,LOW);
digitalWrite(10,HIGH);
break;
case 14:
pinMode(8, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(8,HIGH);
digitalWrite(11,LOW);
break;
case 15:
pinMode(8, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(8,LOW);
digitalWrite(11,HIGH);
break;
case 16:
pinMode(9, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(11,LOW);
break;
case 17:
pinMode(9, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(11,LOW);
break;
case 18:
pinMode(9, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(12,LOW);
break;
case 19:
pinMode(9, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(9,LOW);
digitalWrite(12,HIGH);
break;
case 20:
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(13,LOW);
break;
case 21:
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(9,LOW);
digitalWrite(13,HIGH);
break;
case 22:
pinMode(9, OUTPUT);
pinMode(A0, OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(A0,LOW);
break;
case 23:
pinMode(9, OUTPUT);
pinMode(A0, OUTPUT);
digitalWrite(9,LOW);
digitalWrite(A0,HIGH);
break;
case 24:
pinMode(9, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(A1,LOW);
break;
case 25:
pinMode(9, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(9,LOW);
digitalWrite(A1,HIGH);
break;
case 26:
pinMode(9, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(A2,LOW);
break;
case 27:
pinMode(9, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(9,LOW);
digitalWrite(A2,HIGH);
break;
case 28:
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
break;
case 29:
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
break;
case 30:
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
break;
case 31:
pinMode(10, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(10,HIGH);
digitalWrite(13,LOW);
break;
case 32:
pinMode(10, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(10,HIGH);
digitalWrite(13,LOW);
break;
case 33:
pinMode(10, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(10,LOW);
digitalWrite(13,HIGH);
break;
case 34:
pinMode(10, OUTPUT);
pinMode(A0, OUTPUT);
digitalWrite(10,HIGH);
digitalWrite(A0,LOW);
break;
case 35:
pinMode(10, OUTPUT);
pinMode(A0, OUTPUT);
digitalWrite(10,LOW);
digitalWrite(A0,HIGH);
break;
case 36:
pinMode(10, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(10,HIGH);
digitalWrite(A1,LOW);
break;
case 37:
pinMode(10, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(10,LOW);
digitalWrite(A1,HIGH);
break;
case 38:
pinMode(10, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(10,HIGH);
digitalWrite(A2,LOW);
break;
case 39:
pinMode(10, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(10,LOW);
digitalWrite(A2,HIGH);
break;
case 40:
pinMode(10, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(10,HIGH);
digitalWrite(12,LOW);
break;
case 41:
pinMode(11, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(11,HIGH);
digitalWrite(A1,LOW);
break;
case 42:
pinMode(11, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(11,LOW);
digitalWrite(A1,HIGH);
break;
case 43:
pinMode(11, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(11,HIGH);
digitalWrite(A2,LOW);
break;
case 44:
pinMode(11, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(11,LOW);
digitalWrite(A2,HIGH);
break;
case 45:
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
break;
case 46:
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
break;
case 47:
pinMode(11, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(11,HIGH);
digitalWrite(13,LOW);
break;
case 48:
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
break;
case 49:
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
break;
case 50:
pinMode(12, OUTPUT);
pinMode(A0, OUTPUT);
digitalWrite(12,HIGH);
digitalWrite(A0,LOW);
break;
case 51:
pinMode(12, OUTPUT);
pinMode(A0, OUTPUT);
digitalWrite(12,LOW);
digitalWrite(A0,HIGH);
break;
case 52:
pinMode(13, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(13,HIGH);
digitalWrite(A1,LOW);
break;
case 53:
pinMode(13, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(13,LOW);
digitalWrite(A1,HIGH);
break;
case 54:
pinMode(13, OUTPUT);
pinMode(A0, OUTPUT);
digitalWrite(13,HIGH);
digitalWrite(A0,LOW);
break;
case 55:
pinMode(13, OUTPUT);
pinMode(A0, OUTPUT);
digitalWrite(13,LOW);
digitalWrite(A0,HIGH);
break;
case 56:
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(A0,HIGH);
digitalWrite(A1,LOW);
break;
case 57:
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
digitalWrite(A0,LOW);
digitalWrite(A1,HIGH);
break;
case 58:
pinMode(A0, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(A0,HIGH);
digitalWrite(A2,LOW);
break;
case 59:
pinMode(A0, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(A0,LOW);
digitalWrite(A2,HIGH);
break;
case 60:
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(A1,HIGH);
digitalWrite(A2,LOW);
break;
}
setinput();
LowPower.idle(SLEEP_FOREVER,ADC_OFF,TIMER2_ON,TIMER1_OFF,TIMER0_OFF,SPI_OFF,USART0_ON,TWI_OFF);
}
void setup()
{
button.setDebounceTime(100);
pinMode(interruptPin, INPUT_PULLUP);
pinMode(buttonpin, INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPin), wakeUp, FALLING);
TCCR2B = _BV(CS22); // Set the timer 2 prescaler to 64
TCCR2A &= ~_BV(WGM21) & ~_BV(WGM20); // Set timer2 for normal operation
TIMSK2 |= _BV(TOIE2);
LowPower.idle(SLEEP_FOREVER,ADC_OFF,TIMER2_ON,TIMER1_OFF,TIMER0_OFF,SPI_OFF,USART0_ON,TWI_OFF);
}
void loop() {
now = micros2();
if (now - last_time >= 1000000){
s=s+1; //increment sec. counting
last_time = micros2();
}
button.loop(); // MUST call the loop() function first
int btnState = button.getState();
// ---- manage seconds, minutes, hours am/pm overflow ----
if(s==60){
s=0;
m=m+1;
}
if(m==60)
{
m=0;
h=h+1;
}
if(h==13)
{
h=1;
flag=flag+1;
if(flag==2)flag=0;
}
if (btnState==LOW){
LowPower.idle(SLEEP_FOREVER,ADC_OFF,TIMER2_ON,TIMER1_OFF,TIMER0_OFF,SPI_OFF,USART0_ON,TWI_OFF);
}
}
// The micros2() function using timer 2
unsigned long micros2()
{
unsigned long m;
uint8_t oldSREG = SREG, t;
cli(); // Disable interrupts
m = overflowCount; // Get the number of overflows
t = TCNT2; // Get the current timer2 value
if ((TIFR2 & _BV(TOV2)) && (t < 255)) // Check if the timer has just overflowed (and we've missed it)
{
m++; // Then in this rare case increment the overflow counter
}
SREG = oldSREG; // Enable interrupts
return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); // Return the number of microseconds
}
ISR(TIMER2_OVF_vect) // ISR timer 2 overflow callback function
{
overflowCount++; // Increment the overflow count
}
