Cuprins:

Calculator cu ecran tactil Arduino: 7 pași
Calculator cu ecran tactil Arduino: 7 pași

Video: Calculator cu ecran tactil Arduino: 7 pași

Video: Calculator cu ecran tactil Arduino: 7 pași
Video: How to make a LED digital counter using 7- Segment Display 2024, Iulie
Anonim
Calculator cu ecran tactil Arduino
Calculator cu ecran tactil Arduino

Buna! Acesta este un proiect de realizare a unui calculator cu ecran tactil folosind un Arduino Uno și un ecran TFT LCD. Am venit cu conceptul pentru clasa mea de programare la domiciliu, iar experiența în construirea acestui proiect a fost foarte interesantă. Acest calculator poate face cele patru operații matematice simple (adunare, scădere, multiplicare și divizare). De asemenea, afișează până la două puncte zecimale pentru răspunsurile de diviziune care le au. Hai să ne scufundăm chiar înăuntru! Aprovizionările pentru acest proiect sunt enumerate mai jos.

Provizii

- Arduino Uno

- Ecran LCD TFT 2.4 (aici l-am cumpărat:

- Cablu USB A la B (cablu pentru conectarea Arduino la computer)

- Computer cu Arduino IDE instalat

- De asemenea, va trebui să descărcați două biblioteci: MCUFRIEND_kbv și Touchscreen. Primul îl puteți găsi pe github (link: https://github.com/prenticedavid/MCUFRIEND_kbv) sau puteți utiliza fișierul zip al bibliotecii pe care l-am inclus mai jos. Al doilea este în Arduino Library manager pentru instalare.

Pasul 1: Conexiuni hardware

Conexiuni hardware
Conexiuni hardware
Conexiuni hardware
Conexiuni hardware
Conexiuni hardware
Conexiuni hardware

Conexiunea ecranului tactil la Arduino Uno este simplă și rapidă. Tot ce trebuie să faceți este să aliniați pinii cei mai mici de pe scut cu pinii cei mai mici de pe Arduino și să împingeți scutul în ace. Pinul superior de 5V și pinul nemarcat de pe partea de alimentare nu ar trebui să aibă pinii de pe scut, aceiași parametri se aplică pinilor etichetați SCL și SDA de pe cealaltă parte a plăcii. Acum suntem gata să codificăm!

Pasul 2: Codul: definiții globale și configurare

#include

MCUFRIEND_kbv tft; // oricum pentru cablurile UNO

#include

#define YP A3

#define XM A2

#define YM 9

#define XP 8

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

#define MINPRESSURE 10

Acesta este începutul codului, unde includem biblioteci (MCUFRIEND_kbv & Touchscreen), definim pinii X și Y, configurăm parametrii ecranului tactil și definim presiunea minimă necesară pentru ca Arduino să înregistreze o apăsare de utilizator.

int ID;

int user_selection;

float salvat_număr = 0;

float term1;

int op_num;

rezultatul plutitor;

int cursorLocX = 5;

int cursorLocY = 20;

Chiar înainte de configurare, trebuie să configurăm câteva variabile globale. ID-ul ajută la punerea în funcțiune a ecranului tactil. user_selection deține un număr care corespunde tastei selectate de utilizator atunci când apasă pe ecranul tactil. saved_number este variabila pe care o imprimăm pe ecran după o intrare de utilizator (mai multe despre aceasta în buclă). Este un float, astfel încât să poată conține numere zecimale, precum și numere întregi. termenul 1 este variabila în care este salvat primul număr al ecuației după selectarea unui operand. op_num salvează operandul ca număr (1 pentru adunare, 2 pentru scădere, 3 pentru multiplicare și 4 pentru divizare). rezultatul este variabila care este tipărită pe ecran după ce utilizatorul a apăsat semnul egal. Este, de asemenea, un plutitor. cursorLocX și cursorLocY sunt punctele de mapare de pe ecranul tactil unde cursorul este setat de mai multe ori (este situat în bara gri din partea de sus, altfel cunoscut sub numele de câmpul de rezultate).

configurare nulă () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

pătrate ();

numere ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Funcția noastră de configurare conține mai întâi inițializarea pentru ecranul tactil (liniile 1-3). Orientarea ecranului este setată folosind comanda tft.setRotation (), cu 0 fiind în poziție verticală. Întregul ecran este de culoare gri închis cu comanda tft.fillScreen (), pe care o vom scrie deasupra (cu excepția câmpului de rezultate). Funcțiile pătrate () și numere () desenează pătratele calculatorului, colorează pătratele alb-negru într-un model de tablă și scriu numere / operanzi pe pătratele în albastru. Vom ajunge la cele din pasul următor. Comanda tft.setTextSize () setează dimensiunea textului câmpului de rezultate la 3, care este un font mediu. Comanda tft.setTextColor () setează culoarea textului câmpului de rezultate la albastru, care este scris peste câmpul gri închis.

Pasul 3: Codul: buclă

void loop () {numberSelect ();

întârziere (100);

if (user_selection == 16) {

;

} altceva {

if (user_selection <10) {

salvat_număr = salvat_număr * 10 + selecție_utilizator;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (salvat_număr);

} else if (user_selection> 10) {

switch (user_selection) {

cazul 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

termen1 = număr_ salvat;

salvat_număr = 0;

pauză;

cazul 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

termen1 = număr_ salvat;

salvat_număr = 0;

pauză;

cazul 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print („X”);

termen1 = număr_ salvat;

salvat_număr = 0;

pauză;

cazul 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

termen1 = număr_ salvat;

salvat_număr = 0;

pauză;

cazul 15:

salvat_număr = 0;

termen1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

pauză;

}

tft.setCursor (cursorLocX, cursorLocY);

Acest lucru este mult de mestecat, așa că voi explica ce este mai sus. Începem prin a apela funcția numberSelect (), care atribuie un număr fiecărui pătrat de pe ecranul tactil. Când un utilizator apasă unul dintre aceste pătrate, funcția setează variabila user_selection la numărul pătratului. Prima instrucțiune if trebuie să ruleze prin buclă numai dacă a fost făcută o selecție validă de utilizator. Dacă este, instrucțiunea if următoare întreabă dacă user_selection are un număr mai mic de 10 salvat (numerele 0-9). Dacă da, numărul_separat este înmulțit cu 10 și numărul din selecția_utilizator este adăugat la numărul_salvat, care este tipărit în câmpul de rezultate de pe ecranul tactil. Dacă nu, instrucțiunea if următoare întreabă dacă user_selection are un număr mai mare de 10 salvat (numerele de operand: 11 pentru +, 12 pentru -, 13 pentru X, 14 pentru / și 15 pentru pătratul ecranului liber). O funcție de comutare are grijă de fiecare caz (determinat de user_selection). Variabilei op_num primește un număr care corespunde operandului care a fost selectat (1 pentru +, 2 pentru -, 3 pentru X și 4 pentru /). Valoarea din save_number este salvată în variabila termen1 astfel încât variabila saved_number să poată fi utilizată pentru a doua jumătate a ecuației. Simbolul operandului este imprimat pe ecran împreună cu ștergerea oricăror numere din câmpul de rezultate. Singura excepție este pătratul ecranului liber, care resetează toate variabilele de calcul și șterge câmpul de rezultate de orice element de pe acesta.

} altceva {

switch (op_num) {

cazul 1:

rezultat = termen1 + număr_ salvat;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dublu (rezultat));

pauză;

cazul 2:

rezultat = termen1 - număr_ salvat;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dublu (rezultat));

pauză;

cazul 3:

rezultat = termen1 * număr_ salvat;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dublu (rezultat));

pauză;

cazul 4:

rezultat = float (termen1) / float (salvat_număr);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (rezultat);

pauză;

}

tft.setCursor (cursorLocX, cursorLocY);

salvat_număr = rezultat;

termen1 = 0;

op_num = 0;

întârziere (1000);

}

}

}

Ultima parte a buclei se referă la evenimentul în care utilizatorul selectează semnul egal (user_selection == 10). O altă funcție de comutare funcționează prin cele patru funcții matematice (determinate de op_num). Cazul de adăugare (cazul 1) adaugă term1 și saved_number împreună și salvează numărul în variabila rezultat. Rezultatul este tipărit în câmpul de rezultate ca un dublu. Cazul de scădere (cazul 2) scade numărul salvat din termenul 1 și salvează numărul în variabila de rezultat. Rezultatul este tipărit în câmpul de rezultate ca dublu. Cazul de multiplicare (cazul 3) înmulțește termenul 1 cu numărul_ salvat și salvează numărul în variabila rezultat. Rezultatul este tipărit în câmpul de rezultate ca un dublu. Cazul diviziunii (cazul 4) împarte termenul 1 cu numărul_ salvat împreună și salvează numărul în variabila rezultat. Rezultatul este tipărit în câmpul de rezultate ca float (deoarece răspunsurile la diviziuni pot fi numere zecimale). După imprimarea pe ecran a unui număr, a unui operand sau a unui rezultat, cursorul este resetat, numărul salvat este setat la rezultatul anterior și termenul 1 și op_num sunt resetate.

Câteva note: utilizatorul nu poate introduce numere zecimale în calculator din cauza lipsei unui pătrat de punct zecimal. De asemenea, utilizatorul poate face o singură ecuație la un moment dat. Nu puteți calcula un rezultat și apoi adăugați / scădeți / înmulțiți / împărțiți acel rezultat. În funcția numberSelect (), există o funcție care șterge ecranul după ce un rezultat a fost tipărit dacă un utilizator a apăsat un alt pătrat.

Pasul 4: Funcția Cod: pătrate

goluri pătrate () {

// pătratele alb-negru alternează pe fiecare rând, iar primul și al treilea rând au un model opus decât al doilea și al patrulea rând

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // începe primul rând de pătrate, de la negru la alb tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // primul rând de pătrate se termină

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // începe al doilea rând de pătrate, de la alb la negru tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // al doilea rând de pătrate se termină

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // începe al treilea rând de pătrate, de la negru la alb tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // al treilea rând de pătrate se termină

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // începe al patrulea rând de pătrate, de la alb la negru tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // al patrulea rând de pătrate se termină

}

Funcția pătrate () este destul de simplă. Comanda tft.. Această funcție desenează toate cele patru rânduri de pătrate (din punct de vedere tehnic dreptunghiuri) și umple fiecare pătrate cu culoarea transmisă.

Pasul 5: Funcția Cod: Numere

numere nule () {

tft.setTextColor (TFT_BLUE); // setează culoarea numărului / caracterului pe albastru

tft.setTextSize (5); // setează numărul / dimensiunea caracterului la 5

tft.setCursor (18, 75); // setează cursorul pentru prima linie de numere / caractere

tft.print ("7 8 9 /"); // imprimă prima linie de numere / caractere

tft.setCursor (18, 140); // setează cursorul pentru a doua linie de numere / caractere

tft.print ("4 5 6 X"); // imprimă a doua linie de numere / caractere

tft.setCursor (18, 205); // setează cursorul pentru a treia linie de numere / caractere

tft.print ("1 2 3 -"); // tipărește a treia linie de numere / caractere

tft.setCursor (18, 270); // setează cursorul pentru a patra linie de numere / caractere

tft.print ("C 0 = +"); // tipărește a patra linie de numere / caractere

}

Funcția numbers () este, de asemenea, simplă. Primele două linii stabilesc dimensiunea textului mai mare și culoarea la albastru. Comanda tft.setCursor () setează cursorul în poziția de pe fiecare rând de unde începe scrierea numerelor. Apoi comanda tft.print () tipărește numerele / caracterele peste pătrate.

Pasul 6: Funcția Cod: Număr Selectați

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

if (p.z> MINPRESSION) {

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

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

if (rezultat! = 0) {

rezultat = 0;

salvat_număr = 0;

tft.print („VALORI CLEAR”);

întârziere (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Pentru a porni funcția numberSelect (), solicităm introducerea utilizatorului de pe ecranul tactil cu comanda ts.getPoint (). Odată colectate aceste date, verificăm dacă a fost depășită presiunea minimă (sau, cu alte cuvinte, dacă utilizatorul a apăsat undeva pe ecranul tactil). Dacă este, coordonatele x și y sunt mapate de la coordonatele carteziene la coordonatele specifice ecranului tactil. (0, 0) este colțul din stânga sus al ecranului tactil, cu axa x trecând și axa y coborând. Următoarea parte verifică dacă există un număr salvat în rezultat. Dacă există, rezultatul și numărul salvat sunt resetate la 0. Mesajul „ȘTERGE VALORILE” este imprimat peste câmpul de rezultate, iar ecranul este șters cu cursorul înapoi la poziția sa inițială.

if (p.y 60) {// primul rând de pătrate

dacă (p.x <60)

user_selection = 7;

altfel dacă (p.x <120)

user_selection = 8;

altfel dacă (p.x <180)

user_selection = 9;

else user_selection = 14;

} else if (p.y 125) {// al doilea rând de pătrate

dacă (p.x <60)

user_selection = 4;

altfel dacă (p.x <120)

user_selection = 5;

altfel dacă (p.x <180)

user_selection = 6;

else user_selection = 13;

} else if (p.y 190) {// al treilea rând de pătrate

dacă (p.x <60)

user_selection = 1;

altfel dacă (p.x <120)

user_selection = 2;

altfel dacă (p.x <180)

user_selection = 3;

else user_selection = 12;

} else if (p.y> 255) {// al patrulea rând de pătrate

dacă (p.x <60)

user_selection = 15;

altfel dacă (p.x <120)

user_selection = 0;

altfel dacă (p.x <180)

user_selection = 10;

else user_selection = 11;

}

} altceva {

user_selection = 16; // user_selection este setat la 16 (nimic variabil)

}

}

Aceasta este partea care determină ce buton a fost selectat. Începând cu rândul superior de pătrate și terminând cu rândul de jos, Arduino caută unde a fost apăsat ecranul. Apoi atribuie pătratului un număr și salvează acel număr în user_selection. Numerele 0-9 corespund pătratelor numerice, numerele 11-15 corespund pătratelor operandului și pătratului liber, iar numărul 10 corespunde pătratului semnului egal. Dacă nu a fost selectat niciun pătrat, atunci user_selection este setat la 16, ceea ce va face ca bucla să înceapă din nou (vezi funcția buclă).

Pasul 7: Bucurați-vă de proiectul finalizat

Iată-l! Acum aveți un calculator cu ecran tactil care poate face adunare, scădere, multiplicare și divizare. Acest proiect a schimbat tot felul în care credeam că funcționează un calculator. În timp ce lucram la acest proiect, îmi amintesc că i-am spus instructorului la curs: „Nu voi mai privi niciodată un calculator în același mod!” Funcțiile pe care, în calitate de utilizator, le considerați ușoare sunt oarecum dificile atunci când vă aflați în spatele computerului încercând să vă imitați ideea. Sper că ți-a plăcut proiectul și sper că și mentalitatea ta despre modul în care funcționează un calculator a fost schimbată!

Iată întregul cod pentru confortul dvs. Este plin de comentarii, deci, dacă aveți probleme, ar trebui să vă arate ce face fiecare linie.

Recomandat: