Artikel ini adalah kelanjutan dari artikel sebelumnya yaitu cara menggunakan push button pada arduino. Jika kalian sudah membaca artikel sebelumnya, maka kalian akan mengetahui bahwa push button hanya dapat digunakan dengan cara ditahan, karena push button akan kembali ke posisi awal jika dilepaskan. Namun, apakah push button tidak bisa digunakan tanpa ditahan seperti tombol on/off? Tentu saja bisa, bagaimana cara membuatnya? Simak artikel berikut ini.
- Debouncing
Jika anda sudah cukup sering menggunakan push button, maka anda mungkin akan mengalami bahwa ketika push button ditekan sekali, terkadang program akan menerjemahkannya sebagai dua atau tiga kali penekanan. Fenomena ini disebut sebagai pemantulan(bouncing). Kenapa ini bisa terjadi? Ini terkait dengan sifat fisik dari tombol itu sendiri, hampir semua tombol mengalami fenomena ini. Ketika tombol ditekan, dia tidak akan sepenuhnya membuat koneksi sempurna. Pada faktanya, tombol hanya akan terkoneksi ke satu sisi, lalu pada sisi yang lain, lalu keduanya, begitu seterusnya hingga tercipta koneksi sempurna. Bouncing terjadi sangat cepat dalam milidetik, namun karena mikrokontroler juga bekerja dalam satuan waktu yang sama, maka fenomena ini juga akan terdeteksi dan berpengaruh pada kineja program, terutama jika push button bekerja sebagai tombol on/off (toggle).
Lalu bagaimana cara mengatasi fenomena bouncing? Mari kita belajar cara mengatasi bouncing sekaligus menerapkan toggle button. Proyek ini akan tetap menggunakan rangkaian elektronik seperti pada artikel sebelumnya. Cek artikel disini. Lalu unggah kode di bawah ini ke dalam Arduino.
const int buttonPin = 2;
const int ledPin = 13;
int ledState = HIGH;
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50; //debounce time;
void setup()
{
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState); // initial LED state
}
void loop()
{
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
digitalWrite(ledPin, ledState);
lastButtonState = reading;
}
Pertama, kita atur variabel-variabel yang akan digunakan:
- Variabel ‘buttonPin’ berisi pin untuk button yaitu pin 2, variable ‘ledPin’ berisi pin untuk LED yaitu pin 13
- Variabel ‘ledState’ berisi kondisi HIGH atau LOW untul LED, kondisi awal bernilai HIGH
- Variabel ‘buttonState’ digunakan nanti untuk menyimpan nilai input dari button
- Variabel ‘lastButtonState’ berisi nilai input terakhir dari button, kondisi awal bernilai LOW
- Variabel ‘lastDebounceTime’ berisi nilai waktu debounce terakhir, kondisi awal bernilai 0. Menggunakan data type unsigned long karena waktu tidak berniali negatif dan data type tersebut memiliki range nilai yang lebih banyak dari long biasa
- Variabel ‘debounceDelay’ berisi nilai durasi debouncing
- Pada void Setup(), atur button sebagai input, LED sebagai output dan kondisi LED sesuai ‘ledState’
Sekarang, kita simulasikan ketika button ditekan sekali. Pertama program akan membaca input dari button dan menyimpan nilainya di variabel ‘reading’. Ketika tombol ditekan, maka ‘reading’ akan bernilai HIGH. Selanjutnya, karena ‘reading’ tidak sama dengan ‘lastButtonState’ yang mana sekarang bernilai LOW, maka fungsi IF terpenuhi. Selanjutnya penghitung waktu millis() akan berjalan sembari menyimpan satu nilai awal millis() pada variabel ‘lastDebounceTime’. Lalu terdapat fungsi IF yang membandingkan jika waktu bouncing-yang didapat dari selisih antara waktu saat ini dan waktu saat pertama tombol ditekan-lebih besar dari ‘debounceDelay’. Fungsi IF ini digunakan untuk memberikan waktu pada button untuk membuat koneksi sempurna, variabel ‘debounceDelay’ dapat disesuaikan dengan spesifikasi dari masing-masing tombol. Jika fungsi IF ini terpenuhi selanjutnya terdapat fungsi IF lagi yang membandingkan apakah variabel ‘reading’ tidak sama dengan ‘buttonState’. Karena saat ini ‘reading’ bernilai HIGH dan ‘buttonState’ bernilai LOW, maka fungsi IF terpenuhi, lalu nilai ‘reading’ akan disimpan pada ‘buttonState’ sehingga sama sama bernilai HIGH dan LED akan menyala. Terakhir, nilai ‘reading’ juga disimpan pada ‘lastButtonState’ untuk mengetahui kondisi terakhir dari button. LED akan tetap menyala meski tombol dilepas karena ‘lastButtonState’ tetap bernilai HIGH dan tidak akan berubah selama tombol tidak ditekan.
Jika program bekerja dengan baik, maka ketika tombol ditekan sekali lalu dilepaskan LED akan tetap menyala dan ketika ditekan sekali lagi LED akan mati. Tombol anda sekarang berkerja seperti saklar on/off. Lebih jelasnya lihat video di bawah ini.
- State Change Detection
Dalam menggunakan push button, terkadang kita ingin tahu apakah tombol dalam keadaan ditekan atau dilepaskan. Salah satu cara mengetahuinya adalah dengan menggunakan metode State Change Detection, terkadang juga disebut sebagai edge detection. Dengan mengetahui state dari tombol, kita dapat menggunakannya untuk melakukan berbagai fungsi. Contoh, tombol play/pause bekerja dengan cara yang sama, pada penekanan pertama fungsi play yang akan berjalan, lalu pada penekanan kedua, fungsi pause yang akan bekerja, lalu pada penekanan berikutnya kembali ke fungsi play, dan begitu seterusnya. Fungsi yang dijalankan tombol tersebut tergantung pada state apa dia sekarang.
Mari kita belajar cara menggunakan State Change Detection menggunakan rangkaian yang sama dengan rangkaian debounce. Tujuan dari program yang akan kita buat adalah membuat agar LED menyala setiap tombol ditekan sebanyak kelipatan empat. Bagaimana cara membuatnya? Mari kita mulai.
const int buttonPin = 2;
const int ledPin = 13;
int buttonState = 0;
int lastButtonState = 0;
int buttonPushCounter = 0;
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop()
{
buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
buttonPushCounter += 1;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
}
else {
Serial.println("off");
}
delay(5);
}
lastButtonState = buttonState;
if (buttonPushCounter % 4 == 0) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}
Pertama, kita atur variabel-variable yang akan digunakan:
- Variabel ‘buttonPin’ berisi pin untuk button yaitu pin 2, variable ‘ledPin’ berisi pin untuk LED yaitu pin 13
- Variabel ‘buttonState’ untuk menyimpan state tombol saat ini, bernilai awal 0
- Variabel ‘lastButtonState’ untuk menyimpan state tombol terakhir, bernilai awal 0(LOW)
- Variabel ‘buttonPushCounter’ untuk menyimpan nilai berapa banyak tombol ditekan, bernilai awal 0
- Pada void Setup(), buttonPin sebagai input, ledPin sebagai output, dan komunikasi serial menggunakan baud 9600
Seperti pada program debounce, pertama program melakukan pembacaan input dari button dan menyimpan nilainya pada ‘buttonState’. Ketika tombol ditekan otomatis ‘buttonState’ akan bernilai 1 atau HIGH dan karena ‘lastButtonState’ adalah LOW maka fungsi IF terpenuhi lalu masuk ke fungsi IF berikutnya. Jika ‘buttonState’ bernilai HIGH maka nilai dari ‘buttonPushCounter’ akan bertambah satu, lalu pada serial monitor akan muncul tulisan on yang berarti tombol sedang ditekan dan berapa kali tombol sudah ditekan sejak program berjalan. Jika tombol dilepas maka program akan lompat ke fungsi else() yang mana akan memunculkan tulisan off. Lalu nilai dari ‘buttonState’ dimasukkan pada ‘lastButtonState’ di akhir. Dimana program untuk LEDnya? Fungsi untuk LED menggunakan fungsi IF yang menguji apakah nilai dari ‘buttonPushCounter’ adalah kelipatan empat. Dengan menggunakan operator modulo (%) jika niali dari counter yang dibagi dengan 4 memiliki sisa 0, maka fungsi IF terpenuhi dan LED akan menyala, begitu juga sebaliknya.
Jika program bekerja dengan baik, maka LED akan menyala setiap tombol ditekan sejumlah kelipatan empat (4,8,12..dst). Penghitung berapa banyak tombol ditekan juga akan terus bergerak maju. Jika tombol ditekan dan ditahan maka tidak akan muncul tulisan off dan program terhenti. Lebih jelasnya lihat video di bawah ini.
Penulis : Ariq Naufal Rabbani
Editor: Malik Athafarras