Widget Ads

Coding

Arduino - Delay With Interrupt


Sudah lama tidak menulis artikel di kategori ini, kategori yang membahas coding secara sepotong atau utuh yang biasanya sangat berguna untuk mengatasi permasalahan saat coding di bahasa tertentu (tidak semua bahasa). Kali ini saya akan membagian tips sebuah fungsi buatan sendiri di bahasa pemrograman arduino, yaitu delay with interrupt (penundaan yang mengandung interupsi).

Fungsi ini beguna ketika menginginkan sebuah delay tapi saat ada interupsi dari tombol atau dari apapun akan keluar delay dan mengerjakan interupsi tersebut. Namun kali ini yang saya bagikan hanyalah fungsi dasarnya yaitu dari interupsi tombol dan keluar dari penundaan tersebut, belum fungsi yang sudah dikembangkan untuk mengerjakan suatu fungsi lainnya dari interupsi selain tombol. Karena ternyata banya yang tanya tentang masalah suatu program jika sudah menjalankan loop atau for dengan delay kok tidak responsif dan terkesan ngehang, dan pertanyaan pertannya lainnya yang solusinya adalah ini. Langsung saja fungsinya adalah sebagai berikut :
 

byte delay_interrupt(int valdelay){
  for (int a=1;a<=valdelay;a++){
    byte button_value = button_pressed();
    if (button_value>0){
      return button_value;
    }
    delay(1);
  }
  return 0;
}

Nah coding diatas jika diartikan adalah membuat delay minimal 1 mili detik dengan perulangan sebanyak nilai yang diinginkan namun disisipin pembacaan tombol (dalam contoh adalah pin D3). Mengulang delay sebesar 1 mili detik selama 1000 kali berarti terjadi penundaan selama 1 detik sama dengan kita biasanya menuliskan delay(1000), namun fungsi ini lebih sakti karena didalam delay kita menyisipkan pembacaan tombol, dan disaat tombol ditekan, langsung keluar dan tidak genap 1000 kali. Misalnya baru ditunda selama 10 ms (10x) tombol ditekan tidak akan diteruskan ke hitungan 1000 sehingga akan keluar menghasilkan nilai 1, dan jika dibiarkan (tidak ada interupsi penekanan tombol) maka akan bernilai 0. Nah nilai ini dapat diproses untuk keluar fungsi lain atau menjalankan fungsi tertentu.

Contoh penggunaan fungsi ini adalah dalam suatu coding strobo, misalnya ada 2 mode dan jika menekan tombol akan beralih mode. Jika tidak menggunakan fungsi delay diatas, bisa dipastikan misalnya sedang mengerjakan mode 1 akan beralih mode 2 maka harus menghabiskan semua fungsi di mode 1 terlebih dahulu. Namun jika menggunakan fungsi diatas bisa langsung ganti mode tanpa perlu menghabiskan semua fungsi di mode tersebut. Berikut codingnya strobo yang hanya pakai delay normal :

const byte pin_mode_1 = 3;
const byte pin_mode_2 = 4;
const byte pin_led_1 = 13;
const byte pin_led_2 = 12;

byte mode = 1;

void setup() {
  Serial.begin(9600);
  Serial.println("Strobo Delay");
  pinMode(pin_mode_1, INPUT_PULLUP);
  pinMode(pin_mode_2, INPUT_PULLUP);
  pinMode(pin_led_1, OUTPUT);
  pinMode(pin_led_2, OUTPUT);
  digitalWrite(pin_led_1, LOW);
  digitalWrite(pin_led_2, LOW);
}

void loop() {
  button_pressed();
  if (mode==1){
    mode_1(); 
  } else if (mode==2){
    mode_2();
  }
}

void mode_1(){
  digitalWrite(pin_led_2, LOW);
  for (byte a=0;a<10;a++){
    digitalWrite(pin_led_1, HIGH);
    delay(1000);
    digitalWrite(pin_led_1, LOW);
    delay(1000);
  }
}

void mode_2(){
  digitalWrite(pin_led_1, LOW);
  for (byte a=0;a<10;a++){
    digitalWrite(pin_led_2, HIGH);
    delay(1000);
    digitalWrite(pin_led_2, LOW);
    delay(1000);
  }
}

void button_pressed(){
  if (digitalRead(pin_mode_1)==LOW){
    if (mode!=1){
      Serial.println("Mode 1");
      mode=1;
      delay(1000);
    }
  } else if (digitalRead(pin_mode_2)==LOW){
    if (mode!=2){
      Serial.println("Mode 2");
      mode=2;
      delay(1000);
    }
  }
}

Nah coding tersebut menggunakan delay normal, saat mengerjakan mode 1 atau 2 selalu menghabiskan looping 10x dengan delay 1 detik 2x dalam satu perulangan atau total delay menjadi 20 detik. Karena inilah strobo akan terasa berat atau tidak merespon tombol secara cepat. Untuk itu perlu menggunakan delay modifikasi tadi, menjadi :

const byte pin_mode_1 = 3;
const byte pin_mode_2 = 4;
const byte pin_led_1 = 13;
const byte pin_led_2 = 12;

byte mode = 1;

void setup() {
  Serial.begin(9600);
  Serial.println("Strobo Delay Interrupt");
  pinMode(pin_mode_1, INPUT_PULLUP);
  pinMode(pin_mode_2, INPUT_PULLUP);
  pinMode(pin_led_1, OUTPUT);
  pinMode(pin_led_2, OUTPUT);
  digitalWrite(pin_led_1, LOW);
  digitalWrite(pin_led_2, LOW);
}

void loop() {
  if (mode==1){
    mode_1(); 
  } else if (mode==2){
    mode_2();
  }
}

void mode_1(){
  digitalWrite(pin_led_2, LOW);
  for (byte a=0;a<10;a++){
    digitalWrite(pin_led_1, HIGH);
    if (delay_interrupt(1000)>0)
      return;
    digitalWrite(pin_led_1, LOW);
    if (delay_interrupt(1000)>0)
      return;
  }
}

void mode_2(){
  digitalWrite(pin_led_1, LOW);
  for (byte a=0;a<10;a++){
    digitalWrite(pin_led_2, HIGH);
    if (delay_interrupt(1000)>0)
      return;
    digitalWrite(pin_led_2, LOW);
    if (delay_interrupt(1000)>0)
      return;
  }
}

byte button_pressed(){
  if (digitalRead(pin_mode_1)==LOW){
    if (mode!=1){
      Serial.println("Mode 1");
      mode=1;
      delay(1000);
    }
    return 1;
  } else if (digitalRead(pin_mode_2)==LOW){
    if (mode!=2){
      Serial.println("Mode 2");
      mode=2;
      delay(1000);
    }
    return 2;
  }
  return 0;
}

byte delay_interrupt(int valdelay){
  for (int a=1;a<=valdelay;a++){
    byte button_value = button_pressed();
    if (button_value>0){
      return button_value;
    }
    delay(1);
  }
  return 0;
}

Coding diatas, akan merespon tombol didalam delay itu sendiri dan akan keluar perulangan jika ada tombol yang ditekan, sehingga ganti mode akan lebih cepat tanpa menghabiskan perulangan mode yang akan diganti.

Semoga penjelasan singkat ini dapat membantu anda mengatasi permasalahan penggunaan delay dalam pemrograman arduino, coding tersebut hanyalan contoh namun jika anda menangkap ilmunya anda akan kembangkan untuk mengatasi masalah-masalah lainnya. Terimakasih sudah membaca sampai selesai, sampai jumpa di artikel lainnya. Fast respon hubungi via whatsapp 0895-0585-0594.

Tags

Baca Juga

TULISKAN KOMENTAR KAMU

Wajib diisi (No.hp akan kami rahasiakan)*

Nama *

Alamat *

No.hp *