Introduction to Arduino interrupts

Arduino

As we all know, the Arduino has 2 basic functions. The setup function and the loop function. In a practical sense, we usually go with the expensive microcontrollers instead of analog components when want to read values and take decisions based on the data coming from sensors and such. In the setup function, we commend the chip to do the initial works at once and then in the loop the chip repeats checking for events and act as coded.  

So, what is the problem?

The complexity! One specific line of the loop function keeps on checking inputs over and over again right when that line is being executed (We call it “polling”). But, as the program gets bigger, more libraries are used, the run time exceeds and becomes quite noticeable. At that point, when a certain occurs, the microcontroller might miss it because of the complexity.  

So, what is the solution?

Interrupts! As the name suggests, interrupts simply interrupt your loop function. When a certain event occurs, it stops the function from whatever it is doing to act against that specific certain event. The interrupt makes sure that you do not miss any important events and helps you get your job done more accurately than ever. Note that, this is a hardware side feature. There is a limited number of interrupt pins and not all pins of the Arduino support this feature. Below is a table with interrupt information of few available Arduino boards.

BOARDDIGITAL PINS USABLE FOR INTERRUPTS
UNO, Nano, Mini, Other 328-based2, 3
UNI WiFi Rev. 2All digital pins
Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21
Micro, Leonardo, Other 32u4-based0, 1, 2, 3, 7
ZeroAll digital pins, except 4
MKR family boards0, 1, 4, 5, 6, 7, 8, 9, A1, A2
DueAll digital pins
101All digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with Change)

As we can see from this table, Arduino UNO has only 2 interrupt pins, and they are 2and 3! ( Ever wondered why some of the libraries only warn you to wire using pin 2 or 3? )  

How do I use this feature?

It’s easy! We use the attachInterrupt function.

attachInterrupt( digitalPinToInterrupt(pin), ISR function, Mode );

This function will almost always go in the setup function. It was 3 parameters.

  • The interrupt pin number: The First parameter takes the pin number of the interrupt you want to use. The Arduino official documentation recommends us to use the digitalPinToInterrupt() function along with it. You just put the pin number inside the digitalPinToInterrupt function.
  • ISRFunction: ISR stands for“Interrupt Service Route”. Here we need to pass the name of a function which should contain what the chip will do when your desired interrupt pin receives the kind you event/trigger than you mention in the next parameter (Mode).
  • Mode: This tells the microcontroller when to triggers the interrupt. There are 4 defined modes. They are:
    • LOW – Whenever the pin is in a low stare, ISR will be executed.
    • RISING – Whenever the pin gets HIGH from LOW, ISR will be executed.
    • FALLING – Whenever the pin gets LOW from HIGH, ISR will be executed.
    • CHANGE – Whenever the pin changes state, ISR will be executed.

With this knowledge, let up implement a circuit and program it using interrupt which lights up and led when a pushbutton is pushed.  

Components

  • Arduino Uno
  • Pushbutton
  • 220 ohm resistor
  • LED

 

Circuit

Code

void setup() {
  pinMode(7, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(2), intpt , RISING);
}

void loop() {
  // put your main code here, to run repeatedly:
}

void intpt(){
       digitalWrite(7, HIGH);
}

 

Code Explanation:

We declare the pin 7 as output. Then we call the attachInterrupt function. In the first parameter, we call the digitalPinToInterrupt and indicate that we want to use the digital pin 2 as our interrupt. The 2nd parameter is where the ISR(interrupt service routine) fits in. The 3rd parameter is the “Mode” that we want to be using for it. In the “intpt” function we define what is to be done when the interrupt is triggered.

Someone in WEST RICHMOND bought a
30A Range Current Sensor Module - ACS712 ACS712T ACS712TELC-30A
about 43 mins ago
 
Someone in NEWSTEAD bought a
2.4GHz 3dB SMA Antenna with U.FL UFL Pigtail
about 50 mins ago
 
Someone in NGUNNAWAL bought a
Arduino Nano 3.0 Atmel ATmega328 Mini-USB Board + 3 Items
about 12 hours ago
 
Someone in MITCHAM bought a
Arduino Nano 3.0 Atmel ATmega328 Mini-USB Board+ 1pcs USB Cable
about 13 hours ago
 
Someone in DULWICH bought a
IR Infrared Obstacle Avoidance Sensor - E18-D80NK
about 19 hours ago
 
Someone in EIGHT MILE PLAINS bought a
High Accuracy DS3231 RTC and EEPROM
about 21 hours ago
 
Someone in ALBION PARK bought a
Micro SD Card Reader Module for Arduino
about 22 hours ago
 
150Mbps Mini USB Wifi LAN Adapter - Raspberry Pi, Mac, OSX, Windows, Linux
Someone in BILGOLA PLATEAU bought a
150Mbps Mini USB Wifi LAN Adapter - Raspberry Pi, Mac, OSX, Windows, Linux
about 24 hours ago
 
Rotary Encoder Module - KY-040
Someone in SALISBURY bought a
Rotary Encoder Module - KY-040
about 1 day ago
 
Someone in NORTH MANLY bought a
Micro SD Card Reader Module for Arduino + 1 Item
about 1 day ago
 
Share This
X