Sadržaj:

Arduino kalkulator ekrana osjetljivog na dodir: 7 koraka
Arduino kalkulator ekrana osjetljivog na dodir: 7 koraka

Video: Arduino kalkulator ekrana osjetljivog na dodir: 7 koraka

Video: Arduino kalkulator ekrana osjetljivog na dodir: 7 koraka
Video: Leap Motion SDK 2024, Juli
Anonim
Arduino kalkulator ekrana osjetljivog na dodir
Arduino kalkulator ekrana osjetljivog na dodir

Zdravo! Ovo je projekt izrade kalkulatora ekrana osjetljivog na dodir pomoću Arduino Uno i TFT LCD ekrana. Došao sam do koncepta za svoj čas programiranja kod kuće, a iskustvo u izgradnji ovog projekta bilo je vrlo zanimljivo. Ovaj kalkulator može izvesti četiri jednostavne matematičke operacije (sabiranje, oduzimanje, množenje i dijeljenje). Također prikazuje do dvije decimale za odgovore podjele koji ih imaju. Uronimo odmah! U nastavku su navedene zalihe ovog projekta.

Supplies

- Arduino Uno

-2.4 TFT LCD štit (evo gdje sam ga kupio:

- USB kabel od A do B (kabel za spajanje Arduina na računalo)

- Računar sa instaliranim Arduino IDE -om

- Također ćete morati preuzeti dvije biblioteke: MCUFRIEND_kbv i ekran osjetljiv na dodir. Prvi možete pronaći na githubu (veza: https://github.com/prenticedavid/MCUFRIEND_kbv) ili možete koristiti zip datoteku biblioteke koju sam naveo ispod. Drugi je u upravitelju Arduino biblioteke za instalaciju.

Korak 1: Hardverske veze

Hardverske veze
Hardverske veze
Hardverske veze
Hardverske veze
Hardverske veze
Hardverske veze

Povezivanje ekrana osjetljivog na dodir s Arduino Uno jednostavno je i brzo. Sve što trebate učiniti je poravnati najniže igle na štitu s najnižim iglama na Arduinu i gurnuti štit u igle. Gornji pin od 5 V i neoznačeni pin na strani napajanja ne bi trebali imati pinove sa štita u sebi, s istim parametrima koji se primjenjuju na pinove označene SCL i SDA na drugoj strani ploče. Sada smo spremni za kodiranje!

Korak 2: Kôd: Globalne definicije i postavljanje

#include

MCUFRIEND_kbv tft; // ionako spojen za UNO štitove

#include

#define YP A3

#define XM A2

#define YM 9

#define XP 8

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

#define MINPRESSURE 10

Ovo je početak koda, gdje uključujemo biblioteke (MCUFRIEND_kbv i ekran osjetljiv na dodir), definiramo X i Y pinove, postavljamo parametre ekrana osjetljivog na dodir i definiramo minimalni pritisak potreban da Arduino registrira korisnički pritisak.

int ID;

int user_selection;

float sačuvani_broj = 0;

float term1;

int op_num;

plutajući rezultat;

int cursorLocX = 5;

int cursorLocY = 20;

Neposredno prije postavljanja moramo postaviti neke globalne varijable. ID pomaže pri pokretanju ekrana osjetljivog na dodir. user_selection sadrži broj koji odgovara tipki koju korisnik odabere pritiskom na zaslon osjetljiv na dodir. saved_number je varijabla koju štampamo na ekranu nakon unosa korisnika (više o tome u petlji). On je plutajući pa može sadržavati decimalne brojeve kao i cijele brojeve. izraz1 je varijabla u koju se nakon odabira operanda sprema prvi broj jednadžbe. op_num sprema operand kao broj (1 za sabiranje, 2 za oduzimanje, 3 za množenje i 4 za dijeljenje). rezultat je varijabla koja se štampa na ekranu nakon što je korisnik pritisnuo znak jednakosti. Takođe je i plovak. cursorLocX i cursorLocY su tačke preslikavanja na ekranu osetljivom na dodir gde je kursor postavljen na više puta (nalazi se u sivoj traci na vrhu, inače poznato kao polje rezultata).

void setup () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

kvadrati ();

brojevi ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Naša funkcija postavljanja prvo sadrži inicijalizaciju za štit ekrana osjetljivog na dodir (linije 1-3). Orijentacija štita se postavlja pomoću naredbe tft.setRotation (), pri čemu je 0 uspravno. Čitav ekran je tamno sive boje naredbom tft.fillScreen (), koju ćemo napisati iznad (osim polja sa rezultatima). Funkcije kvadrata () i brojeva () iscrtavaju kvadrate kalkulatora, boje kvadrate crno -bijelo u šahovnici i upisuju brojeve/operande na kvadrate plavom bojom. Do njih ćemo doći u sljedećem koraku. Naredba tft.setTextSize () postavlja veličinu teksta polja rezultata na 3, što je srednji font. Naredba tft.setTextColor () postavlja boju teksta polja rezultata na plavu, koja se ispisuje preko tamno sivog polja.

Korak 3: Kod: Petlja

void loop () {numberSelect ();

kašnjenje (100);

if (user_selection == 16) {

;

} else {

if (user_selection <10) {

sačuvani_broj = sačuvani_broj * 10 + korisnički_izbor;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (sačuvani_broj);

} else if (user_selection> 10) {

switch (user_selection) {

slučaj 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

termin1 = sačuvani_broj;

sačuvani_broj = 0;

break;

slučaj 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

termin1 = sačuvani_broj;

sačuvani_broj = 0;

break;

slučaj 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

termin1 = sačuvani_broj;

sačuvani_broj = 0;

break;

slučaj 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

termin1 = sačuvani_broj;

sačuvani_broj = 0;

break;

slučaj 15:

sačuvani_broj = 0;

termin1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

break;

}

tft.setCursor (cursorLocX, cursorLocY);

Ovo je mnogo za žvakanje, pa ću objasniti ono što je gore. Počinjemo pozivanjem funkcije numberSelect () koja dodjeljuje broj svakom kvadratu na ekranu osjetljivom na dodir. Kada korisnik pritisne jedan od tih kvadrata, funkcija postavlja varijablu user_selection na broj kvadrata. Prva if naredba će se izvoditi samo kroz petlju ako je napravljen važeći korisnički odabir. Ako je tako, sljedeća naredba if pita ima li user_selection spremljen broj manji od 10 (brojevi 0-9). Ako se to dogodi, broj_sačuvanog množi se s 10, a broj u korisničkom izboru dodaje se spremljenom_broju, koji se ispisuje u polju rezultata na ekranu osjetljivom na dodir. Ako se to ne dogodi, sljedeća naredba if pita ima li user_selection broj spremljen u veći od 10 (brojevi operanda: 11 za +, 12 za -, 13 za X, 14 za /i 15 za kvadrat čistog ekrana). Funkcija prekidača vodi računa o svakom slučaju (određuje user_selection). Promenljivoj op_num se daje broj koji odgovara operandu koji je izabran (1 za +, 2 za -, 3 za X i 4 za /). Vrijednost u spremljenom_broju sprema se u varijablu termin1 tako da se varijabla spremljeni_broj može koristiti za drugu polovicu jednadžbe. Simbol operanda se štampa na ekranu zajedno sa brisanjem svih brojeva u polju za rezultate. Jedini izuzetak je čist kvadrat ekrana, koji resetira sve proračunske varijable i briše polje rezultata sa bilo čega na njemu.

} else {

prekidač (op_num) {

slučaj 1:

rezultat = termin1 + sačuvani_broj;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dvostruki (rezultat));

break;

slučaj 2:

rezultat = termin1 - sačuvani_broj;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dvostruki (rezultat));

break;

slučaj 3:

rezultat = termin1 * sačuvani_broj;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dvostruki (rezultat));

break;

slučaj 4:

rezultat = float (termin1) / float (sačuvani_broj);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (rezultat);

break;

}

tft.setCursor (cursorLocX, cursorLocY);

sačuvani_broj = rezultat;

termin1 = 0;

op_num = 0;

kašnjenje (1000);

}

}

}

Zadnji dio petlje bavi se događajem kada je korisnik odabrao znak jednakosti (user_selection == 10). Druga funkcija prekidača radi kroz četiri matematičke funkcije (određene op_num). Slučaj sabiranja (slučaj 1) dodaje termin1 i sačuvani_broj zajedno i sprema broj u varijablu rezultata. Rezultat se ispisuje u polje rezultata kao dvostruki. Slučaj oduzimanja (slučaj 2) oduzima sačuvani_broj od termina1 i sprema broj u varijablu rezultata. Rezultat se ispisuje u polje rezultata kao dvostruki. Slučaj množenja (slučaj 3) množi izraz1 sa sačuvanim_brojem i sprema broj u varijablu rezultata. Rezultat se ispisuje u polje rezultata kao dvostruki. Slučaj podjele (slučaj 4) dijeli termin1 sa sačuvanim_brojem zajedno i sprema broj u varijablu rezultata. Rezultat se ispisuje u polje rezultata kao float (jer odgovori podjele mogu biti decimalni brojevi). Nakon što se na ekranu odštampa bilo koji broj, operand ili rezultat, kursor se resetuje, sačuvani_broj se postavlja na prethodni rezultat, a termin1 i op_num se resetuju.

Nekoliko napomena: korisnik ne može unijeti decimalne brojeve u kalkulator zbog nedostatka kvadrata decimalne točke. Također, korisnik može raditi samo jednu jednadžbu odjednom. Ne možete izračunati rezultat, a zatim taj rezultat sabrati/oduzeti/pomnožiti/podijeliti. U funkciji numberSelect () postoji funkcija koja briše ekran nakon ispisa rezultata ako je korisnik pritisnuo drugi kvadrat.

Korak 4: Kod: Funkcija kvadrata

void squares () {{100} {101}

// crno -bijeli kvadratići izmjenjuju se u svakom redu, a prvi i treći red imaju suprotan uzorak od drugog i četvrtog reda

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // počinje prvi red kvadrata, crno -bijelo tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // završava prvi red kvadrata

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // počinje drugi red kvadrata, bijelo do crno tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // završava se drugi red kvadrata

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // počinje treći red kvadrata, crno -bijelo tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // završava se treći red kvadrata

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // počinje četvrti red kvadrata, bijelo do crno tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // završava se četvrti red kvadrata

}

Funkcija squares () je prilično jednostavna. Naredba tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) iscrtava pravokutnik prema parametrima koji su mu preneseni, a to su prve pozicije x i y, druge pozicije x i y i boja kojom je pravokutnik ispunjen.. Ova funkcija iscrtava sva četiri reda kvadrata (tehnički pravokutnici) i ispunjava svaki kvadrat bojom koja mu se prenosi.

Korak 5: Kod: Funkcija brojeva

void numbers () {

tft.setTextColor (TFT_BLUE); // postavlja boju/broj znaka na plavu

tft.setTextSize (5); // postavlja broj/veličinu znaka na 5

tft.setCursor (18, 75); // postavlja kursor za prvi red brojeva/znakova

tft.print ("7 8 9 /"); // ispisuje prvi red brojeva/znakova

tft.setCursor (18, 140); // postavlja kursor za drugi red brojeva/znakova

tft.print ("4 5 6 X"); // ispisuje drugi red brojeva/znakova

tft.setCursor (18, 205); // postavlja kursor za treći red brojeva/znakova

tft.print ("1 2 3 -"); // ispisuje treći red brojeva/znakova

tft.setCursor (18, 270); // postavlja kursor za četvrti red brojeva/znakova

tft.print ("C 0 = +"); // ispisuje četvrti red brojeva/znakova

}

Funkcija numbers () je također jednostavna. Prva dva reda postavljaju veličinu teksta većom, a boju plavom. Naredba tft.setCursor () postavlja kursor na poziciju u svakom redu odakle počinje pisanje brojeva. Zatim naredba tft.print () ispisuje brojeve/znakove preko kvadrata.

Korak 6: Kod: Funkcija NumberSelect

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

if (p.z> MINPRISAK) {

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

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

if (rezultat! = 0) {

rezultat = 0;

sačuvani_broj = 0;

tft.print ("CLEAR VALUES");

kašnjenje (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Za početak funkcije numberSelect (), tražimo unos korisnika sa ekrana osjetljivog na dodir pomoću naredbe ts.getPoint (). Nakon što se ti podaci prikupe, provjeravamo je li prekoračen minimalni pritisak (ili, drugim riječima, ako je korisnik pritisnuo negdje na ekranu osjetljivom na dodir). Ako jeste, koordinate x i y se mapiraju iz kartezijanskih koordinata u koordinate specifične za dodirni ekran. (0, 0) je gornji lijevi kut ekrana osjetljivog na dodir, s osi x koja ide preko, a osi y prema dolje. Sljedeći dio provjerava ima li u rezultatu spremljen broj. Ako postoji, rezultat i sačuvani_broj se poništavaju na 0. Poruka "CLEAR VALUES" se ispisuje preko polja s rezultatima, a ekran se briše s pokazivačem na početnu poziciju.

if (p.y 60) {// prvi red kvadrata

ako (p.x <60)

user_selection = 7;

inače ako (p.x <120)

user_selection = 8;

inače ako (p.x <180)

user_selection = 9;

else user_selection = 14;

} else if (p.y 125) {// drugi red kvadrata

ako (p.x <60)

user_selection = 4;

inače ako (p.x <120)

user_selection = 5;

inače ako (p.x <180)

user_selection = 6;

else user_selection = 13;

} else if (p.y 190) {// treći red kvadrata

ako (p.x <60)

user_selection = 1;

inače ako (p.x <120)

user_selection = 2;

inače ako (p.x <180)

user_selection = 3;

else user_selection = 12;

} else if (p.y> 255) {// četvrti red kvadrata

ako (p.x <60)

user_selection = 15;

inače ako (p.x <120)

user_selection = 0;

inače ako (p.x <180)

user_selection = 10;

else user_selection = 11;

}

} else {

user_selection = 16; // user_selection je postavljeno na 16 (ništa varijabilno)

}

}

Ovo je dio koji određuje koje je dugme odabrano. Počevši od gornjeg reda kvadrata i završavajući donjim redom, Arduino traži mjesto na kojem je ekran zapravo pritisnut. Zatim kvadratu dodjeljuje broj i sprema taj broj u user_selection. Brojevi 0-9 odgovaraju kvadratima brojeva, brojevi 11-15 odgovaraju kvadratima operanda i jasnom kvadratu, a broj 10 odgovara kvadratu znaka jednakosti. Ako nije odabran kvadrat, tada je user_selection postavljen na 16, što će petlju pokrenuti iznova (vidi funkciju petlje).

Korak 7: Uživajte u svom završenom projektu

Evo ga! Sada imate kalkulator ekrana osjetljivog na dodir koji može sabirati, oduzimati, množiti i dijeliti. Ovaj projekat promijenio je način na koji sam mislio da kalkulator radi. Dok sam radio na ovom projektu, sjećam se da sam rekao svom instruktoru na času: "Nikada više neću gledati kalkulator na isti način!" Funkcije za koje vi kao korisnik mislite da su jednostavne donekle su teške kada stojite za računarom pokušavajući oponašati vašu ideju. Nadam se da ste uživali u projektu, i nadam se da se promijenilo i vaše razmišljanje o tome kako kalkulator radi!

Evo cijelog koda radi vaše udobnosti. Puno je komentara pa ako imate bilo kakvih problema trebali bi vam pokazati šta svaka linija radi.

Preporučuje se: