Съдържание:
- Консумативи
- Стъпка 1: Хардуерни връзки
- Стъпка 2: Кодът: Глобални дефиниции и настройка
- Стъпка 3: Кодът: Цикъл
- Стъпка 4: Кодът: Функция квадрати
- Стъпка 5: Кодът: Функция на числата
- Стъпка 6: Кодът: Функция NumberSelect
- Стъпка 7: Насладете се на готовия си проект
Видео: Калкулатор на Arduino със сензорен екран: 7 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:51
Здравейте! Това е проект за създаване на калкулатор със сензорен екран, използващ 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: Насладете се на готовия си проект
Ето го! Вече имате калкулатор със сензорен екран, който може да прави събиране, изваждане, умножение и деление. Този проект промени целия начин, по който мислех, че работи калкулатор. Докато работех по този проект, си спомням, че казах на инструктора си в час: „Никога повече няма да гледам калкулатора по същия начин!“Функциите, които вие като потребител смятате за лесни, са малко трудни, когато сте зад компютъра и се опитвате да подражавате на вашата идея. Надявам се, че проектът ви е харесал, и се надявам, че и вашето мислене за това как работи калкулаторът се е променило!
Ето целия код за ваше удобство. Той е пълен с коментари, така че ако имате някакви проблеми, те трябва да ви покажат какво прави всеки ред.
Препоръчано:
Визитна картичка със сензорен екран: 8 стъпки (със снимки)
Визитна картичка със сензорен екран: По степен съм машинен инженер, но също така съм развил умения по електротехника и програмиране от години проекти, включващи схеми и микроконтролери. Тъй като работодателите ще очакват, че имам умения по машинен инженер
Arduino TFT LCD Калкулатор със сензорен екран: 3 стъпки
Arduino TFT LCD Сензорен калкулатор: Здравейте момчета, в тази инструкция ще се научим как да правим калкулатор, използвайки Arduino Uno с 3.5 " TFT LCD сензорен дисплей, така че ще напишем код и ще го качим в arduino, който ще покаже интерфейса на калкулатора на дисплея и ще
Везна за претегляне със сензорен екран (Arduino): 7 стъпки (със снимки)
Везна за претегляне със сензорен екран (Arduino): Искали ли сте някога да създадете везна за претегляне със сензорен екран? Никога не сте мислили за това? Добре прочетете и опитайте да създадете такъв … Знаете ли какво са TFT сензорен екран и клетка за зареждане? Ако отговорът е „Да“, преминете към стъпка 1, просто започнете с четене на Въведение. Въведение: Какво
Сензорен екран за семейна синхронизация и домашен контролен панел със сензорен екран: 7 стъпки (със снимки)
Сензорен сензорен панел за семейно синхронизиране и домашен контролен панел: Имаме календар, който се актуализира ежемесечно със събития, но се извършва ръчно. Ние също сме склонни да забравяме неща, които сме свършили или други дребни задължения. На тази възраст си мислех, че е много по -лесно да има синхронизиран календар и система от тип бележник, която да
Осветена рамка за плакати със сензорен екран с подсъзнателно съобщение!: 16 стъпки (със снимки)
Осветена рамка за плакати със сензорен екран с подсъзнателно съобщение !: Откакто Think Geek за първи път публикува набор от пет „пътувания“, вдъхновени от Serenity/Firefly плакати, знаех, че трябва да имам собствен комплект. Преди няколко седмици най -накрая ги получих, но бях изправен пред дилема: как да ги монтирам на стената си? Как да се направи