Съдържание:

Калкулатор на Arduino със сензорен екран: 7 стъпки
Калкулатор на Arduino със сензорен екран: 7 стъпки

Видео: Калкулатор на Arduino със сензорен екран: 7 стъпки

Видео: Калкулатор на Arduino със сензорен екран: 7 стъпки
Видео: Веб-программирование – информатика для руководителей бизнеса 2016 2024, Ноември
Anonim
Arduino сензорен екран калкулатор
Arduino сензорен екран калкулатор

Здравейте! Това е проект за създаване на калкулатор със сензорен екран, използващ Arduino Uno и TFT LCD щит. Измислих концепцията за моя клас по програмиране в домашни условия и опитът при изграждането на този проект беше много интересен. Този калкулатор може да извърши четирите прости математически операции (събиране, изваждане, умножение и деление). Той също така показва до две десетични точки за отговорите на разделението, които ги имат. Нека се потопим направо! Консумативите за този проект са изброени по -долу.

Консумативи

- Arduino Uno

-2.4 TFT LCD щит (ето къде го купих:

- USB A към B кабел (кабел за свързване на Arduino към компютър)

- Компютър с инсталирана Arduino IDE

- Ще трябва също да изтеглите две библиотеки: MCUFRIEND_kbv и сензорен екран. Първият можете да намерите на github (връзка: https://github.com/prenticedavid/MCUFRIEND_kbv) или можете да използвате zip файла на библиотеката, който включих по -долу. Вторият е в мениджъра на Arduino Library за инсталиране.

Стъпка 1: Хардуерни връзки

Хардуерни връзки
Хардуерни връзки
Хардуерни връзки
Хардуерни връзки
Хардуерни връзки
Хардуерни връзки

Свързването на щита със сензорен екран към Arduino Uno е лесно и бързо. Всичко, което трябва да направите, е да подредите най -ниските щифтове на щита с най -ниските щифтове на Arduino и да натиснете щита в щифтовете. Горният 5V щифт и немаркираният щифт от страната на захранването не трябва да имат щифтове от щита в тях, като същите параметри се прилагат за щифтовете, обозначени като SCL и SDA от другата страна на платката. Сега сме готови за кодиране!

Стъпка 2: Кодът: Глобални дефиниции и настройка

#включва

MCUFRIEND_kbv tft; // така или иначе свързани с щитове UNO

#включва

#дефинирайте YP A3

#дефинирайте XM A2

#дефинирайте YM 9

#дефинирайте XP 8

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

#define MINPRESSURE 10

Това е началото на кода, където включваме библиотеки (MCUFRIEND_kbv & Touchscreen), дефинираме пиновете X и Y, настройваме параметрите на сензорния екран и определяме минималното налягане, необходимо за Arduino да регистрира потребителска преса.

int ID;

int user_selection;

float saved_number = 0;

float term1;

int op_num;

плаващ резултат;

int cursorLocX = 5;

int cursorLocY = 20;

Точно преди настройката трябва да настроим някои глобални променливи. ID помага за стартиране и работа на сензорния екран. user_selection съдържа номер, който съответства на клавиша, който потребителят избира при натискане на сензорния екран. saved_number е променливата, която отпечатваме на екрана след въвеждане на потребител (повече за това в цикъла). Това е поплавък, така че може да съдържа десетични числа, както и цели числа. term1 е променливата, в която се записва първото число на уравнението, след като е избран операнд. op_num записва операнда като число (1 за събиране, 2 за изваждане, 3 за умножение и 4 за деление). резултатът е променливата, която се отпечатва на екрана, след като потребителят е натиснал знака за равенство. Той също е поплавък. cursorLocX и cursorLocY са точките на картографиране на сензорния екран, където курсорът е настроен на няколко пъти (той се намира в сивата лента в горната част, иначе известна като полето с резултати).

void setup () {

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: Кодът: Цикъл

void loop () {numberSelect ();

забавяне (100);

if (user_selection == 16) {

;

} else {

if (user_selection <10) {

записан_номер = запазен_номер * 10 + потребителски_избор;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (записан_номер);

} иначе ако (user_selection> 10) {

switch (user_selection) {

случай 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

term1 = запазен_номер;

запазен_номер = 0;

прекъсване;

случай 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

term1 = запазен_номер;

запазен_номер = 0;

прекъсване;

случай 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

term1 = запазен_номер;

запазен_номер = 0;

прекъсване;

случай 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

term1 = запазен_номер;

запазен_номер = 0;

прекъсване;

случай 15:

запазен_номер = 0;

термин1 = 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 се добавя към записания номер, който се отпечатва в полето за резултати на сензорния екран. Ако това не стане, следващият оператор if пита дали user_selection има записано в него число по -голямо от 10 (номерата на операндите: 11 за +, 12 за -, 13 за X, 14 за /и 15 за квадратен екран). Функция за превключване се грижи за всеки случай (определя се от user_selection). Променливата op_num получава номер, който съответства на операнда, който е избран (1 за +, 2 за -, 3 за X и 4 за /). Стойността в saved_number се записва в променливата term1, така че променливата saved_number може да се използва за втората половина на уравнението. Символът на операнда се отпечатва на екрана заедно с изчистването на всички числа в полето за резултати. Единственото изключение е квадратът за изчистване на екрана, който нулира всички изчислителни променливи и изчиства полето с резултати от всичко в него.

} else {

превключвател (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:

резултат = float (term1) / float (записан_ номер);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (резултат);

прекъсване;

}

tft.setCursor (cursorLocX, cursorLocY);

записан_номер = резултат;

термин1 = 0;

op_num = 0;

забавяне (1000);

}

}

}

Последната част от цикъла се занимава със събитието потребителят да избере знака за равенство (user_selection == 10). Друга функция за превключване работи чрез четирите математически функции (определени от op_num). Случаят за добавяне (случай 1) добавя термин1 и записан_номер заедно и записва числото в променливата на резултата. Резултатът се отпечатва в полето с резултати като двойно. Делото за изваждане (случай 2) изважда записан_ номер от термин1 и записва числото в променливата на резултата. Резултатът се отпечатва в полето с резултати като двоен. Случаят за умножение (случай 3) умножава термин1 по записан_ номер и записва числото в променливата на резултата. Резултатът се отпечатва в полето с резултати като двоен. Делът на разделяне (случай 4) разделя термин1 на записан_номер заедно и записва числото в променливата на резултата. Резултатът се отпечатва в полето с резултати като плаващ (тъй като отговорите за разделяне могат да бъдат десетични числа). След като на екрана се отпечата събитие на число, операнд или резултат, курсорът се нулира, записаният_ номер се настройва на предишния резултат, а терминът1 и оп_нум се нулират.

Няколко забележки: потребителят не може да въвежда десетични числа в калкулатора поради липсата на квадрат с десетична запетая. Също така, потребителят може да прави само едно уравнение наведнъж. Не можете да изчислите резултат и след това да добавите/извадите/умножите/разделите този резултат. Във функцията numberSelect () има функция, която изчиства екрана след отпечатване на резултат, ако потребителят е натиснал друг квадрат.

Стъпка 4: Кодът: Функция квадрати

void квадрати () {

// черно -бели квадратчета се редуват на всеки ред и първият и третият ред имат обратен модел от втория и четвъртия ред

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: Кодът: Функция на числата

void numbers () {

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: Кодът: Функция 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 (резултат! = 0) {

резултат = 0;

запазен_номер = 0;

tft.print ("ЯСНИ СТОЙНОСТИ");

забавяне (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

За да стартираме функцията numberSelect (), искаме въвеждане от потребителя от сензорния екран с командата ts.getPoint (). След като тези данни бъдат събрани, ние проверяваме дали минималното налягане е превишено (или, с други думи, дали потребителят е натиснал някъде на сензорния екран). Ако е така, координатите x и y се картографират от декартови координати в специфични за сензорния екран координати. (0, 0) е горният ляв ъгъл на сензорния екран, като оста x е напречна, а оста y е надолу. Следващата част проверява дали има записан номер в резултат. Ако има, резултатът и записаният номер се нулират на 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;

} else 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;

} else 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;

} else 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;

}

} else {

user_selection = 16; // user_selection е зададен на 16 (нищо променливо)

}

}

Това е частта, която определя кой бутон е избран. Започвайки с най -горния ред квадратчета и завършвайки с долния ред, Arduino търси къде всъщност е натиснат екранът. След това той присвоява на квадрата номер и записва това число в user_selection. Числата 0-9 съответстват на числовите квадрати, числата 11-15 съответстват на квадратите на операндите и ясния квадрат, а числото 10 съответства на знака квадрат за равенство. Ако не е избран квадрат, тогава user_selection е зададен на 16, което ще накара цикъла да започне отново (вижте функцията цикъл).

Стъпка 7: Насладете се на готовия си проект

Ето го! Вече имате калкулатор със сензорен екран, който може да прави събиране, изваждане, умножение и деление. Този проект промени целия начин, по който мислех, че работи калкулатор. Докато работех по този проект, си спомням, че казах на инструктора си в час: „Никога повече няма да гледам калкулатора по същия начин!“Функциите, които вие като потребител смятате за лесни, са малко трудни, когато сте зад компютъра и се опитвате да подражавате на вашата идея. Надявам се, че проектът ви е харесал, и се надявам, че и вашето мислене за това как работи калкулаторът се е променило!

Ето целия код за ваше удобство. Той е пълен с коментари, така че ако имате някакви проблеми, те трябва да ви покажат какво прави всеки ред.

Препоръчано: