Mundarija:

Arduino sensorli ekranli kalkulyator: 7 qadam
Arduino sensorli ekranli kalkulyator: 7 qadam

Video: Arduino sensorli ekranli kalkulyator: 7 qadam

Video: Arduino sensorli ekranli kalkulyator: 7 qadam
Video: Калькулятор на Arduino в Tinkercad 2024, Iyul
Anonim
Arduino sensorli ekranli kalkulyator
Arduino sensorli ekranli kalkulyator

Salom! Bu Arduino Uno va TFT LCD qalqoni yordamida sensorli ekranli kalkulyator yaratish loyihasi. Men o'z uyimdagi dasturlash sinfining kontseptsiyasini ishlab chiqdim va bu loyihani yaratish tajribasi juda qiziq edi. Bu kalkulyator to'rtta oddiy matematik amallarni bajarishi mumkin (qo'shish, ayirish, ko'paytirish va bo'lish). U, shuningdek, ularga ega bo'linadigan javoblar uchun ikkita o'nlik kasrni ko'rsatadi. Keling, sho'ng'iymiz! Ushbu loyiha uchun materiallar quyida keltirilgan.

Ta'minotlar

- Arduino Uno

-2.4 TFT LCD qalqoni (mana bu erda sotib oldim:

- USB A - B kabeli (Arduino -ni kompyuterga ulash uchun sim)

- Arduino IDE o'rnatilgan kompyuter

- Shuningdek, ikkita kutubxonani yuklab olishingiz kerak bo'ladi: MCUFRIEND_kbv va sensorli ekran. Birinchisini github -da topishingiz mumkin (havola: https://github.com/prenticedavid/MCUFRIEND_kbv) yoki siz quyida joylashtirgan kutubxona zip faylidan foydalanishingiz mumkin. Ikkinchisi Arduino kutubxonasi menejerida o'rnatiladi.

1 -qadam: Uskuna ulanishlari

Uskuna ulanishlari
Uskuna ulanishlari
Uskuna ulanishlari
Uskuna ulanishlari
Uskuna ulanishlari
Uskuna ulanishlari

Sensorli ekran qalqonini Arduino Uno -ga ulash oddiy va tez. Qalqondagi eng past pimlarni Arduino -dagi eng past pim bilan bir qatorga qo'yish va qalqonni pimlarga itarish kifoya. Quvvat tomonidagi 5V yuqori va etiketlanmagan pinlarda qalqondan yasalgan pinlar bo'lmasligi kerak, bunda bir xil parametrlar taxtaning boshqa tomonida SCL va SDA deb belgilangan pinlar uchun qo'llaniladi. Endi biz kodlashga tayyormiz!

2 -qadam: Kod: global ta'riflar va sozlash

#qo'shing

MCUFRIEND_kbv tft; // baribir UNO qalqonlari uchun qattiq simli

#qo'shing

#YP A3 ni aniqlang

#XM A2 ni aniqlang

#YM 9 ni aniqlang

#XP 8 ni aniqlang

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

#MINPRESSURE 10 ni aniqlang

Bu kodning boshlanishi, biz kutubxonalarni o'z ichiga olamiz (MCUFRIEND_kbv va Sensorli ekran), X va Y pinlarini aniqlaymiz, sensorli ekran parametrlarini o'rnatamiz va Arduino foydalanuvchini bosishni ro'yxatdan o'tkazishi uchun zarur bo'lgan minimal bosimni aniqlaymiz.

int identifikatori;

int user_selection;

float saqlangan_number = 0;

suzuvchi muddat1;

int op_num;

float natijasi;

int cursorLocX = 5;

int cursorLocY = 20;

O'rnatishdan oldin, biz global o'zgaruvchilarni sozlashimiz kerak. ID sensorli ekranni ishga tushirishga yordam beradi. user_selection sensorli ekranni bosishda foydalanuvchi tanlagan kalitga mos keladigan raqamni o'z ichiga oladi. save_number - bu foydalanuvchi kiritganidan keyin biz ekranga bosib chiqaradigan o'zgaruvchidir (bu haqida pastadirda). Bu float, shuning uchun u o'nli sonlarni ham, butun sonlarni ham ushlab tura oladi. term1 - operand tanlanganidan keyin tenglamaning birinchi raqami saqlanadigan o'zgaruvchi. op_num operandni raqam sifatida saqlaydi (qo'shish uchun 1, ayirish uchun 2, ko'paytirish uchun 3 va bo'linish uchun 4). natija - foydalanuvchi tenglik belgisini bosgandan so'ng ekranga bosiladigan o'zgaruvchi. Bu ham suzuvchi. cursorLocX va cursorLocY - bu sensorli ekrandagi kursor bir necha marotaba o'rnatiladigan xaritalash nuqtalari (u tepadagi kulrang chiziqda joylashgan, aks holda natijalar maydoni deb nomlanadi).

bo'sh o'rnatish () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

kvadratchalar ();

raqamlar ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Bizning sozlash funksiyamiz birinchi bo'lib sensorli ekran qalqonini ishga tushirishni o'z ichiga oladi (1-3-qatorlar). Qalqonning yo'nalishi tft.setRotation () buyrug'i yordamida o'rnatiladi, 0 esa tik holatidadir. Butun ekran tft.fillScreen () buyrug'i bilan quyuq kul rangga bo'yalgan, biz uni tepasiga yozamiz (natijalar maydonidan tashqari). Kvadratlar () va sonlar () funktsiyalari kalkulyatorning kvadratlarini chizadi, katak taxtasida oq -qora ranglarni ranglaydi va kvadratlarga raqamlar/operandlarni yozadi. Keyingi bosqichda biz ularga murojaat qilamiz. Tft.setTextSize () buyrug'i natijalar maydonining matn hajmini 3 ga o'rnatadi, bu o'rta shrift. Tft.setTextColor () buyrug'i quyuq kulrang maydon ustida yozilgan natijalar maydonining matn rangini ko'k rangga o'rnatadi.

3 -qadam: Kod: Loop

void loop () {numberSelect ();

kechikish (100);

agar (user_selection == 16) {

;

} boshqa {

agar (user_selection <10) {

najot_number = saqlangan_son * 10 + foydalanuvchi_soli;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (saqlangan_son);

} agar boshqa (user_selection> 10) {

almashtirish (user_selection) {

11 -holat:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

term1 = saqlangan_son;

saqlangan_son = 0;

tanaffus;

12 -holat:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

term1 = saqlangan_son raqam;

saqlangan_son = 0;

tanaffus;

13 -holat:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

term1 = saqlangan_son;

saqlangan_son = 0;

tanaffus;

14 -holat:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

term1 = saqlangan_son raqam;

saqlangan_son = 0;

tanaffus;

15 -holat:

saqlangan_son = 0;

term1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tanaffus;

}

tft.setCursor (cursorLocX, cursorLocY);

Bu chaynash uchun juda ko'p narsa, shuning uchun men yuqorida nima borligini tushuntiraman. Biz sensorli ekrandagi har bir kvadratga raqam belgilaydigan numberSelect () funktsiyasini chaqirishdan boshlaymiz. Foydalanuvchi bu kvadratlardan birini bosganda, funktsiya user_selection o'zgaruvchisini kvadrat soniga o'rnatadi. Birinchi if ifodasi, agar foydalanuvchi to'g'ri tanlangan bo'lsa, faqat tsikl orqali ishlaydi. Agar shunday bo'lsa, keyingi if iborasida user_selection-da 10 dan kam raqam saqlanganmi yoki yo'qmi so'raladi (0-9 raqamlari). Agar shunday bo'lsa, save_number 10 ga ko'paytiriladi va user_selection -dagi raqam save_number raqamiga qo'shiladi, u sensorli ekrandagi natijalar maydonida chop etiladi. Agar shunday bo'lmasa, keyingi if iborasida user_selection -da 10dan katta raqam saqlanganmi yoki yo'qmi so'raladi (operand raqamlari: +uchun 12, -uchun 13, X uchun 14, /uchun 15 va aniq ekranli kvadrat uchun 15)). Kommutator funktsiyasi har bir holat uchun javob beradi (user_selection tomonidan belgilanadi). Op_num o'zgaruvchisiga tanlangan operandga mos keladigan raqam beriladi (+uchun 2, X uchun 3, X uchun 4 va /uchun). Saqlangan_raqamdagi qiymat term1 o'zgaruvchiga saqlanadi, shuning uchun saqlangan_sonli o'zgaruvchini tenglamaning ikkinchi yarmida ishlatish mumkin. Operand belgisi ekranda chop etiladi va natijalar maydonidagi raqamlar o'chiriladi. Faqatgina istisno - bu barcha o'zgaruvchilarni qayta tiklaydigan va natijalar maydonini undagi hamma narsadan tozalaydigan aniq ekranli kvadrat.

} boshqa {

almashtirish (op_num) {

1 -holat:

natija = term1 + saqlangan_son;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (ikki barobar (natija));

tanaffus;

2 -holat:

natija = term1 - saqlangan_son;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (ikki barobar (natija));

tanaffus;

3 -holat:

natija = term1 * saqlangan_son;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (ikki barobar (natija));

tanaffus;

4 -holat:

natija = float (term1) / suzuvchi (saqlangan_son);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (natija);

tanaffus;

}

tft.setCursor (cursorLocX, cursorLocY);

saqlangan_son = natija;

term1 = 0;

op_num = 0;

kechikish (1000);

}

}

}

Loopning oxirgi qismi foydalanuvchining tenglik belgisini tanlashi bilan bog'liq (user_selection == 10). Boshqa almashtirish funktsiyasi to'rtta matematik funktsiya orqali ishlaydi (op_num tomonidan belgilanadi). Qo'shimcha holat (1 -holat) term1 va save_number raqamlarini qo'shib, natijani o'zgaruvchiga saqlaydi. Natijalar natija maydoniga ikki barobar chop etiladi, ayirish holati (2 -holat) 1 -sondan save_numberni olib tashlaydi va natijani o'zgaruvchiga saqlaydi. Natijalar natijalar maydoniga ikki barobar bosib chiqariladi. Ko'paytirish holati (3 -holat) term1 -ni save_numberga ko'paytiradi va sonni natija o'zgaruvchisiga saqlaydi. Natijalar ikki barobarga natijalar maydoniga chop etiladi. 4 -qismli bo'linish term1 -ni save_number -ga bo'linadi va raqamni natija o'zgaruvchisiga saqlaydi. Natija natijalar maydoniga float sifatida bosiladi (chunki bo'linish javoblari o'nli raqamlar bo'lishi mumkin). Raqam, operand yoki natija ekranga chiqarilgandan so'ng, kursor asl holatiga qaytariladi, save_number oldingi natijaga o'rnatiladi va term1 va op_num sozlamalari tiklanadi.

Bir nechta eslatmalar: foydalanuvchi o'nlik kasrli kvadrat yo'qligi sababli hisoblagichga o'nlik raqamlarni kirita olmaydi. Bundan tashqari, foydalanuvchi bir vaqtning o'zida faqat bitta tenglamani bajarishi mumkin. Siz natijani hisoblay olmaysiz, keyin bu natijani qo'sha/ayira olmaysiz/ko'paytirolmaysiz/bo'lmaysiz. NumberSelect () funktsiyasida, agar foydalanuvchi boshqa kvadratni bosgan bo'lsa, natija chop etilgandan so'ng ekranni tozalaydigan funksiya mavjud.

4 -qadam: Kod: kvadratlar funktsiyasi

bo'sh kvadratlar () {

// har bir satrda qora va oq kvadratlar almashadi va birinchi va uchinchi qatorlar ikkinchi va to'rtinchi qatorlarga qaraganda qarama -qarshi naqshga ega

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // kvadratlarning birinchi qatori boshlanadi, qora -oq tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // kvadratlarning birinchi qatori tugaydi

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // kvadratning ikkinchi qatori boshlanadi, oqdan qoragacha tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // kvadratlarning ikkinchi qatori tugaydi

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // kvadratning uchinchi qatori boshlanadi, qora -oq tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // kvadratlarning uchinchi qatori tugaydi

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // to'rtinchi qator kvadratlar boshlanadi, oqdan qoragacha tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // to'rtinchi qator kvadratlar tugaydi

}

Squares () funktsiyasi juda oddiy. Tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) buyrug'i unga berilgan parametrlarga muvofiq to'rtburchaklar chizadi, ular x va y -ning birinchi o'rni, x va y -ning ikkinchi pozitsiyasi va to'rtburchak to'ldirilgan rang.. Bu funksiya to'rt qatorli to'rtburchaklar (texnik to'rtburchaklar) ni chizadi va har bir kvadratni unga berilgan rang bilan to'ldiradi.

5 -qadam: Kod: raqamlar funktsiyasi

bo'sh raqamlar () {

tft.setTextColor (TFT_BLUE); // raqam/belgi rangini ko'k rangga o'rnatadi

tft.setTextSize (5); // raqam/belgilar hajmini 5 ga o'rnatadi

tft.setCursor (18, 75); // raqamlar/belgilarning birinchi qatori uchun kursorni o'rnatadi

tft.print ("7 8 9 /"); // raqamlar/belgilarning birinchi qatorini chop etadi

tft.setCursor (18, 140); // sonlar/belgilarning ikkinchi qatori uchun kursorni o'rnatadi

tft.print ("4 5 6 X"); // raqamlar/belgilarning ikkinchi qatorini chop etadi

tft.setCursor (18, 205); // raqamlar/belgilarning uchinchi qatori uchun kursorni o'rnatadi

tft.print ("1 2 3 -"); // raqamlar/belgilarning uchinchi qatorini chop etadi

tft.setCursor (18, 270); // raqamlar/belgilarning to'rtinchi qatori uchun kursorni o'rnatadi

tft.print ("C 0 = +"); // raqamlar/belgilarning to'rtinchi qatorini chop etadi

}

Raqamlar () funktsiyasi ham oddiy. Birinchi ikkita satr matn hajmini kattaroq qilib, rangini ko'k rangga qo'yadi. Tft.setCursor () buyrug'i kursorni raqamlarning yozilishi boshlanadigan har bir satrdagi holatiga o'rnatadi. Keyin tft.print () buyrug'i kvadratlar ustidagi raqamlar/belgilarni bosib chiqaradi.

6 -qadam: Kod: Raqam funktsiyasini tanlang

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

agar (p.z> MINPRESSURE) {

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

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

agar (natija! = 0) {

natija = 0;

saqlangan_son = 0;

tft.print ("Aniq qiymatlar");

kechikish (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

NumberSelect () funktsiyasini ishga tushirish uchun biz ts.getPoint () buyrug'i bilan sensorli ekrandan foydalanuvchining kirishini so'raymiz. Ushbu ma'lumotlar yig'ilgandan so'ng, biz minimal bosim oshib ketganligini tekshiramiz (yoki boshqacha qilib aytganda, foydalanuvchi sensorli ekranning biror joyini bosgan bo'lsa). Agar shunday bo'lsa, x va y koordinatalari kartezian koordinatalaridan sensorli ekranga xos koordinatalarga xaritalanadi. (0, 0) - sensorli ekranning chap yuqori burchagi, x o'qi bo'ylab va y o'qi pastga tushadi. Keyingi qism natijada saqlangan raqam mavjudligini tekshiradi. Agar mavjud bo'lsa, natija va qutqarilgan_raqamlar 0 ga qaytariladi. Natijalar maydoniga "VALUESNI OCHIR" xabari bosiladi va kursor boshlang'ich holatiga qaytariladi.

if (p.y 60) {// kvadratlarning birinchi qatori

agar (p.x <60)

user_selection = 7;

aks holda (p.x <120)

user_selection = 8;

aks holda (p.x <180)

user_selection = 9;

else user_selection = 14;

} if if (p.y 125) {// ikkinchi qatorli kvadratchalar

agar (p.x <60)

user_selection = 4;

aks holda (p.x <120)

user_selection = 5;

aks holda (p.x <180)

user_selection = 6;

else user_selection = 13;

} if if (p.y 190) {// kvadratlarning uchinchi qatori

agar (p.x <60)

user_selection = 1;

aks holda (p.x <120)

user_selection = 2;

aks holda (p.x <180)

user_selection = 3;

else user_selection = 12;

} if if (p.y> 255) {// to'rtinchi qatorli kvadratchalar

agar (p.x <60)

user_selection = 15;

aks holda (p.x <120)

user_selection = 0;

aks holda (p.x <180)

user_selection = 10;

else user_selection = 11;

}

} boshqa {

user_selection = 16; // user_selection 16 ga o'rnatildi (o'zgarmas narsa)

}

}

Bu qaysi tugma tanlanganligini aniqlaydigan qism. Kvadratlarning yuqori qatoridan boshlab, pastki qatori bilan tugaydigan Arduino, ekran aslida qaerda bosilganligini qidiradi. Keyin kvadratga raqam beradi va bu raqamni user_selection -ga saqlaydi. 0-9 raqamlari raqamlar kvadratiga, 11-15 raqamlari operand va aniq kvadratga, 10 raqami esa teng belgilar kvadratiga mos keladi. Agar kvadrat tanlanmagan bo'lsa, user_selection 16 ga o'rnatiladi, bu esa tsiklni qaytadan boshlashga olib keladi (loop funktsiyasiga qarang).

7 -qadam: Siz tugagan loyihadan rohatlaning

Mana sizda! Endi sizda sensorli ekranli kalkulyator bor, u qo'shish, ayirish, ko'paytirish va bo'linishni bajaradi. Bu loyiha men hisoblagich ishlayotganini butunlay o'zgartirdi. Men bu loyiha ustida ishlayotganda, darsda o'qituvchimga: "Men hech qachon kalkulyatorga hech qachon xuddi shunday qaramayman!" Foydalanuvchi sifatida sizning fikringizcha, sizning fikringizni taqlid qilishga urinayotgan kompyuter orqasida turganingizda, siz uchun oson bo'lgan vazifalar. Umid qilamanki, sizga loyiha yoqdi va umid qilamanki, sizning hisobingiz qanday ishlaydi, degan fikringiz ham o'zgargan!

Sizning qulayligingiz uchun bu erda butun kod. U sharhlar bilan to'ldirilgan, shuning uchun agar sizda muammolar bo'lsa, ular sizga har bir satr nima qilishini ko'rsatishi kerak.

Tavsiya: