Bab 2 Proyek-proyek Arduino
3.5 Tombol-tombol yang Ada
dapat membangun, dan untuk prototipe pertama, ini adalah OK. Tetapi sering Anda membutuhkan lebih dari satu tombol, dan juga lebih elegan untuk
menambahkan tombol Anda sendiri anyway. Jadi, itulah yang akan kita lakukan pada bagian berikutnya.
3.5 Tombol-tombol yang Ada
Pada bagian ini, kita akan menambahkan tombol tekan kita sendiri untuk dadu biner kita, sehingga kita tidak lagi harus penyalahgunaan tombol reset Arduino untuk melempar dadu. Kita akan memulai dari yang kecil dan
membangun sebuah sirkuit yang menggunakan tombol tekan untuk mengontrol LED tunggal. Jadi, apa sebenarnya tombol tekan (pushbuttons)?
Berikut adalah tiga pandangan khas tombol tekan yang dapat digunakan sebagai tombol reset Arduino itu. Terhubung Terhubung Top Front Side Ia memiliki empat konektor yang sangat pas pada papan tempat breadboard
(setidaknya setelah Anda telah meluruskan mereka dengan tang). Dua berlawanan pin terhubung saat tombol ditekan, jika tidak, mereka terputus. Pada Hubungkan pin 7 (dipilih secara acak) ke tombol tekan, dan menghubungkan tombol tekan melalui 10k resistor ke ground pin. Kemudian hubungkan power supply 5 volt ke pin lain dari tombol. Semua dalam semua, pendekatan ini tampaknya mudah, tapi mengapa kita perlu resistor lagi?
Masalahnya adalah bahwa kita mengharapkan tombol tekan untuk kembali nilai default (LOW) dalam kasus ini tidak ditekan. Tapi ketika tombol tidak ditekan, tidak akan langsung terhubung ke tanah dan akan berkedip karena statis dan gangguan. Sedikit arus mengalir melalui resistor, dan ini membantu
mencegah gangguan acak dari mengubah tegangan bahwa pin input melihat.
const unsigned int BUTTON_PIN = 7;
const unsigned int LED_PIN = 13;
void setup() {
39
pinMode(BUTTON_PIN, INPUT); }
void loop() {
const int BUTTON_STATE = digitalRead(BUTTON_PIN);
if (BUTTON_STATE == HIGH) digitalWrite(LED_PIN, HIGH);
else
digitalWrite(LED_PIN, LOW); }
Kita menghubungkan tombol ke pin 7 dan LED untuk pin 13 dan
menginisialisasi pin sesuai pada setup () function. Dalam loop (), kita membaca saat ini keadaan pin yang terhubung ke tombol. Jika TINGGI, kita beralih LED on. Jika tidak, kita mematikannya. Meng-upload program ke Arduino, dan Anda akan melihat bahwa LED adalah pada selama Anda menekan tombol. Segera setelah Anda melepaskan tombol, LED akan mati.
Ini sangat keren, karena sekarang kita hampir memiliki semua yang kita butuhkan untuk mengendalikan dadu kita menggunakan tombol kita sendiri. tapi sebelum kita lanjutkan, kita akan sedikit meningkatkan contoh kita dan
mengubah tombol menjadi tombol lampu nyata. Untuk membangun sebuah lampu, kita mulai dengan solusi yang paling sederhana mungkin. Jangan
mengubah arus hubung, dan meng-upload program berikut untuk Arduino Anda :
const unsigned int BUTTON_PIN = 7;
- const unsigned int LED_PIN = 13;
- - void setup(){ 5 pinMode(LED_PIN, OUTPUT); - pinMode(BUTTON_PIN, INPUT); - } -
40 10
- void loop(){
- const int CURRENT_BUTTON_STATE = digitalRead(BUTTON_PIN);
-
- if (CURRENT_BUTTON_STATE == HIGH){
15 led_state = (led_state == LOW) ? HIGH : LOW;
- digitalWrite(LED_PIN, led_state);
- }
- }
Kita mulai dengan biasa pin konstanta, dan di setup () kita tentukan mode pin yang kita gunakan. Sejalan 9, kita mendefinisikan variabel bernama led_state global yang untuk menyimpan kondisi saat LED kita. Ini akan menjadi LOW ketika LED adalah dan TINGGI sebaliknya. Dalam loop (), kita cek negara
tombol saat ini. Ketika kita menekan tombol, negara yang beralih ke TINGGI, dan kita mengaktifkan isi led_state.
Artinya, jika led_state adalah TINGGI, kita set ke LOW, dan sebaliknya. Pada akhirnya, kita mengatur negara LED fisik untuk saat ini kita state perangkat lunak yang sesuai. Solusi kita adalah benar-benar sederhana, tapi sayangnya, tidak bekerja. Putar main dengan itu sedikit, dan Anda akan segera melihat beberapa perilaku yang mengganggu.
Jika Anda menekan tombol, misalnya, kadang-kadang LED akan menyala dan kemudian pergi dengan segera. Juga, jika Anda melepaskannya, LED akan sering tetap berada dalam keadaan kurang lebih sewenang-wenang, yaitu, kadang-kadang akan berada di dan kadang-kadang-kadang-kadang off. Masalahnya adalah bahwa Arduino mengeksekusi loop (metode) dan lebih lagi. Meskipun CPU Arduino adalah relatif lambat, ini akan terjadi sangat sering tidak peduli apakah kita saat ini tekan
tombol atau tidak.
Tetapi jika Anda tekan dan tekan terus, negaranya akan terus menjadi TINGGI, dan Anda akan terus-menerus beralih negara LED (karena ini terjadi begitu cepat sepertinya LED terus-menerus). Ketika Anda melepaskan tombol, LED berada dalam keadaan yang lebih atau kurang sewenang-wenang. Untuk
41 memperbaiki situasi, kita harus menyimpan tidak hanya saat LED negara tetapi juga keadaan sebelumnya tombol tekan ini :
const unsigned int BUTTON_PIN = 7;
const unsigned int LED_PIN = 13;
void setup() {
pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT); }
int old_button_state = LOW;
int led_state = LOW;
void loop() {
const int CURRENT_BUTTON_STATE = digitalRead(BUTTON_PIN);
if (CURRENT_BUTTON_STATE!= old_button_state && CURRENT_BUTTON_STATE == HIGH)
{
led_state = (led_state == LOW) ? HIGH : LOW; digitalWrite(LED_PIN, led_state);
}
old_button_state = CURRENT_BUTTON_STATE; }
Setelah inisialisasi tombol dan pin LED, kita mendeklarasikan dua
variabel sekarang: toko old_button_state keadaan sebelumnya tombol tekan kita, dan led_state menyimpan negara LED saat ini. Keduanya dapat berupa TINGGI atau RENDAH. Dalam loop () fungsi, kita masih harus membaca tombol negara saat ini, tapi sekarang kita tidak hanya memeriksa apakah TINGGI. Kita juga memeriksa apakah itu telah berubah sejak terakhir kali kita membacanya. Hanya ketika kedua kondisi terpenuhi kita beralih negara LED. Jadi, kita tidak lagi menyalakan LED dan mematikan berulang-ulang selama tombol ditekan.
Di akhir program kita, kita harus menyimpan kondisi tombol saat di old_button_state. Upload versi baru kita, dan Anda akan melihat bahwa solusi ini
42 bekerja jauh lebih baik dari yang lama kita. Tapi Anda masih akan menemukan beberapa kasus tepi ketika tombol tidak sepenuhnya berperilaku seperti yang diharapkan. Masalah terutama terjadi pada saat Anda melepas tombol. Penyebab masalah ini adalah bahwa tombol mekanik bangkit untuk beberapa milidetik ketika Anda menekan mereka.
Tepat setelah Anda memiliki menekan tombol, Arduino tidak
memancarkan sinyal yang jelas. Untuk mengatasi hal ini Akibatnya, Anda harus menghilangkan bounce tombol. Ini biasanya cukup untuk menunggu periode singkat waktu sampai sinyal tombol yang stabil. debouncing memastikan bahwa kita bereaksi hanya sekali untuk menekan tombol. tambahan untuk debouncing, kita masih harus menyimpan keadaan saat ini LED dalam variabel. Berikut adalah cara untuk melakukannya:
const unsigned int BUTTON_PIN = 7;
- const unsigned int LED_PIN = 13;
- - void setup(){ 5 pinMode(LED_PIN, OUTPUT); - pinMode(BUTTON_PIN, INPUT); - } -
- int old_button_state = LOW;
10 int led_state = LOW;
- void loop(){
- const int CURRENT_BUTTON_STATE = digitalRead(BUTTON_PIN);
- if (CURRENT_BUTTON_STATE!= old_button_state &&
15 CURRENT_BUTTON_STATE == HIGH)
- {
- led_state = (led_state == LOW) ? HIGH : LOW;
- digitalWrite(LED_PIN, led_state);
- delay(50);
43 - old_button_state = CURRENT_BUTTON_STATE;
- }
Ini versi final switch LED kita berbeda dari yang sebelumnya di hanya satu baris: untuk menghilangkan bounce tombol, kita tunggu 50 milidetik sejalan 19 sebelum kita memasuki loop utama lagi. Ini adalah segalanya yang perlu Anda ketahui tentang tombol tekan untuk saat ini. dalam bagian berikutnya, kita akan menggunakan dua tombol untuk mengubah dadu biner kita menjadi nyata game.