Kazalo:

Arduino kalkulator zaslona na dotik: 7 korakov
Arduino kalkulator zaslona na dotik: 7 korakov

Video: Arduino kalkulator zaslona na dotik: 7 korakov

Video: Arduino kalkulator zaslona na dotik: 7 korakov
Video: Изучите Arduino за 30 минут: примеры и проекты 2024, November
Anonim
Arduino kalkulator zaslona na dotik
Arduino kalkulator zaslona na dotik

Zdravo! To je projekt izdelave kalkulatorja z zaslonom na dotik z uporabo Arduino Uno in TFT LCD ščita. Pripravil sem koncept za svoj razred programiranja na šoli in izkušnje pri gradnji tega projekta so bile zelo zanimive. Ta kalkulator lahko izvede štiri preproste matematične operacije (seštevanje, odštevanje, množenje in deljenje). Prikaže tudi do dve decimalni mesti za odgovore deljenja, ki jih imajo. Potopimo se takoj! Zaloge za ta projekt so navedene spodaj.

Zaloge

- Arduino Uno

-2.4 TFT LCD ščit (tukaj sem ga kupil:

- kabel USB A do B (kabel za povezavo Arduina z računalnikom)

- Računalnik z nameščenim Arduino IDE

- Prav tako boste morali prenesti dve knjižnici: MCUFRIEND_kbv in zaslon na dotik. Prvega najdete na githubu (povezava: https://github.com/prenticedavid/MCUFRIEND_kbv) ali pa uporabite zip datoteko knjižnice, ki sem jo vključil spodaj. Drugi je v upravitelju knjižnice Arduino za namestitev.

1. korak: Povezave strojne opreme

Povezave strojne opreme
Povezave strojne opreme
Povezave strojne opreme
Povezave strojne opreme
Povezave strojne opreme
Povezave strojne opreme

Povezava ščita zaslona na dotik z Arduino Uno je preprosta in hitra. Vse kar morate storiti je, da poravnate najnižje zatiče na ščitu z najnižjimi zatiči na Arduinu in potisnete ščit v nožice. Zgornji 5V nožica in neoznačeni zatič na strani napajanja ne smeta imeti zatičev iz ščita, z enakimi parametri, ki veljajo za nožice z oznako SCL in SDA na drugi strani plošče. Zdaj smo pripravljeni na kodiranje!

2. korak: Koda: globalne definicije in nastavitev

#vključi

MCUFRIEND_kbv tft; // vseeno trdno ožičen za UNO ščite

#vključi

#določite YP A3

#define XM A2

#določi YM 9

#define XP 8

Zaslon na dotik ts = Zaslon na dotik (XP, YP, XM, YM, 300);

#define MINPRESSURE 10

To je začetek kode, kamor vključimo knjižnice (MCUFRIEND_kbv in zaslon na dotik), določimo zatiče X in Y, nastavimo parametre zaslona na dotik in določimo najmanjši pritisk, ki je potreben, da Arduino registrira uporabniški pritisk.

int ID;

int user_selection;

float shranjeno_številko = 0;

float term1;

int op_num;

plavajoči rezultat;

int kurzorLocX = 5;

int cursorLocY = 20;

Tik pred nastavitvijo moramo nastaviti nekaj globalnih spremenljivk. ID pomaga pri zagonu zaslona na dotik. user_selection vsebuje številko, ki ustreza tipki, ki jo uporabnik izbere ob pritisku na zaslon na dotik. save_number je spremenljivka, ki jo natisnemo na zaslon po vnosu uporabnika (več o tem v zanki). Je plavajoči, tako da lahko vsebuje decimalna števila in cela števila. izraz1 je spremenljivka, v katero je shranjena prva številka enačbe, potem ko je izbran operand. op_num shrani operand kot število (1 za seštevanje, 2 za odštevanje, 3 za množenje in 4 za deljenje). rezultat je spremenljivka, ki se natisne na zaslon, potem ko je uporabnik pritisnil znak enakosti. Je tudi plovec. cursorLocX in cursorLocY sta točki preslikave na zaslonu na dotik, kjer je kazalec večkrat nastavljen (nahaja se v sivi vrstici na vrhu, sicer znani tudi kot polje z rezultati).

void setup () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

kvadrati ();

številke ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Naša nastavitvena funkcija najprej vsebuje inicializacijo za zaščito zaslona na dotik (vrstice 1-3). Usmerjenost ščita se nastavi z ukazom tft.setRotation (), pri čemer je 0 pokonci. Celoten zaslon je obarvan temno sivo z ukazom tft.fillScreen (), ki ga bomo zapisali na vrhu (razen polja z rezultati). Funkcije kvadratov () in številk () narišejo kvadrate kalkulatorja, polja pobarvajo črno -belo v vzorcu šahovnice in na kvadrate v modro napišejo številke/operande. Do njih bomo prišli v naslednjem koraku. Ukaz tft.setTextSize () nastavi velikost besedila polja z rezultati na 3, kar je srednja pisava. Ukaz tft.setTextColor () nastavi barvo besedila polja z rezultati na modro, ki je zapisana nad temno sivim poljem.

3. korak: Koda: Zanka

void loop () {numberSelect ();

zamuda (100);

if (user_selection == 16) {

;

} drugo {

if (user_selection <10) {

shranjeno_številko = shranjeno_številko * 10 + uporabniški_izbor;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (shranjeno_številko);

} else if (user_selection> 10) {

switch (user_selection) {

primer 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

izraz1 = shranjeno_številko;

shranjeno_številko = 0;

zlom;

primer 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

izraz1 = shranjeno_številko;

shranjeno_številko = 0;

zlom;

primer 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

izraz1 = shranjeno_številko;

shranjeno_številko = 0;

zlom;

primer 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

izraz1 = shranjeno_številko;

shranjeno_številko = 0;

zlom;

primer 15:

shranjeno_številko = 0;

izraz1 = 0;

op_številka = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

zlom;

}

tft.setCursor (cursorLocX, cursorLocY);

To je veliko za žvečenje, zato bom razložil, kar je zgoraj. Začnemo s klicem funkcije numberSelect (), ki vsakemu kvadratu na zaslonu na dotik dodeli številko. Ko uporabnik pritisne enega od teh kvadratov, funkcija nastavi spremenljivko user_selection na številko kvadrata. Prvi stavek if naj teče skozi zanko le, če je bil opravljen veljaven izbor uporabnika. Če je tako, naslednji stavek if vpraša, ali ima user_selection shranjeno število, manjše od 10 (številke 0-9). Če se to zgodi, se shranjeno_številko pomnoži z 10 in številka v user_selection se doda shranjeni_številki, ki je natisnjena v polju z rezultati na zaslonu na dotik. Če se ne, se naslednji stavek if vpraša, ali je vanj shranjeno število, večje od 10 (številke operandov: 11 za +, 12 za -, 13 za X, 14 za /in 15 za kvadrat čistega zaslona). Preklopna funkcija skrbi za vsak primer (določi ga user_selection). Spremenljivki op_num je dodeljena številka, ki ustreza izbranemu operandu (1 za +, 2 za -, 3 za X in 4 za /). Vrednost v shranjenem_številku je shranjena v spremenljivko izraz1, tako da se lahko spremenljivko shranjeno_številko uporabi za drugo polovico enačbe. Simbol operanda je natisnjen skupaj z brisanjem vseh številk v polju z rezultati. Edina izjema je čist kvadrat zaslona, ki ponastavi vse računske spremenljivke in izbriše polje z rezultati kar koli na njem.

} drugo {

switch (op_num) {

primer 1:

rezultat = termin1 + shranjeno_številko;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dvojni (rezultat));

zlom;

primer 2:

rezultat = termin1 - shranjeno_številko;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dvojni (rezultat));

zlom;

primer 3:

rezultat = termin1 * shranjeno_številko;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dvojni (rezultat));

zlom;

primer 4:

rezultat = float (termin1) / float (shranjeno_številko);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (rezultat);

zlom;

}

tft.setCursor (cursorLocX, cursorLocY);

shranjeno_številka = rezultat;

izraz1 = 0;

op_številka = 0;

zamuda (1000);

}

}

}

Zadnji del zanke obravnava dogodek, ko uporabnik izbere znak enakosti (user_selection == 10). Druga funkcija stikala deluje skozi štiri matematične funkcije (določene z op_num). Primer za seštevanje (primer 1) skupaj doda termin1 in shranjeno_številko ter shrani številko v spremenljivko rezultata. Rezultat je natisnjen v polje z rezultati kot dvojnik. Primer odštevanja (primer 2) odšteje shranjeno_številko od izraza1 in shrani število v spremenljivko rezultata. Rezultat je natisnjen v polje z rezultati kot dvojnik. Primer množenja (primer 3) pomnoži izraz1 s shranjeno_številko in shrani število v spremenljivko rezultata. Rezultat je natisnjen v polje z rezultati kot dvojnik. Primer deljenja (primer 4) deli termin1 s shranjeno_številko skupaj in shrani število v spremenljivko rezultata. Rezultat se natisne v polje z rezultati kot plavajoče (ker so odgovori na deljenje lahko decimalna števila). Ko se na zaslon natisnejo številka, operand ali rezultat, se kazalec ponastavi, shranjeno_številko je nastavljeno na prejšnji rezultat, izraz1 in op_num pa ponastavljena.

Nekaj opomb: uporabnik ne more vnesti decimalnih številk v kalkulator zaradi pomanjkanja kvadrata decimalne vejice. Prav tako lahko uporabnik naenkrat naredi samo eno enačbo. Ne morete izračunati rezultata in nato tega rezultata sešteti/odšteti/pomnožiti/deliti. V funkciji numberSelect () je funkcija, ki po tiskanju rezultata počisti zaslon, če je uporabnik pritisnil drug kvadrat.

4. korak: Koda: funkcija kvadratov

void squares () {

// črno -beli kvadrati se izmenjujejo v vsaki vrstici, prva in tretja vrstica pa imata nasproten vzorec kot druga in četrta vrstica

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // prva vrstica kvadratov se začne, črno -bela tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // konča se prva vrstica kvadratov

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // začne se druga vrstica kvadratov, bela do črna tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // konča se druga vrstica kvadratov

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // začne se tretja vrstica kvadratov, črno -bela tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // konča tretja vrsta kvadratov

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // začne se četrta vrstica kvadratov, bela do črna tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // konča četrta vrstica kvadratov

}

Funkcija squares () je precej preprosta. Ukaz tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) nariše pravokotnik glede na parametre, ki so mu bili posredovani, to so prvi položaji x in y, drugi položaji x in y ter barva, s katero je pravokotnik zapolnjen. Ta funkcija nariše vse štiri vrstice kvadratov (tehnično pravokotnikov) in vsake kvadrate napolni z barvo, ki ji je podana.

5. korak: Koda: funkcija številk

void numbers () {

tft.setTextColor (TFT_BLUE); // barvo številke/znaka nastavi na modro

tft.setTextSize (5); // nastavi številko/velikost znaka na 5

tft.setCursor (18, 75); // nastavi kazalec za prvo vrstico številk/znakov

tft.print ("7 8 9 /"); // natisne prvo vrstico številk/znakov

tft.setCursor (18, 140); // nastavi kazalec za drugo vrstico številk/znakov

tft.print ("4 5 6 X"); // natisne drugo vrstico številk/znakov

tft.setCursor (18, 205); // nastavi kazalec za tretjo vrstico številk/znakov

tft.print ("1 2 3 -"); // natisne tretjo vrstico številk/znakov

tft.setCursor (18, 270); // nastavi kazalec za četrto vrstico številk/znakov

tft.print ("C 0 = +"); // natisne četrto vrstico številk/znakov

}

Tudi funkcija numbers () je preprosta. Prvi dve vrstici nastavita velikost besedila in barvo modro. Ukaz tft.setCursor () nastavi kazalec na položaj v vsaki vrstici, od koder se začne pisanje številk. Nato ukaz tft.print () natisne številke/znake na kvadrate.

Korak 6: Koda: funkcija NumberSelect

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

if (p.z> MINPRESSURE) {

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

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

if (rezultat! = 0) {

rezultat = 0;

shranjeno_številko = 0;

tft.print ("POČISTI VREDNOSTI");

zamuda (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Za začetek funkcije numberSelect () prosimo za uporabniški vnos z zaslona na dotik z ukazom ts.getPoint (). Ko so ti podatki zbrani, preverimo, ali je bil minimalni tlak presežen (ali z drugimi besedami, če je uporabnik pritisnil nekje na zaslonu na dotik). Če je, se koordinati x in y preslikata iz kartezijanskih koordinat v koordinate, značilne za zaslon na dotik. (0, 0) je zgornji levi kot zaslona na dotik, pri čemer je os x navzgor, os y pa navzdol. Naslednji del preveri, ali je v rezultatu shranjena številka. Če obstaja, sta rezultat in shranjeno_številko ponastavljeni na 0. Sporočilo "CLEAR VALUES" se natisne nad poljem z rezultati in zaslon se počisti s kazalcem nazaj v začetni položaj.

if (p.y 60) {// prva vrstica kvadratov

če (p.x <60)

user_selection = 7;

drugače če (p.x <120)

user_selection = 8;

drugače če (p.x <180)

user_selection = 9;

else user_selection = 14;

} else if (p.y 125) {// druga vrstica kvadratov

če (p.x <60)

user_selection = 4;

drugače če (p.x <120)

user_selection = 5;

drugače če (p.x <180)

user_selection = 6;

else user_selection = 13;

} else if (p.y 190) {// tretja vrstica kvadratov

če (p.x <60)

user_selection = 1;

drugače če (p.x <120)

user_selection = 2;

drugače če (p.x <180)

user_selection = 3;

else user_selection = 12;

} else if (p.y> 255) {// četrta vrstica kvadratov

če (p.x <60)

user_selection = 15;

drugače če (p.x <120)

user_selection = 0;

drugače če (p.x <180)

user_selection = 10;

else user_selection = 11;

}

} drugo {

user_selection = 16; // user_selection je nastavljeno na 16 (nič spremenljivo)

}

}

To je del, ki določa, kateri gumb je bil izbran. Začenši z zgornjo vrstico kvadratov in konča z spodnjo vrstico, Arduino išče, kje je bil zaslon dejansko pritisnjen. Nato kvadratu dodeli številko in to številko shrani v user_selection. Številke 0-9 ustrezajo številčnim kvadratom, številke 11-15 ustrezajo kvadratom operandov in čistemu kvadratu, številka 10 pa kvadratu znakov enakega. Če ni izbran noben kvadrat, je uporabniški izbor nastavljen na 16, zaradi česar se bo zanka znova zagnala (glej funkcijo zanke).

7. korak: Uživajte v končanem projektu

Evo ga! Zdaj imate kalkulator na zaslonu na dotik, ki omogoča seštevanje, odštevanje, množenje in deljenje. Ta projekt se je spremenil tako, kot sem mislil, da kalkulator deluje. Ko sem delal na tem projektu, se spomnim, da sem svojemu inštruktorju v razredu rekel: "Nikoli več ne bom gledal na kalkulator na enak način!" Uporabniške funkcije, ki se vam zdijo enostavne, so nekoliko težke, ko za računalnikom poskušate posnemati vašo idejo. Upam, da vam je bil projekt všeč, in upam, da se je spremenilo tudi vaše razmišljanje o delovanju kalkulatorja!

Tukaj je celotna koda za vaše udobje. Polno je komentarjev, zato vam morajo v primeru težav pokazati, kaj počne vsaka vrstica.

Priporočena: