Interrupt Service
Routine (ISR) atau interrupt adalah suatu keadaan dimana saat pemicu program
interrupt dipicu baik secara eksternal ataupun internal, program interrupt akan
menghentikan sejenak program lain yang sedang dijalankan dan melaksanakan
program interrupt tersebut.
Pada arduino Interrupt dapat
digunakan dengan menambahkan program berikut pada program yang ingin kita
berikan fungsi interrupt.
- attachInterrupt
(interrupt, ISR, mode)//[eksternal interrupt]
- attachInterrupt
(pin, ISR, mode) (hanya Arduino Due)
AttachInterrupt [eksternal
interrupt] memudahkan kita dalam mengolah data pada arduino. Pada setiap boards
arduino kebanyakan memiliki 2 pin interrupt. pada arduino uno, memiliki 2 buah
pin interrupt yang dapat difungsikan, yaitu pin 2 digital (int 0), dan pin 3
digital (int 1). Dibawa ini merupakan ketersediaan pin interupsi pada berbagai
board arduino
- int pada Board arduino : int.0 int.1 int.2 int.3 int.4 int.5
- Untuk
board arduino Uno, dan Ethernet yaitu pin : 2, 3
- Untuk
board arduino Mega2560 yaitu : 2, 3, 21, 20, 19, 18
- Untuk
board arduino Leonardo yaitu : 3, 2, 0, 1 7
Pada setiap int memiliki
pasangan yang bisa dipasangkan dengan pin interrupt yang tersedia diatas antara
lain :
- Pada
arduino uno int0 dan pin 2 serta int1
dan pin 3 atau sebaliknya sesuai dengan keinginan kita
- Pada
arduino mega int4 dan pin 19 serta int5 dan pin 18
Pada kondisi diatas
jika kita menginginkan penggunaan interrupt lebih dari 2 buah interrupt
misalnya, kita ingin membuat 3 buah interrupt maka boar yang digunakan adalah board
maga atau leonardo, pada kasus ini kita akan menggunakan mega sehingga pin yang
digunakan adalah pin 2,3 dan 19 untuk dipasangkan degan int0,int1 dan int4
-
Int0 = pin 2
-
Int1
= pin 3
-
Int5 = pin 19
Mode interrupt external
(AttachInterrupt ) terdiri atas 4 kondisi, yaitu:
1. LOW,
fungsi interrupt yang dijalankan untuk kondisi pin rendah,
2. CHANGE,
fungsi interrupt yang dijalankan setiap kali perubahan pin nilai,
3. RISING,
fungsi interrupt yang dijalankan jika terjadi perubahan nilai pin dari LOW ke
HIGH,
4. FALLING,
fungsi interrupt yang dijalankan jika terjadi perubahan nilai pin dari HIGH ke
LOW.
Contoh sketch :
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include <SPI.h>
#define RAIN_GAUGE_PIN 2
#define RAIN_GAUGE_INT 0 //INT0
int rainCounter = 0;
float rain;
long lastDebounce0 = 0;
long debounceDelay = 1000;
// Set the LCD address to 0x3f for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 2,1,0,4,5,6,7,3, POSITIVE);
RTC_DS3231 rtc;
char dayOfTheWeek[7][12] = {"Minggu", "Senin",
"Selasa", "Rabu", "Kamis", "Jumat",
"Sabtu"};
void setup()
{
// initialize the LCD
lcd.begin(20,4);
Serial.begin(9600);
pinMode(RAIN_GAUGE_PIN,INPUT);
digitalWrite(RAIN_GAUGE_PIN,HIGH);
attachInterrupt(0,countRain,FALLING);//INTERRUPH
return;
//(tahun, bulan, tanggal, jam, menit, detik)
//rtc.adjust(DateTime(2017, 7, 28, 22, 26, 0));
}
void countRain()
{
if((millis()-lastDebounce0)> debounceDelay)
{
rainCounter++;
rain = (rainCounter*0.2); //
1pulsa berharga 0.2mm
lastDebounce0 = millis();
}
}
void loop()
{
DateTime now = rtc.now();
Serial.println(rain);
lcd.setCursor(0, 1); //baris
pertama
lcd.print("CH : ");
lcd.print(rain);
lcd.print("mm");
lcd.print(now.year(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.day(), DEC);
lcd.print("<>");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
lcd.println();
}