Tutorial Project Arduino Menggunakan External Interrupts


Sebelumnya telah dijelaskan mengenai tutorial interrupt dasar pada Arduino, kali ini akan diulas mengenai cara menggunakan dua buah external interrupt dalam sebuah contoh project. Dalam contoh project ini, program utama akan membaca data ADC dari potentiometer. Secara default pembacaan ADC Arduino ialah 10 bit, mulai dari 0 hingga 1023, jumlah keseluruhan 1024. Untuk project ini akan diubah dalam nilai 4 bit, mulai dari 0 hingga 15, jumlahnya 16. Untuk mengubah dari 10 bit (jumlahnya 1024) menjadi 4 bit (jumlahnya 16), yakni dengan membagi nilai 10 bit tersebut dengan nilai 64. Dari hasil tersebut diperoleh data yang bernilai 0 hingga 15. Data tersebut selain akan ditampilkan dalam Serial Monitor Arduino IDE, juga akan ditampilkan dalam deretan empat buah LED yang merepresentasikan nilai binary dari data nilai tersebut. Sedangkan penggunaan dua buah interrupt disini untuk menyimpan dan membaca data ADC dalam EEPROM. Satu buah interrupt digunakan untuk menyimpan data ke EEPROM, sedangkan satu lagi digunakan untuk membaca data dalam EEPROM tersebut.

<img src="arduino.png" alt="arduino">


Source Code
Untuk selanjutnya source code (sketch) interrupt Arduino yang digunakan sebagai berikut.

/*
Program external interrupts
Arduino Uno

Loki Lang
*/

#include <EEPROM.h>

int lang;

void setup()
{
  Serial.begin(9600);
  attachInterrupt(0, menyimpan, RISING);
  attachInterrupt(1, membaca, RISING);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop()
{
  lang = analogRead(A0)/64;
  delay(1000);
  switch(lang)
  {
  case 0:
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    Serial.println("Nilainya 0");
    delay(1000);
    break;
  case 1:
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    Serial.println("Nilainya 1");
    delay(1000);
    break;
  case 2:
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    Serial.println("Nilainya 2");
    delay(1000);
    break;
  case 3:
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    Serial.println("Nilainya 3");
    delay(1000);
    break;
  case 4:
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    Serial.println("Nilainya 4");
    delay(1000);
    break;
  case 5:
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    Serial.println("Nilainya 5");
    delay(1000);
    break;
  case 6:
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    Serial.println("Nilainya 6");
    delay(1000);
    break;
  case 7:
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    Serial.println("Nilainya 7");
    delay(1000);
    break;
  case 8:
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    Serial.println("Nilainya 8");
    delay(1000);
    break;
  case 9:
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    Serial.println("Nilainya 9");
    delay(1000);
    break;
  case 10:
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    Serial.println("Nilainya 10");
    delay(1000);
    break;
  case 11:
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    Serial.println("Nilainya 11");
    delay(1000);
    break;
  case 12:
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    Serial.println("Nilainya 12");
    delay(1000);
    break;
  case 13:
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    Serial.println("Nilainya 13");
    delay(1000);
    break;
  case 14:
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    Serial.println("Nilainya 14");
    delay(1000);
    break;
  case 15:
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    Serial.println("Nilainya 15");
    delay(1000);
    break;
  default:
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    Serial.println("Default");
    delay(1000);
    break;
  }
}

void menyimpan()
{
  int address = 0;
  detachInterrupt(0);
  detachInterrupt(1);
  while(address < 8)
  {
    lang = analogRead(A0)/4;
    delay(1000);
    EEPROM.write(address, lang);
    Serial.print("Sedang menyimpan nilai ");
    Serial.print(lang);
    Serial.print(" di alamat ");
    Serial.print(address);
    Serial.println();
    address++;
    delay(1000);
    }
    attachInterrupt(0, menyimpan, RISING);
  attachInterrupt(1, membaca, RISING);
}

void membaca()
{
  int address = 0;
  detachInterrupt(0);
  detachInterrupt(1);
  while(address < 8)
  {
    lang = EEPROM.read(address);
    Serial.print("Nilai di alamat ");
    Serial.print(address);
    Serial.print(" yakni ");
    Serial.print(lang, DEC);
    Serial.println();
    delay(1000);
    address++;
  }
  attachInterrupt(0, menyimpan, RISING);
  attachInterrupt(1, membaca, RISING);
}



Untuk pin digital Arduino 4, 5, 6, dan 7 berturut-turut digunakan sebagai output untuk menyalakan LED, dari nilai Least Significant Bit ke Most Significant Bit. Untuk interrupt 0 Arduino Uno pada pin digital 2, sedangkan interrupt 1 ada pada pin digital 3. Penggunaan switch dengan tambahan resistor pull-down ke ground, ditujukan untuk menghindari nilai float saat switch tidak ditekan. Dengan memberikan resistor pull-down tersebut akan memberikan nilai default tegangan saat switch tidak ditekan mendekati 0 volt. Hal tersebut juga berpengaruh pada source code (sketch) mode operasi interrupt yang digunakan yakni RISING. Untuk mode operasi RISING, interrupt akan menjalankan interrupt bila terjadi perubahan nilai pada pin interrupt dari low menjadi high. Sesuai dengan kondisi switch dengan resistor pull-down, yang bila tidak ditekan akan bernilai low, sedangkan bila ditekan akan bernilai high.
Untuk deklarasi external interrupt agar dapat digunakan pada Arduino Uno, menggunakan attachInterrupt() yang sesuai dengan nomor interrupt, function yang dipanggil, dan mode operasi interrupt tersebut. Sedangkan bila diberikan instruksi detachInterrupt() yang sesuai nomor interrupt, akan membuat interrupt tersebut tidak bisa dijalankan. Untuk detachInterrupt() cukup berguna dalam menjalankan suatu proses, block program, atau bahkan dalam interrupt, yang harus dijalankan, tanpa gangguan interrupt lainnya.

Bila ada sesuatu yang belum jelas dan ingin tahu lebih dalam seputar project Arduino, pemrograman, dan elektronika, bisa bertanya pada bagian comment atau melalui page Facebook berikut.