Talaan ng mga Nilalaman:

Calculator ng Arduino Touchscreen: 7 Mga Hakbang
Calculator ng Arduino Touchscreen: 7 Mga Hakbang

Video: Calculator ng Arduino Touchscreen: 7 Mga Hakbang

Video: Calculator ng Arduino Touchscreen: 7 Mga Hakbang
Video: Lesson 98: Arduino 10 LED Push button Projects, Potentiometer LED Voltmeter and Traffic Light 2024, Nobyembre
Anonim
Calculator ng Arduino Touchscreen
Calculator ng Arduino Touchscreen

Kamusta! Ito ay isang proyekto upang gumawa ng isang calculator ng touchscreen gamit ang isang Arduino Uno at isang kalasag na TFT LCD. Naisip ko ang konsepto para sa aking klase sa programa sa homeschool, at ang karanasan sa pagbuo ng proyektong ito ay napaka-interesante. Ang calculator na ito ay maaaring gawin ang apat na simpleng pagpapatakbo ng matematika (karagdagan, pagbabawas, pagpaparami, at paghahati). Nagpapakita rin ito ng hanggang sa dalawang puntos na decimal para sa mga sagot sa dibisyon na mayroon sila. Sumisid agad sa! Ang mga supply para sa proyektong ito ay nakalista sa ibaba.

Mga gamit

- Arduino Uno

- 2.4 TFT LCD Shield (narito kung saan ko ito binili:

- USB A to B cable (kurdon upang ikonekta ang Arduino sa computer)

- Computer na may naka-install na Arduino IDE

- Kakailanganin mo ring mag-download ng dalawang aklatan: MCUFRIEND_kbv at Touchscreen. Ang una na maaari mong makita sa github (link: https://github.com/prenticedavid/MCUFRIEND_kbv) o maaari mong gamitin ang library zip file na isinama ko sa ibaba. Ang pangalawa ay nasa manager ng Arduino Library para sa pag-install.

Hakbang 1: Mga Koneksyon sa Hardware

Mga Koneksyon sa Hardware
Mga Koneksyon sa Hardware
Mga Koneksyon sa Hardware
Mga Koneksyon sa Hardware
Mga Koneksyon sa Hardware
Mga Koneksyon sa Hardware

Ang koneksyon ng touchscreen na kalasag sa Arduino Uno ay simple at mabilis. Ang kailangan mo lang gawin ay pumila ng pinakamababang mga pin sa kalasag na may pinakamababang mga pin sa Arduino at itulak ang kalasag sa mga pin. Ang nangungunang 5V pin at ang walang label na pin sa gilid ng kuryente ay hindi dapat magkaroon ng mga pin mula sa kalasag sa kanila, na may parehong mga parameter na nalalapat para sa mga pin na may label na SCL at SDA sa kabilang panig ng board. Ngayon, handa na kaming mag-code!

Hakbang 2: Ang Code: Mga Kahulugan sa Global at Pag-setup

# isama

MCUFRIEND_kbv tft; // hard-wired para sa mga panangga ng UNO pa rin

# isama

# tukuyin ang YP A3

# tukuyin ang XM A2

# tukuyin ang YM 9

# tukuyin ang XP 8

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

# tukuyin ang MINPRESSURE 10

Ito ang simula ng code, kung saan isinasama namin ang mga aklatan (MCUFRIEND_kbv & Touchscreen), tukuyin ang mga pin ng X at Y, i-set up ang mga parameter ng touchscreen, at tukuyin ang minimum na presyon na kinakailangan para mairehistro ng Arduino ang isang press ng gumagamit.

int ID;

int user_selection;

float save_number = 0;

term na float1;

int op_num;

resulta ng float;

int cursorLocX = 5;

int cursorLocY = 20;

Kanan bago ang pag-set up, kailangan naming mag-set up ng ilang mga pandaigdigang variable. Tumutulong ang ID sa pagsisimula ng pagpapatakbo ng touchscreen. Ang user_selection ay nagtataglay ng isang numero na tumutugma sa susi na pipiliin ng gumagamit kapag pinindot ang touchscreen. Ang save_number ay ang variable na nai-print namin sa screen pagkatapos ng isang entry ng gumagamit (higit pa dito sa loop). Ito ay isang float kaya maaari itong humawak ng mga decimal number pati na rin ang mga integer. ang term1 ay ang variable na ang unang bilang ng equation ay nai-save sa pagkatapos ng isang operand ay napili. nai-save ng op_num ang operand bilang isang numero (1 para sa karagdagan, 2 para sa pagbabawas, 3 para sa pagpaparami, at 4 para sa paghahati). Ang resulta ay ang variable na naka-print sa screen pagkatapos na pinindot ng gumagamit ang katumbas na sign. Ito rin ay isang float. ang cursorLocX at cursorLocY ay ang mga puntos sa pagma-map sa touchscreen kung saan ang cursor ay nakatakda sa maraming beses (matatagpuan ito sa grey bar sa tuktok, kung hindi man kilala bilang mga patlang ng mga resulta).

walang bisa ang pag-setup () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

mga parisukat ();

numero();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Ang aming pag-andar sa pag-setup ay naglalaman muna ng pagsisimula para sa touchscreen na kalasag (mga linya 1-3). Ang oryentasyon ng kalasag ay nakatakda gamit ang tft.setRotation () na utos, na may 0 na patayo. Ang buong screen ay may kulay na maitim na kulay-abo na may tft.fillScreen () na utos, na isusulat namin sa itaas ng (maliban sa patlang ng mga resulta). Ang mga pag-andar ng mga parisukat () at numero () ay iginuhit ang mga parisukat ng calculator, kulay ang mga parisukat na itim at puti sa isang pattern ng checkerboard, at isulat ang mga numero / operan sa mga parisukat na asul. Makakarating kami sa mga nasa susunod na hakbang. Itinatakda ng utos na tft.setTextSize () ang laki ng teksto ng patlang ng mga resulta sa 3, na isang medium font. Ang utos na tft.setTextColor () ay nagtatakda ng kulay ng teksto ng patlang ng mga resulta sa asul, na nakasulat sa madilim na kulay-abong patlang.

Hakbang 3: Ang Code: Loop

void loop () {numberSelect ();

pagkaantala (100);

kung (user_selection == 16) {

;

} iba pa {

kung (user_seleksyon <10) {

save_number = save_number * 10 + user_selection;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (nai-save na numero);

} iba pa kung (user_selection> 10) {

switch (user_selection) {

kaso 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

term1 = nai-save_number;

nai-save_number = 0;

pahinga;

kaso 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

term1 = nai-save_number;

nai-save_number = 0;

pahinga;

kaso 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

term1 = nai-save_number;

nai-save_number = 0;

pahinga;

kaso 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

term1 = nai-save_number;

nai-save_number = 0;

pahinga;

kaso 15:

nai-save_number = 0;

term1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

pahinga;

}

tft.setCursor (cursorLocX, cursorLocY);

Marami itong ngumunguya, kaya't ipapaliwanag ko kung ano ang nasa itaas. Nagsisimula kami sa pamamagitan ng pagtawag sa function na numberSelect (), na nagtatalaga ng isang numero sa bawat parisukat sa touchscreen. Kapag pinindot ng isang gumagamit ang isa sa mga parisukat na iyon, itinatakda ng pagpapaandar ang variable ng user_seleksyon sa bilang ng parisukat. Ang una kung pahayag ay tatakbo lamang sa pamamagitan ng loop kung ang isang wastong pagpili ng gumagamit ay nagawa. Kung ito ay, ang susunod kung pahayag ay nagtanong kung ang user_selection ay may isang bilang na mas mababa sa 10 nai-save dito (ang mga numero 0-9). Kung gagawin ito, ang save_number ay pinarami ng 10 at ang numero sa user_selection ay idinagdag sa nai-save na numero, na naka-print sa patlang ng mga resulta sa touchscreen. Kung hindi, ang susunod kung pahayag ay tatanungin kung ang user_selection ay may bilang na mas malaki sa 10 nai-save dito (ang mga numero ng operand: 11 para sa +, 12 para sa -, 13 para sa X, 14 para /, at 15 para sa malinaw na square ng screen). Pinangangalagaan ng isang function na switch ang bawat kaso (natutukoy ng user_selection). Ang variable op_num ay binibigyan ng isang numero na tumutugma sa operand na napili (1 para sa +, 2 para sa -, 3 para sa X, at 4 para sa /). Ang halaga sa save_number ay nai-save sa variable term1 upang ang variable na nai-save_number ay maaaring magamit para sa ikalawang kalahati ng equation. Ang simbolo ng operand ay naka-print sa screen kasama ang pag-clear ng anumang mga numero sa patlang ng mga resulta. Ang tanging pagbubukod lamang ay ang malinaw na parisukat ng screen, na i-reset ang lahat ng mga variable ng pagkalkula at i-clear ang patlang ng mga resulta ng anuman dito.

} iba pa {

lumipat (op_num) {

kaso 1:

resulta = term1 + nai-save_number;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (doble (resulta));

pahinga;

kaso 2:

resulta = term1 - nai-save_number;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (doble (resulta));

pahinga;

kaso 3:

resulta = term1 * nai-save_number;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (doble (resulta));

pahinga;

kaso 4:

resulta = float (term1) / float (save_number);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (resulta);

pahinga;

}

tft.setCursor (cursorLocX, cursorLocY);

nai-save_number = resulta;

term1 = 0;

op_num = 0;

pagkaantala (1000);

}

}

}

Ang huling bahagi ng loop ay nakikipag-usap sa kaganapan ng gumagamit na pumipili ng katumbas na pag-sign (user_selection == 10). Ang isa pang pagpapaandar na switch ay gumagana sa pamamagitan ng apat na mga pagpapaandar sa matematika (tinutukoy ng op_num). Ang karagdagan na kaso (kaso 1) ay nagdaragdag ng term1 at nai-save na numero nang magkasama at nai-save ang numero sa variable ng resulta. Ang resulta ay nakalimbag sa patlang ng mga resulta bilang isang doble. Ang kaso ng pagbabawas (kaso 2) ay binawas ang nai-save na numero mula sa term1 at nai-save ang numero sa variable ng resulta. Ang resulta ay nai-print sa patlang ng mga resulta bilang isang doble. Ang multiplication case (case 3) ay nagpaparami ng term1 ng nai-save na numero at nai-save ang numero sa variable ng resulta. Ang resulta ay naka-print sa patlang ng mga resulta bilang isang doble. Ang kaso ng dibisyon (kaso 4) ay hinahati ang term1 ng na-save_number na magkasama at nai-save ang numero sa variable ng resulta. Ang resulta ay nai-print sa patlang ng mga resulta bilang isang float (dahil ang mga sagot sa dibisyon ay maaaring mga decimal number). Matapos ang kaganapan ng alinman sa isang numero, operand, o resulta na nai-print sa screen, ang cursor ay na-reset, ang save_number ay nakatakda sa nakaraang resulta, at ang term1 & op_num ay nai-reset.

Ilang tala: ang gumagamit ay hindi maaaring maglagay ng mga decimal number sa calculator dahil sa kakulangan ng isang decimal point square. Gayundin, ang gumagamit ay maaari lamang gumawa ng isang equation nang paisa-isa. Hindi mo makakalkula ang isang resulta at pagkatapos ay idagdag / ibawas / i-multiply / hatiin ang resulta. Sa pag-andar ng numberSelect (), mayroong isang pagpapaandar na nalilimas ang screen pagkatapos na mai-print ang isang resulta kung ang isang gumagamit ay pinindot ang isa pang parisukat.

Hakbang 4: Ang Code: Mga Kuwadrang Pag-andar

walang bisa na mga parisukat () {

// itim at puting mga parisukat na kahalili sa bawat hilera at ang una at pangatlong mga hilera ay may isang kabaligtaran na pattern kaysa sa pangalawa at ikaapat na mga hilera

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // unang hilera ng mga parisukat ay nagsisimula, itim hanggang puti na tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // natatapos ang unang hilera ng mga parisukat

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // pangalawang hilera ng mga parisukat ay nagsisimula, puti hanggang itim na tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // natapos ang pangalawang hilera ng mga parisukat

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // nagsisimula ang ikatlong hilera ng mga parisukat, itim hanggang puti na tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // natapos ang ikatlong hilera ng mga parisukat

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // nagsisimula ang ika-apat na hilera ng mga parisukat, puti hanggang itim na tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // natapos ang ika-apat na hilera ng mga parisukat

}

Ang pag-andar ng mga parisukat () ay medyo prangka. Ang utos na tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) ay gumuhit ng isang parihaba ayon sa mga parameter na ipinasa dito, na kung saan ay ang unang posisyon ng x at y, ang pangalawang posisyon ng x at y, at ang kulay na puno ng rektanggulo. Ang paggana na ito ay kumukuha ng lahat ng apat na mga hilera ng mga parisukat (teknikal na mga parihaba) at pinupunan ang bawat mga parisukat na may kulay na ipinapasa dito.

Hakbang 5: Ang Code: Pag-andar ng Mga Numero

walang bisa na mga numero () {

tft.setTextColor (TFT_BLUE); // nagtatakda ng kulay ng bilang / character sa asul

tft.setTextSize (5); // nagtatakda ng laki / laki ng character sa 5

tft.setCursor (18, 75); // nagtatakda ng cursor para sa unang linya ng mga numero / character

tft.print ("7 8 9 /"); // naglilimbag ng unang linya ng mga numero / character

tft.setCursor (18, 140); // nagtatakda ng cursor para sa pangalawang linya ng mga numero / character

tft.print ("4 5 6 X"); // naglilimbag ng pangalawang linya ng mga numero / character

tft.setCursor (18, 205); // nagtatakda ng cursor para sa pangatlong linya ng mga numero / character

tft.print ("1 2 3 -"); // nagpi-print ng pangatlong linya ng mga numero / character

tft.setCursor (18, 270); // nagtatakda ng cursor para sa ika-apat na linya ng mga numero / character

tft.print ("C 0 = +"); // naglilimbag ng pang-apat na linya ng mga numero / character

}

Direkta din ang pagpapaandar ng mga numero (). Itinakda ng unang dalawang linya ang laki ng teksto at ang kulay sa asul. Itinatakda ng utos na tft.setCursor () ang cursor sa posisyon sa bawat hilera kung saan nagsimula ang pagsulat ng mga numero. Pagkatapos ang utos na tft.print () ay naglilimbag ng mga numero / character sa mga parisukat.

Hakbang 6: Ang Code: NumberSelect Function

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

kung (p.z> MINPRESSURE) {

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

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

kung (resulta! = 0) {

resulta = 0;

nai-save_number = 0;

tft.print ("MALINAW NA HALAGA");

pagkaantala (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Upang simulan ang pagpapaandar ng numberSelect (), hinihiling namin ang input ng gumagamit mula sa touchscreen na may utos na ts.getPoint (). Kapag nakolekta ang data na iyon, suriin namin upang makita kung ang minimum na presyon ay lumampas (o, sa madaling salita, kung ang gumagamit ay pinindot sa isang lugar sa touchscreen). Kung ito ay, ang mga coordinate ng x at y ay nai-map mula sa mga coordinate ng Cartesian hanggang sa mga coordinate na tukoy sa touchscreen. Ang (0, 0) ay ang tuktok na kaliwang sulok ng touchscreen, na ang x axis ay tatawid at ang y axis ay bababa. Sinusuri ng susunod na bahagi upang makita kung mayroong isang bilang na nai-save sa resulta. Kung mayroon, ang resulta at nai-save_number ay nai-reset sa 0. Ang mensahe na "MALINAW NA HALAGA" ay naka-print sa ibabaw ng patlang ng mga resulta, at ang screen ay malinis kasama ang cursor pabalik sa panimulang posisyon nito.

kung (p.y 60) {// unang hilera ng mga parisukat

kung (p.x <60)

user_selection = 7;

kung hindi man (p.x <120)

user_selection = 8;

kung hindi man (p.x <180)

user_selection = 9;

iba user_selection = 14;

} iba pa kung (p.y 125) {// pangalawang hilera ng mga parisukat

kung (p.x <60)

user_selection = 4;

kung hindi man (p.x <120)

user_selection = 5;

kung hindi man (p.x <180)

user_selection = 6;

iba user_selection = 13;

} iba pa kung (p.y 190) {// ikatlong hilera ng mga parisukat

kung (p.x <60)

user_selection = 1;

kung hindi man (p.x <120)

user_selection = 2;

kung hindi man (p.x <180)

user_selection = 3;

iba user_selection = 12;

} iba pa kung (p.y> 255) {// ika-apat na hilera ng mga parisukat

kung (p.x <60)

user_selection = 15;

kung hindi man (p.x <120)

user_selection = 0;

kung hindi man (p.x <180)

user_selection = 10;

iba user_selection = 11;

}

} iba pa {

user_selection = 16; // user_selection ay nakatakda sa 16 (walang variable)

}

}

Ito ang bahagi na tumutukoy kung aling pindutan ang napili. Simula sa tuktok na hilera ng mga parisukat at nagtatapos sa ilalim na hilera, hinahanap ng Arduino kung saan talagang pinindot ang screen. Pagkatapos ay nagtatalaga ito ng parisukat ng isang numero at nai-save ang numerong iyon sa user_selection. Ang mga bilang na 0-9 ay tumutugma sa mga parisukat na bilang, ang mga bilang na 11-15 ay tumutugma sa mga parisukat ng operand at ang malinaw na parisukat, at ang bilang na 10 ay tumutugma sa mga parehong sign square. Kung walang napiling parisukat, pagkatapos ang user_selection ay nakatakda sa 16, na magpapasimulang muli ng loop (tingnan ang pag-andar ng loop).

Hakbang 7: Masiyahan sa Iyong Tapos na Project

Ayan! Mayroon ka na ngayong isang calculator ng touchscreen na maaaring gawin karagdagan, pagbabawas, pagpaparami, at paghahati. Binago ng proyektong ito ang buong paraang akala ko na gumagana ang isang calculator. Habang ginagawa ko ang proyektong ito, naaalala kong sinabi sa aking magturo sa klase, "Hindi na ako muling tumingin sa isang calculator sa parehong paraan!" Ang mga pagpapaandar na sa tingin mo ng isang gumagamit ay madali ay medyo mahirap kapag nasa likod ka ng computer na sinusubukan na tularan ang iyong ideya. Inaasahan kong nasiyahan ka sa proyekto, at inaasahan kong nabago din ang iyong pag-iisip ng kung paano gumagana ang isang calculator!

Narito ang buong code para sa iyong kaginhawaan. Ito ay puno ng mga komento kaya kung mayroon kang anumang mga problema dapat nilang ipakita sa iyo kung ano ang ginagawa ng bawat linya.

Inirerekumendang: