Sadržaj:

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

Video: Arduino kalkulator zaslona osjetljivog na dodir: 7 koraka

Video: Arduino kalkulator zaslona osjetljivog na dodir: 7 koraka
Video: Leap Motion SDK 2024, Prosinac
Anonim
Arduino kalkulator zaslona osjetljivog na dodir
Arduino kalkulator zaslona osjetljivog na dodir

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

Pribor

- Arduino Uno

-2.4 TFT LCD štit (ovdje sam ga kupio:

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

- Računalo s instaliranim Arduino IDE -om

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

Korak 1: Hardverske veze

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

Spajanje 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 odnose na pinove označene SCL i SDA s druge strane ploče. Sada smo spremni za kodiranje!

Korak 2: Kôd: Globalne definicije i postavljanje

#uključi

MCUFRIEND_kbv tft; // ionako spojen za UNO štitove

#uključi

#definirajte YP A3

#definirajte XM A2

#definirajte YM 9

#define XP 8

TouchScreen ts = Zaslon osjetljiv na dodir (XP, YP, XM, YM, 300);

#define MINPRESSURE 10

Ovo je početak koda, gdje uključujemo knjižnice (MCUFRIEND_kbv i zaslon osjetljiv na dodir), definiramo X i Y pinove, postavljamo parametre zaslona osjetljivog na dodir i definiramo minimalni pritisak potreban za Arduino da registrira korisnički tisak.

int ID;

int user_selection;

float spremljeni_broj = 0;

float term1;

int op_num;

plutajući rezultat;

int kurzorLocX = 5;

int cursorLocY = 20;

Neposredno prije postavljanja moramo postaviti neke globalne varijable. ID pomaže pri pokretanju zaslona osjetljivog na dodir. user_selection sadrži broj koji odgovara tipki koju korisnik odabere pritiskom na dodirni zaslon. saved_number je varijabla koju ispisujemo na zaslon 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 sprema prvi broj jednadžbe nakon odabira operanda. op_num sprema operand kao broj (1 za zbrajanje, 2 za oduzimanje, 3 za množenje i 4 za dijeljenje). rezultat je varijabla koja se ispisuje na zaslon nakon što je korisnik pritisnuo znak jednakosti. Također je i plovak. cursorLocX i cursorLocY točke su preslikavanja na zaslonu osjetljivom na dodir gdje je pokazivač 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 zaslon osjetljiv na dodir (retci 1-3). Orijentacija štita postavlja se naredbom tft.setRotation (), pri čemu je 0 uspravno. Cijeli zaslon obojen je tamno sivom bojom pomoću naredbe tft.fillScreen () koju ćemo napisati iznad (osim polja s 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 s rezultatima 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) {

;

}drugo{

if (user_selection <10) {

spremljeni_broj = spremljeni_broj * 10 + korisnički_izbor;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (spremljeni_broj);

} else if (user_selection> 10) {

switch (user_selection) {

slučaj 11:

op_broj = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

izraz1 = spremljeni_broj;

spremljeni_broj = 0;

pauza;

slučaj 12:

op_broj = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

izraz1 = spremljeni_broj;

spremljeni_broj = 0;

pauza;

slučaj 13:

op_broj = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

izraz1 = spremljeni_broj;

spremljeni_broj = 0;

pauza;

slučaj 14:

op_broj = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

izraz1 = spremljeni_broj;

spremljeni_broj = 0;

pauza;

slučaj 15:

spremljeni_broj = 0;

pojam1 = 0;

op_broj = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

pauza;

}

tft.setCursor (cursorLocX, cursorLocY);

Ovo je puno za žvakanje pa ću objasniti ono što je gore. Počinjemo pozivanjem funkcije numberSelect () koja dodjeljuje broj svakom kvadratu na zaslonu osjetljivom na dodir. Kad korisnik pritisne jedan od tih kvadrata, funkcija postavlja varijablu user_selection na broj kvadrata. Prva naredba if će se izvoditi kroz petlju samo ako je izvršen valjani odabir korisnika. Ako jest, sljedeća naredba if pita ima li user_selection spremljen broj manji od 10 (brojevi 0-9). Ako se to dogodi, spremljeni broj pomnožava se s 10, a broj u korisničkom odabiru dodaje se spremljenom broju koji se ispisuje u polju rezultata na zaslonu osjetljivom na dodir. Ako nema, sljedeća naredba if pita ima li user_selection spremljen broj veći od 10 (brojevi operanda: 11 za +, 12 za -, 13 za X, 14 za /i 15 za čist kvadrat). Funkcija prekidača brine se za svaki slučaj (određuje user_selection). Varijabli op_num daje se broj koji odgovara operandu koji je odabran (1 za +, 2 za -, 3 za X i 4 za /). Vrijednost u spremljenom_broju sprema se u varijablu izraz1 tako da se varijabla spremljeni_broj može koristiti za drugu polovicu jednadžbe. Simbol operanda ispisuje se na ekranu zajedno s brisanjem svih brojeva u polju rezultata. Jedina iznimka je čist kvadrat zaslona, koji resetira sve varijable izračuna i briše polje rezultata s bilo čega na njemu.

}drugo{

prekidač (op_broj) {

slučaj 1:

rezultat = termin1 + spremljeni_broj;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dvostruki (rezultat));

pauza;

slučaj 2:

rezultat = termin1 - spremljeni_broj;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dvostruki (rezultat));

pauza;

slučaj 3:

rezultat = termin1 * spremljeni_broj;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dvostruki (rezultat));

pauza;

slučaj 4:

rezultat = float (termin1) / float (spremljeni_broj);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (rezultat);

pauza;

}

tft.setCursor (cursorLocX, cursorLocY);

spremljeni_broj = rezultat;

pojam1 = 0;

op_broj = 0;

kašnjenje (1000);

}

}

}

Posljednji 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 zbrajanja (slučaj 1) dodaje termin1 i spremljeni_broj 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 spremljenim brojem i sprema broj u varijablu rezultata. Rezultat se ispisuje u polje rezultata kao dvostruki. Slučaj podjele (slučaj 4) dijeli termin1 sa spremljenim_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 ispiše događaj, broj, operand ili rezultat, kursor se resetira, broj_spremnika postavi na prethodni rezultat, a pojam1 i op_num se resetiraju.

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 zbrojiti/oduzeti/pomnožiti/podijeliti. U funkciji numberSelect () postoji funkcija koja briše zaslon 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 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 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 četvrti red kvadrata

}

Funkcija squares () prilično je 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 je prenesena.

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 redak brojeva/znakova

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

tft.setCursor (18, 205); // postavlja kursor za treći redak 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 () također je jednostavna. Prva dva retka povećavaju veličinu teksta, a boju plavu. Naredba tft.setCursor () postavlja kursor na položaj u svakom retku 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;

spremljeni_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 korisnički unos s zaslona osjetljivog na dodir pomoću naredbe ts.getPoint (). Nakon što su ti podaci prikupljeni, provjeravamo je li prekoračen minimalni tlak (ili, drugim riječima, je li korisnik pritisnuo negdje na zaslonu osjetljivom na dodir). Ako jest, koordinate x i y preslikavaju se iz kartezijanskih koordinata u koordinate specifične za zaslon osjetljiv na dodir. (0, 0) je gornji lijevi kut zaslona osjetljivog na dodir, s osi x koja ide preko, a osi y prema dolje. Sljedeći dio provjerava postoji li u rezultatu spremljen broj. Ako postoji, rezultat i spremljeni_broj se poništavaju na 0. Poruka "CLEAR VALUES" se ispisuje preko polja s rezultatima, a zaslon se briše s pokazivačem natrag u početni položaj.

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;

}

}drugo{

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

}

}

Ovo je dio koji određuje koji je gumb odabran. Počevši od gornjeg reda kvadrata i završavajući donjim redom, Arduino traži mjesto na kojem je zaslon 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 dovršenom projektu

Evo ga! Sada imate kalkulator zaslona osjetljivog na dodir koji može vršiti zbrajanje, oduzimanje, množenje i dijeljenje. Ovaj projekt promijenio je način na koji sam mislio da kalkulator radi. Dok sam radio na ovom projektu, sjećam se da sam svom instruktoru na satu rekao: "Nikad 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čunalom i pokušavate oponašati svoju ideju. Nadam se da vam se svidio projekt, i nadam se da se promijenilo i vaše razmišljanje o načinu rada kalkulatora!

Evo cijelog koda radi vaše udobnosti. Puno je komentara pa ako imate problema, trebali bi vam pokazati što svaki redak radi.

Preporučeni: