Мазмуну:

Arduino Touchscreen Calculator: 7 кадам
Arduino Touchscreen Calculator: 7 кадам

Video: Arduino Touchscreen Calculator: 7 кадам

Video: Arduino Touchscreen Calculator: 7 кадам
Video: #ArduBlock 2.0 - DWIN Дисплей - Кодовый замок на Arduino + Соленоид! 2024, Ноябрь
Anonim
Arduino сенсордук экрандын калкулятору
Arduino сенсордук экрандын калкулятору

Салам! Бул Arduino Uno жана TFT LCD калканчынын жардамы менен сенсордук экранды эсептөөчү долбоор. Мен үйдө программалоо классынын концепциясын ойлоп таптым жана бул долбоорду куруу тажрыйбасы абдан кызыктуу болду. Бул эсептегич төрт жөнөкөй математикалык амалдарды аткара алат (кошуу, азайтуу, көбөйтүү жана бөлүү). Ал ошондой эле аларга ээ болгон жооптор үчүн эки ондук чекитке чейин көрсөтөт. Келгиле, чумкуйбуз! Бул долбоордун материалдары төмөндө келтирилген.

Жабдуулар

- Ардуино Уно

-2.4 TFT LCD Shield (бул жерде мен аны сатып алдым:

- USB Aдан B кабели (Arduino'ду компьютерге туташтыруу үчүн жип)

- Arduino IDE орнотулган компьютер

- Ошондой эле эки китепкананы жүктөп алышыңыз керек: MCUFRIEND_kbv жана Touchscreen. Биринчисин githubдан таба аласыз (шилтеме: https://github.com/prenticedavid/MCUFRIEND_kbv) же сиз төмөнгө киргизген китепкана zip файлын колдоно аласыз. Экинчиси Arduino китепканасынын менеджеринде орнотуу үчүн.

1 -кадам: Аппараттык туташуулар

Аппараттык туташуулар
Аппараттык туташуулар
Аппараттык туташуулар
Аппараттык туташуулар
Аппараттык туташуулар
Аппараттык туташуулар

Сенсордук экрандын Arduino Uno менен байланышы жөнөкөй жана тез. Ардуинодогу эң төмөн казыктар менен калкандагы эң төмөн казыктарды тизип, калканды казыктарга түртүү гана жетиштүү. Үстүнкү 5V пин жана күч тарабында этикеткасы жок пиндин ичинде калканчтын түйрүктөрү болбошу керек, ошол эле параметрлер тактанын экинчи тарабында SCL жана SDA деп белгиленген казыктарга колдонулат. Эми биз коддоого даярбыз!

2 -кадам: Код: глобалдык аныктамалар жана орнотуу

#кошуу

MCUFRIEND_kbv tft; // баары бир БУУнун калкандары үчүн зымдуу

#кошуу

#аныктоо YP A3

#аныктоо XM A2

#аныктоо YM 9

#XP 8ди аныктоо

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

#МИНРЕССУРА 10ду аныктаңыз

Бул коддун башталышы, анда биз китепканаларды (MCUFRIEND_kbv & Touchscreen) камтыйбыз, X жана Y казыктарын аныктайбыз, сенсордук экрандын параметрлерин орнотобуз жана Arduino колдонуучунун прессин каттоосу үчүн керектүү минималдуу басымды аныктайбыз.

int ID;

int user_selection;

float xilas_number = 0;

float term1;

int op_num;

float result;

int cursorLocX = 5;

int cursorLocY = 20;

Орнотуудан мурун, биз кээ бир глобалдык өзгөрмөлөрдү орнотушубуз керек. ID сенсордук экранды ишке киргизүүгө жардам берет. user_selection сенсордук экранды басканда колдонуучу тандаган баскычка туура келген номерди камтыйт. save_number - бул колдонуучу киргизгенден кийин экранга басып чыгаруучу өзгөрмө (бул тууралуу кененирээк маалымат). Бул калкыма, андыктан ондук сандарды жана бүтүн сандарды кармай алат. term1 - теңдеменин биринчи саны операнд тандалгандан кийин сакталуучу өзгөрмө. op_num операнды сан катары сактайт (1 кошуу үчүн, 2 азайтуу үчүн, 3 көбөйтүү үчүн жана 4 бөлүү үчүн). натыйжа - колдонуучу барабар белгисин баскандан кийин экранга басылган өзгөрмө. Бул ошондой эле сүзгүч. cursorLocX жана cursorLocY - бул сенсордук экрандын курсору бир нече жолу коюлган карта чекиттери (ал үстүңкү боз тилкеде жайгашкан, башкача айтканда жыйынтыктар талаасы деп аталат).

жараксыз орнотуу () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

квадраттар ();

сандар ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Биздин орнотуу функциясы адегенде сенсордук экрандын инициализациясын камтыйт (1-3-саптар). Калкандын багыты tft.setRotation () командасынын жардамы менен коюлат, 0 тик турат. Бүт экран tft.fillScreen () буйругу менен кочкул боз түскө боёлгон, биз аны үстүнө жазабыз (жыйынтыктар талаасын кошпогондо). Квадраттар () жана сандар () функциялары калькулятордун квадраттарын тартышат, квадраттарды ак -кара түстө шахмат тактасында боёшот жана квадраттарга сандарды/операнддарды көк түстө жазышат. Биз кийинки кадамда аларга жетебиз. Tft.setTextSize () буйругу, жыйынтыктар талаасынын текст өлчөмүн орточо шрифт болгон 3 деп коёт. Tft.setTextColor () буйругу күңүрт боз талаанын үстүнө жазылган жыйынтыктар талаасынын текст түсүн көк кылып коёт.

3 -кадам: Code: Loop

void loop () {numberSelect ();

кечиктирүү (100);

эгер (user_selection == 16) {

;

} башка {

if (user_selection <10) {

save_number = save_number * 10 + user_selection;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (save_number);

} башка if (user_selection> 10) {

которуу (user_selection) {

учурда 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

мөөнөт1 = сакталган_сан;

save_number = 0;

тыныгуу;

учур 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

мөөнөт1 = сакталган_сан;

save_number = 0;

тыныгуу;

учурда 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

мөөнөт1 = сакталган_сан;

save_number = 0;

тыныгуу;

14 -жагдай:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

мөөнөт1 = сакталган_сан;

save_number = 0;

тыныгуу;

15 -жагдай:

save_number = 0;

term1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

тыныгуу;

}

tft.setCursor (cursorLocX, cursorLocY);

Бул чайноо үчүн көп нерсе, ошондуктан мен жогоруда эмне экенин түшүндүрөм. Биз сенсордук экрандын ар бир квадратына номер ыйгарган numberSelect () функциясын чакыруудан баштайбыз. Колдонуучу ошол квадраттардын бирин басканда, функция user_selection өзгөрмөсүн квадраттын санына коет. Биринчи if оператору жарактуу колдонуучу тандалганда гана цикл аркылуу иштейт. Эгер ошондой болсо, анда кийинки if билдирүүсүндө user_selection саны 10дон азыраак (0-9 сандары) сакталганбы деп сурайт. Эгер ошондой болсо, куткарылган_сандын саны 10го көбөйтүлөт жана user_selectionтагы сан сенсордук экрандын жыйынтыктар талаасында басылган save_numberге кошулат. Болбосо, кийинки if билдирүүсүндө user_selection анын ичинде 10дон ашык номери барбы деп сурайт (операнддын номерлери: +үчүн 12, -үчүн 13, X үчүн 14, /үчүн жана ачык экран үчүн 15). Коммутатор функциясы ар бир иштин камын көрөт (user_selection тарабынан аныкталат). Op_num өзгөрмөсүнө тандалган операндга дал келген сан берилет (1 үчүн +, 2 үчүн -, 3 үчүн X жана 4 үчүн). Save_numberдеги маани термин1 өзгөрмөсүнө сакталат, андыктан save_number өзгөрмөсү теңдеменин экинчи жарымында колдонулушу мүмкүн. Операнддын символу экранда басылып чыгат жана натыйжалар талаасындагы каалаган сандар тазаланат. Жалгыз өзгөчөлүктөр - бул экрандын ачык квадраты, ал бардык өзгөрмөлөрдү баштапкы абалга келтирет жана андагы нерселердин жыйынтыктар талаасын тазалайт.

} башка {

которуу (op_num) {

иши 1:

натыйжа = мөөнөт1 + сакталган_сан;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (кош (жыйынтык));

тыныгуу;

2 -жагдай:

натыйжа = мөөнөт1 - сакталган_сан;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (кош (жыйынтык));

тыныгуу;

3 -жагдай:

натыйжа = мөөнөт1 * сакталган_сана;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (кош (жыйынтык));

тыныгуу;

4 -жагдай:

натыйжа = калкып чыгуу (мөөнөт1) / калкып чыгуу (сакталган_сан);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (натыйжа);

тыныгуу;

}

tft.setCursor (cursorLocX, cursorLocY);

save_number = натыйжа;

term1 = 0;

op_num = 0;

кечигүү (1000);

}

}

}

Циклдин акыркы бөлүгү колдонуучунун барабардык белгисин тандап алышы менен байланыштуу (user_selection == 10). Башка которуштуруу функциясы төрт математикалык функция аркылуу иштейт (op_num тарабынан аныкталат). Кошумча корпус (1 -жагдай) term1 менен save_number санын кошот жана санды жыйынтык өзгөрмөсүнө сактайт. Натыйжа эки эселенген натыйжалар талаасында басылып чыгарылат (2 -учур), термин_1ден save_numberди алып салат жана санды жыйынтык өзгөрмөсүнө сактайт. Жыйынтык жыйынтыктар талаасына эки эсе басылып чыгарылат. Көбөйтүү иши (3 -жагдай) term1'ди save_number менен көбөйтөт жана санды жыйынтык өзгөрмөсүнө сактайт. Натыйжа эки эселенген натыйжалар талаасына басылып чыгарылат. Бөлүштүрүү иши (4 -жагдай) term1ди save_numberге бөлөт жана санды жыйынтык өзгөрмөсүнө сактайт. Жыйынтык жыйынтыктар талаасына калкып чыгат (анткени жооптор ондук сандар болушу мүмкүн). Экранга сан, операнд же жыйынтык чыккандан кийин, курсор баштапкы абалга келтирилет, save_number мурунку натыйжага коюлат жана термин1 & op_num баштапкы абалга келтирилет.

Бир нече эскертүүлөр: колдонуучу ондук чекит квадратынын жоктугунан эсептегичке ондук сандарды киргизе албайт. Ошондой эле, колдонуучу бир убакта бир гана теңдеме жасай алат. Сиз натыйжаны эсептей албайсыз, андан кийин бул жыйынтыкты кошо/кемите/көбөйтө/бөлө албайсыз. NumberSelect () функциясында, эгер колдонуучу башка квадратты басса, натыйжа басылгандан кийин экранды тазалоочу функция бар.

4 -кадам: Code: Squares Function

бош квадраттар () {

// кара жана ак квадраттар ар бир сапта алмашат жана биринчи жана үчүнчү саптар экинчи жана төртүнчү катарларга караганда карама -каршы үлгүгө ээ

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // квадраттардын биринчи сабы башталат, актан tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // квадраттардын биринчи сабы аяктайт

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // квадраттардын экинчи сабы башталат, актан карага tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // квадраттардын экинчи сабы бүтөт

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // квадраттардын үчүнчү сабы башталат, актан кара tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // үчүнчү катардагы квадраттар бүтөт

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // төртүнчү катардагы квадраттар башталат, актан карага чейин tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // төртүнчү катардагы квадраттар бүтөт

}

Squares () функциясы абдан жөнөкөй. Tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) буйругу ага берилген параметрлерге ылайык тик бурчтук тартат, алар x жана y биринчи позициялары, x жана y экинчи позициялары жана тик бурчтук толтурулган түс.. Бул функция төрт катар квадраттарды (техникалык тик бурчтуктарды) тартат жана ар бир квадратты ага берилген түс менен толтурат.

5 -кадам: Код: Сандар Функциясы

бош сандар () {

tft.setTextColor (TFT_BLUE); // санды/тамга түсүн көккө коёт

tft.setTextSize (5); // санды/тамга өлчөмүн 5ке коёт

tft.setCursor (18, 75); // сандардын/символдордун биринчи сабы үчүн курсорду орнотот

tft.print ("7 8 9 /"); // сандардын/белгилердин биринчи сабын басып чыгарат

tft.setCursor (18, 140); // сандардын/символдордун экинчи сабына курсорду коёт

tft.print ("4 5 6 X"); // сандардын/белгилердин экинчи сабын басып чыгарат

tft.setCursor (18, 205); // сандарды/символдордун үчүнчү сабына курсорду коёт

tft.print ("1 2 3 -"); // сандардын/белгилердин үчүнчү сабын басып чыгарат

tft.setCursor (18, 270); // сандарды/символдордун төртүнчү сабына курсорду коёт

tft.print ("C 0 = +"); // сандардын/белгилердин төртүнчү сабын басып чыгарат

}

Numbers () функциясы да жөнөкөй. Биринчи эки сап тексттин өлчөмүн чоңураак кылып, түсүн көк кылып койгон. Tft.setCursor () буйругу курсорду сандардын жазылышы башталган ар бир саптагы абалына коёт. Андан кийин tft.print () буйругу сандарды/тамгаларды квадраттардын үстүнөн басып чыгарат.

6 -кадам: Code: NumberSelect Функциясы

Void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

if (p.z> MINPRESSURE) {

p.x = карта (p.x, 250, 845, 0, 239);

p.y = карта (p.y, 245, 860, 0, 319);

if (result! = 0) {

натыйжа = 0;

save_number = 0;

tft.print ("ТААНУУ БААЛАРЫ");

кечигүү (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

NumberSelect () функциясын өчүрүү үчүн ts.getPoint () буйругу менен сенсордук экрандан колдонуучунун киргизүүсүн суранабыз. Бул маалыматтар чогултулгандан кийин, биз минималдуу басымдын ашып кеткенин текшеребиз (же, башкача айтканда, колдонуучу сенсордук экрандын бир жерин басса). Эгер ошондой болсо, x жана y координаттары картезиялык координаттардан сенсордук экрандын өзгөчө координаттарына картага түшүрүлөт. (0, 0) - бул сенсордук экрандын жогорку сол бурчу, х огу өйдө жана у огу ылдый түшөт. Кийинки бөлүк натыйжада сакталган номер бар -жогун текшерет. Эгерде бар болсо, result жана save_number 0 баштапкы абалга келтирилет. "CLEAR VALUES" билдирүүсү жыйынтыктар талаасында басылып чыгат жана экран курсор менен баштапкы абалына кайтарылат.

if (p.y 60) {// квадраттардын биринчи сабы

эгерде (p.x <60)

user_selection = 7;

башка болсо (p.x <120)

user_selection = 8;

башка болсо (p.x <180)

user_selection = 9;

else user_selection = 14;

} if if (p.y 125) {// чарчылардын экинчи сабы

эгерде (p.x <60)

user_selection = 4;

башка болсо (p.x <120)

user_selection = 5;

башка болсо (p.x <180)

user_selection = 6;

else user_selection = 13;

} if if (p.y 190) {// үчүнчү катардагы квадраттар

эгерде (p.x <60)

user_selection = 1;

башка болсо (p.x <120)

user_selection = 2;

башка болсо (p.x <180)

user_selection = 3;

else user_selection = 12;

} if if (p.y> 255) {// төртүнчү катардагы квадраттар

эгерде (p.x <60)

user_selection = 15;

башка болсо (p.x <120)

user_selection = 0;

башка болсо (p.x <180)

user_selection = 10;

else user_selection = 11;

}

} башка {

user_selection = 16; // user_selection 16га коюлган (эч нерсе өзгөрүлбөйт)

}

}

Бул кайсы баскыч тандалганын аныктоочу бөлүк. Квадраттардын жогорку катарынан башталып, астыңкы катар менен бүткөн Arduino экран чынында басылган жерди издейт. Андан кийин ал квадратка номер ыйгарат жана ал санды user_selection ичине сактайт. 0-9 цифралары сандык квадраттарга, 11-15 сандары операнддык квадраттарга жана ачык квадратка, 10 саны барабар белги квадратына туура келет. Эгерде эч кандай квадрат тандалбаса, анда user_selection 16га коюлган, бул циклди кайра баштайт (цикл функциясын караңыз).

7 -кадам: Бүткөн долбооруңуздан ырахат алыңыз

Мына сага! Эми сизде сенсордук эсептегич бар, ал кошуу, азайтуу, көбөйтүү жана бөлүүнү аткара алат. Бул долбоор калькулятор иштеп жатат деп ойлогондон кийин өзгөрдү. Мен бул долбоордун үстүндө иштеп жүргөндө, сабакта инструкторума: "Мен эч качан калькуляторду мурдагыдай карабайм!" Деп айтканым эсимде. Колдонуучу катары сиз ойлогон функциялар сиздин оюңузду тууроо үчүн компьютердин артында турганда бир аз татаалыраак болот. Мен сизге бул долбоор жакты деп ишенем жана эсептегичтин кандай иштээри жөнүндө сиздин оюңуз өзгөрдү деп ишенем!

Бул жерде сиздин ыңгайлуулугуңуз үчүн бүт код. Ал комментарийлер менен толтурулган, андыктан эгер сизде кандайдыр бир көйгөй жаралса, алар сизге ар бир саптын эмне кылаарын көрсөтүшү керек.

Сунушталууда: