INHOUDSOPGAWE:

Arduino -raakskermrekenaar: 7 stappe
Arduino -raakskermrekenaar: 7 stappe

Video: Arduino -raakskermrekenaar: 7 stappe

Video: Arduino -raakskermrekenaar: 7 stappe
Video: 1F Arduino on the move basic week 7 deel 2 les 4 (3) 2024, Julie
Anonim
Arduino raakskermrekenaar
Arduino raakskermrekenaar

Hallo! Dit is 'n projek om 'n raakskermrekenaar te maak met 'n Arduino Uno en 'n TFT LCD -skild. Ek het die konsep vir my tuisskoolprogrammeringsklas bedink, en die ervaring met die bou van hierdie projek was baie interessant. Hierdie sakrekenaar kan die vier eenvoudige wiskundige bewerkings doen (optel, aftrek, vermenigvuldig en deel). Dit vertoon ook tot twee desimale punte vir die afdeling -antwoorde wat dit bevat. Kom ons duik reg in! Die voorrade vir hierdie projek word hieronder gelys.

Voorrade

- Arduino Uno

-2.4 TFT LCD Shield (hier het ek dit gekoop:

- USB A tot B -kabel (koord om Arduino aan 'n rekenaar te koppel)

- Rekenaar met Arduino IDE geïnstalleer

- U moet ook twee biblioteke aflaai: MCUFRIEND_kbv en raakskerm. Die eerste een wat u op github kan vind (skakel: https://github.com/prenticedavid/MCUFRIEND_kbv) of u kan die zip -lêer van die biblioteek wat ek hieronder ingesluit het, gebruik. Die tweede is in die Arduino Library -bestuurder vir installasie.

Stap 1: Hardewareverbindings

Hardewareverbindings
Hardewareverbindings
Hardewareverbindings
Hardewareverbindings
Hardewareverbindings
Hardewareverbindings

Die aansluiting van die raakskermskerm op die Arduino Uno is eenvoudig en vinnig. Al wat u hoef te doen is om die laagste penne op die skild in lyn te bring met die laagste penne op die Arduino en die skild in die penne te druk. Die boonste 5V -pen en die ongemerkte pen aan die kragkant moet nie penne van die skild bevat nie, met dieselfde parameters wat geld vir die penne gemerk SCL en SDA aan die ander kant van die bord. Nou, ons is gereed om te kodeer!

Stap 2: Die kode: globale definisies en opstelling

#insluit

MCUFRIEND_kbv tft; // in elk geval vasgebind vir UNO-skilde

#insluit

#definieer YP A3

#definieer XM A2

#definieer YM 9

#definieer XP 8

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

#definieer MINDRUK 10

Dit is die begin van die kode, waar ons biblioteke (MCUFRIEND_kbv en raakskerm) insluit, die X- en Y -penne definieer, die aanraakskermparameters opstel en die minimum druk definieer wat nodig is vir die Arduino om 'n gebruikerspers te registreer.

int ID;

int user_selection;

float save_number = 0;

vlotterm1;

int op_num;

vlot resultaat;

int cursorLocX = 5;

int cursorLocY = 20;

Net voor die opstelling moet ons 'n paar globale veranderlikes opstel. ID help om die raakskerm aan die gang te kry. user_selection bevat 'n nommer wat ooreenstem met die sleutel wat die gebruiker kies wanneer hy op die raakskerm druk. save_number is die veranderlike wat ons na 'n gebruikersinskrywing op die skerm druk (meer hieroor in die lus). Dit is 'n vlotter sodat dit desimale getalle sowel as heelgetalle kan bevat. term1 is die veranderlike waarin die eerste getal van die vergelyking gestoor word nadat 'n operand gekies is. op_num stoor die operand as 'n getal (1 vir optelling, 2 vir aftrekking, 3 vir vermenigvuldiging en 4 vir deling). gevolg is die veranderlike wat op die skerm gedruk word nadat die gebruiker op die gelykteken gedruk het. Dit is ook 'n vlot. cursorLocX en cursorLocY is die karteringpunte op die raakskerm waar die wyser meermale gestel is (dit is in die grys balk bo, andersins bekend as die resultaatveld).

ongeldige opstelling () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

vierkante ();

getalle ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Ons opstelfunksie bevat eers die inisialisering van die raakskerm (reëls 1-3). Die oriëntasie van die skild word ingestel met die tft.setRotation () -opdrag, met 0 regop. Die hele skerm is donkergrys gekleur met die tft.fillScreen () -opdrag, wat ons bo -aan skryf (behalwe vir die resultate). Die vierkante () en getalle () funksies teken die vierkante van die sakrekenaar, kleur die vierkante swart en wit in 'n dambordpatroon en skryf getalle/operande op die blokkies in blou. Ons kom by die volgende stap daarby uit. Die opdrag tft.setTextSize () stel die teksgrootte van die resultaatveld op 3, wat 'n medium lettertipe is. Die opdrag tft.setTextColor () stel die tekskleur van die resultate veld in blou, wat oor die donkergrys veld geskryf word.

Stap 3: Die kode: lus

leemte -lus () {numberSelect ();

vertraging (100);

as (user_selection == 16) {

;

} anders {

as (user_selection <10) {

save_number = opgeslagen_nummer * 10 + user_selection;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (opgeslagen_getal);

} anders as (user_selection> 10) {

skakelaar (gebruikerskeuse) {

saak 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

term1 = gestoor_getal;

gestoorde_getal = 0;

breek;

saak 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

term1 = gestoor_getal;

gestoorde_getal = 0;

breek;

saak 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

term1 = gestoor_getal;

gestoorde_getal = 0;

breek;

saak 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

term1 = gestoor_getal;

gestoorde_getal = 0;

breek;

saak 15:

gestoorde_getal = 0;

term1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

breek;

}

tft.setCursor (cursorLocX, cursorLocY);

Dit is baie om te kou, so ek sal verduidelik wat hierbo is. Ons begin deur die funksie numberSelect () te skakel, wat 'n nommer aan elke vierkant op die raakskerm toewys. As 'n gebruiker een van daardie vierkante druk, stel die funksie die user_selection veranderlike op die getal van die vierkant. Die eerste if -stelling moet slegs deur die lus loop as 'n geldige gebruikerskeuse gemaak is. As dit die geval is, vra die volgende as-verklaring of user_selection 'n getal van minder as 10 bevat (die getalle 0-9). As dit wel die geval is, word opgeslagen_getal vermenigvuldig met 10 en die nommer in gebruikerskeuse word bygevoeg by opgespoor_getal, wat in die resultate -veld op die raakskerm gedruk word. As dit nie die geval is nie, vra die volgende as -verklaring of user_selection 'n getal groter as 10 daarin het (die operandgetalle: 11 vir +, 12 vir -, 13 vir X, 14 vir /en 15 vir die duidelike skermvierkant). 'N Skakelfunksie sorg vir elke geval (bepaal deur user_selection). Die veranderlike op_num kry 'n getal wat ooreenstem met die operand wat gekies is (1 vir +, 2 vir -, 3 vir X en 4 vir /). Die waarde in save_number word in die veranderlike term1 gestoor, sodat die save_number -veranderlike vir die tweede helfte van die vergelyking gebruik kan word. Die operand -simbool word op die skerm gedruk, tesame met die verwydering van getalle in die veld. Die enigste uitsondering is die duidelike skermvierkant, wat al die berekeningsveranderlikes terugstel en die resultaatveld van alles wat daarop is, uitvee.

} anders {

skakelaar (op_num) {

geval 1:

resultaat = term1 + gestoor_getal;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dubbel (resultaat));

breek;

geval 2:

resultaat = term1 - gestoorde_nommer;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dubbel (resultaat));

breek;

geval 3:

resultaat = term1 * gestoor_getal;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dubbel (resultaat));

breek;

geval 4:

resultaat = vlot (term1) / vlot (gestoor_getal);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (resultaat);

breek;

}

tft.setCursor (cursorLocX, cursorLocY);

opgeslagen_getal = resultaat;

term1 = 0;

op_num = 0;

vertraging (1000);

}

}

}

Die laaste deel van die lus handel oor die gebeurtenis waarin die gebruiker die gelykteken kies (user_selection == 10). 'N Ander skakelfunksie werk deur die vier wiskundige funksies (bepaal deur op_num). Die optelgeval (geval 1) voeg term1 en opgeslagen_getal bymekaar en stoor die getal in die resultaatveranderlike. Die resultaat word as 'n dubbele in die resultate veld gedruk. Die aftrekkingskas (geval 2) trek die getal van die getal af van term1 en stoor die getal in die resultaatveranderlike. Die resultaat word in die resultaatveld as dubbel gedruk. Die vermenigvuldigingsgeval (geval 3) vermenigvuldig term1 met save_number en stoor die getal in die resultaatveranderlike. Die resultaat word in die resultate veld as 'n dubbele gedruk. Die delingsgeval (geval 4) deel term1 deur save_number saam en stoor die getal in die resultaat veranderlike. Die resultaat word as 'n vlot in die resultaatveld gedruk (omdat die delingsantwoorde desimale getalle kan wees). Nadat 'n getal, operand of resultaat op die skerm gedruk is, word die wyser teruggestel, die gestoorde_getal word op die vorige resultaat gestel en term1 en op_num word teruggestel.

'N Paar opmerkings: die gebruiker kan nie desimale getalle in die sakrekenaar invoer nie omdat daar nie 'n desimale puntvierkant is nie. Die gebruiker kan ook slegs een vergelyking op 'n slag doen. U kan nie 'n resultaat bereken nie en dan die resultaat optel/aftrek/vermenigvuldig/verdeel. In die funksie numberSelect () is daar 'n funksie wat die skerm skoonmaak nadat 'n resultaat gedruk is as 'n gebruiker op 'n ander vierkant gedruk het.

Stap 4: Die kode: vierkante funksie

leë vierkante () {

// swart en wit vierkante wissel op elke ry en die eerste en derde rye het 'n teenoorgestelde patroon as die tweede en vierde rye

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // eerste ry vierkante begin, swart tot wit tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // eerste ry vierkante eindig

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // tweede ry vierkante begin, wit tot swart tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // tweede ry vierkante eindig

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // derde ry vierkante begin, swart tot wit tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // derde ry vierkante eindig

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // begin vierde ry vierkante, wit tot swart tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // vierde ry vierkante eindig

}

Die vierkante () -funksie is redelik eenvoudig. Die opdrag tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) teken 'n reghoek volgens die parameters wat daaraan oorgedra word, wat x en y se eerste posisies, x en y se tweede posisies is, en die kleur waarmee die reghoek gevul is. Hierdie funksie teken al vier rye vierkante (tegnies reghoeke) en vul elke vierkant met die kleur wat daarby aangeheg is.

Stap 5: Die kode: getalle -funksie

nietige getalle () {

tft.setTextColor (TFT_BLUE); // stel nommer/karakterkleur op blou

tft.setTextSize (5); // stel nommer/karaktergrootte op 5

tft.setCursor (18, 75); // stel die wyser vir die eerste reël getalle/karakters

tft.print ("7 8 9 /"); // druk eerste reël getalle/karakters af

tft.setCursor (18, 140); // stel die wyser vir die tweede reël getalle/karakters

tft.print ("4 5 6 X"); // druk die tweede reël getalle/karakters af

tft.setCursor (18, 205); // stel die wyser vir die derde reël getalle/karakters

tft.print ("1 2 3 -"); // druk die derde reël getalle/karakters af

tft.setCursor (18, 270); // stel die wyser vir die vierde reël getalle/karakters

tft.print ("C 0 = +"); // druk vierde reël getalle/karakters af

}

Die getalle () funksie is ook eenvoudig. Die eerste twee reëls stel die teks groter en die kleur blou. Die opdrag tft.setCursor () stel die wyser na die posisie op elke ry waar die skryf van die getalle begin. Dan druk die opdrag tft.print () die getalle/karakters oor die vierkante.

Stap 6: Die kode: nommer Kies funksie

leemte nommerSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

as (p.z> MINPRESSURE) {

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

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

as (resultaat! = 0) {

resultaat = 0;

gestoorde_getal = 0;

tft.print ("DUIDELIKE WAARDES");

vertraging (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Om die funksie numberSelect () te begin, vra ons gebruikersinvoer vanaf die raakskerm met die ts.getPoint () -opdrag. Sodra die data versamel is, kyk ons of die minimum druk oorskry is (of, met ander woorde, of die gebruiker iewers op die raakskerm gedruk het). As dit die geval is, word die x- en y-koördinate van Cartesiaanse koördinate na aanraakskermspesifieke koördinate gekarteer. (0, 0) is die linker boonste hoek van die raakskerm, met die x -as dwars en die y -as af. Die volgende deel kyk of daar 'n nommer gestoor is. As dit die geval is, word die resultaat en die gestoorde_getal teruggestel na 0. Die boodskap "WISSELE WAARDES" word oor die resultate veld gedruk en die skerm word skoongemaak met die wyser terug na die beginposisie.

if (p.y 60) {// eerste ry vierkante

as (p.x <60)

user_selection = 7;

anders as (px <120)

user_selection = 8;

anders as (px <180)

user_selection = 9;

anders user_selection = 14;

} anders as (p.y 125) {// tweede ry vierkante

as (p.x <60)

user_selection = 4;

anders as (px <120)

user_selection = 5;

anders as (px <180)

user_selection = 6;

anders user_selection = 13;

} anders as (p.y 190) {// derde ry vierkante

as (p.x <60)

user_selection = 1;

anders as (px <120)

user_selection = 2;

anders as (px <180)

user_selection = 3;

anders user_selection = 12;

} anders as (p.y> 255) {// vierde ry vierkante

as (p.x <60)

user_selection = 15;

anders as (px <120)

user_selection = 0;

anders as (px <180)

user_selection = 10;

anders user_selection = 11;

}

} anders {

user_selection = 16; // user_selection is ingestel op 16 (niks veranderlik nie)

}

}

Dit is die deel wat bepaal watter knoppie gekies is. Begin met die boonste ry vierkante en eindig met die onderste ry, die Arduino soek waar die skerm eintlik ingedruk is. Dit ken dan die vierkant 'n getal toe en stoor die getal in user_selection. Die getalle 0-9 stem ooreen met die getalvierkante, die getalle 11-15 stem ooreen met die operandvierkante en die duidelike vierkant, en die getal 10 stem ooreen met die gelyke teken vierkant. As daar geen vierkant gekies is nie, word user_selection op 16 gestel, wat die lus weer van voor af sal begin (sien lusfunksie).

Stap 7: Geniet u voltooide projek

Daar het jy dit! U het nou 'n raakskermrekenaar wat optel, aftrek, vermenigvuldig en deel. Hierdie projek het heeltemal verander soos ek gedink het dat 'n sakrekenaar werk. Terwyl ek aan hierdie projek gewerk het, onthou ek toe ek vir my instrukteur in die klas gesê het: "Ek sal nooit weer dieselfde na 'n sakrekenaar kyk nie!" Die funksies wat u as gebruiker maklik vind, is ietwat moeilik as u agter die rekenaar probeer om u idee na te volg. Ek hoop dat u die projek geniet het, en ek hoop dat u ingesteldheid oor hoe 'n sakrekenaar werk, ook verander is!

Hier is die volledige kode vir u gemak. Dit is gevul met kommentaar, so as u probleme ondervind, moet hulle u wys wat elke reël doen.

Aanbeveel: