xx123xx

Pilih promo sekarang

ARDUINO LED BUTTON FIX BOUNCE

TEKNISI AMATIR
0

 

Sirkuit Arduino dengan LED dan tombol

Untuk membangun sirkuit, Anda memerlukan komponen-komponen berikut:

  • Papan Arduino (papan apa pun, jika Anda tidak memiliki Uno, Anda dapat dengan mudah beradaptasi dengan mencari pin yang sesuai).
  • Papan tempat memotong roti.
  • LED – warna apa pun.
  • Tekan tombol.
  • Resistor 220 Ohm untuk LED. Jika Anda tidak memiliki nilai spesifik ini, resistor apa pun dari 330 hingga 1k Ohm bisa digunakan.
  • Resistor 10k Ohm untuk tombol tekan. Kalau tidak punya, bisa sampai 20k-50k Ohm.
  • Sekumpulan kabel male to male (termasuk jika memungkinkan warna hitam, merah, dan warna lainnya).

Inilah sirkuit yang harus Anda buat.

Sirkuit Arduino - LED dan Tombol Tekan

Petunjuk langkah demi langkah untuk membangun sirkuit ( info lebih lanjut tentang pin Arduino di sini ):

  • Pertama, pastikan untuk mematikan Arduino Anda – lepaskan semua kabel USB.
  • Pasang kabel hitam di antara garis biru papan tempat memotong roti dan pin ground (GND) pada papan Arduino.
  • Colokkan LEDnya. Anda dapat melihat bahwa LED memiliki kaki yang lebih pendek dari yang lain. Hubungkan kaki yang lebih pendek ini ke ground (garis biru di sini) pada sirkuit.
  • Hubungkan kaki LED yang lebih panjang ke pin digital (di sini pin no 8, Anda bisa mengubahnya). Tambahkan resistor 220 Ohm di antaranya untuk membatasi arus yang melalui LED.
  • Tambahkan tombol tekan ke papan tempat memotong roti, seperti pada gambar.
  • Hubungkan salah satu kaki tombol ke ground, dan letakkan resistor 10k Ohm di antaranya. Resistor ini akan bertindak sebagai resistor “pull down”, yang berarti status tombol default adalah RENDAH.
  • Tambahkan kabel merah di antara kaki tombol lainnya dan VCC (5V).
  • Terakhir, sambungkan kaki tombol (sisi yang sama dengan resistor pull down) ke pin digital (di sini 7).

Baiklah, sirkuit Anda sekarang sudah selesai. Anda dapat mulai menulis kode.

Nyalakan LED saat tombol ditekan, sebaliknya matikan

Apa yang ingin kami capai sederhana saja: ketika tombol tidak ditekan, LED mati. Dan ketika kita menekan tombolnya seharusnya LED menyala.

Kode

#tentukan LED_PIN 8
#tentukan BUTTON_PIN 7
batalkan pengaturan () {
pinMode ( LED_PIN, KELUARAN ) ;
pinMode ( BUTTON_PIN, INPUT ) ;
}
lingkaran kosong () {
jika ( Baca digital ( BUTTON_PIN ) == TINGGI ) {
tulis digital ( LED_PIN, TINGGI ) ;
}
lain {
digitalWrite ( LED_PIN, RENDAH ) ;
}
}

Mari kita pecahkan kode ini baris demi baris.

Mempersiapkan

#tentukan LED_PIN 8
#tentukan BUTTON_PIN 7

Pertama, sebagai praktik terbaik, kami menggunakan beberapa definisi untuk menyimpan nomor pin untuk LED dan tombol tekan. Dengan begitu, jika Anda sudah menggunakan pin yang berbeda dengan saya, Anda hanya perlu memodifikasi 2 baris tersebut. Juga, di masa depan jika Anda ingin mengubah LED dari pin 8 ke pin 11 misalnya, Anda dapat memodifikasi baris ini tanpa menyentuh apa pun di kode.

batalkan pengaturan () {
pinMode ( LED_PIN, KELUARAN ) ;
pinMode ( BUTTON_PIN, INPUT ) ;
}

Fungsi setup dijalankan satu kali pada awal program. Ini adalah waktu yang tepat untuk menginisialisasi pin kita dengan fungsi pinMode():

  • OUTPUT untuk LED, karena kita akan menulis data ke dalamnya.
  • INPUT untuk tombol tekan, karena kita akan membaca data darinya.

Sekarang, pin digital sudah diatur dengan benar.

Loop – Nyalakan LED saat tombol ditekan

lingkaran kosong () {
jika ( Baca digital ( BUTTON_PIN ) == TINGGI ) {
tulis digital ( LED_PIN, TINGGI ) ;
}
lain {
digitalWrite ( LED_PIN, RENDAH ) ;
}
}

Dalam fungsi loop, kita mulai dengan membaca status tombol dengan fungsi digitalRead(). Karena kita mempunyai resistor pull down pada tombolnya, kita tahu bahwa keadaan tidak ditekan akan memberi kita nilai RENDAH.

(Catatan: jika Anda menggunakan resistor pull up, atau tanpa resistor sama sekali – dengan opsi INPUT_PULLUP   untuk pinMode – ini akan menjadi kebalikannya. HIGH ketika tombol tidak ditekan, dan LOW ketika ditekan.)

Jadi, setelah kita mendapatkan status tombolnya, kita periksa apakah HIGH atau LOW:

  • HIGH (ditekan): kita menyalakan LED dengan digitalWrite() dan status HIGH.
  • LOW (tidak ditekan): kita matikan LED dengan digitalWrite() dan status LOW.

Oke, sekarang mari kita lakukan sesuatu yang sedikit lebih rumit.

Alihkan status LED dengan tombol tekan – iterasi pertama

Apa yang ingin kami lakukan adalah mengubah status LED saat Anda menekan + melepaskan tombol. Jadi, saat pertama kali Anda melepaskan tombolnya, LED akan menyala. Kedua kalinya, itu akan mati. Dll.

Kode

#tentukan LED_PIN 8
#tentukan BUTTON_PIN 7
byte lastButtonState = RENDAH;
byte ledState = RENDAH;
batalkan pengaturan () {
pinMode ( LED_PIN, KELUARAN ) ;
pinMode ( BUTTON_PIN, INPUT ) ;
}
lingkaran kosong () {
byte buttonState = digitalRead ( BUTTON_PIN ) ;
jika ( buttonState != lastButtonState ) {
lastButtonState = status tombol;
jika ( buttonState == RENDAH ) {
ledState = ( ledState == TINGGI ) ? RENDAH: TINGGI;
digitalWrite ( LED_PIN, ledState ) ;
}
}
}

Mari kita menganalisis kodenya.

Mempersiapkan

#tentukan LED_PIN 8
#tentukan BUTTON_PIN 7

Definisi tersebut sama dengan sebelumnya.

byte lastButtonState = RENDAH;
byte ledState = RENDAH;

Kita perlu membuat 2 variabel global, untuk menjaga status tombol dan LED. Dalam perulangan kita akan menggunakan variabel tersebut untuk membandingkan keadaan sebelumnya dengan keadaan baru.

batalkan pengaturan () {
pinMode ( LED_PIN, KELUARAN ) ;
pinMode ( BUTTON_PIN, INPUT ) ;
}

Pengaturan kekosongan tetap sama. Kami baru saja mengatur mode untuk kedua pin.

Dan kini hal serius akan datang. Kami memasuki fungsi loop kosong.

Pantau status tombol

lingkaran kosong () {
byte buttonState = digitalRead ( BUTTON_PIN ) ;

Hal pertama yang kita lakukan adalah membaca status tombol dan menyimpannya di dalam variabel lokal baru.

jika ( buttonState != lastButtonState ) {

Kemudian kita dapat membandingkan keadaan saat ini dengan keadaan terakhir (dari eksekusi fungsi loop sebelumnya). 4 kemungkinan di sini:

  1. RENDAH -> RENDAH (terakhir -> saat ini).
  2. RENDAH -> TINGGI.
  3. TINGGI -> RENDAH.
  4. TINGGI -> TINGGI.

Dengan syarat, kita hanya memasukkan blok kode selanjutnya jika state saat ini dan terakhir berbeda. Jika 2 statusnya sama, maka kita tidak memasukkan if dan fungsi loop selesai untuk giliran ini.

lastButtonState = status tombol;

Selain itu, setelah kita mempunyai informasi yang diinginkan, kita langsung menyimpan status saat ini ke dalam variabel status terakhir, sehingga kita mendapatkan nilai yang benar untuk kali berikutnya kita memasuki perulangan.

jika ( buttonState == RENDAH ) {

Saat ini kita hanya mempunyai 2 kemungkinan tersisa:

  • Entah keadaan sebelumnya adalah LOW dan keadaan saat ini adalah HIGH (tidak ditekan untuk ditekan).
  • Atau keadaan sebelumnya HIGH dan keadaan sekarang LOW (ditekan hingga tidak ditekan).

Kita hanya tertarik pada opsi kedua, jadi di sini kita hanya perlu memeriksa apakah status tombol saat ini RENDAH. Jika demikian, sekarang kita dapat menyalakan atau mematikan LED.

Alihkan LED saat tombol telah dilepaskan

ledState = ( ledState == TINGGI ) ? RENDAH : TINGGI;

Di sini kita mengubah status LED. Saya bukan penggemar berat one-liner tetapi yang ini sangat berguna ketika Anda hanya perlu mengubah suatu keadaan. Ini akan menghemat 3-4 baris kode untuk sesuatu yang sangat sepele.

Berikut templat untuk satu kalimat ini: (kondisi untuk dievaluasi) ? jika benar gunakan nilai ini : jika salah gunakan nilai ini.

Jadi, jika LED sedang menyala (ledState == HIGH), kita tetapkan nilai LOW. Jika LED dimatikan (ledState != HIGH), kami menetapkan nilai HIGH.

digitalWrite ( LED_PIN, ledState ) ;
}
}
}

Dan hal terakhir yang perlu kita lakukan tentu saja mengatur status LED secara fisik, dengan status komputasi baru.

Nyalakan dan matikan LED dengan tombol – menggunakan debounce

Satu hal yang mungkin Anda perhatikan pada percobaan sebelumnya: terkadang saat Anda menekan dan melepaskan tombol, status LED tidak berubah, atau berkedip cepat beberapa kali.

Ini karena tombolnya memantul secara fisik saat Anda menekannya. Dengan demikian, banyak kesalahan positif yang akan ditafsirkan oleh Arduino. Apa yang dapat Anda lakukan untuk mencegahnya adalah dengan menambahkan penundaan debounce pada kode Anda. Misalnya, Anda dapat memutuskan bahwa ketika program mendeteksi perubahan pada status tombol, program akan menunggu 50 milidetik sebelum mempertimbangkan perubahan lain yang layak.

Mari tambahkan beberapa baris ke kode kita sebelumnya.

Kode yang ditingkatkan

#tentukan LED_PIN 8
#tentukan BUTTON_PIN 7
byte lastButtonState = RENDAH;
byte ledState = RENDAH;
unsigned long debounceDuration = 50; // milis
unsigned long lastTimeButtonStateChanged = 0;
batalkan pengaturan () {
pinMode ( LED_PIN, KELUARAN ) ;
pinMode ( BUTTON_PIN, INPUT ) ;
}
lingkaran kosong () {
jika ( milis () - lastTimeButtonStateChanged > debounceDuration ) {
byte buttonState = digitalRead ( BUTTON_PIN ) ;
jika ( buttonState != lastButtonState ) {
lastTimeButtonStateChanged = milis () ;
lastButtonState = status tombol;
jika ( buttonState == RENDAH ) {
ledState = ( ledState == TINGGI ) ? RENDAH: TINGGI;
digitalWrite ( LED_PIN, ledState ) ;
}
}
}
}

Sekarang, jika Anda menjalankan program ini, Anda tidak akan mengalami masalah dengan status LED yang berubah secara acak saat Anda menekan/melepaskan tombol.

Dan inilah cara kami mencapainya.

Debounce menjelaskan

unsigned long debounceDuration = 50; // milis
unsigned long lastTimeButtonStateChanged = 0;

Kami membuat 2 variabel global baru:

  • Pertama untuk memutuskan berapa lama kita ingin menunggu sebelum memvalidasi perubahan kedua pada status tombol. Artinya jika status berubah, perubahan apa pun setelahnya dalam 50 milidetik berikutnya akan diabaikan. 50 mili adalah nilai yang bagus, Anda dapat bereksperimen dengan nilai yang lebih rendah dan lebih tinggi untuk memeriksa perilakunya.
  • Satu lagi yang perlu diingat kapan terakhir kali keadaan diubah, jadi kita mempunyai titik awal untuk membandingkannya.
lingkaran kosong () {
jika ( milis () - lastTimeButtonStateChanged > debounceDuration ) {

Kemudian, dalam perulangan, kita hanya memulai fungsi tombol/LED jika sudah cukup waktu berlalu sejak terakhir kali status tombol diubah.

Untuk melakukannya cukup sederhana: kami membandingkan durasi sejak waktu pembaruan terakhir dengan durasi debounce yang diperlukan.

jika ( buttonState != lastButtonState ) {
lastTimeButtonStateChanged = milis () ;

Setelah penundaan debounce terlewati, maka kita dapat melakukan apa yang kita lakukan sebelumnya. Dan jangan lupa untuk memperbarui titik awal untuk “pengatur waktu debounce” tepat setelah Anda mendeteksi perubahan dalam status tombol. Jadi, saat program memasuki loop lagi, program akan menunggu selama 50 milidetik (atau nilai yang Anda pilih) untuk mendeteksi perubahan baru pada status tombol.

Kesimpulan – Arduino menghidupkan dan mematikan Led dengan tombol

Dalam tutorial ini Anda telah melihat cara membuat rangkaian Arduino dengan LED dan tombol tekan, dan juga cara mengontrol rangkaian ini untuk menghidupkan dan mematikan LED dengan tombol.

Meskipun aplikasinya cukup sederhana, ada banyak cara untuk memprogramnya. Anda dapat menyalakan LED hanya saat tombol ditekan, atau membuat LED berkedip saat Anda melepaskan tombol, dan seterusnya.

Cara lain untuk menulis kode (untuk fungsi yang sama persis) adalah dengan menggunakan interupsi Arduino – tersedia untuk papan yang memiliki pin interupsi.

Untuk melangkah lebih jauh dari sini, lihat:

source : roboticbacken.com

terimakasih, semoga artikel ini bisa bermanfaat untuk kalian semua, jangan lupa follow, dan subscribe chanel kami, jika ada pertanyaan silakan tuliskan pada kolom komentan.
seeyou next time...... 

Posting Komentar

0Komentar
Posting Komentar (0)