Menu
CoddyTech

Hitung Tekanan Tombol dengan Interupsi

Termasuk bagian Pengaturan Waktu Tanpa Delay dalam perjalanan Arduino di Coddy. Pelajaran 15 dari 18.

Seperti yang kamu lihat di bagian Inputs, tombol mengalami pantulan: selama sekitar satu milidetik, kontak saling menyentuh, terpisah, lalu menyentuh lagi, saat ditekan dan saat dilepas. Interupsi mendeteksi setiap sentuhan, jadi ISR FALLING yang menambahkan 1 akan menghitung satu klik beberapa kali.

ISR tidak dapat mengatasi pantulan dengan delay(): delay() memerlukan interupsi clock itu sendiri, dan interupsi dijeda saat ISR berjalan. Gunakan clock sebagai gantinya. Ingat kapan penekanan terakhir dihitung, lalu abaikan setiap sinyal turun yang terjadi terlalu cepat setelahnya:

unsigned long lastPress = 0;

void onPress() {
  unsigned long now = millis();
  if (now - lastPress >= 200) {
    presses = presses + 1;
    lastPress = now;
  }
}

Membaca millis() di ISR tidak masalah: nilai itu menunjukkan waktu saat ISR dimulai. Pilih jendela waktu yang lebih lama daripada satu klik, agar pantulan saat tombol dilepas terjadi di dalamnya, dan lebih pendek daripada jeda antara dua klik cepat. 200 ms cocok untuk manusia.

challenge icon

Tantangan

Sedang

Penghitung ini menghitung setiap klik beberapa kali. Terapkan debounce di dalam onPress():

  • tambahkan variabel unsigned long lastPress
  • hitung satu falling edge hanya jika setidaknya 200 ms telah berlalu sejak lastPress, lalu simpan waktunya di lastPress

Tekan Jalankan, klik tombol beberapa kali dan amati hitungannya, lalu tekan Periksa.

Coba sendiri

const int buttonPin = 2;

volatile int presses = 0;
int shown = 0;

void onPress() {
  // setiap perubahan pin ke LOW dihitung, termasuk pantulannya: atasi pantulan di sini
  presses = presses + 1;
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}

void loop() {
  // cetak jumlahnya setiap kali berubah
  if (presses != shown) {
    shown = presses;
    Serial.println(shown);
  }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pengaturan Waktu Tanpa Delay

Latihan sendiri: Playground Arduino