Skip to content

Instantly share code, notes, and snippets.

@komputronika
Created June 5, 2018 16:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save komputronika/278b8fd0cfab17f8a02045443d1a4185 to your computer and use it in GitHub Desktop.
Save komputronika/278b8fd0cfab17f8a02045443d1a4185 to your computer and use it in GitHub Desktop.
Mendeteksi penekanan tombol ganda dengan Arduino
//-------------------------------------
// 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);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment