Isi kandungan:

Kalkulator Skrin Sentuh Arduino: 7 Langkah
Kalkulator Skrin Sentuh Arduino: 7 Langkah

Video: Kalkulator Skrin Sentuh Arduino: 7 Langkah

Video: Kalkulator Skrin Sentuh Arduino: 7 Langkah
Video: Program Arduino | MEMBUAT KALKULATOR BERBASIS ARDUINO UNO 2024, Julai
Anonim
Kalkulator Skrin Sentuh Arduino
Kalkulator Skrin Sentuh Arduino

Helo! Ini adalah projek untuk membuat kalkulator skrin sentuh menggunakan Arduino Uno dan perisai TFT LCD. Saya mengemukakan konsep untuk kelas pengaturcaraan homeschool saya, dan pengalaman membina projek ini sangat menarik. Kalkulator ini dapat melakukan empat operasi matematik sederhana (penambahan, pengurangan, pendaraban, dan pembahagian). Ia juga memaparkan hingga dua titik perpuluhan untuk jawapan bahagian yang memilikinya. Mari selami! Bekalan untuk projek ini disenaraikan di bawah.

Bekalan

- Arduino Uno

- 2.4 TFT LCD Shield (di sinilah saya membelinya:

- Kabel USB A ke B (kabel untuk menyambungkan Arduino ke komputer)

- Komputer dengan Arduino IDE dipasang

- Anda juga perlu memuat turun dua perpustakaan: MCUFRIEND_kbv dan Skrin Sentuh. Yang pertama anda dapati di github (pautan: https://github.com/prenticedavid/MCUFRIEND_kbv) atau anda boleh menggunakan fail zip perpustakaan yang saya sertakan di bawah. Yang kedua adalah di pengurus Perpustakaan Arduino untuk pemasangan.

Langkah 1: Sambungan Perkakasan

Sambungan Perkakasan
Sambungan Perkakasan
Sambungan Perkakasan
Sambungan Perkakasan
Sambungan Perkakasan
Sambungan Perkakasan

Sambungan pelindung skrin sentuh ke Arduino Uno mudah dan pantas. Yang harus anda lakukan hanyalah melariskan pin paling rendah pada perisai dengan pin terendah di Arduino dan mendorong pelindung ke dalam pin. Pin 5V teratas dan pin yang tidak berlabel di sisi kuasa seharusnya tidak mempunyai pin dari perisai di dalamnya, dengan parameter yang sama berlaku untuk pin berlabel SCL dan SDA di sisi lain papan. Sekarang, kami sudah bersedia untuk membuat kod!

Langkah 2: Kod: Definisi & Persediaan Global

#sertakan

MCUFRIEND_kbv tft; // tetap untuk perisai UNO pula

#sertakan

#tentukan YP A3

#tentukan XM A2

#tentukan YM 9

#tentukan XP 8

TouchScreen ts = TouchScreen (XP, YP, XM, YM, 300);

#tentukan MINPRESSURE 10

Ini adalah permulaan kod, di mana kami menyertakan perpustakaan (MCUFRIEND_kbv & Touchscreen), menentukan pin X dan Y, mengatur parameter skrin sentuh, dan menentukan tekanan minimum yang diperlukan agar Arduino mendaftarkan akhbar pengguna.

ID int;

int pengguna_pilihan;

terapung_number = 0;

jangka masa apungan1;

int op_num;

hasil apungan;

int kursorLocX = 5;

int kursorLocY = 20;

Tepat sebelum persediaan, kita perlu menyediakan beberapa pemboleh ubah global. ID membantu menghidupkan dan membuka skrin sentuh. user_selection memegang nombor yang sesuai dengan kunci yang dipilih pengguna semasa menekan skrin sentuh. save_number adalah pemboleh ubah yang kami cetak ke skrin setelah kemasukan pengguna (lebih lanjut mengenai ini dalam gelung). Ia adalah pelampung sehingga dapat menahan nombor perpuluhan dan juga bilangan bulat. term1 adalah pemboleh ubah yang mana nombor persamaan pertama disimpan setelah operan dipilih. op_num menyimpan operan sebagai nombor (1 untuk penambahan, 2 untuk pengurangan, 3 untuk pendaraban, dan 4 untuk pembahagian). hasilnya adalah pemboleh ubah yang dicetak ke skrin setelah pengguna menekan tanda sama. Ia juga terapung. cursorLocX dan cursorLocY adalah titik pemetaan pada skrin sentuh di mana kursor ditetapkan beberapa kali (terletak di bar kelabu di bahagian atas, atau dikenali sebagai medan hasil).

batal persediaan () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

petak ();

nombor ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Fungsi penyediaan kami pertama kali mengandungi inisialisasi untuk pelindung skrin sentuh (baris 1-3). Orientasi perisai ditetapkan menggunakan perintah tft.setRotation (), dengan 0 tegak. Seluruh skrin berwarna kelabu gelap dengan perintah tft.fillScreen (), yang akan kami tulis di bahagian atas (kecuali untuk bidang hasil). Fungsi kotak () dan nombor () melukis kotak kalkulator, mewarnakan kotak hitam dan putih dalam corak papan centang, dan menulis nombor / operan pada kotak dengan warna biru. Kami akan menghubungi mereka dalam langkah seterusnya. Perintah tft.setTextSize () menetapkan ukuran teks medan hasil menjadi 3, yang merupakan font sederhana. Perintah tft.setTextColor () menetapkan warna teks medan hasil menjadi biru, yang ditulis di atas medan kelabu gelap.

Langkah 3: Kod: Gelung

gelung kosong () {numberSelect ();

kelewatan (100);

jika (user_selection == 16) {

;

} lain {

jika (pemilihan_pengguna <10) {

save_number = save_number * 10 + user_selection;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (save_number);

} lain jika (pemilihan_pengguna> 10) {

beralih (pemilihan_ pengguna) {

kes 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

term1 = nombor_simpan;

save_number = 0;

rehat;

kes 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

term1 = nombor_simpan;

save_number = 0;

rehat;

kes 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

term1 = nombor_simpan;

save_number = 0;

rehat;

kes 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

term1 = nombor_simpan;

save_number = 0;

rehat;

kes 15:

save_number = 0;

istilah1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

rehat;

}

tft.setCursor (cursorLocX, cursorLocY);

Ini banyak untuk dikunyah, jadi saya akan menerangkan apa yang ada di atas. Kita mulakan dengan memanggil fungsi numberSelect (), yang memberikan nombor ke setiap petak di skrin sentuh. Apabila pengguna menekan salah satu petak itu, fungsi menetapkan pemboleh ubah pemilihan pengguna ke bilangan petak. Pernyataan pertama jika hanya berjalan melalui gelung jika pemilihan pengguna yang sah telah dibuat. Sekiranya ada, pernyataan if berikutnya akan bertanya apakah user_selection mempunyai nombor kurang dari 10 yang tersimpan di dalamnya (nombor 0-9). Jika ya, save_number dikalikan dengan 10 dan nombor di user_selection ditambahkan ke save_number, yang dicetak di medan hasil pada skrin sentuh. Sekiranya tidak, pernyataan if berikutnya bertanya apakah user_selection mempunyai nombor yang lebih besar daripada 10 yang tersimpan di dalamnya (nombor operan: 11 untuk +, 12 untuk -, 13 untuk X, 14 untuk /, dan 15 untuk kotak skrin yang jelas). Fungsi suis mengurus setiap kes (ditentukan oleh pemilihan_pengguna). Pemboleh ubah op_num diberi nombor yang sesuai dengan operasi yang dipilih (1 untuk +, 2 untuk -, 3 untuk X, dan 4 untuk /). Nilai dalam save_number disimpan ke dalam pemboleh ubah term1 sehingga pembolehubah_ save number dapat digunakan untuk separuh kedua persamaan. Simbol operan dicetak di layar bersama dengan membersihkan nombor di medan hasil. Satu-satunya pengecualian adalah kotak yang jelas, yang menetapkan semula semua pemboleh ubah pengiraan dan membersihkan medan hasil dari apa sahaja di atasnya.

} lain {

tukar (op_num) {

kes 1:

hasil = term1 + nombor_simpan;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (berganda (hasil));

rehat;

kes 2:

hasil = term1 - nombor_simpan;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (berganda (hasil));

rehat;

kes 3:

hasil = term1 * nombor_simpan;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (berganda (hasil));

rehat;

kes 4:

hasil = float (term1) / float (nombor_simpan);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (hasil);

rehat;

}

tft.setCursor (cursorLocX, cursorLocY);

save_number = hasil;

istilah1 = 0;

op_num = 0;

kelewatan (1000);

}

}

}

Bahagian terakhir gelung berkenaan dengan peristiwa pengguna memilih tanda sama dengan (user_selection == 10). Fungsi suis lain berfungsi melalui empat fungsi matematik (ditentukan oleh op_num). Huruf tambahan (kes 1) menambah istilah1 dan nombor_simpan bersama-sama dan menyimpan nombor ke dalam pemboleh ubah hasil. Hasilnya dicetak ke medan hasil sebagai ganda. Kes penolakan (kes 2) mengurangkan bilangan_simpan dari istilah1 dan menyimpan nombor ke dalam pemboleh ubah hasil. Hasilnya dicetak ke medan hasil sebagai berganda. Huruf pendaraban (kes 3) menggandakan istilah1 dengan save_number dan menyimpan nombor ke dalam pemboleh ubah hasil. Hasilnya dicetak ke medan hasil sebagai ganda. Kes pembahagian (kes 4) membahagi istilah1 dengan nombor_simpan bersama-sama dan menyimpan nombor ke dalam pemboleh ubah hasil. Hasilnya dicetak ke medan hasil sebagai apungan (kerana pembahagian jawapan boleh menjadi nombor perpuluhan). Selepas peristiwa sama ada nombor, operan, atau hasil dicetak ke layar, kursor diset semula, save_number ditetapkan ke hasil sebelumnya, dan term1 & op_num diset semula.

Beberapa nota: pengguna tidak dapat memasukkan nombor perpuluhan ke dalam kalkulator kerana kekurangan titik perpuluhan. Juga, pengguna hanya dapat melakukan satu persamaan pada satu masa. Anda tidak dapat mengira hasilnya dan kemudian menambah / tolak / darab / bahagikan hasilnya. Dalam fungsi numberSelect (), ada fungsi yang membersihkan layar setelah hasilnya dicetak jika pengguna menekan kotak lain.

Langkah 4: Kod: Fungsi Kuadrat

petak kosong () {

// kotak hitam dan putih bergantian pada setiap baris dan baris pertama dan ketiga mempunyai corak yang berlawanan daripada baris kedua dan keempat

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // barisan petak pertama bermula, hitam hingga putih tft.fillRect (60, 60, 60, 65, TFT_WHITE);

tft.fillRect (120, 60, 60, 65, TFT_BLACK);

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // baris pertama petak berakhir

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // baris kedua petak bermula, putih hingga hitam tft.fillRect (60, 125, 60, 65, TFT_BLACK);

tft.fillRect (120, 125, 60, 65, TFT_WHITE);

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // baris kedua petak berakhir

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // baris ketiga petak bermula, hitam hingga putih tft.fillRect (60, 190, 60, 65, TFT_WHITE);

tft.fillRect (120, 190, 60, 65, TFT_BLACK);

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // baris ketiga petak berakhir

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // baris keempat petak bermula, putih hingga hitam tft.fillRect (60, 255, 60, 65, TFT_BLACK);

tft.fillRect (120, 255, 60, 65, TFT_WHITE);

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // baris keempat petak berakhir

}

Fungsi kuasa dua () cukup mudah. Perintah tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) melukis sebuah segi empat tepat mengikut parameter yang dilalui kepadanya, yang merupakan kedudukan pertama x dan y, kedudukan kedua x dan y, dan warna yang diisi oleh segi empat tepat. Fungsi ini melukis keempat-empat baris kotak (segi empat tepat secara teknikal) dan mengisi setiap kotak dengan warna yang dilewatkan kepadanya.

Langkah 5: Kod: Fungsi Nombor

nombor kosong () {

tft.setTextColor (TFT_BLUE); // menetapkan warna nombor / watak menjadi biru

tft.setTextSize (5); // menetapkan nombor / saiz watak hingga 5

tft.setCursor (18, 75); // menetapkan kursor untuk baris nombor / aksara pertama

tft.print ("7 8 9 /"); // mencetak baris pertama nombor / aksara

tft.setCursor (18, 140); // menetapkan kursor untuk baris nombor / aksara kedua

tft.print ("4 5 6 X"); // mencetak baris nombor / aksara kedua

tft.setCursor (18, 205); // menetapkan kursor untuk baris ketiga nombor / aksara

tft.print ("1 2 3 -"); // mencetak baris ketiga nombor / aksara

tft.setCursor (18, 270); // menetapkan kursor untuk baris keempat nombor / aksara

tft.print ("C 0 = +"); // mencetak baris nombor keempat / aksara

}

Fungsi nombor () juga mudah. Dua baris pertama menetapkan saiz teks lebih besar dan warnanya menjadi biru. Perintah tft.setCursor () menetapkan kursor ke kedudukan pada setiap baris di mana penulisan nombor bermula dari. Kemudian perintah tft.print () mencetak nombor / aksara di atas petak.

Langkah 6: Kod: Fungsi NumberSelect

nombor kosong Pilih () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

jika (p.z> MINPRESSURE) {

p.x = peta (p.x, 250, 845, 0, 239);

p.y = peta (p.y, 245, 860, 0, 319);

jika (hasil! = 0) {

hasil = 0;

save_number = 0;

tft.print ("NILAI BERSIH");

kelewatan (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Untuk memulakan fungsi numberSelect (), kami meminta input pengguna dari layar sentuh dengan perintah ts.getPoint (). Setelah data tersebut dikumpulkan, kami memeriksa untuk melihat apakah tekanan minimum telah terlampaui (atau, dengan kata lain, jika pengguna telah menekan suatu tempat di layar sentuh). Sekiranya demikian, koordinat x dan y dipetakan dari koordinat Cartesian ke koordinat khusus skrin sentuh. (0, 0) adalah sudut kiri atas skrin sentuh, dengan sumbu x melintang dan paksi y turun. Bahagian seterusnya memeriksa untuk mengetahui sama ada terdapat nombor yang disimpan dalam hasil. Sekiranya ada, hasil dan nombor_ disimpan diset semula ke 0. Mesej "NILAI CLEAR" dicetak di atas medan hasil, dan layar dibersihkan dengan kursor kembali ke posisi awal.

jika (p.y 60) {// barisan petak pertama

jika (p.x <60)

pemilihan_pengguna = 7;

jika tidak (p.x <120)

pemilihan_pengguna = 8;

lain jika (p.x <180)

pemilihan_pengguna = 9;

pengguna_seleksi lain = 14;

} lain jika (hlm 125) {// barisan petak kedua

jika (p.x <60)

pemilihan_pengguna = 4;

jika tidak (p.x <120)

pemilihan_pengguna = 5;

lain jika (p.x <180)

pemilihan_pengguna = 6;

pengguna_seleksi lain = 13;

} lain jika (p.y 190) {// barisan petak ketiga

jika (p.x <60)

pemilihan_pengguna = 1;

jika tidak (p.x <120)

pemilihan_pengguna = 2;

lain jika (p.x <180)

pemilihan_pengguna = 3;

user_selection lain = 12;

} lain jika (p.y> 255) {// barisan petak keempat

jika (p.x <60)

pemilihan_pengguna = 15;

jika tidak (p.x <120)

pemilihan_pengguna = 0;

lain jika (p.x <180)

pemilihan_pengguna = 10;

pengguna_seleksi lain = 11;

}

} lain {

pemilihan_pengguna = 16; // user_selection diatur ke 16 (tiada pemboleh ubah)

}

}

Ini adalah bahagian yang menentukan butang mana yang telah dipilih. Bermula dengan baris atas kotak dan berakhir dengan baris bawah, Arduino mencari di mana layar sebenarnya ditekan. Ia kemudian memberikan kuadrat nombor dan menyimpan nombor itu ke dalam pilihan pengguna. Nombor 0-9 sesuai dengan kotak nombor, nombor 11-15 sesuai dengan kotak operan dan petak yang jelas, dan nombor 10 sesuai dengan kotak tanda sama dengan. Sekiranya tidak ada petak yang dipilih, maka pemilihan_pengaturan ditetapkan ke 16, yang akan menjadikan gelung bermula semula (lihat fungsi gelung).

Langkah 7: Nikmati Projek Selesai Anda

Di sana anda memilikinya! Anda kini mempunyai kalkulator skrin sentuh yang dapat melakukan penambahan, pengurangan, pendaraban dan pembahagian. Projek ini mengubah keseluruhan cara saya fikir kalkulator berfungsi. Semasa saya mengerjakan projek ini, saya masih ingat memberitahu pengajar saya di kelas, "Saya tidak akan melihat kalkulator dengan cara yang sama lagi!" Fungsi yang anda fikirkan sebagai pengguna mudah dilakukan agak sukar ketika anda berada di belakang komputer yang cuba meniru idea anda. Saya harap anda menikmati projek ini, dan saya harap pemikiran anda tentang cara kerja kalkulator juga telah berubah!

Inilah keseluruhan kod untuk kemudahan anda. Ia dipenuhi dengan komen, jadi jika anda mempunyai masalah, mereka harus menunjukkan kepada anda apa yang dilakukan oleh setiap baris.

Disyorkan: