Arduino - Tombol Fungsi Ganda - Tekan Panjang / Tekan Pendek (Tanpa Tunda) + Bonus: 6 Langkah

Arduino - Tombol Fungsi Ganda - Tekan Panjang / Tekan Pendek (Tanpa Tunda) + Bonus: 6 Langkah

Daftar Isi:

Anonim

Dengan menggunakan perangkat lunak, kita dapat mengambil satu tombol dan mengaktifkan atau menonaktifkan lampu, atau menyelesaikan fungsi yang lebih rumit jika kita inginkan. Tetapi bagaimana jika kita memiliki dua fungsi tetapi masih hanya satu tombol? Banyak dari kita menggunakan tombol seperti ini, misalnya pada smartphone, setiap hari; ini disebut pers pendek dan tekan lama (tekan dan tahan).

Panduan berikut akan membawa Anda melalui semua langkah yang diperlukan untuk membuat tombol tekan sederhana yang dapat mengontrol keadaan dua LED yang terpisah.

Persediaan:

Langkah 1: Teori

Pertama beberapa teori. Menggunakan tombol untuk menyalakan lampu itu sederhana, jika tombol itu membaca TINGGI (ketika ditekan), maka kita dapat menyalakan LED dengan menuliskan pin output yang dilampirkan TINGGI demikian juga. Setelah tombol membaca RENDAH, kita dapat mengatur pin output RENDAH lagi untuk mematikan LED. Inilah yang kami sebut sesaat.

Untuk pengaturan ini, kami ingin mengaktifkan atau menonaktifkan LED. Ini dalam dirinya sendiri adalah masalah untuk contoh sederhana di atas, karena fungsi loop di Arduino berulang ratusan kali per detik. Bahkan pers yang paling cepat pun bisa hidup dan mati berkali-kali. Masalah pertama ini akan kita atasi menggunakan satu atau dua boolean sederhana, dijelaskan pada beberapa halaman berikutnya.

Masalah kedua adalah fungsi panjang tekan. Bagaimana kita memicu fungsi ini tanpa terlebih dahulu memicu fungsi pers? Jawabannya sederhana. Fungsi tekan lama dipicu saat tombol ditekan, fungsi tekan singkat dipicu setelah tombol dilepaskan. Ini lagi dapat diamati pada ponsel pintar dengan merilis objek di layar tepat sebelum fungsi tekan lama diaktifkan.

Pada langkah berikutnya kita akan membuat pengaturan perangkat keras kita, silakan lewati ini jika Anda sudah pada tahap ini …

Langkah 2: Perangkat Keras

Perangkat kerasnya sangat lurus ke depan, jadi saya tidak akan terlalu membosankan Anda.

Pertama adalah dua LED. Kami mengirimkan anoda masing-masing ke pin 12 dan 13 pada Arduino, katoda kemudian menuju ke tanah.

Tombol terhubung ke output 5V dan pin 3 pada Arduino, kemudian di-ground dengan resistor 10kOhm.

Langkah 3: Perangkat Lunak Secara Rinci Bagian 1

Sekarang untuk merinci setiap langkah kode. Jika Anda ingin langsung menuju kode lengkap, Anda akan menemukannya di langkah 5

Pertama mari kita lihat variabel yang diperlukan untuk pengaturan ini, dimulai dengan referensi pin lurus ke depan.

int LED1 = 12; int LED2 = 13; tombol int = 3;

Selanjutnya kita perlu beberapa boolean. Ini akan digunakan untuk menyalakan atau mematikan status LED

boolean LED1State = false; boolean LED2State = false;

Dua booleans lain sekarang. Yang pertama akan diubah tergantung pada status tombol; ini akan memungkinkan kode untuk mendeteksi loop pertama setelah tombol ditekan atau dilepaskan. Yang kedua akan melayani dua fungsi, itu akan memungkinkan kode untuk menghentikan pers lama dari mengaktifkan lebih dari sekali, dan akan menghentikan fungsi pers singkat yang diaktifkan ketika kita melepaskan tombol setelah tekan lama.

boolean buttonActive = false; boolean longPressActive = false;

Akhirnya dua variabel terakhir. Variabel pertama digunakan untuk merekam waktu tombol ditekan pertama kali. Variabel kedua, adalah lama waktu (dalam milidetik) yang Anda inginkan agar tombolnya ditekan, untuk mengaktifkan fungsi tekan lama. Ini dapat diubah menjadi sosok pilihan Anda.

tombol panjangTimer = 0; longPressTime = 250;

Sekarang untuk pengaturan, ini sekali lagi sangat lurus ke depan, kami hanya mengatur mode pin.

void setup () {pinMode (LED1, OUTPUT); pinMode (LED2, OUTPUT); pinMode (tombol, INPUT); }

Langkah 4: Perangkat Lunak Secara Rinci Bagian 2

Sekarang untuk loop. Saya akan memecah ini sedikit demi sedikit, untuk menjelaskan apa yang terjadi. Hal pertama yang akan dilakukan program adalah membaca status tombol. Ini akan memberi kita kode di bawah ini dan dan memungkinkan kita untuk membuat fungsi untuk kondisi yang tidak ditekan dan ditekan, ingat bahwa fungsi tekan singkat terjadi pada saat tombol dilepas.

if (digitalRead (tombol) == HIGH) {// Tombol ditekan} lain {// Tombol tidak ditekan}

Di bagian tombol ditekan, hal pertama yang akan kita lakukan adalah menguji variabel buttonActive, setelah diatur ini salah. Jika saat ini salah, ini berarti program mendeteksi tombol sedang ditekan untuk pertama kalinya. Ini karena setelah membaca false, kami segera mengaturnya menjadi true, dan hanya melepaskan tombol yang dapat mengembalikannya ke false. Kami juga merekam waktu tombol pertama kali ditekan.

if (buttonActive == false) {buttonActive = true; buttonTimer = millis (); }

Langkah selanjutnya dalam bagian tombol ditekan, adalah untuk menguji berapa lama kita telah menahan tombol untuk. Kami melakukan ini dengan menguji waktu saat ini, mengurangi waktu pertama kali ditekan dalam milidetik dan membandingkannya dengan lamanya waktu yang kami inginkan sampai pers lama diaktifkan.

Kami juga memeriksa bahwa boolean longPressActive salah, karena setelah kami mengaktifkan fungsi tekan lama kami akan mengatur boolean ini menjadi true untuk menghentikan pengulangan aktivasi. Setelah kami menahan tombol untuk waktu yang diinginkan, kami akan membalik status boolean LED1State yang pada gilirannya akan membalik pin yang terpasang pada LED. TINGGI atau RENDAH demikian.

if ((millis () - buttonTimer> longPressTime) && (longPressActive == false)) {longPressActive = true; LED1State =! LED1State; digitalWrite (LED1, LED1State); }

Pindah ke tombol yang tidak menekan bagian kode. Hal pertama yang akan kita periksa adalah apakah boolean buttonActive benar. Jika disetel ke true, kode akan diulang untuk pertama kalinya sejak tombol dirilis. Ini kemudian akan mengatur boolean kembali ke false untuk memungkinkan kode di atas mendeteksi tombol yang ditekan lagi.

if (buttonActive == true) {buttonActive = false; }

Dalam pernyataan if di atas, karena kami mendeteksi loop pertama setelah pelepasan tombol, kita selanjutnya akan memeriksa apakah fungsi tekan lama diaktifkan, yang akan memberikan dua langkah yang mungkin. Jika pers lama diaktifkan, kami hanya akan mengatur longPressActive kembali ke false untuk memungkinkan program untuk menekan lama sekali lagi. Jika tidak diaktifkan, kami akan membalik status LED kedua seperti yang kami lakukan dengan yang pertama.

if (longPressActive == true) {longPressActive = false; } else {LED2State =! LED2State; digitalWrite (LED2, LED2State); }

Langkah 5: Kode Lengkap

Ini kode lengkap yang siap diunggah ke Arduino Anda.

int LED1 = 12; int LED2 = 13; tombol int = 3; boolean LED1State = false; boolean LED2State = false; tombol panjangTimer = 0; longPressTime = 250; boolean buttonActive = false; boolean longPressActive = false; void setup () {pinMode (LED1, OUTPUT); pinMode (LED2, OUTPUT); pinMode (tombol, INPUT); } void loop () {if (digitalRead (tombol) == HIGH) {if (buttonActive == false) {buttonActive = true; buttonTimer = millis (); } if ((millis () - buttonTimer> longPressTime) && (longPressActive == false)) {longPressActive = true; LED1State =! LED1State; digitalWrite (LED1, LED1State); }} else {if (buttonActive == true) {if (longPressActive == true) {longPressActive = false; } else {LED2State =! LED2State; digitalWrite (LED2, LED2State); } buttonActive = false; }}}

Langkah 6: Bonus - Dua Tombol 6 Fungsi

Bagaimana jika kita memiliki dua tombol? Maka kita memiliki kemungkinan 6 fungsi sebagai berikut.

Tombol Tekan Pendek 1

Tombol Tekan Pendek 2

Tombol Tekan Pendek 1 & 2

Tombol Tekan Panjang 1

Tombol Tekan Panjang 2

Tombol Tekan Panjang 1 & 2

Program bekerja dengan cara yang sama seperti kode pertama, dengan beberapa perubahan penting.

Pertama ada lebih banyak LED, artinya ada lebih banyak variabel, dan tentu saja tombol ekstra. Tetapi perubahan terbesar datang ke titik di mana pers lama atau pers pendek diaktifkan. Setelah salah satu dari dua titik ini tercapai, alih-alih menyalakan atau mematikan LED, kami memiliki tiga tindakan yang mungkin untuk setiap fungsi. Menghasilkan satu dari enam kemungkinan LED menyala atau mati. Untuk menentukan tindakan yang harus diambil, kami memeriksa status setiap tombol dan titik-titik itu, dan merespons sesuai.

Ini kodenya

int LED1 = 8; int LED2 = 9; int LED3 = 10; int LED4 = 11; int LED5 = 12; int LED6 = 13; int button1 = 3; int button2 = 4; tombol panjangTimer = 0; panjang buttonTime = 250; boolean buttonActive = false; boolean longPressActive = false; boolean button1Active = false; boolean button2Active = false; boolean LED1Active = false; boolean LED2Active = false; boolean LED3Active = false; boolean LED4Active = false; boolean LED5Active = false; boolean LED6Active = false; void setup () {pinMode (LED1, OUTPUT); pinMode (LED2, OUTPUT); pinMode (LED3, OUTPUT); pinMode (LED4, OUTPUT); pinMode (LED5, OUTPUT); pinMode (LED6, OUTPUT); pinMode (tombol1, INPUT); pinMode (tombol2, INPUT); } void loop () {if (digitalRead (button1) == HIGH) {if (buttonActive == false) {buttonActive = true; buttonTimer = millis (); } button1Active = true; } if (digitalRead (button2) == HIGH) {if (buttonActive == false) {buttonActive = true; buttonTimer = millis (); } button2Active = true; } if ((buttonActive == true) && (millis () - buttonTimer> buttonTime) && (longPressActive == false)) {longPressActive = true; if ((button1Active == true) && (button2Active == true)) {LED4Active =! LED4Active; digitalWrite (LED4, LED4Active); } lain jika ((button1Active == true) && (button2Active == false)) {LED5Active =! LED5Active; digitalWrite (LED5, LED5Active); } else {LED6Active =! LED6Active; digitalWrite (LED6, LED6Active); }} if ((buttonActive == true) && (digitalRead (button1) == LOW) && (digitalRead (button2) == LOW)) {if (longPressActive == true) {longPressActive = false; } else {if ((button1Active == true) && (button2Active == true)) {LED1Active =! LED1Active; digitalWrite (LED1, LED1Active); } lain jika ((button1Active == true) && (button2Active == false)) {LED2Active =! LED2Active; digitalWrite (LED2, LED2Active); } else {LED3Active =! LED3Active; digitalWrite (LED3, LED3Active); }} buttonActive = false; button1Active = false; button2Active = false; }}

Dari sini kita bahkan dapat menambahkan tombol ketiga untuk kemungkinan 14 LED, atau empat tombol untuk 30 LED. Mungkin lain kali:)