These triggers help your Arduino notice when a button or sensor changes from off to on, on to off, or just changes state. This way, your program can react right away.
Rising, falling, and change triggers in Arduino
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
// pin: the pin number
// ISR: the function to run when triggered
// mode: RISING, FALLING, or CHANGERISING triggers when the signal goes from LOW to HIGH.
FALLING triggers when the signal goes from HIGH to LOW.
CHANGE triggers on any change, either LOW to HIGH or HIGH to LOW.
buttonPressed function when pin 2 changes from LOW to HIGH.attachInterrupt(digitalPinToInterrupt(2), buttonPressed, RISING);buttonReleased function when pin 3 changes from HIGH to LOW.attachInterrupt(digitalPinToInterrupt(3), buttonReleased, FALLING);sensorChanged function whenever pin 4 changes state.attachInterrupt(digitalPinToInterrupt(4), sensorChanged, CHANGE);This program counts how many times a button connected to pin 2 is pressed. It uses a FALLING trigger because the button connects the pin to ground when pressed (going from HIGH to LOW). The count increases each time the button is pressed, and the number is printed every second.
#define buttonPin 2 volatile int count = 0; void setup() { pinMode(buttonPin, INPUT_PULLUP); Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(buttonPin), countPresses, FALLING); } void loop() { // Just print the count every second Serial.print("Button pressed: "); Serial.print(count); Serial.println(" times"); delay(1000); } void countPresses() { count++; }
Interrupt functions (ISR) should be short and fast. Avoid using delay() or Serial.print() inside them.
Use volatile for variables shared between the ISR and main code to keep values correct.
Not all pins support interrupts on every Arduino board. Check your board's documentation.
RISING triggers when a signal goes from LOW to HIGH.
FALLING triggers when a signal goes from HIGH to LOW.
CHANGE triggers on any change in the signal.