Satura rādītājs:

Arduino skārienekrāna kalkulators: 7 soļi
Arduino skārienekrāna kalkulators: 7 soļi

Video: Arduino skārienekrāna kalkulators: 7 soļi

Video: Arduino skārienekrāna kalkulators: 7 soļi
Video: NEWYES Calculator VS Casio calculator 2024, Jūlijs
Anonim
Arduino skārienekrāna kalkulators
Arduino skārienekrāna kalkulators

Sveiki! Šis ir projekts, lai izveidotu skārienekrāna kalkulatoru, izmantojot Arduino Uno un TFT LCD ekrānu. Es izdomāju savas mājas skolas programmēšanas klases koncepciju, un pieredze šī projekta veidošanā bija ļoti interesanta. Šis kalkulators var veikt četras vienkāršas matemātiskas darbības (saskaitīšanu, atņemšanu, reizināšanu un dalīšanu). Tas arī parāda līdz divām zīmēm aiz komata sadalījuma atbildēm, kurās tās ir. Nirtam tieši iekšā! Šī projekta materiāli ir uzskaitīti zemāk.

Piegādes

- Arduino Uno

-2.4 TFT LCD vairogs (šeit es to nopirku:

- USB A līdz B kabelis (vads, lai savienotu Arduino ar datoru)

- Dators ar instalētu Arduino IDE

- Jums būs jālejupielādē arī divas bibliotēkas: MCUFRIEND_kbv un skārienekrāns. Pirmo, ko varat atrast vietnē github (saite: https://github.com/prenticedavid/MCUFRIEND_kbv), vai arī varat izmantot tālāk iekļauto bibliotēkas zip failu. Otrais ir instalēšanai Arduino bibliotēkas pārvaldniekā.

1. darbība. Aparatūras savienojumi

Aparatūras savienojumi
Aparatūras savienojumi
Aparatūras savienojumi
Aparatūras savienojumi
Aparatūras savienojumi
Aparatūras savienojumi

Skārienekrāna vairoga savienošana ar Arduino Uno ir vienkārša un ātra. Viss, kas jums jādara, ir izkārtot vairoga zemākās tapas ar zemākajām tapām uz Arduino un iespiest vairogu tapās. Augšējā 5 V tapai un nemarķētajai tapai barošanas pusē nedrīkst būt tapas no vairoga, un tie paši parametri attiecas uz tapām, kas apzīmētas ar SCL un SDA plāksnes otrā pusē. Tagad mēs esam gatavi kodēt!

2. darbība. Kods: globālās definīcijas un iestatīšana

#iekļaut

MCUFRIEND_kbv tft; // ciets savienojums UNO vairogiem jebkurā gadījumā

#iekļaut

#define YP A3

#define XM A2

#define YM 9

#define XP 8

Skārienekrāns ts = Skārienekrāns (XP, YP, XM, YM, 300);

#define MINPRESSURE 10

Tas ir koda sākums, kurā mēs iekļaujam bibliotēkas (MCUFRIEND_kbv un skārienekrānu), definējam X un Y tapas, iestatām skārienekrāna parametrus un definējam minimālo spiedienu, kas nepieciešams, lai Arduino reģistrētu lietotāja presi.

int ID;

int user_selection;

pludiņš saglabāts_numurs = 0;

pludiņa termins1;

int op_num;

pludiņa rezultāts;

int cursorLocX = 5;

int cursorLocY = 20;

Tieši pirms iestatīšanas mums ir jāiestata daži globālie mainīgie. ID palīdz izveidot un palaist skārienekrānu. user_selection satur skaitli, kas atbilst taustiņam, ko lietotājs izvēlas, nospiežot skārienekrānu. Save_number ir mainīgais, ko mēs drukājam uz ekrāna pēc lietotāja ievadīšanas (vairāk par to cilpā). Tas ir pludiņš, tāpēc tajā var būt gan decimāldaļskaitļi, gan veseli skaitļi. termins1 ir mainīgais, kurā tiek saglabāts vienādojuma pirmais numurs pēc operanda izvēles. op_num saglabā operandu kā skaitli (1 saskaitīšanai, 2 atņemšanai, 3 reizināšanai un 4 dalīšanai). rezultāts ir mainīgais, kas tiek drukāts uz ekrāna pēc tam, kad lietotājs ir nospiests vienādības zīmi. Tas ir arī pludiņš. cursorLocX un cursorLocY ir kartēšanas punkti skārienekrānā, kur kursors ir iestatīts uz vairākām reizēm (tas atrodas pelēkajā joslā augšpusē, citādi pazīstams kā rezultātu lauks).

void setup () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

kvadrāti ();

cipari ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Mūsu iestatīšanas funkcija vispirms ietver skārienekrāna vairoga inicializāciju (1.-3. Rindas). Vairoga orientācija tiek iestatīta, izmantojot komandu tft.setRotation (), un 0 ir vertikāli. Viss ekrāns ir iekrāsots tumši pelēkā krāsā, izmantojot komandu tft.fillScreen (), kuru mēs uzrakstīsim augšpusē (izņemot rezultātu lauku). Funkcijas kvadrāti () un skaitļi () uzzīmē kalkulatora kvadrātus, iekrāso kvadrātus melnbaltā krāsā ar dambretes modeli un uz kvadrātiem raksta skaitļus/operandus zilā krāsā. Mēs nonāksim pie tiem nākamajā solī. Komanda tft.setTextSize () nosaka rezultātu lauka teksta lielumu uz 3, kas ir vidējs fonts. Komanda tft.setTextColor () nosaka rezultātu lauka teksta krāsu uz zilu, kas ir uzrakstīta virs tumši pelēkā lauka.

3. darbība: kods: cilpa

void loop () {numberSelect ();

kavēšanās (100);

ja (user_selection == 16) {

;

} vēl {

ja (user_selection <10) {

saglabāts_numurs = saglabāts_numurs * 10 + lietotāja_izvēle;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (saglabāts_numurs);

} cits if (user_selection> 10) {

slēdzis (user_selection) {

11. gadījums:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

termins1 = saglabāts_numurs;

saglabāts_numurs = 0;

pārtraukums;

12. gadījums:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

termins1 = saglabāts_numurs;

saglabāts_numurs = 0;

pārtraukums;

13. gadījums:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

termins1 = saglabāts_numurs;

saglabāts_numurs = 0;

pārtraukums;

14. gadījums:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

termins1 = saglabāts_numurs;

saglabāts_numurs = 0;

pārtraukums;

15. gadījums:

saglabāts_numurs = 0;

termins1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

pārtraukums;

}

tft.setCursor (cursorLocX, cursorLocY);

Tas ir daudz košļājams, tāpēc es paskaidrošu, kas ir iepriekš. Mēs sākam, izsaucot funkciju numberSelect (), kas katram skārienekrāna kvadrātam piešķir numuru. Kad lietotājs nospiež vienu no šiem kvadrātiem, funkcija nosaka mainīgo user_selection uz kvadrāta numuru. Pirmais, ja paziņojums tiks palaists caur cilpu tikai tad, ja ir veikta derīga lietotāja izvēle. Ja tas tā ir, nākamajā paziņojumā tiek jautāts, vai lietotāja_izvēle ir saglabāts skaitlis, kas mazāks par 10 (skaitļi 0–9). Ja tas notiek, saglabātā_numurs tiek reizināts ar 10 un skaitlis user_selection tiek pievienots sarakstam Save_number, kas tiek izdrukāts skārienekrāna rezultātu laukā. Ja tā nav, nākamajā paziņojumā tiek vaicāts, vai lietotāja_izvēle ir saglabāts skaitlis, kas lielāks par 10 (operandu skaitļi: 11 - +, 12 -, -13, -X, - -14, un -ekrāna skaidram laukumam). Slēdža funkcija rūpējas par katru gadījumu (nosaka user_selection). Mainīgajam op_num tiek dots skaitlis, kas atbilst atlasītajam operandam (1 - +, 2 -, 3 -X un 4 - /). Vērtība Save_number tiek saglabāta mainīgajā terminā1, lai mainīgo Save_number varētu izmantot vienādojuma otrajā pusē. Operanda simbols tiek drukāts uz ekrāna, kā arī tiek dzēsti visi skaitļi rezultātu laukā. Vienīgais izņēmums ir skaidra ekrāna kvadrāts, kas atiestata visus aprēķina mainīgos un attīra rezultātu lauku no visa tajā esošā.

} vēl {

slēdzis (op_num) {

1. gadījums:

rezultāts = termins1 + saglabāts_numurs;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dubultā (rezultāts));

pārtraukums;

2. gadījums:

rezultāts = termins1 - saglabāts_numurs;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dubultā (rezultāts));

pārtraukums;

3. gadījums:

rezultāts = termins1 * saglabāts_numurs;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dubultā (rezultāts));

pārtraukums;

4. gadījums:

rezultāts = pludiņš (termins1) / pludiņš (saglabāts_numurs);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (rezultāts);

pārtraukums;

}

tft.setCursor (cursorLocX, cursorLocY);

saglabāts_numurs = rezultāts;

termins1 = 0;

op_num = 0;

kavēšanās (1000);

}

}

}

Pēdējā cikla daļa attiecas uz notikumu, kad lietotājs izvēlas vienādības zīmi (user_selection == 10). Vēl viena slēdža funkcija darbojas, izmantojot četras matemātiskās funkcijas (nosaka op_num). Pievienošanas gadījums (1. gadījums) saskaita kopā terminu1 un saglabāto_numuru un saglabā rezultātu mainīgajā. Rezultāts tiek izdrukāts rezultātu laukā kā dubults. Atņemšanas gadījums (2. gadījums) no termina1 atņem Save_number un saglabā rezultātu mainīgajā. Rezultāts tiek izdrukāts rezultātu laukā dubultā. Reizināšanas gadījums (3. gadījums) reizina terminu 1 ar saglabāto_numuru un saglabā rezultātu mainīgajā. Rezultāts tiek izdrukāts rezultātu laukā kā divkāršs. Sadalīšanas gadījums (4. gadījums) sadala terminu 1 ar saglabāto_skaitli kopā un saglabā rezultātu mainīgajā. Rezultāts tiek izdrukāts rezultātu laukā kā pludiņš (jo dalījuma atbildes var būt decimāldaļas). Pēc tam, kad ekrānā tiek izdrukāts skaitlis, operands vai rezultāts, kursors tiek atiestatīts, saglabātā_numurs tiek iestatīts uz iepriekšējo rezultātu un tiek atiestatīti termins1 un op_num.

Dažas piezīmes: lietotājs nevar ievadīt kalkulatorā decimāldaļskaitļus, jo trūkst decimāldaļas kvadrāta. Turklāt lietotājs vienlaikus var veikt tikai vienu vienādojumu. Jūs nevarat aprēķināt rezultātu un pēc tam saskaitīt/atņemt/reizināt/dalīt šo rezultātu. Funkcijā numberSelect () ir funkcija, kas notīra ekrānu pēc rezultāta izdrukāšanas, ja lietotājs ir nospiedis citu kvadrātu.

4. solis: kods: kvadrātu funkcija

tukši kvadrāti () {

// melnbaltie kvadrāti mainās katrā rindā, un pirmajai un trešajai rindai ir pretējs raksts nekā otrajai un ceturtajai rindai

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // sākas pirmā kvadrātu rinda, melna līdz balta tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // beidzas pirmā kvadrātu rinda

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // sākas otrā kvadrātu rinda, balta līdz melna tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // beidzas otrā kvadrātu rinda

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // sākas trešā kvadrātu rinda, melna līdz balta tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // beidzas trešā kvadrātu rinda

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // sākas ceturtā kvadrātu rinda, balta līdz melna tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // beidzas ceturtā kvadrātu rinda

}

Funkcija kvadrāti () ir diezgan vienkārša. Komanda tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) uzzīmē taisnstūri atbilstoši tai nodotajiem parametriem, kas ir x un y pirmās pozīcijas, x un y otrās pozīcijas un krāsa, ar kuru taisnstūris ir piepildīts. Šī funkcija uzzīmē visas četras kvadrātu rindas (tehniski taisnstūri) un aizpilda katru kvadrātu ar tai nodoto krāsu.

5. darbība: funkcija Kods: skaitļi

tukši skaitļi () {

tft.setTextColor (TFT_BLUE); // nosaka ciparu/rakstzīmju krāsu uz zilu

tft.setTextSize (5); // nosaka skaitļa/rakstzīmes lielumu uz 5

tft.setCursor (18, 75); // nosaka kursoru pirmajai ciparu/rakstzīmju rindai

tft.print ("7 8 9 /"); // izdrukā pirmo ciparu/rakstzīmju rindu

tft.setCursor (18, 140); // iestata kursoru ciparu/rakstzīmju otrajai rindai

tft.print ("4 5 6 X"); // izdrukā ciparu/rakstzīmju otro rindu

tft.setCursor (18, 205); // iestata kursoru ciparu/rakstzīmju trešajai rindai

tft.print ("1 2 3 -"); // izdrukā trešo ciparu/rakstzīmju rindu

tft.setCursor (18, 270); // nosaka kursoru ceturtajai ciparu/rakstzīmju rindai

tft.print ("C 0 = +"); // izdrukā ceturto ciparu/rakstzīmju rindu

}

Ciparu () funkcija ir arī vienkārša. Pirmās divas rindas nosaka teksta lielumu un krāsu zilā krāsā. Komanda tft.setCursor () nosaka kursoru pozīcijā katrā rindā, no kuras sākas skaitļu rakstīšana. Pēc tam komanda tft.print () izdrukā ciparus/rakstzīmes virs laukumiem.

6. darbība: kods: numursSelect Function

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

ja (p.z> MINPRESSURE) {

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

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

ja (rezultāts! = 0) {

rezultāts = 0;

saglabāts_numurs = 0;

tft.print ("Skaidras vērtības");

kavēšanās (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Lai sāktu funkciju numberSelect (), mēs lūdzam lietotāja ievadi no skārienekrāna ar komandu ts.getPoint (). Kad šie dati ir savākti, mēs pārbaudām, vai nav pārsniegts minimālais spiediens (vai, citiem vārdiem sakot, vai lietotājs ir nospiedis kaut kur uz skārienekrāna). Ja tā ir, x un y koordinātas tiek kartētas no Dekarta koordinātām uz skārienekrānam raksturīgām koordinātām. (0, 0) ir skārienekrāna augšējais kreisais stūris, kur x ass iet pāri un y ass iet uz leju. Nākamā daļa pārbauda, vai rezultātā ir saglabāts numurs. Ja ir, rezultāts un saglabātais_numurs tiek atiestatīti uz 0. Rezultātu laukā tiek izdrukāts ziņojums "TĪRĪT VĒRTĪBAS", un ekrāns tiek notīrīts ar kursoru atpakaļ sākuma stāvoklī.

ja (p.y 60) {// pirmā kvadrātu rinda

ja (px <60)

user_selection = 7;

citādi, ja (p.x <120)

user_selection = 8;

citādi, ja (p.x <180)

user_selection = 9;

cits user_selection = 14;

} cits if (p.y 125) {// otrā kvadrātu rinda

ja (px <60)

user_selection = 4;

citādi, ja (p.x <120)

user_selection = 5;

citādi, ja (p.x <180)

user_selection = 6;

cits user_selection = 13;

} cits if (p.y 190) {// trešā kvadrātu rinda

ja (px <60)

user_selection = 1;

citādi, ja (p.x <120)

user_selection = 2;

citādi, ja (p.x <180)

user_selection = 3;

cits user_selection = 12;

} cits if (p.y> 255) {// ceturtā kvadrātu rinda

ja (px <60)

user_selection = 15;

citādi, ja (p.x <120)

user_selection = 0;

citādi, ja (p.x <180)

user_selection = 10;

cits user_selection = 11;

}

} vēl {

user_selection = 16; // user_selection ir iestatīts uz 16 (nekas nav mainīgs)

}

}

Šī ir daļa, kas nosaka, kura poga ir izvēlēta. Sākot ar augšējo kvadrātu rindu un beidzot ar apakšējo rindu, Arduino meklē vietu, kur ekrāns faktiski tika nospiests. Pēc tam tas kvadrātam piešķir skaitli un saglabā šo numuru lietotāja atlasē. Skaitļi 0-9 atbilst skaitļu kvadrātiem, skaitļi 11-15-operandu kvadrātiem un skaidrajam kvadrātam, bet skaitlis 10-vienādības zīmes kvadrātam. Ja nav atlasīts kvadrāts, tad lietotāja_izvēle ir iestatīta uz 16, kas liks ciklam sākt no jauna (sk. Cilpas funkciju).

7. solis: izbaudiet pabeigto projektu

Tur jums tas ir! Tagad jums ir skārienekrāna kalkulators, kas var veikt saskaitīšanu, atņemšanu, reizināšanu un dalīšanu. Šis projekts mainīja visu veidu, kā es domāju, ka kalkulators darbojas. Strādājot pie šī projekta, atceros, ka stundā savam instruktoram teicu: "Es nekad vairs neskatīšos uz kalkulatoru tāpat!" Funkcijas, kuras jūs kā lietotājs uzskatāt par vienkāršām, ir nedaudz sarežģītas, ja atrodaties aiz datora, mēģinot atdarināt savu ideju. Es ceru, ka jums patika projekts, un es ceru, ka ir mainījusies arī jūsu domāšana par to, kā darbojas kalkulators!

Šeit ir viss kods jūsu ērtībai. Tas ir piepildīts ar komentāriem, tādēļ, ja jums rodas kādas problēmas, viņiem jāparāda, ko katra rinda dara.

Ieteicams: