Sisukord:

Arduino puuteekraaniga kalkulaator: 7 sammu
Arduino puuteekraaniga kalkulaator: 7 sammu

Video: Arduino puuteekraaniga kalkulaator: 7 sammu

Video: Arduino puuteekraaniga kalkulaator: 7 sammu
Video: Marlin Firmware 2.0.x Explained 2024, November
Anonim
Arduino puuteekraaniga kalkulaator
Arduino puuteekraaniga kalkulaator

Tere! See on projekt puuteekraaniga kalkulaatori valmistamiseks, kasutades Arduino Uno ja TFT LCD -ekraani. Mõtlesin välja oma koduõppe programmeerimistunni kontseptsiooni ja selle projekti loomise kogemus oli väga huvitav. See kalkulaator saab teha nelja lihtsat matemaatilist toimingut (liitmine, lahutamine, korrutamine ja jagamine). See kuvab ka kuni kaks kohta pärast koma nende jagamisvastuste jaoks. Sukeldume kohe sisse! Selle projekti tarned on loetletud allpool.

Tarvikud

- Arduino Uno

-2.4 TFT LCD-kilp (siit ma selle ostsin:

- USB A kuni B kaabel (juhe Arduino ühendamiseks arvutiga)

- Arvuti, kuhu on installitud Arduino IDE

- Peate alla laadima ka kaks raamatukogu: MCUFRIEND_kbv ja puuteekraani. Esimese leiate githubist (link: https://github.com/prenticedavid/MCUFRIEND_kbv) või saate kasutada allpool toodud raamatukogu zip -faili. Teine on installimiseks Arduino raamatukogu halduris.

Samm: riistvaraühendused

Riistvaraühendused
Riistvaraühendused
Riistvaraühendused
Riistvaraühendused
Riistvaraühendused
Riistvaraühendused

Puutetundliku ekraani ühendamine Arduino Unoga on lihtne ja kiire. Kõik, mida pead tegema, on joondada kilbi madalaimad tihvtid Arduino madalaimate tihvtidega ja suruda kilp tihvtidesse. Ülemisel 5 V tihvtil ja toite poolel oleval märgistamata tihvtil ei tohiks olla kilbist tihvte, samad parameetrid kehtivad ka plaadi teisel küljel olevate tihvtide SCL ja SDA kohta. Nüüd oleme valmis kodeerima!

2. samm: kood: üldised määratlused ja seadistamine

#kaasake

MCUFRIEND_kbv tft; // kõvasti ühendatud UNO kilpide jaoks

#kaasake

#määratle YP A3

#defineeri XM A2

#määratle YM 9

#define XP 8

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

#defineeri MINPRESSURE 10

See on koodi algus, kus me kaasame teegid (MCUFRIEND_kbv ja puuteekraan), määratleme X- ja Y -tihvtid, seadistame puuteekraani parameetrid ja määratleme minimaalse rõhu, mida Arduino vajab kasutaja pressi registreerimiseks.

int ID;

int kasutaja_valik;

ujuk salvestatud_arv = 0;

float term1;

int op_num;

ujuk tulemus;

int cursorLocX = 5;

int cursorLocY = 20;

Vahetult enne seadistamist peame seadistama mõned globaalsed muutujad. ID aitab puuteekraani tööle panna. user_selection hoiab numbrit, mis vastab klahvile, mille kasutaja puuteekraanile vajutades valib. salvestatud_arv on muutuja, mille prindime ekraanile pärast kasutaja sisestamist (sellest lähemalt tsüklis). See on ujuk, nii et see mahutab nii kümnendnumbreid kui ka täisarvu. Termin1 on muutuja, millesse võrrandi esimene number salvestatakse pärast operandi valimist. op_num salvestab operandi numbrina (1 liitmiseks, 2 lahutamiseks, 3 korrutamiseks ja 4 jagamiseks). tulemus on muutuja, mis prinditakse ekraanile pärast võrdusmärgi vajutamist. See on ka ujuk. cursorLocX ja cursorLocY on puuteekraani kaardistamispunktid, kus kursor on seatud mitu korda (see asub ülaosas hallil ribal, mida nimetatakse ka tulemuste väljaks).

tühine seadistus () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

ruudud ();

numbrid ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Meie seadistusfunktsioon sisaldab esmalt puuteekraani kaitsekihi lähtestamist (read 1-3). Kilbi orientatsioon määratakse käsuga tft.setRotation (), kusjuures 0 on püsti. Kogu ekraan on värvitud tumehalliks käsuga tft.fillScreen (), mille kirjutame üleval (välja arvatud tulemuste väli). Funktsioonid ruudud () ja numbrid () joonistavad kalkulaatori ruudud, värvivad ruudud mustaks ja valgeks malelaua mustriga ning kirjutavad ruududele sinisega numbrid/operandid. Nende juurde jõuame järgmises etapis. Käsk tft.setTextSize () määrab tulemuste välja teksti suuruseks 3, mis on keskmine font. Käsk tft.setTextColor () määrab tulemuste välja tekstivärvi siniseks, mis on kirjutatud üle tumehalli välja.

3. samm: kood: silmus

void loop () {numberSelect ();

viivitus (100);

kui (kasutaja_valik == 16) {

;

} muud {

if (kasutaja_valik <10) {

salvestatud_arv = salvestatud_number * 10 + kasutaja_valik;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (salvestatud_arv);

} muu, kui (kasutaja_valik> 10) {

lüliti (kasutaja_valik) {

juhtum 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

termin1 = salvestatud_arv;

salvestatud_arv = 0;

murda;

juhtum 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

termin1 = salvestatud_arv;

salvestatud_arv = 0;

murda;

juhtum 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

termin1 = salvestatud_arv;

salvestatud_arv = 0;

murda;

juhtum 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

termin1 = salvestatud_arv;

salvestatud_arv = 0;

murda;

juhtum 15:

salvestatud_arv = 0;

termin1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

murda;

}

tft.setCursor (cursorLocX, cursorLocY);

Seda on palju närida, nii et selgitan ülaltoodut. Alustuseks helistame funktsioonile numberSelect (), mis määrab puuteekraanil igale ruudule numbri. Kui kasutaja vajutab ühte neist ruutudest, määrab funktsioon user_selection muutuja ruudu arvuks. Esimene if -avaldus peab silmusest läbi jooksma ainult siis, kui on tehtud kehtiv kasutajavalik. Kui see on nii, siis järgmine lause küsib, kas kasutaja_valik on salvestanud numbri alla 10 (numbrid 0–9). Kui see nii on, korrutatakse salvestatud_arv 10 -ga ja kasutaja_valiku number lisatakse salvestatud numbrile, mis trükitakse puuteekraani tulemuste väljale. Kui ei, siis järgmine lause küsib, kas user_selectioni on salvestatud arv, mis on suurem kui 10 (operandi numbrid: 11 +, 12 -, 13 X, 14 jaoks /ja 15 selge ekraani ruudu jaoks). Lülitusfunktsioon hoolitseb iga juhtumi eest (määrab kasutaja_valik). Muutujale op_num antakse number, mis vastab valitud operandile (1 +, 2 -, 3 X ja 4 /). Väärtus salvestatud_number salvestatakse muutuja terminisse 1, nii et muutujat salvestatud_number saab kasutada võrrandi teises pooles. Operandi sümbol trükitakse ekraanile koos tulemuste väljal olevate numbrite kustutamisega. Ainus erand on selge ekraani ruut, mis lähtestab kõik arvutusmuutujad ja puhastab tulemuste välja sellelt.

} muud {

lüliti (op_num) {

juhtum 1:

tulemus = termin1 + salvestatud_arv;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (topelt (tulemus));

murda;

juhtum 2:

tulemus = termin1 - salvestatud_arv;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (topelt (tulemus));

murda;

juhtum 3:

tulemus = termin1 * salvestatud_arv;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (topelt (tulemus));

murda;

juhtum 4:

tulemus = float (termin1) / float (salvestatud_arv);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (tulemus);

murda;

}

tft.setCursor (cursorLocX, cursorLocY);

salvestatud_arv = tulemus;

termin1 = 0;

op_num = 0;

viivitus (1000);

}

}

}

Tsükli viimane osa käsitleb sündmust, kus kasutaja valib võrdusmärgi (kasutaja_valik == 10). Teine lülitusfunktsioon töötab läbi nelja matemaatilise funktsiooni (määratud op_num abil). Lisamisjuhtum (juhtum 1) liidab termini1 ja salvestatud_arvu kokku ning salvestab arvu tulemusmuutjasse. Tulemus trükitakse tulemuste väljale kahekordselt. Lahutamisjuhtum (juhtum 2) lahutab terminist1 salvestatud_arvu ja salvestab arvu tulemusmuutjasse. Tulemus trükitakse tulemuste väljale kahekordselt. Korrutamisjuhtum (juhtum 3) korrutab termini 1 arvuga salvestatud_arv ja salvestab arvu tulemusmuutjasse. Tulemus trükitakse tulemuste väljale kahekordselt. Jagamisjuhtum (juhtum 4) jagab termini 1 kokku salvestatud_arvuga ja salvestab arvu tulemusmuutjasse. Tulemus trükitakse tulemuste väljale ujukina (sest jaotusvastused võivad olla kümnendarvud). Pärast seda, kui ekraanile on trükitud kas number, operand või tulemus, lähtestatakse kursor, salvestatud_number määratakse eelmisele tulemile ning termin1 ja op_nummer lähtestatakse.

Mõned märkused: kasutaja ei saa kümnendnumbreid arvutisse sisestada, kuna puudub kümnendkoha ruut. Samuti saab kasutaja teha ainult ühe võrrandi korraga. Te ei saa tulemust arvutada ja seejärel selle tulemuse liita/lahutada/korrutada/jagada. Funktsioonis numberSelect () on funktsioon, mis puhastab ekraani pärast tulemuse printimist, kui kasutaja on vajutanud mõnda muud ruutu.

Samm: kood: ruutude funktsioon

tühjad ruudud () {

// mustad ja valged ruudud vahelduvad igal real ning esimesel ja kolmandal real on muster vastupidine kui teisel ja neljandal real

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // algab esimene ruutude rida, mustast valgeni tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // esimene ruutude rida lõpeb

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // algab teine ruutude rida, valge kuni must tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // teine ruutude rida lõpeb

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // algab kolmas ruutude rida, must kuni valge tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // kolmanda rea ruudud lõpevad

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // neljas ruutude rida algab, valge kuni must tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // neljas ruutude rida lõpeb

}

Funktsioon ruudud () on üsna lihtne. Käsk tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) joonistab ristküliku vastavalt talle edastatud parameetritele, milleks on x ja y esimesed positsioonid, x ja y teised positsioonid ning värv, millega ristkülik on täidetud. See funktsioon joonistab kõik neli ruutude rida (tehniliselt ristkülikud) ja täidab iga ruudu sellele edastatud värviga.

Samm: funktsioon: kood: numbrid

tühjad numbrid () {

tft.setTextColor (TFT_BLUE); // määrab numbri/märgi värvi siniseks

tft.setTextSize (5); // määrab numbri/märgi suuruseks 5

tft.setCursor (18, 75); // määrab kursori numbrite/märkide esimesele reale

tft.print ("7 8 9 /"); // prindib numbrite/märkide esimese rea

tft.setCursor (18, 140); // määrab kursori numbrite/märkide teise rea jaoks

tft.print ("4 5 6 X"); // prindib numbrite/märkide teise rea

tft.setCursor (18, 205); // määrab kursori numbrite/märkide kolmandale reale

tft.print ("1 2 3 -"); // prindib numbrite/märkide kolmanda rea

tft.setCursor (18, 270); // määrab kursori numbrite/märkide neljandale reale

tft.print ("C 0 = +"); // prindib numbrite/märkide neljanda rea

}

Funktsioon numbrid () on samuti lihtne. Esimesed kaks rida määravad teksti suuruse ja värvi siniseks. Käsk tft.setCursor () seab kursori igale reale, kust algab numbrite kirjutamine. Seejärel trükib tft.print () käsk ruutudele numbrid/märgid.

6. samm: kood: numbervaliku funktsioon

tühine numberValige () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

kui (lk.> MINPRESSURE) {

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

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

kui (tulemus! = 0) {

tulemus = 0;

salvestatud_arv = 0;

tft.print ("SELGED VÄÄRTUSED");

viivitus (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Funktsiooni numberSelect () alustamiseks palume kasutajal sisestada puuteekraanilt käsuga ts.getPoint (). Kui need andmed on kogutud, kontrollime, kas minimaalne rõhk on ületatud (või teisisõnu, kas kasutaja on kuskil puuteekraanil vajutanud). Kui see on nii, kaardistatakse x- ja y-koordinaadid Descartes'i koordinaatidest puutetundliku ekraani spetsiifilisteks koordinaatideks. (0, 0) on puuteekraani vasak ülemine nurk, kus x -telg läheb risti ja y -telg allapoole. Järgmine osa kontrollib, kas tulemusesse on salvestatud number. Kui see on olemas, lähtestatakse tulemus ja salvestatud_arv väärtuseks 0. Tulemuste väljale trükitakse teade "CLEAR VALUES" ja ekraan tühjendatakse kursoriga tagasi algasendisse.

if (lk 60) {// esimene ruutude rida

kui (px <60)

kasutaja_valik = 7;

muidu kui (px <120)

kasutaja_valik = 8;

muidu kui (px <180)

kasutaja_valik = 9;

else user_selection = 14;

} else if (lk 125) {// teine ruutude rida

kui (px <60)

kasutaja_valik = 4;

muidu kui (px <120)

kasutaja_valik = 5;

muidu kui (px <180)

kasutaja_valik = 6;

else user_selection = 13;

} else if (lk 190) {// kolmas ruutude rida

kui (px <60)

kasutaja_valik = 1;

muidu kui (px <120)

kasutaja_valik = 2;

muidu kui (px <180)

kasutaja_valik = 3;

else user_selection = 12;

} else if (p.y> 255) {// neljas ruutude rida

kui (px <60)

kasutaja_valik = 15;

muidu kui (px <120)

kasutaja_valik = 0;

muidu kui (px <180)

kasutaja_valik = 10;

else user_selection = 11;

}

} muud {

kasutaja_valik = 16; // user_selection on seatud väärtusele 16 (pole midagi muutuvat)

}

}

See on osa, mis määrab, milline nupp on valitud. Alustades ruutude ülemisest reast ja lõpetades alumise reaga, otsib Arduino, kus ekraanile tegelikult vajutati. Seejärel määrab see ruudule numbri ja salvestab selle numbri valikusse user_selection. Numbrid 0-9 vastavad numbriväljadele, numbrid 11-15 operandiväljadele ja selgele ruudule ning number 10 võrdusmärgi ruudule. Kui ruutu pole valitud, on kasutaja_valik seatud väärtusele 16, mis paneb tsükli uuesti otsast peale (vt silmusefunktsioon).

Samm: nautige oma lõpetatud projekti

Siin see on! Nüüd on teil puuteekraaniga kalkulaator, millega saab liita, lahutada, korrutada ja jagada. See projekt muutis kogu viisi, kuidas ma arvasin, et kalkulaator töötab. Selle projekti kallal töötades mäletan, et ütlesin tunnis oma juhendajale: "Ma ei vaata enam kunagi kalkulaatorit samamoodi!" Teie kui kasutaja arvates lihtsad funktsioonid on mõnevõrra keerulised, kui olete arvuti taga, püüdes oma ideed jäljendada. Loodan, et teile projekt meeldis ja loodan, et teie mõtteviisi kalkulaatori töö kohta on muudetud!

Siin on teie mugavuse huvides kogu kood. See on täis kommentaare, nii et kui teil on probleeme, peaksid nad näitama, mida iga rida teeb.

Soovitan: