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.
Tantangan
SedangPenghitung 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 dilastPress
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);
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pengaturan Waktu Tanpa Delay
1millis()
Jam millis()Waktu dalam unsigned longLED Berkedip Tanpa JedaDua LED, Dua KecepatanLED Berkedip Saat Tombol Mengubah StatusLampu dengan Pengatur Waktu4Pengaturan Waktu yang Presisi
Mengukur dengan micros()Saat millis() Berputar KembaliStopwatch Tombol3Interupsi
Tekanan Tombol yang Luput dari LoopFALLING, RISING, dan CHANGEBerbagi dengan volatileHitung Tekanan Tombol dengan InterupsiLatihan sendiri: Playground Arduino