Wednesday, November 8, 2017

MENGENAL INTERRUPT PADA ARDUINO

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();

}