Orodha ya maudhui:

Kikokotoo cha skrini ya kugusa Arduino: Hatua 7
Kikokotoo cha skrini ya kugusa Arduino: Hatua 7

Video: Kikokotoo cha skrini ya kugusa Arduino: Hatua 7

Video: Kikokotoo cha skrini ya kugusa Arduino: Hatua 7
Video: Использование Melexis MLX90614 Инфракрасный термометр с Arduino 2024, Julai
Anonim
Kikokotoo cha skrini ya kugusa Arduino
Kikokotoo cha skrini ya kugusa Arduino

Halo! Huu ni mradi wa kutengeneza kikokotoo cha skrini ya kugusa kwa kutumia Arduino Uno na ngao ya LCD ya TFT. Nilikuja na dhana ya darasa langu la programu ya shule ya nyumbani, na uzoefu wa kujenga mradi huu ulikuwa wa kupendeza sana. Kikokotoo hiki kinaweza kufanya shughuli nne rahisi za hisabati (kuongeza, kutoa, kuzidisha, na kugawanya). Pia inaonyesha hadi alama mbili za decimal kwa majibu ya mgawanyiko ambayo yanao. Wacha tuingie moja kwa moja! Vifaa vya mradi huu vimeorodheshwa hapa chini.

Vifaa

- Arduino Uno

- 2.4 TFT LCD Shield (hapa ndipo nilinunua:

- USB A hadi B cable (kamba kuunganisha Arduino kwenye kompyuta)

- Kompyuta iliyo na Arduino IDE imewekwa

- Utahitaji pia kupakua maktaba mbili: MCUFRIEND_kbv na Skrini ya Kugusa. Ya kwanza unaweza kupata kwenye github (kiungo: https://github.com/prenticedavid/MCUFRIEND_kbv) au unaweza kutumia faili ya zip ya maktaba ambayo nimejumuisha hapo chini. Ya pili iko katika msimamizi wa Maktaba ya Arduino kwa usanikishaji.

Hatua ya 1: Muunganisho wa vifaa

Uunganisho wa vifaa
Uunganisho wa vifaa
Uunganisho wa vifaa
Uunganisho wa vifaa
Uunganisho wa vifaa
Uunganisho wa vifaa

Uunganisho wa ngao ya skrini ya kugusa kwa Arduino Uno ni rahisi na ya haraka. Unachohitajika kufanya ni kujipanga pini za chini kabisa kwenye ngao na pini za chini kabisa kwenye Arduino na kushinikiza ngao ndani ya pini. Pini ya juu ya 5V na pini isiyo na lebo upande wa umeme haipaswi kuwa na pini kutoka kwa ngao ndani yake, na vigezo sawa vinavyotumika kwa pini zilizoandikwa SCL na SDA upande wa pili wa bodi. Sasa, tuko tayari kuweka nambari!

Hatua ya 2: Kanuni: Ufafanuzi wa Ulimwenguni na Usanidi

# pamoja

MCFRIEND_kbv tft; // waya ngumu kwa ngao za UNO hata hivyo

# pamoja

#fafanua YP A3

#fafanua XM A2

#fafanua YM 9

#fafanua XP 8

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

#fafanua UHUSIANO 10

Huu ni mwanzo wa nambari, ambapo tunajumuisha maktaba (MCUFRIEND_kbv & Skrini ya kugusa), fafanua pini za X na Y, weka vigezo vya skrini ya kugusa, na ufafanue shinikizo la chini linalohitajika kwa Arduino kusajili vyombo vya habari vya mtumiaji.

kitambulisho;

uteuzi wa mtumiaji;

kuelea idadi ya kuhifadhiwa = 0;

kuelea term1;

int op_num;

matokeo ya kuelea;

mshaleLocX = 5;

mshaleLocY = 20;

Hapo kabla ya usanidi, tunahitaji kuanzisha anuwai kadhaa za ulimwengu. Kitambulisho husaidia kupata skrini ya kugusa na kuendesha. user_selection inashikilia nambari inayolingana na ufunguo ambao mtumiaji huchagua wakati wa kubofya skrini ya kugusa. idadi iliyohifadhiwa ni ubadilishaji ambao tunachapisha kwenye skrini baada ya kuingia kwa mtumiaji (zaidi juu ya hii kwenye kitanzi). Ni kuelea kwa hivyo inaweza kushikilia nambari za decimal pamoja na nambari. term1 ni tofauti ambayo nambari ya kwanza ya equation imehifadhiwa baada ya operesheni iliyochaguliwa. op_num inaokoa operesheni kama nambari (1 kwa kuongeza, 2 kwa kutoa, 3 kwa kuzidisha, na 4 kwa mgawanyiko). matokeo ni tofauti ambayo imechapishwa kwenye skrini baada ya mtumiaji kubonyeza ishara sawa. Pia ni kuelea. cursorLocX na cursorLocY ni sehemu za ramani kwenye skrini ya kugusa ambapo mshale umewekwa mara kadhaa (iko kwenye baa ya kijivu hapo juu, ikijulikana kama uwanja wa matokeo).

usanidi batili () {

tft.setet ();

ID = tft.readID ();

tft kuanza (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

mraba ();

namba ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Kazi yetu ya kuanzisha kwanza ina uanzishaji wa ngao ya skrini ya kugusa (mistari 1-3). Mwelekeo wa ngao umewekwa kwa kutumia tft.setRotation () amri, na 0 kuwa wima. Skrini nzima ina rangi ya kijivu nyeusi na amri ya tft.fillScreen (), ambayo tutaandika juu ya (isipokuwa uwanja wa matokeo). Miraba () na namba () kazi huvuta mraba wa kikokotoo, rangi viwanja vyeusi na vyeupe katika muundo wa ubao wa kukagua, na andika nambari / operesheni kwenye viwanja vya bluu. Tutafika kwa wale walio katika hatua inayofuata. Amri ya tft.setTextSize () inaweka saizi ya maandishi ya uwanja wa matokeo kuwa 3, ambayo ni font ya kati. Amri ya tft.setTextColor () inaweka rangi ya maandishi ya uwanja wa matokeo kuwa bluu, ambayo imeandikwa juu ya uwanja mweusi wa kijivu.

Hatua ya 3: Kanuni: Kitanzi

kitanzi batili () {namba Chagua ();

kuchelewesha (100);

ikiwa (user_selection == 16) {

;

} mwingine {

ikiwa (uteuzi_wa mtumiaji <10) {

nambari iliyohifadhiwa = nambari iliyohifadhiwa * 10 + uteuzi_wa mtumiaji;

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print (nambari iliyohifadhiwa);

} vingine ikiwa (chaguzi_ya mtumiaji> 10) {

badilisha (user_selection) {

kesi ya 11:

op_num = 1;

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print ("+");

neno1 = nambari iliyohifadhiwa;

nambari iliyohifadhiwa = 0;

kuvunja;

kesi ya 12:

op_num = 2;

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print ("-");

neno1 = nambari iliyohifadhiwa;

nambari iliyohifadhiwa = 0;

kuvunja;

kesi 13:

op_num = 3;

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print ("X");

neno1 = nambari iliyohifadhiwa;

nambari iliyohifadhiwa = 0;

kuvunja;

kesi ya 14:

op_num = 4;

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print ("/");

neno1 = nambari iliyohifadhiwa;

nambari iliyohifadhiwa = 0;

kuvunja;

kesi 15:

nambari iliyohifadhiwa = 0;

mrefu1 = 0;

op_num = 0;

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print ("");

kuvunja;

}

tft.setCursor (mshaleLocX, mshaleLocY);

Hii ni mengi ya kutafuna, kwa hivyo nitaelezea yaliyo hapo juu. Tunaanza kwa kupiga simu ya kuchaguaSelect (), ambayo inapeana nambari kwa kila mraba kwenye skrini ya kugusa. Mtumiaji anapobonyeza moja ya mraba huo, kazi huweka ubadilishaji wa user_selection kwa idadi ya mraba. Kauli ya kwanza ikiwa ni kukimbia tu kitanzi ikiwa uteuzi halali wa mtumiaji umefanywa. Ikiwa ni, taarifa ifuatayo ikiwa inauliza ikiwa chaguo la mtumiaji lina nambari chini ya 10 iliyohifadhiwa ndani yake (nambari 0-9). Ikiwa inafanya hivyo, nambari ya kuokoa imeongezwa kwa 10 na nambari katika chaguo la mtumiaji imeongezwa kwenye nambari iliyohifadhiwa, ambayo imechapishwa kwenye uwanja wa matokeo kwenye skrini ya kugusa. Ikiwa haifanyi hivyo, taarifa ifuatayo ikiwa inauliza ikiwa chaguo la mtumiaji lina nambari kubwa kuliko 10 iliyohifadhiwa ndani yake (nambari za operesheni: 11 kwa +, 12 kwa -, 13 kwa X, 14 kwa /, na 15 kwa mraba wazi wa skrini). Kazi ya kubadili inachukua kila kesi (imedhamiriwa na user_selection). Op_num inayobadilishwa inapewa nambari inayolingana na operesheni iliyochaguliwa (1 kwa +, 2 kwa -, 3 kwa X, na 4 kwa /). Thamani ya nambari iliyohifadhiwa imehifadhiwa katika neno1 linalobadilika ili kutofautisha_nambari inaweza kuhifadhiwa kwa nusu ya pili ya mlingano. Alama ya operesheni imechapishwa kwenye skrini pamoja na kusafisha nambari yoyote kwenye uwanja wa matokeo. Isipokuwa tu ni mraba wazi wa skrini, ambayo huweka upya vigeuzi vyote vya hesabu na inafuta uwanja wa matokeo wa kitu chochote juu yake.

} mwingine {

badilisha (op_num) {

kesi 1:

matokeo = nambari1 + nambari iliyohifadhiwa;

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print (mara mbili (matokeo));

kuvunja;

kesi 2:

matokeo = term1 - nambari iliyohifadhiwa;

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print (mara mbili (matokeo));

kuvunja;

kesi ya 3:

matokeo = nambari1 * nambari iliyohifadhiwa;

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print (mara mbili (matokeo));

kuvunja;

kesi ya 4:

matokeo = kuelea (muda1) / kuelea (nambari iliyohifadhiwa);

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print (matokeo);

kuvunja;

}

tft.setCursor (mshaleLocX, mshaleLocY);

idadi iliyohifadhiwa = matokeo;

mrefu1 = 0;

op_num = 0;

kuchelewesha (1000);

}

}

}

Sehemu ya mwisho ya kitanzi inahusika na tukio la mtumiaji kuchagua ishara sawa (user_selection == 10). Kazi nyingine ya kubadili inafanya kazi kupitia kazi nne za hisabati (zilizoamuliwa na op_num). Kesi ya nyongeza (kesi 1) inaongeza neno1 na kuokoa_namba pamoja na inaokoa nambari katika utofauti wa matokeo. Matokeo yamechapishwa kwenye uwanja wa matokeo kama maradufu. Kesi ya kutoa (kesi ya 2) huondoa idadi iliyohifadhiwa kutoka nambari1 na huhifadhi nambari katika utofauti wa matokeo. Matokeo yamechapishwa kwenye uwanja wa matokeo kama maradufu. Kesi ya kuzidisha (kesi ya 3) huzidisha neno1 na idadi ya kuokolewa na inaokoa nambari katika utofauti wa matokeo. Matokeo yamechapishwa kwenye uwanja wa matokeo kama maradufu. Kesi ya mgawanyiko (kesi ya 4) hugawanya nambari1 kwa kuokolewa_nambari pamoja na kuokoa nambari katika utofauti wa matokeo. Matokeo yamechapishwa kwenye uwanja wa matokeo kama kuelea (kwa sababu majibu ya mgawanyiko yanaweza kuwa nambari za desimali). Baada ya tukio la nambari, operesheni, au matokeo kuchapishwa kwenye skrini, mshale umewekwa upya, nambari iliyohifadhiwa imewekwa kwenye matokeo ya awali, na neno1 & op_num limepangwa upya.

Vidokezo vichache: mtumiaji hawezi kuingiza nambari za decimal kwenye kikokotoo kwa sababu ya ukosefu wa mraba wa nambari ya decimal. Pia, mtumiaji anaweza kufanya equation moja kwa wakati mmoja. Huwezi kuhesabu matokeo na kisha kuongeza / kutoa / kuzidisha / kugawanya matokeo hayo. Katika kazi ya nambari Chagua (), kuna kazi ambayo inafuta skrini baada ya matokeo kuchapishwa ikiwa mtumiaji amesisitiza mraba mwingine.

Hatua ya 4: Kanuni: Kazi ya Viwanja

miraba tupu () {

// mraba nyeusi na nyeupe hubadilishana kila safu na safu ya kwanza na ya tatu ina muundo tofauti kuliko safu ya pili na ya nne

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // safu ya kwanza ya mraba huanza, nyeusi hadi nyeupe tft. JazaRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // safu ya kwanza ya mraba inaisha

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // safu ya pili ya mraba huanza, nyeupe hadi nyeusi tft. JazaRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // safu ya pili ya mraba inaisha

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // safu ya tatu ya mraba huanza, nyeusi hadi nyeupe tft. JazaRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // safu ya tatu ya mraba inaisha

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // safu ya nne ya mraba huanza, nyeupe hadi nyeusi tft. JazaRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // safu ya nne ya mraba inaisha

}

Miraba () kazi ni ya moja kwa moja. Tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) inachora mstatili kulingana na vigezo vilivyopitishwa kwake, ambazo ni nafasi za kwanza za x na y, nafasi za x na y, na rangi ambayo mstatili umejazwa na. Kazi hii inachora safu zote nne za mraba (kitaalam mstatili) na inajaza kila mraba na rangi iliyopitishwa kwake.

Hatua ya 5: Kanuni: Kazi ya Nambari

nambari batili () {

tft.setTextColor (TFT_BLUE); // huweka nambari / rangi ya tabia kuwa bluu

tft.setTextSize (5); // huweka idadi / saizi ya herufi hadi 5

tft.set Mshale (18, 75); // huweka mshale kwa mstari wa kwanza wa nambari / wahusika

tft.print ("7 8 9 /"); // chapa mstari wa kwanza wa nambari / wahusika

tft.setCursor (18, 140); // huweka mshale kwa mstari wa pili wa nambari / wahusika

tft.print ("4 5 6 X"); // chapa laini ya pili ya nambari / wahusika

tft.setCursor (18, 205); // huweka mshale kwa mstari wa tatu wa nambari / wahusika

tft.print ("1 2 3 -"); // chapa laini ya tatu ya nambari / wahusika

tft.setCursor (18, 270); // huweka mshale kwa mstari wa nne wa nambari / wahusika

tft.print ("C 0 = +"); // chapa laini ya nne ya nambari / wahusika

}

Nambari () kazi pia ni ya moja kwa moja. Mistari miwili ya kwanza huweka saizi kubwa ya maandishi na rangi kuwa ya hudhurungi. Amri ya tft.setCursor () inaweka mshale kwenye nafasi kwenye kila safu ambapo uandishi wa nambari zinaanzia. Kisha amri ya tft.print () inachapisha nambari / wahusika juu ya mraba.

Hatua ya 6: Nambari: Chagua Kazi

nambari batili Chagua () {

TSPoint p = ts. PoPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

ikiwa (p.z> MINPRESSURE) {

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

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

ikiwa (matokeo! = 0) {

matokeo = 0;

nambari iliyohifadhiwa = 0;

tft.print ("WAZI MAADILI");

kuchelewesha (500);

tft.setCursor (mshaleLocX, mshaleLocY);

tft.print ("");

tft.setCursor (mshaleLocX, mshaleLocY);

}

Kuanza kazi ya nambari Chagua (), tunaomba pembejeo ya mtumiaji kutoka skrini ya kugusa na amri ya ts.getPoint (). Mara tu data hiyo itakapokusanywa, tunaangalia kuona ikiwa shinikizo la chini limepitishwa (au, kwa maneno mengine, ikiwa mtumiaji amesisitiza mahali fulani kwenye skrini ya kugusa). Ikiwa ni hivyo, kuratibu za x na y zimepangwa kutoka kwa kuratibu za Cartesian hadi kuratibu maalum za skrini. (0, 0) ni kona ya juu ya mkono wa kushoto wa skrini ya kugusa, na mhimili wa x unapita na mhimili y unashuka. Sehemu inayofuata itaangalia ikiwa kuna nambari iliyohifadhiwa katika matokeo. Ikiwa kuna, nambari ya matokeo na iliyohifadhiwa imewekwa upya kuwa 0. Ujumbe "WAZI MAADILI" umechapishwa kwenye sehemu ya matokeo, na skrini inafutwa na mshale kurudi kwenye nafasi yake ya kuanza.

ikiwa (p.y 60) {// safu ya kwanza ya mraba

ikiwa (p. x <60)

user_selection = 7;

vinginevyo ikiwa (p.x <120)

user_selection = 8;

vinginevyo ikiwa (p.x <180)

user_selection = 9;

chaguo lingine la mtumiaji = 14;

} vingine ikiwa (p.y 125) {// safu ya pili ya mraba

ikiwa (p. x <60)

user_selection = 4;

vinginevyo ikiwa (p.x <120)

user_selection = 5;

vinginevyo ikiwa (p.x <180)

user_selection = 6;

chaguo lingine la mtumiaji = 13;

} vingine ikiwa (p.y 190) {// safu ya tatu ya mraba

ikiwa (p. x <60)

user_selection = 1;

vinginevyo ikiwa (p.x <120)

user_selection = 2;

vinginevyo ikiwa (p.x <180)

user_selection = 3;

chaguo lingine la mtumiaji = 12;

} vingine ikiwa (p.y> 255) {// safu ya nne ya mraba

ikiwa (p. x <60)

user_selection = 15;

vinginevyo ikiwa (p.x <120)

user_selection = 0;

vinginevyo ikiwa (p.x <180)

user_selection = 10;

chaguo lingine la mtumiaji = 11;

}

} mwingine {

user_selection = 16; // user_selection imewekwa kwa 16 (hakuna tofauti)

}

}

Hii ndio sehemu ambayo huamua ni kitufe kipi kilichochaguliwa. Kuanzia na safu ya juu ya mraba na kuishia na safu ya chini, Arduino inatafuta mahali ambapo skrini ilibanwa sana. Halafu inapeana mraba nambari na inahifadhi nambari hiyo katika chaguo la mtumiaji. Nambari 0-9 zinalingana na mraba wa nambari, nambari 11-15 zinalingana na mraba wa operesheni na mraba wazi, na nambari 10 inalingana na mraba wa ishara sawa. Ikiwa hakuna mraba uliochaguliwa, basi chaguo la mtumiaji limewekwa hadi 16, ambayo itafanya kitanzi kuanza tena (angalia kazi ya kitanzi).

Hatua ya 7: Furahia Mradi Wako Umekamilika

Hapo unayo! Sasa unayo kikokotoo cha skrini ya kugusa ambacho kinaweza kufanya nyongeza, kutoa, kuzidisha, na kugawanya. Mradi huu ulibadilisha njia nzima nilidhani kikokotozi kilifanya kazi. Wakati nilikuwa nikifanya kazi kwenye mradi huu, nakumbuka nikimwambia mwalimu wangu darasani, "Sitatazama kikokotoo kwa njia ile ile tena!" Kazi ambazo wewe kama mtumiaji unafikiria ni rahisi ni ngumu wakati uko nyuma ya kompyuta kujaribu kuiga wazo lako. Natumai ulifurahiya mradi huo, na natumai mawazo yako ya jinsi kazi ya kikokotoo imebadilishwa pia!

Hapa kuna nambari nzima kwa urahisi wako. Imejazwa na maoni kwa hivyo ikiwa una shida yoyote wanapaswa kukuonyesha nini kila mstari hufanya.

Ilipendekeza: