# Add the interrupt code

## In this learning path

- [Introduction](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/)
- [About Embedded Programming](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/background/)
- [Application Programming](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/app_stack/)
- [Embedded Programming](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/embedded_stack/)
- [Embedded Programming on Arm](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/arm_embedded/)
- [Build a smart device prototype](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/raspberrypi_pico/)
- [Program your smart device prototype](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/arduino_sketch/)
- [Learn about interrupts](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/int-background/)
- [Add the interrupt code](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/int-setup/)
- [Refactor the application](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/refactoring/)
- [Next Steps](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/_next-steps/)

## Remove state
Previously, you used two variables to keep track of the current value and the previous value of the PIR sensor.

The variables were used to identify a change in state that needs a response:

```cpp
// This variable will hold the current value of the motion detection pin's charge
// LOW means no motion is detected, HIGH means motion is detected
int motionState = LOW;

// This variable will hold the read value on each iteration of the loop
int val = 0;
```

The new code does not need to keep track of the state, only if the state changes.

You can replace the two variables with just one:

```cpp
// This variable tells us if motion triggered the interrupt
bool motionDetected = false;
```

## Interrupt handler
The next thing to do is write the interrupt handling code.

An interrupt handler is just a function in Arduino. Importantly, this function does not take any arguments and it doesn’t return a value.

```cpp
void motion_detected() {
  motionDetected = true;
}
```

Remember that your interrupt handler should be small and fast. All you need to do is change the value of the `motionDetected` variable, it doesn’t get much smaller or faster than that!

## Triggering an interrupt
Now that the handler function is in place, you need to tell the device when to call it. To do that, add the line below to the `setup()` function:

```cpp
attachInterrupt(digitalPinToInterrupt(motionPin), motion_detected, RISING);
```

The `attachInterrupt` function takes three arguments:

- the interrupt number
- the interrupt handler function
- the interrupt condition

### Interrupt number
Depending on the CPU, there can be a number of things that can trigger an interrupt. The CPU gives each of these a number and you need to look at the documentation for your specific device to know which number corresponds to which trigger. In this Arduino sketch, you can use the `digitalPinToInterrupt()` function to look up the interrupt number for a given pin, such as the `motionPin` variable.

### Interrupt handler
This is a reference to your function. Be sure to use the function name and don’t put parentheses after it or else it will execute the function and pass the return value to `attachInterrupt`, which isn’t what you want.

### Interrupt condition
Depending on your hardware, there may be different conditions that can be used to trigger an interrupt. Arduino typically supports `CHANGE`, `FALLING`, and `RISING` to trigger interrupts based on changes to the pin’s input voltage:

- `FALLING` for a change from `HIGH` to `LOW`
- `RISING` for a change from `LOW` to `HIGH`
- `CHANGE` for a change in either direction

Use the `RISING` condition because you only want to do something when the PIR sensor changes from `LOW` to `HIGH`.

Continue to the next section to see the updated application code.
