Tartalomjegyzék:

Arduino érintőképernyős számológép: 7 lépés
Arduino érintőképernyős számológép: 7 lépés

Videó: Arduino érintőképernyős számológép: 7 lépés

Videó: Arduino érintőképernyős számológép: 7 lépés
Videó: Mind-boggling Arduino touchscreen artwork #arduino #electronics #electrician #elektronik #engineer 2024, November
Anonim
Arduino érintőképernyős számológép
Arduino érintőképernyős számológép

Helló! Ez a projekt egy érintőképernyős számológép készítése Arduino Uno és TFT LCD pajzs használatával. Az otthoni iskolai programozási órámhoz találtam ki a koncepciót, és a projekt felépítésében szerzett tapasztalatok nagyon érdekesek voltak. Ez a számológép elvégezheti a négy egyszerű matematikai műveletet (összeadás, kivonás, szorzás és osztás). Ezenkívül legfeljebb két tizedes pontot jelenít meg a megosztási válaszokhoz. Merüljünk rögtön! Az alábbiakban felsoroljuk a projekthez szükséges kellékeket.

Kellékek

- Arduino Uno

-2.4 TFT LCD pajzs (itt vettem:

- USB A -B kábel (kábel az Arduino csatlakoztatásához a számítógéphez)

- Számítógép telepítve Arduino IDE -vel

- Két könyvtárat is le kell töltenie: MCUFRIEND_kbv és érintőképernyőt. Az elsőt megtalálhatja a github -on (link: https://github.com/prenticedavid/MCUFRIEND_kbv), vagy használhatja a könyvtár zip fájlját, amelyet alább tettem fel. A második az Arduino könyvtárkezelőben található a telepítéshez.

1. lépés: Hardverkapcsolatok

Hardver kapcsolatok
Hardver kapcsolatok
Hardver kapcsolatok
Hardver kapcsolatok
Hardver kapcsolatok
Hardver kapcsolatok

Az érintőképernyő -pajzs csatlakoztatása az Arduino Uno -hoz egyszerű és gyors. Mindössze annyit kell tennie, hogy a pajzs legalacsonyabb csapjait az Arduino legalacsonyabb csapjaival sorakoztatja, és a pajzsot a csapokba nyomja. A felső 5 V -os és a címkézetlen tűk a tápoldalon nem lehetnek tűk a pajzsból, ugyanazok a paraméterek érvényesek a tábla másik oldalán lévő SCL és SDA feliratú csapokra. Most készen állunk a kódolásra!

2. lépés: A kód: Globális definíciók és beállítás

#befoglalni

MCUFRIEND_kbv tft; // UNO pajzsokhoz amúgy is bekötött

#befoglalni

#define YP A3

#define XM A2

#define YM 9

#define XP 8

Érintőképernyő ts = Érintőképernyő (XP, YP, XM, YM, 300);

#define MINPRESSURE 10

Ez a kód kezdete, ahol könyvtárakat (MCUFRIEND_kbv és érintőképernyő) is magába foglalunk, meghatározzuk az X és Y csapokat, beállítjuk az érintőképernyő paramétereit, és meghatározzuk a minimális nyomást, amely szükséges az Arduino számára a felhasználói sajtó regisztrálásához.

int azonosító;

int user_selection;

úszó mentett_szám = 0;

lebegő kifejezés1;

int op_num;

lebegési eredmény;

int kurzorLocX = 5;

int cursorLocY = 20;

Közvetlenül a beállítás előtt be kell állítanunk néhány globális változót. Az ID segít az érintőképernyő üzembe helyezésében. A user_selection olyan számot tartalmaz, amely megfelel annak a gombnak, amelyet a felhasználó az érintőképernyő megnyomásakor választ. save_number az a változó, amelyet a felhasználó beírása után nyomtatunk a képernyőre (erről bővebben a ciklusban). Ez egy úszó, így tizedes számokat és egész számokat is tartalmazhat. a term1 az a változó, amelybe az egyenlet első száma mentésre kerül egy operandus kiválasztása után. Az op_num az operandust számként menti (1 összeadáshoz, 2 kivonáshoz, 3 szorzáshoz és 4 osztáshoz). Az eredmény az a változó, amely a képernyőre nyomtatódik, miután a felhasználó megnyomta az egyenlőségjelet. Ez is úszó. cursorLocX és cursorLocY azok a leképezési pontok az érintőképernyőn, ahol a kurzort többszörösre állítják (a felső szürke sávban található, más néven eredménymező).

void setup () {

tft.reset ();

Azonosító = tft.readID ();

tft.begin (azonosító);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

négyzetek();

számok ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

A beállítási funkciónk először az érintőképernyő-pajzs inicializálását tartalmazza (1-3. Sor). Az árnyékolás tájolása a tft.setRotation () paranccsal állítható be, a 0 függőleges helyzetben. A teljes képernyő sötétszürke színű a tft.fillScreen () paranccsal, amelyet a tetejére írunk (kivéve az eredmény mezőt). A négyzetek () és a számok () függvények megrajzolják a számológép négyzeteit, a kockákat fekete -fehérre színezik egy sakktábla mintával, és számokat/operandusokat írnak kék színnel a négyzetekre. A következő lépésben ezekhez jutunk. A tft.setTextSize () parancs az eredménymező szövegméretét 3 -ra állítja, ami közepes betűtípus. A tft.setTextColor () parancs az eredménymező szöveg színét kékre állítja, amely a sötétszürke mezőre van írva.

3. lépés: A kód: Loop

void loop () {numberSelect ();

késleltetés (100);

if (user_selection == 16) {

;

}más{

if (user_selection <10) {

mentett_szam = mentett_szam * 10 + user_selection;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (mentett_szám);

} else if (user_selection> 10) {

kapcsoló (user_selection) {

11. eset:

op_szám = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

kifejezés1 = mentett_szám;

mentett_szám = 0;

szünet;

12. eset:

op_szám = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

kifejezés1 = mentett_szám;

mentett_szám = 0;

szünet;

13. eset:

op_szám = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

kifejezés1 = mentett_szám;

mentett_szám = 0;

szünet;

14. eset:

op_szám = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

kifejezés1 = mentett_szám;

mentett_szám = 0;

szünet;

15. eset:

mentett_szám = 0;

kifejezés 1 = 0;

op_szám = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

szünet;

}

tft.setCursor (cursorLocX, cursorLocY);

Ez sokat rágható, ezért elmagyarázom a fentieket. Kezdjük a numberSelect () függvény hívásával, amely egy számot rendel az érintőképernyő minden négyzetéhez. Amikor a felhasználó megnyomja az egyik négyzetet, a függvény a user_selection változót a négyzet számára állítja. Az első if utasítás csak akkor fut végig a cikluson, ha érvényes felhasználói választás történt. Ha igen, akkor a következő if utasítás megkérdezi, hogy a user_selection 10-nél kisebb számot tartalmaz-e (0-9 számok). Ha igen, a mentett_számot megszorozzuk 10 -zel, és a user_selection mezőben szereplő számot hozzáadjuk a mentett_számhoz, amelyet az érintőképernyő eredménymezőjében nyomtatunk. Ha nem, akkor a következő if utasítás megkérdezi, hogy a user_selection 10 -nél nagyobb számot tartalmaz -e (az operandusok száma: 11 +, 12 - -, 13 -X, 14 - /és 15 -tiszta képernyő négyzet). Egy kapcsoló funkció gondoskodik minden esetről (a user_selection határozza meg). Az op_num változó a kiválasztott operandusnak megfelelő számot kap (1 +, 2 -, 3, X és 4 a /). A save_number értékét a rendszer az 1. változóba menti, így a save_number változó használható az egyenlet második felére. Az operandus szimbólum megjelenik a képernyőn, és törli a számokat az eredménymezőben. Az egyetlen kivétel a tiszta képernyő négyzet, amely alaphelyzetbe állítja az összes számítási változót, és törli az eredménymezőt.

}más{

kapcsoló (op_num) {

1. eset:

eredmény = kifejezés1 + mentett_szám;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dupla (eredmény));

szünet;

2. eset:

eredmény = kifejezés1 - mentett_szám;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dupla (eredmény));

szünet;

3. eset:

eredmény = kifejezés1 * mentett_szám;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (dupla (eredmény));

szünet;

4. eset:

eredmény = lebegés (kifejezés 1) / lebegés (mentett_szám);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (eredmény);

szünet;

}

tft.setCursor (cursorLocX, cursorLocY);

mentett_szám = eredmény;

kifejezés 1 = 0;

op_szám = 0;

késleltetés (1000);

}

}

}

A ciklus utolsó része azzal az eseménysel foglalkozik, amikor a felhasználó kiválasztja az egyenlőségjelet (user_selection == 10). Egy másik kapcsolófunkció a négy matematikai függvényen keresztül működik (op_num határozza meg). Az összeadási eset (1. eset) összeadja az 1. kifejezést és a mentett_számot, és elmenti a számot az eredményváltozóba. Az eredményt duplán nyomtatja az eredménymezőbe. A kivonási eset (2. eset) kivonja a save_number értéket az 1. kifejezésből, és elmenti a számot az eredményváltozóba. Az eredményt duplán nyomtatja az eredménymezőbe. A szorzási eset (3. eset) megszorozza az 1. kifejezést a mentett_számmal, és elmenti a számot az eredményváltozóba. Az eredményt duplán nyomtatja az eredménymezőbe. Az osztási eset (4. eset) elosztja az 1. kifejezést a mentett_számmal, és elmenti a számot az eredményváltozóba. Az eredményt úszóként nyomtatja az eredménymezőbe (mert az osztási válaszok tizedes számok is lehetnek). Miután egy számot, operandust vagy eredményt nyomtatott a képernyőre, a kurzor visszaáll, a mentett_szám az előző eredményre van állítva, és az 1. és op_szám visszaáll.

Néhány megjegyzés: a felhasználó nem írhatja be a tizedes számokat a számológépbe a tizedesjegy négyzet hiánya miatt. Ezenkívül a felhasználó egyszerre csak egy egyenletet hajthat végre. Nem tudja kiszámítani az eredményt, majd összeadni/kivonni/szorozni/osztani. A numberSelect () függvényben van egy funkció, amely törli a képernyőt az eredmény kinyomtatása után, ha a felhasználó megnyomott egy másik négyzetet.

4. lépés: A kód: négyzetfüggvény

üres négyzetek () {

// fekete -fehér négyzetek váltakoznak minden sorban, és az első és a harmadik sor ellentétes mintázatú, mint a második és a negyedik sor

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // az első négyzetsor kezdődik, fekete -fehér tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // az első négyzetsor véget ér

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // második négyzetsor kezdődik, fehértől feketeig tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // a második négyzetsor véget ér

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // a harmadik négyzetsor kezdődik, feketétől fehérig tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // a harmadik négyzetsor véget ér

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // a negyedik négyzetsor kezdődik, fehértől feketeig tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // a negyedik négyzetsor véget ér

}

A négyzetek () függvény meglehetősen egyszerű. A tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) parancs egy téglalapot rajzol a hozzá átadott paraméterek szerint, amelyek x és y első pozíciói, x és y második pozíciói, valamint a szín, amellyel a téglalap kitöltődik.. Ez a funkció lerajzolja mind a négy sor négyzetet (technikailag téglalapokat), és minden négyzetet kitölt a hozzá adott színnel.

5. lépés: A kód: számok függvény

érvénytelen számok () {

tft.setTextColor (TFT_BLUE); // a szám/karakter színét kékre állítja

tft.setTextSize (5); // a szám/karakter méretét 5 -re állítja

tft.setCursor (18, 75); // beállítja a kurzort a számok/karakterek első sorához

tft.print ("7 8 9 /"); // kinyomtatja a számok/karakterek első sorát

tft.setCursor (18, 140); // beállítja a kurzort a számok/karakterek második sorához

tft.print ("4 5 6 X"); // kinyomtatja a számok/karakterek második sorát

tft.setCursor (18, 205); // beállítja a kurzort a számok/karakterek harmadik sorához

tft.print ("1 2 3 -"); // kinyomtatja a számok/karakterek harmadik sorát

tft.setCursor (18, 270); // beállítja a kurzort a számok/karakterek negyedik sorához

tft.print ("C 0 = +"); // kinyomtatja a számok/karakterek negyedik sorát

}

A számok () függvény is egyszerű. Az első két sorban a szöveg mérete nagyobb, a színe pedig kék. A tft.setCursor () parancs a kurzort arra a sorra állítja, ahol a számok írása kezdődik. Ezután a tft.print () parancs kinyomtatja a számokat/karaktereket a négyzetekre.

6. lépés: A kód: NumberSelect Function

void numberSelect () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

ha (p.z> MINPRESSURE) {

p.x = térkép (p.x, 250, 845, 0, 239);

p.y = térkép (p.y., 245, 860, 0, 319);

if (eredmény! = 0) {

eredmény = 0;

mentett_szám = 0;

tft.print ("TISZTA ÉRTÉKEK");

késleltetés (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

A numberSelect () függvény elindításához kérjük, hogy a felhasználó írja be az érintőképernyőt a ts.getPoint () paranccsal. Miután ezeket az adatokat összegyűjtöttük, ellenőrizzük, hogy túllépték -e a minimális nyomást (vagy más szóval, ha a felhasználó megnyomta valahol az érintőképernyőt). Ha igen, akkor az x és y koordinátákat a derékszögű koordinátákról az érintőképernyő-specifikus koordinátákra képezi le. (0, 0) az érintőképernyő bal felső sarka, ahol az x tengely átmegy, az y tengely pedig lefelé. A következő rész ellenőrzi, hogy van -e mentett szám az eredményben. Ha van, akkor az eredmény és a mentett_szám 0 -ra áll vissza. Az "ÉRTÉKEK TISZTÍTÁSA" üzenet az eredménymezőre kerül nyomtatásra, és a képernyő törlődik a kurzorral a kiindulási helyzetébe.

if (p.y. 60) {// első négyzetsor

ha (px x 60)

user_selection = 7;

egyébként ha (px x 120)

user_selection = 8;

egyébként ha (px x 180)

user_selection = 9;

else user_selection = 14;

} else if (p. 125) {// második négyzetsor

ha (px x 60)

user_selection = 4;

egyébként ha (px x 120)

user_selection = 5;

egyébként ha (px x 180)

user_selection = 6;

else user_selection = 13;

} else if (p.y. 190) {// harmadik négyzetsor

ha (px x 60)

user_selection = 1;

egyébként ha (px x 120)

user_selection = 2;

egyébként ha (px x 180)

user_selection = 3;

else user_selection = 12;

} else if (p.y> 255) {// negyedik négyzetsor

ha (px x 60)

user_selection = 15;

egyébként ha (px x 120)

user_selection = 0;

egyébként ha (px x 180)

user_selection = 10;

else user_selection = 11;

}

}más{

user_selection = 16; // a user_selection értéke 16 (semmi változó)

}

}

Ez az a rész, amely meghatározza, hogy melyik gombot választotta ki. A négyzetek felső sorával kezdve az alsó sorral végződve az Arduino megkeresi, hogy valójában hol volt megnyomva a képernyő. Ezután egy számot rendel a négyzethez, és elmenti azt a user_selection mappába. A 0-9 számok a négyzetek számának felelnek meg, a 11-15 számok az operandus négyzeteknek és a tiszta négyzetnek, a 10 szám pedig az egyenlőségjel négyzetnek. Ha nincs négyzet kiválasztva, akkor a user_selection 16 -ra van állítva, aminek hatására a ciklus újra kezdődik (lásd ciklusfüggvény).

7. lépés: Élvezze a befejezett projektet

Tessék, itt van! Most van egy érintőképernyős számológépe, amely összeadást, kivonást, szorzást és osztást végezhet. Ez a projekt teljesen megváltoztatta azt, ahogyan azt gondoltam, hogy egy számológép működik. Miközben ezen a projekten dolgoztam, emlékszem, hogy az órán azt mondtam az oktatómnak: "Soha többé nem nézem ugyanúgy a számológépet!" A felhasználók által egyszerűnek tartott funkciók némileg bonyolultak, ha a számítógép mögött áll, és megpróbálja utánozni az elképzelését. Remélem, tetszett a projekt, és remélem, hogy a számológép működésével kapcsolatos gondolkodásmódja is megváltozott!

Íme a teljes kód az Ön kényelme érdekében. Tele van megjegyzésekkel, így ha bármilyen problémája van, meg kell mutatniuk, mit tesznek az egyes sorok.

Ajánlott: