// One method of interrupt - Detect FALLING
// This does not allow for LONG PRESS. It generates TWO interrupts when held longer than debounce
volatile bool buttonPressed; // use "volatile" for variable INSIDE interrupt service routeine (ISR)
int buttonPin = 2; // interrupt pin INT0... also available is INT1, pin 3
int ledPin3 = 3; // red LED
int ledPin5 = 5; // white LED
int count; // a counter
void setup() {
Serial.begin(9600); // start the serial monitor for text (for this demonstration)
pinMode(ledPin3, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // button is wired to ground and signal pin, pulled HIGH internally
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, FALLING); // PIN#, ISR, TRIGGER
// digitalPinToInterrupt(buttonPin) - use the Arduino pin number, not the ATMega328 pin number
// buttonISR - the function (Interrupt Service Routine/Interrupt Handler) to be called
// TRIGGER - run the ISR when the pin senses RISING, FALLING, ONCHANGE
welcome(); // Send an introduction to the Serial Monitor (for this demonstration)
}
void loop() {
// calling functions
blockingCode(); // blink LED and delay()
checkButton();
}
int buttonISR() { // Interrupt Service Routine called on a button press
noInterrupts(); // disable interrupts while in the ISR
buttonPressed = true; // set the flag that the button was pressed
interrupts(); // enable interrupts when leaving the ISR
}
void blockingCode() { // set both LEDs ON
digitalWrite(ledPin5, !(digitalRead(ledPin5))); // read and toggle LED pin
delay(250); // wait
}
void checkButton() {
if (buttonPressed) { // check the buttonPressed flag always
delay(150); // debounce the button press noise if the buttonPressed flag was set
buttonPressed = false; // reset buttonPressed flag to prepare for the next interrupt
digitalWrite(ledPin3, !(digitalRead(ledPin3))); // toggle LED pin
count++; // increment the counter...
Serial.print(" "); Serial.print(count); // ... show the number of button presses
}
}
void welcome() {
// a place to display instructions
Serial.print("Button Press count: 0");
}
button press toggle
continuous/blocking code