|
//------------------------------------- |
|
// Mendeteksi Penekanan Tombol Ganda |
|
// Semacam mendeteksi double klik, tapi bisa lebih dari 2 klik |
|
// |
|
// - Bisa mendeteksi jumlah tekanan berurutan pada button |
|
// - Jumlah penekanan tidak terbatas (single, double, triple, dst) |
|
// - Rentang waktu tekanan bisa diatur |
|
// |
|
// Author: Julius Chandra |
|
//------------------------------------- |
|
|
|
class TekanGanda { |
|
|
|
protected: |
|
|
|
byte counter, ret; // Mencatat jumlah counter tekanan |
|
unsigned long millisLalu; // Mencatat waktu millis yang lalu |
|
byte pinTombol; // Pin input tombol |
|
unsigned long timeout; // Rentang waktu yang diperlukan untuk tekan tombol ganda |
|
|
|
public: |
|
|
|
// Ini counstructor, TekanGanda( pinTombol, [rentang]); |
|
|
|
TekanGanda( byte pin, unsigned int to = 500 ) { |
|
counter = 0; |
|
millisLalu = millis(); |
|
timeout = to; |
|
pinTombol = pin; |
|
} |
|
|
|
// Ini untuk mendeteksi jumlah tekan, ditaruh di loop |
|
// Kalau ada single, double, triple dst, maka fungsi ini |
|
// akan me-return jumlah tekanan |
|
|
|
byte jumlahTekan() { |
|
byte tekan = digitalRead(pinTombol); |
|
unsigned long millisKini = millis(); |
|
|
|
// Kalau ada tekanan (ACTIVE LOW yaaaa) |
|
if (tekan==0) { |
|
// Terpaksa delay sedikit, anti bouncing |
|
// Kecuali pakai hardware anti bouncing nya |
|
delay(175); |
|
|
|
// Kalau counter masih 0, counter di set 1 |
|
if (counter==0) { |
|
counter = 1; |
|
millisLalu = millisKini; |
|
|
|
// Kalau counter tidak 0 |
|
} else { |
|
// Periksa apakah waktu penekanan tombol ini masih dalam rentang penekanan berurutan |
|
if (millisKini - millisLalu < timeout) { |
|
// Bila ya, tambahkan jumlah counternya. |
|
counter++; |
|
millisLalu = millisKini; |
|
} |
|
} |
|
} |
|
|
|
// Sudah lewat rentang penekanan berseri |
|
// Counter di nolkan lagi saja atuh kang... |
|
// Trus return jumlah penekanan nya (counter) |
|
if ( millisKini - millisLalu > timeout) { |
|
ret = counter; |
|
counter = 0; |
|
return ret; |
|
} |
|
|
|
// Kalau belum ada timeout rentang waktu, anggap belum ada penekanan |
|
return 0; |
|
} |
|
}; |
|
|
|
// Buat objek TekanGanda, pada pin 11 |
|
TekanGanda tombol(11); |
|
|
|
// Untuk simpan jumlah tekanan nya |
|
byte jumlah; |
|
|
|
void setup() { |
|
// Untuk LED, jadikan output |
|
pinMode(8,OUTPUT); |
|
pinMode(9,OUTPUT); |
|
pinMode(10,OUTPUT); |
|
|
|
// Untuk tombol, pullup, active LOW |
|
pinMode(11, INPUT_PULLUP); |
|
} |
|
|
|
void loop() { |
|
// Baca tombol euy... |
|
jumlah = tombol.jumlahTekan(); |
|
|
|
// Kalau ada penekanan tombol |
|
if (jumlah>0) { |
|
// Matikan duyu LED yang lain |
|
offSemua(); |
|
|
|
// Kalau jumlah 1, berarti LED 8 yang nyala, dst |
|
digitalWrite(7+jumlah, HIGH); |
|
} |
|
} |
|
|
|
void offSemua() { |
|
digitalWrite( 8, LOW); |
|
digitalWrite( 9, LOW); |
|
digitalWrite(10, LOW); |
|
} |