Përmbajtje:

Llogaritësi i ekranit me prekje Arduino: 7 hapa
Llogaritësi i ekranit me prekje Arduino: 7 hapa

Video: Llogaritësi i ekranit me prekje Arduino: 7 hapa

Video: Llogaritësi i ekranit me prekje Arduino: 7 hapa
Video: SKR Pro v1.2 - Basics 2024, Korrik
Anonim
Llogaritësi i ekranit me prekje Arduino
Llogaritësi i ekranit me prekje Arduino

Përshëndetje! Ky është një projekt për të bërë një kalkulator të ekranit me prekje duke përdorur një Arduino Uno dhe një mburojë LCD TFT. Kam dalë me konceptin për klasën time të programimit në shkollën shtëpiake, dhe përvoja në ndërtimin e këtij projekti ishte shumë interesante. Ky kalkulator mund të bëjë katër veprime të thjeshta matematikore (mbledhje, zbritje, shumëzim dhe pjesëtim). Gjithashtu shfaq deri në dy pikë dhjetore për përgjigjet e pjesëtimit që i kanë ato. Le të zhyten menjëherë! Furnizimet për këtë projekt janë të listuara më poshtë.

Furnizimet

- Arduino Uno

-2.4 TFT LCD Shield (ja ku e bleva:

- Kabllo USB A në B (kabllo për të lidhur Arduino me kompjuterin)

- Kompjuter me Arduino IDE të instaluar

- Ju gjithashtu do të duhet të shkarkoni dy biblioteka: MCUFRIEND_kbv dhe Touchscreen. E para mund ta gjeni në github (lidhja: https://github.com/prenticedavid/MCUFRIEND_kbv) ose mund të përdorni skedarin zip të bibliotekës që kam përfshirë më poshtë. E dyta është në menaxherin e Bibliotekës Arduino për instalim.

Hapi 1: Lidhjet e harduerit

Lidhjet e harduerit
Lidhjet e harduerit
Lidhjet e harduerit
Lidhjet e harduerit
Lidhjet e harduerit
Lidhjet e harduerit

Lidhja e mburojës së ekranit me prekje me Arduino Uno është e thjeshtë dhe e shpejtë. E tëra çfarë ju duhet të bëni është të vendosni kunjat më të ulët në mburojë me kunjat më të ulëta në Arduino dhe ta shtyni mburojën në kunjat. Kunja 5V e lartë dhe kunja pa etiketë në anën e energjisë nuk duhet të kenë kunja nga mburoja në to, me të njëjtat parametra që zbatohen për kunjat e etiketuar SCL dhe SDA në anën tjetër të tabelës. Tani, ne jemi gati për kodim!

Hapi 2: Kodi: Përkufizimet dhe Konfigurimi Global

#përfshi

MCUFRIEND_kbv tft; // sidoqoftë, për mburojat e OKB-së

#përfshi

#përcakto YP A3

#përcakto XM A2

#përcakto YM 9

#përcaktoni XP 8

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

#përcaktoni MINPRESIONIN 10

Ky është fillimi i kodit, ku përfshijmë bibliotekat (MCUFRIEND_kbv & Touchscreen), përcaktojmë kunjat X dhe Y, vendosim parametrat e ekranit me prekje dhe përcaktojmë presionin minimal të nevojshëm që Arduino të regjistrojë një shtyp të përdoruesit.

ID e int;

int user_selection;

noton ruajtur_numri = 0;

termi notues1;

int op_num;

rezultati notues;

int cursorLocX = 5;

int cursorLocY = 20;

Menjëherë para konfigurimit, ne duhet të krijojmë disa ndryshore globale. ID ndihmon në funksionimin e ekranit me prekje. user_selection mban një numër që korrespondon me çelësin që përdoruesi zgjedh kur shtyp ekranin me prekje. save_number është variabla që shtypim në ekran pas një hyrje të përdoruesit (më shumë për këtë në lak). Shtë një noton kështu që mund të mbajë numra dhjetorë, si dhe numra të plotë. term1 është ndryshorja në të cilën ruhet numri i parë i ekuacionit pasi është zgjedhur një operand. op_num ruan operandin si një numër (1 për mbledhjen, 2 për zbritjen, 3 për shumëzimin dhe 4 për pjesëtimin). rezultati është ndryshorja që shtypet në ekran pasi përdoruesi të ketë shtypur shenjën e barazimit. Alsoshtë gjithashtu një noton. cursorLocX dhe cursorLocY janë pikat e hartës në ekranin me prekje ku kursori është vendosur në shumë herë (ai ndodhet në shiritin gri në krye, i njohur ndryshe si fusha e rezultateve).

void setup () {

tft.reset ();

ID = tft.readID ();

tft.filloj (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

sheshe ();

numrat ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Funksioni ynë i konfigurimit së pari përmban inicimin për mburojën e ekranit me prekje (rreshtat 1-3). Orientimi i mburojës vendoset duke përdorur komandën tft.setRotation (), me 0 të jetë i drejtë. I gjithë ekrani është me ngjyrë gri të errët me komandën tft.fillScreen (), të cilën do ta shkruajmë në krye (përveç fushës së rezultateve). Funksionet e katrorëve () dhe numrave () vizatojnë katrorët e kalkulatorit, ngjyrosin katrorët bardh e zi në një model të tabelës së checker -it dhe shkruajnë numra/operandë në katrorë me ngjyrë blu. Ne do të shkojmë tek ata në hapin tjetër. Komanda tft.setTextSize () vendos madhësinë e tekstit të fushës së rezultateve në 3, e cila është një font mesatar. Komanda tft.setTextColor () vendos ngjyrën e tekstit të fushës së rezultateve në blu, e cila shkruhet mbi fushën gri të errët.

Hapi 3: Kodi: Lak

void loop () {numberSelect ();

vonesë (100);

nëse (përzgjedhja e përdoruesit == 16) {

;

} tjetër {

nëse (përzgjedhja e përdoruesit <10) {

numri_i ruajtur = numri i ruajtur * 10 + përzgjedhja e përdoruesit;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (numri_i ruajtur);

} tjetër nëse (përzgjedhja e përdoruesit> 10) {

kaloni (përzgjedhja e përdoruesit) {

rasti 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

term1 = numri_i ruajtur;

numri_i ruajtur = 0;

pushim;

rasti 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

term1 = numri_i ruajtur;

numri_i ruajtur = 0;

pushim;

rasti 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

term1 = numri_i ruajtur;

numri_i ruajtur = 0;

pushim;

rasti 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

term1 = numri_i ruajtur;

numri_i ruajtur = 0;

pushim;

rasti 15:

numri_i ruajtur = 0;

term1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

pushim;

}

tft.setCursor (cursorLocX, cursorLocY);

Kjo është shumë për tu përtypur, kështu që unë do të shpjegoj atë që është më lart. Fillojmë duke thirrur funksionin numberSelect (), i cili i cakton një numër secilit katror në ekranin me prekje. Kur një përdorues shtyp një nga ato sheshe, funksioni vendos ndryshoren e zgjedhjes së përdoruesit në numrin e katrorit. Deklarata e parë nëse do të kalojë përmes lakut vetëm nëse është bërë një përzgjedhje e vlefshme e përdoruesit. Nëse është, deklarata tjetër if pyet nëse user_selection ka një numër më të vogël se 10 të ruajtur në të (numrat 0-9). Nëse po, numri i ruajtur shumëzohet me 10 dhe numri në përzgjedhjen e përdoruesit i shtohet numrit të ruajtur, i cili shtypet në fushën e rezultateve në ekranin me prekje. Nëse jo, deklarata tjetër if pyet nëse user_selection ka një numër më të madh se 10 të ruajtur në të (numrat e operandit: 11 për +, 12 për -, 13 për X, 14 për /, dhe 15 për katrorin e ekranit të qartë) Një funksion ndërprerës kujdeset për secilin rast (i përcaktuar nga përzgjedhja e përdoruesit). Ndryshores op_num i jepet një numër që i përgjigjet operandit të zgjedhur (1 për +, 2 për -, 3 për X, dhe 4 për /). Vlera në numrin e ruajtur ruhet në termin e ndryshueshëm1 në mënyrë që ndryshorja e ruajtur të numrit të përdoret për gjysmën e dytë të ekuacionit. Simboli i operandit shtypet në ekran së bashku me pastrimin e çdo numri në fushën e rezultateve. Përjashtimi i vetëm është katrori i qartë i ekranit, i cili rivendos të gjitha variablat e llogaritjes dhe pastron fushën e rezultateve nga çdo gjë në të.

} tjetër {

kaloni (op_num) {

rasti 1:

rezultat = term1 + numër i ruajtur;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dyshe (rezultati));

pushim;

rasti 2:

rezultat = term1 - ruajtur_numri;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dyfish (rezultat));

pushim;

rasti 3:

rezultat = term1 * ruajtur_numer;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dyfish (rezultat));

pushim;

rasti 4:

rezultati = noton (term1) / noton (numri_i ruajtur);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (rezultati);

pushim;

}

tft.setCursor (cursorLocX, cursorLocY);

ruajtur_numri = rezultati;

term1 = 0;

op_num = 0;

vonesa (1000);

}

}

}

Pjesa e fundit e lakut merret me ngjarjen e përdoruesit që zgjedh shenjën e barabartë (përzgjedhja e përdoruesit == 10). Një funksion tjetër ndërprerës punon përmes katër funksioneve matematikore (të përcaktuara nga op_num). Rasti shtesë (rasti 1) shton termin1 dhe numrin e ruajtur së bashku dhe e ruan numrin në ndryshoren e rezultatit. Rezultati shtypet në fushën e rezultateve si dyshe. Rasti i zbritjes (rasti 2) zbret numrin e ruajtur nga termi1 dhe e ruan numrin në ndryshoren e rezultatit. Rezultati shtypet në fushën e rezultateve si dyshe. Rasti i shumëzimit (rasti 3) shumëzon termin1 me numrin e ruajtur dhe ruan numrin në ndryshoren e rezultatit. Rezultati shtypet në fushën e rezultateve si dyshe. Rasti i ndarjes (rasti 4) ndan termin1 me numrin e ruajtur së bashku dhe ruan numrin në ndryshoren e rezultatit. Rezultati shtypet në fushën e rezultateve si notë (sepse përgjigjet e pjesëtimit mund të jenë numra dhjetorë). Pas rastit të shtypjes në ekran të një numri, operandi ose rezultati, kursori rivendoset, numri i ruajtur vendoset në rezultatin e mëparshëm dhe termi 1 & op_num janë rivendosur.

Disa shënime: përdoruesi nuk mund të fusë numra dhjetorë në kalkulator për shkak të mungesës së një katrori të pikës dhjetore. Gjithashtu, përdoruesi mund të bëjë vetëm një ekuacion në të njëjtën kohë. Ju nuk mund të llogaritni një rezultat dhe më pas të shtoni/zbritni/shumëzoni/ndani atë rezultat. Në funksionin numberSelect (), ekziston një funksion që pastron ekranin pasi të jetë printuar një rezultat nëse një përdorues ka shtypur një katror tjetër.

Hapi 4: Kodi: Funksioni i shesheve

katrorë të pavlefshëm () {

// Katrorët bardh e zi alternohen në secilën rresht dhe rreshtat e parë dhe të tretë kanë një model të kundërt se rreshtat e dytë dhe të katërt

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // fillon rreshti i parë i katrorëve, i zi në të bardhë tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // rreshti i parë i shesheve përfundon

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // fillon rreshti i dytë i shesheve, i bardhë në të zi tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // rreshti i dytë i shesheve përfundon

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // fillon rreshti i tretë i shesheve, i zi në të bardhë tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // rreshti i tretë i shesheve përfundon

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // rreshti i katërt i shesheve fillon, e bardhë në të zezë tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // rreshti i katërt i shesheve përfundon

}

Funksioni i shesheve () është mjaft i drejtpërdrejtë. Komanda tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) tërheq një drejtkëndësh sipas parametrave që i kalohen atij, të cilat janë pozicionet e para të x dhe y, pozicionet e dyta të x dhe y dhe ngjyrën me të cilën është mbushur drejtkëndëshi Me Ky funksion tërheq të katër rreshtat e katrorëve (teknikisht drejtkëndëshat) dhe mbush secilin katror me ngjyrën që i është kaluar.

Hapi 5: Kodi: Funksioni i Numrave

numrat e pavlefshëm () {

tft.setTextColor (TFT_BLUE); // vendos numrin/ngjyrën e karakterit në blu

tft.setTextSize (5); // vendos numrin/madhësinë e karakterit në 5

tft.setCursor (18, 75); // vendos kursorin për rreshtin e parë të numrave/karaktereve

tft.print ("7 8 9 /"); // printon rreshtin e parë të numrave/karaktereve

tft.setCursor (18, 140); // vendos kursorin për rreshtin e dytë të numrave/karaktereve

tft.print ("4 5 6 X"); // printon rreshtin e dytë të numrave/karaktereve

tft.setCursor (18, 205); // vendos kursorin për rreshtin e tretë të numrave/karaktereve

tft.print ("1 2 3 -"); // printon rreshtin e tretë të numrave/karaktereve

tft.setCursor (18, 270); // vendos kursorin për rreshtin e katërt të numrave/karaktereve

tft.print ("C 0 = +"); // printon rreshtin e katërt të numrave/karaktereve

}

Funksioni i numrave () është gjithashtu i drejtpërdrejtë. Dy rreshtat e parë e vendosin madhësinë e tekstit më të madh dhe ngjyrën në blu. Komanda tft.setCursor () e vendos kursorin në pozicionin në çdo rresht nga fillon shkrimi i numrave. Pastaj komanda tft.print () printon numrat/karakteret mbi katrorët.

Hapi 6: Kodi: NumberSelect Funksioni

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

nëse (p.z> MINPRESSURE) {

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

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

nëse (rezultati! = 0) {

rezultati = 0;

numri_i ruajtur = 0;

tft.print ("VLERAT E PASTRA");

vonesë (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Për të filluar funksionin numberSelect (), ne kërkojmë hyrje të përdoruesit nga ekrani me prekje me komandën ts.getPoint (). Pasi të jenë mbledhur ato të dhëna, ne kontrollojmë nëse presioni minimal është tejkaluar (ose, me fjalë të tjera, nëse përdoruesi ka shtypur diku në ekranin me prekje). Nëse është, koordinatat x dhe y janë të hartuara nga koordinatat karteziane në koordinatat specifike të ekranit me prekje. (0, 0) është këndi i sipërm i majtë i ekranit me prekje, me boshtin x që kalon përtej dhe boshtin y zbret poshtë. Pjesa tjetër kontrollon për të parë nëse ka një numër të ruajtur në rezultat. Nëse ka, rezultati dhe numri i ruajtur rivendosen në 0. Mesazhi "VLERAT E FLETA" printohet në fushën e rezultateve dhe ekrani pastrohet me kursorin në pozicionin e tij fillestar.

nëse (f.y 60) {// rreshti i parë i katrorëve

nëse (p.x <60)

përzgjedhja e përdoruesit = 7;

ndryshe nëse (p.x <120)

përzgjedhja e përdoruesit = 8;

ndryshe nëse (p.x <180)

përzgjedhja e përdoruesit = 9;

tjetër_zgjedhja e përdoruesit = 14;

} tjetër nëse (p.y 125) {// rreshti i dytë i shesheve

nëse (p.x <60)

përzgjedhja e përdoruesit = 4;

ndryshe nëse (p.x <120)

përzgjedhja e përdoruesit = 5;

ndryshe nëse (p.x <180)

përzgjedhja e përdoruesit = 6;

tjetër përzgjedhja e përdoruesit = 13;

} tjetër nëse (p.y 190) {// rreshti i tretë i shesheve

nëse (p.x <60)

përzgjedhja e përdoruesit = 1;

ndryshe nëse (p.x <120)

përzgjedhja e përdoruesit = 2;

ndryshe nëse (p.x <180)

përzgjedhja e përdoruesit = 3;

tjetër përzgjedhja e përdoruesit = 12;

} tjetër nëse (p.y> 255) {// rreshti i katërt i shesheve

nëse (p.x <60)

përzgjedhja e përdoruesit = 15;

ndryshe nëse (p.x <120)

përzgjedhja e përdoruesit = 0;

ndryshe nëse (p.x <180)

përzgjedhja e përdoruesit = 10;

tjetër_zgjedhja e përdoruesit = 11;

}

} tjetër {

përzgjedhja e përdoruesit = 16; // përzgjedhja e përdoruesit është vendosur në 16 (asgjë e ndryshueshme)

}

}

Kjo është pjesa që përcakton se cili buton është zgjedhur. Duke filluar me rreshtin e parë të shesheve dhe duke përfunduar me rreshtin e poshtëm, Arduino kërkon vendin ku është shtypur në të vërtetë ekrani. Pastaj i cakton katrorit një numër dhe e ruan atë numër në zgjedhjen e përdoruesit. Numrat 0-9 korrespondojnë me katrorët e numrave, numrat 11-15 korrespondojnë me katrorët e operandit dhe katrorin e qartë, dhe numri 10 korrespondon me sheshin e shenjave të barabarta. Nëse asnjë katror nuk është zgjedhur, atëherë user_selection është vendosur në 16, gjë që do të bëjë që laku të fillojë përsëri (shiko funksionin e lakut).

Hapi 7: Shijoni projektin tuaj të përfunduar

Aty e keni! Tani keni një kalkulator të ekranit me prekje që mund të bëjë mbledhje, zbritje, shumëzim dhe pjesëtim. Ky projekt ndryshoi krejt mënyrën se si mendova se një kalkulator funksiononte. Ndërsa po punoja në këtë projekt, mbaj mend që i thashë instruktorit tim në klasë, "Unë kurrë nuk do ta shikoj llogaritësin në të njëjtën mënyrë përsëri!" Funksionet që ju si përdorues mendoni se janë të lehta janë disi të vështira kur jeni prapa kompjuterit duke u përpjekur të imitoni idenë tuaj. Shpresoj që ju ka pëlqyer projekti, dhe shpresoj që mendimi juaj se si funksionon një kalkulator ka ndryshuar gjithashtu!

Këtu keni të gjithë kodin për lehtësinë tuaj. Shtë e mbushur me komente kështu që nëse keni ndonjë problem ata duhet t'ju tregojnë se çfarë bën çdo rresht.

Recommended: