Բովանդակություն:

Arduino Touchscreen Հաշվիչ ՝ 7 քայլ
Arduino Touchscreen Հաշվիչ ՝ 7 քայլ

Video: Arduino Touchscreen Հաշվիչ ՝ 7 քայլ

Video: Arduino Touchscreen Հաշվիչ ՝ 7 քայլ
Video: How to Make PLC LCD HMI || FLProg 2024, Նոյեմբեր
Anonim
Arduino սենսորային էկրանի հաշվիչ
Arduino սենսորային էկրանի հաշվիչ

Բարեւ Ձեզ! Սա Arduino Uno- ի և TFT LCD վահանի միջոցով սենսորային հաշվիչ ստեղծելու նախագիծ է: Ես մշակեցի իմ տնային ծրագրավորման դասի հայեցակարգը, և այս նախագիծը կառուցելու փորձը շատ հետաքրքիր էր: Այս հաշվիչը կարող է կատարել չորս պարզ մաթեմատիկական գործողություններ (գումարում, հանում, բազմապատկում և բաժանում): Այն նաև ցուցադրում է մինչև երկու տասնորդական կետ `դրանք ունեցող բաժանման պատասխանների համար: Եկեք սուզվենք անմիջապես: Այս նախագծի մատակարարումները թվարկված են ստորև:

Պարագաներ

- Արդուինո Ունո

-2.4 TFT LCD Shield (ահա որտեղից եմ այն գնել ՝

- USB A- ից B մալուխ (լար Arduino- ին համակարգչին միացնելու համար)

- Տեղադրված է Arduino IDE համակարգիչ

- Դուք նաև պետք է ներբեռնեք երկու գրադարան ՝ MCUFRIEND_kbv և Touchscreen: Առաջինը կարող եք գտնել github- ում (հղում ՝ https://github.com/prenticedavid/MCUFRIEND_kbv) կամ կարող եք օգտագործել գրադարանի zip ֆայլը, որը ես ներառել եմ ստորև: Երկրորդը տեղադրման համար գտնվում է Arduino գրադարանի մենեջերում:

Քայլ 1: Սարքավորման միացումներ

Սարքավորումների միացումներ
Սարքավորումների միացումներ
Սարքավորումների միացումներ
Սարքավորումների միացումներ
Սարքավորումների միացումներ
Սարքավորումների միացումներ

Սենսորային վահանի միացումը Arduino Uno- ին պարզ և արագ է: Մնում է միայն վահանի ամենացածր կապում շարել Arduino- ի ամենացածր կապումներով և վահանը քորոցների մեջ մղել: Վերին 5 Վ -ի քորոցը և հոսանքի կողմում չպիտակված քորոցը չպետք է ունենան վահանի կապիչներ, տախտակի մյուս կողմում SCL և SDA պիտակներով նույն պարամետրերի դեպքում: Այժմ, մենք պատրաստ ենք ծածկագրել:

Քայլ 2: Կոդ. Գլոբալ սահմանումներ և կարգավորում

#ներառում

MCUFRIEND_kbv tft; // UNO վահանների համար, ամեն դեպքում, լարված:

#ներառում

#սահմանել YP A3- ը

#սահմանի XM A2

#սահմանել YM 9

#սահմանեք XP 8 -ը

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

#սահմանել ՄԻՆՊՐՈՍՈԹՅՈՆ 10

Սա կոդի սկիզբն է, որտեղ մենք ներառում ենք գրադարաններ (MCUFRIEND_kbv & Touchscreen), սահմանում ենք X և Y կապում, կարգավորում ենք սենսորային էկրանի պարամետրերը և սահմանում նվազագույն ճնշումը, որն անհրաժեշտ է Arduino- ին `օգտվողի մամուլ գրանցելու համար:

int ID;

int user_selection;

բոց փրկված_թիվ = 0;

float term1;

int op_num;

լողացող արդյունք;

int cursorLocX = 5;

int cursorLocY = 20;

Տեղադրումից անմիջապես առաջ մենք պետք է որոշ գլոբալ փոփոխականներ ստեղծենք: ID- ն օգնում է գործարկել սենսորային էկրանը: user_selection- ը պահում է մի շարք, որը համապատասխանում է այն ստեղնին, որն ընտրում է օգտվողը սենսորային էկրանին սեղմելիս: save_number- ը այն փոփոխականն է, որը մենք տպում ենք էկրանին օգտվողի մուտքից հետո (այս մասին ավելին ՝ օղակում): Այն բոց է, այնպես որ կարող է պահել տասնորդական թվեր, ինչպես նաև ամբողջ թվեր: term1- ը այն փոփոխականն է, որում հավասարման առաջին թիվը պահվում է օպերանդի ընտրությունից հետո: op_num- ը օպերանդը պահում է որպես թիվ (1 -ը ՝ գումարման, 2 -ը ՝ հանման, 3 -ը ՝ բազմապատկման և 4 -ը ՝ բաժանման համար): արդյունքը այն փոփոխականն է, որը տպվում է էկրանին այն բանից հետո, երբ օգտատերը սեղմել է հավասարության նշանը: Այն նաեւ բոց է: cursorLocX- ը և cursorLocY- ը սենսորային էկրանի քարտեզագրման կետերն են, որտեղ կուրսորը բազմապատկված է (այն գտնվում է վերևի մոխրագույն բարում, այլապես հայտնի է որպես արդյունքների դաշտ):

void setup () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

քառակուսիներ ();

թվեր ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Մեր կարգաբերման գործառույթը նախ պարունակում է հպման էկրանի վահանի նախաստորագրում (տողեր 1-3): Վահանի կողմնորոշումը սահմանվում է tft.setRotation () հրամանի միջոցով, 0 -ն ուղղահայաց է: Ամբողջ էկրանը մուգ մոխրագույն է tft.fillScreen () հրամանով, որը մենք կգրենք վերևում (բացառությամբ արդյունքների դաշտի): Քառակուսիներ () և թվեր () գործառույթները գծում են հաշվիչի քառակուսիները, սև ու սպիտակ քառակուսիները գունավորում են շախմատային տախտակի տեսքով, իսկ քառակուսիների վրա կապույտ գույնով գրում թվեր/օպերանդներ: Մենք հաջորդ քայլին կհասնենք նրանց: Tft.setTextSize () հրամանը արդյունքների դաշտի տեքստի չափը սահմանում է 3, որը միջին տառատեսակ է: Tft.setTextColor () հրամանը արդյունքների դաշտի տեքստի գույնը սահմանում է կապույտ, որը գրված է մուգ մոխրագույն դաշտի վրա:

Քայլ 3: Կոդ. Օղակ

void loop () {numberSelect ();

ուշացում (100);

եթե (user_selection == 16) {

;

} ուրիշ {

եթե (օգտվողի ընտրություն <10) {

փրկված_թիվ = պահված_թիվ * 10 + օգտվողի_ընտրություն;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (պահված_թիվ);

} else if (user_selection> 10) {

անջատիչ (օգտվողի_ընտրություն) {

գործ 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

տերմին 1 = պահված_թիվ;

պահված_թիվ = 0;

ընդմիջում;

դեպք 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

տերմին 1 = պահված_թիվ;

պահված_թիվ = 0;

ընդմիջում;

գործ 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

տերմին 1 = պահված_թիվ;

խնայված_թիվ = 0;

ընդմիջում;

գործ 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

տերմին 1 = պահված_թիվ;

խնայված_թիվ = 0;

ընդմիջում;

գործ 15:

պահված_թիվ = 0;

տերմին 1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

ընդմիջում;

}

tft.setCursor (cursorLocX, cursorLocY);

Սա շատ բան է ծամելու, այնպես որ ես կբացատրեմ վերը նշվածը: Մենք սկսում ենք կանչել numberSelect () ֆունկցիան, որը մի շարք է վերագրում սենսորային էկրանի յուրաքանչյուր քառակուսուն: Երբ օգտվողը սեղմում է այդ քառակուսիներից մեկը, գործառույթը user_selection փոփոխականը դնում է քառակուսի թվի վրա: Առաջին if հայտարարությունը պետք է անցնի միայն օղակով, եթե օգտագործողի վավեր ընտրություն է կատարվել: Եթե այդպես է, հաջորդ if հայտարարությունը հարցնում է, թե արդյոք user_selection- ում պահպանված է 10-ից փոքր թիվ (0-9 համարները): Եթե դա այդպես լինի, պահված_թիվը բազմապատկվում է 10 -ով, և օգտվողի ընտրության թիվը ավելացվում է պահված_թվին, որը տպված է սենսորային էկրանի արդյունքների դաշտում: Եթե դա այդպես չէ, հաջորդ if հայտարարությունը հարցնում է, թե արդյոք user_selection- ում պահպանված է 10 -ից ավելի մեծ թիվ (օպերանդի համարները ՝ 11 -ը +, 12 -ը -, 13 -ը X- ի համար, 14 -ը /և 15 -ը `հստակ էկրանի քառակուսու համար:): Անջատիչի գործառույթը հոգում է յուրաքանչյուր դեպքի մասին (որոշվում է օգտագործողի_ընտրությամբ): Op_num փոփոխականին տրվում է մի շարք, որը համապատասխանում է ընտրված օպերանդին (1 + -ի համար, 2 -ի համար, 3 -ը X- ի համար, և 4 -ը ` /): Պահված_թվաքանակի արժեքը պահվում է փոփոխական տերմինի մեջ 1 այնպես, որ պահված_թվային փոփոխականը կարող է օգտագործվել հավասարման երկրորդ կեսի համար: Օպերանդի խորհրդանիշը տպվում է էկրանին `արդյունքների դաշտում ցանկացած թվեր ջնջելու հետ միասին: Միակ բացառությունը մաքուր էկրանի քառակուսին է, որը վերականգնում է հաշվարկման բոլոր փոփոխականները և մաքրում արդյունքների դաշտը դրա վրա եղած որևէ բանից:

} ուրիշ {

անջատիչ (op_num) {

դեպք 1:

արդյունք = տերմին 1 + պահված_թիվ;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (կրկնակի (արդյունք));

ընդմիջում;

դեպք 2:

արդյունք = տերմին 1 - պահված_թիվ;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (կրկնակի (արդյունք));

ընդմիջում;

դեպք 3:

արդյունք = տերմին 1 * պահված_թիվ;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (կրկնակի (արդյունք));

ընդմիջում;

դեպք 4:

արդյունք = բոց (տերմին 1) / բոց (պահված_թիվ);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (արդյունք);

ընդմիջում;

}

tft.setCursor (cursorLocX, cursorLocY);

փրկված_թիվ = արդյունք;

տերմին 1 = 0;

op_num = 0;

ուշացում (1000);

}

}

}

Օղակի վերջին մասը վերաբերում է օգտվողի ՝ հավասարության նշանը ընտրելու իրադարձությանը (user_selection == 10): Մեկ այլ անջատիչ գործառույթ աշխատում է չորս մաթեմատիկական գործառույթների միջոցով (որոշվում է op_num- ով): Լրացման գործը (դեպք 1) ավելացնում է term1- ը և պահված_թիվը միասին և թիվը պահում արդյունքի փոփոխականի մեջ: Արդյունքը տպվում է արդյունքների դաշտում կրկնակի: Հանումի գործը (դեպք 2) հանում է պահված_թիվը տերմինից 1 -ից և թիվը պահում արդյունքի փոփոխականի մեջ: Արդյունքը տպվում է արդյունքների դաշտում կրկնակի տեսքով: Բազմապատկման գործը (դեպք 3) բազմապատկում է տերմինը 1 պահված_թվով և թիվը պահում արդյունքի փոփոխականի մեջ: Արդյունքը տպվում է արդյունքների դաշտում կրկնակի: Բաժանման գործը (դեպք 4) կիսում է տերմինը 1 խնայված_թվով միասին և թիվը պահում արդյունքի փոփոխականի մեջ: Արդյունքը տպվում է արդյունքների դաշտում որպես բոց (քանի որ բաժանման պատասխանները կարող են լինել տասնորդական թվեր): Թիվը, օպերանդը կամ արդյունքը էկրանին տպվելուց հետո կուրսորը զրոյացվում է, պահված_թիվը դրվում է նախորդ արդյունքի վրա, իսկ տերմինը 1 & op_num- ը վերակայվում է:

Մի քանի նշում. Օգտագործողը չի կարող տասնորդական թվեր մուտքագրել հաշվիչ `տասնորդական կետի քառակուսի բացակայության պատճառով: Բացի այդ, օգտագործողը կարող է միաժամանակ կատարել միայն մեկ հավասարություն: Դուք չեք կարող հաշվարկել արդյունքը, այնուհետև ավելացնել/հանել/բազմապատկել/բաժանել այդ արդյունքը: NumberSelect () գործառույթում կա մի գործառույթ, որը մաքրում է էկրանը արդյունքը տպելուց հետո, եթե օգտագործողը սեղմել է մեկ այլ քառակուսի:

Քայլ 4: Կոդ. Քառակուսիների գործառույթ

դատարկ քառակուսիներ () {

// Սև և սպիտակ քառակուսիները փոխարինվում են յուրաքանչյուր տողում, և առաջին և երրորդ տողերն ունեն հակառակ օրինաչափություն, քան երկրորդ և չորրորդ տողերը

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // սկսվում է քառակուսիների առաջին շարքը ՝ սևից սպիտակ tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // ավարտվում է քառակուսիների առաջին շարքը

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // սկսվում է քառակուսիների երկրորդ շարքը ՝ սպիտակից մինչև սև tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // ավարտվում է քառակուսիների երկրորդ շարքը

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // սկսվում է քառակուսիների երրորդ շարքը ՝ սևից սպիտակ tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // ավարտվում է քառակուսիների երրորդ շարքը

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // սկսվում է քառակուսիների չորրորդ շարքը ՝ սպիտակից մինչև սև tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // ավարտվում է քառակուսիների չորրորդ շարքը

}

Քառակուսիների () գործառույթը բավականին պարզ է: Tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) հրամանը նկարում է ուղղանկյուն ՝ ըստ իրեն փոխանցված պարամետրերի, որոնք են x և y- ի առաջին դիրքերը, x և y- ի երկրորդ դիրքերը և գույնը, որով լցված է ուղղանկյունը:. Այս գործառույթը գծում է քառակուսիների բոլոր չորս շարքերը (տեխնիկապես ուղղանկյուններ) և յուրաքանչյուր քառակուսին լրացնում է իրեն փոխանցված գույնով:

Քայլ 5: Կոդ. Թվերի գործառույթ

դատարկ թվեր () {

tft.setTextColor (TFT_BLUE); // համարը/բնույթի գույնը սահմանում է կապույտ

tft.setTextSize (5); // թիվը/նիշի չափը սահմանում է 5

tft.setCursor (18, 75); // սահմանում է կուրսորը թվերի/նիշերի առաջին տողի համար

tft.print ("7 8 9 /"); // տպում է թվերի/նիշերի առաջին տողը

tft.setCursor (18, 140); // սահմանում է կուրսորը թվերի/նիշերի երկրորդ տողի համար

tft.print («4 5 6 X»); // տպում է թվերի/նիշերի երկրորդ տողը

tft.setCursor (18, 205); // սահմանում է կուրսորը թվերի/նիշերի երրորդ տողի համար

tft.print ("1 2 3 -"); // տպում է թվերի/նիշերի երրորդ տողը

tft.setCursor (18, 270); // սահմանում է կուրսորը թվերի/նիշերի չորրորդ տողի համար

tft.print ("C 0 = +"); // տպում է թվերի/նիշերի չորրորդ տողը

}

Թվերի () գործառույթը նույնպես պարզ է: Առաջին երկու տողերում տեքստի չափը ավելի մեծ է, իսկ գույնը `կապույտ: Tft.setCursor () հրամանը կուրսորը դնում է յուրաքանչյուր տողի դիրքի վրա, որտեղից սկսվում է թվերի գրառումը: Այնուհետեւ tft.print () հրամանը տպում է թվերը/նիշերը քառակուսիների վրա:

Քայլ 6: Կոդը ՝ NumberSelect գործառույթը

դատարկ համար Ընտրել () {

TSPoint p = ts.getPoint ();

pinMode (XM, OUTPUT);

pinMode (YP, OUTPUT);

եթե (p.z> MINPRESSURE) {

p.x = քարտեզ (p.x, 250, 845, 0, 239);

p.y = քարտեզ (p.y, 245, 860, 0, 319);

եթե (արդյունք! = 0) {

արդյունք = 0;

պահված_թիվ = 0;

tft.print («Մաքուր արժեքներ»);

ուշացում (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

NumberSelect () գործառույթը գործարկելու համար մենք ts.getPoint () հրամանի միջոցով դիպչում ենք էկրանի օգտագործողի մուտքը: Երբ այդ տվյալները հավաքվեն, մենք ստուգում ենք, թե արդյոք նվազագույն ճնշումը գերազանցվել է (կամ, այլ կերպ ասած, եթե օգտագործողը սեղմել է հպման էկրանին ինչ -որ տեղ): Եթե այդպես է, ապա x և y կոորդինատները քարտեզային կոորդինատներից քարտեզագրվում են դիպչող էկրանին հատուկ կոորդինատներին: (0, 0) սենսորային էկրանի վերին ձախ անկյունն է, որի առանցքը x- ով անցնում է, իսկ y առանցքը ՝ ներքև: Հաջորդ մասը ստուգում է ՝ արդյո՞ք արդյունքում պահպանված թիվ կա: Եթե կա, արդյունքը և պահված_թիվը վերակայվում են 0 -ի: «Մաքրել արժեքներ» հաղորդագրությունը տպվում է արդյունքների դաշտում, և էկրանը մաքրվում է կուրսորը հետ վերադարձնելով իր սկզբնական դիրքին:

եթե (էջ 60) {// քառակուսիների առաջին շարքը

եթե (p.x <60)

օգտվողի ընտրություն = 7;

հակառակ դեպքում (p.x <120)

օգտվողի ընտրություն = 8;

այլապես (p.x <180)

օգտվողի ընտրություն = 9;

այլ օգտվողի ընտրություն = 14;

} else if (p.y 125) {// քառակուսիների երկրորդ շարքը

եթե (p.x <60)

օգտվողի ընտրություն = 4;

այլապես, եթե (p.x <120)

օգտվողի ընտրություն = 5;

այլապես (p.x <180)

օգտվողի ընտրություն = 6;

այլ օգտվողի ընտրություն = 13;

} else if (էջ 190) {// քառակուսիների երրորդ շարքը

եթե (p.x <60)

օգտվողի_ընտրություն = 1;

հակառակ դեպքում (p.x <120)

օգտվողի_ընտրություն = 2;

այլապես (p.x <180)

օգտվողի_ընտրություն = 3;

այլ օգտվողի ընտրություն = 12;

} else if (p.y> 255) {// քառակուսիների չորրորդ շարքը

եթե (p.x <60)

օգտվողի_ընտրություն = 15;

այլապես, եթե (p.x <120)

օգտվողի ընտրություն = 0;

այլապես (p.x <180)

օգտվողի ընտրություն = 10;

այլ օգտվողի ընտրություն = 11;

}

} ուրիշ {

օգտվողի_ընտրություն = 16; // user_selection- ը 16 է (փոփոխական ոչինչ)

}

}

Սա այն մասն է, որը որոշում է, թե որ կոճակն է ընտրված: Սկսելով քառակուսիների վերին շարքից և ավարտելով ներքևի տողերով ՝ Arduino- ն փնտրում է այն տեղը, որտեղ իրականում սեղմված էր էկրանը: Այնուհետև քառակուսուն տալիս է մի թիվ և պահում է այդ թիվը user_selection- ում: 0-9 թվերը համապատասխանում են թվերի քառակուսիներին, 11-15 թվերը `օպերանդի քառակուսիներին և պարզ քառակուսուն, իսկ 10 թիվը` հավասարների նշանի քառակուսուն: Եթե քառակուսի չի ընտրվել, ապա user_selection- ը սահմանվում է 16, ինչը հանգեցնելու է, որ օղակը նորից սկսվի (տես օղակի գործառույթը):

Քայլ 7: Վայելեք ձեր ավարտված նախագիծը:

Ահա դուք ունեք այն: Այժմ դուք ունեք սենսորային հաշվիչ, որը կարող է գումարել, հանել, բազմապատկել և բաժանել: Այս նախագիծը փոխեց իմ մտածած հաշվիչի աշխատանքի ամբողջ ձևը: Երբ ես աշխատում էի այս նախագծի վրա, ես հիշում եմ, որ դասղեկիս դասարանում ասում էի. «Ես այլևս երբեք նույն կերպ չեմ նայի հաշվիչին»: Այն գործառույթները, որոնք դուք, որպես օգտվողի կարծիքով, հեշտ եք համարում, որոշ չափով դժվար են, երբ համակարգչի հետևում եք և փորձում եք ընդօրինակել ձեր գաղափարը: Հուսով եմ, որ ձեզ դուր եկավ նախագիծը, և ես հույս ունեմ, որ ձեր մտածելակերպը, թե ինչպես է աշխատում հաշվիչը, նույնպես փոխվել է:

Ահա ամբողջ ծածկագիրը `ձեր հարմարության համար: Այն լի է մեկնաբանություններով, այնպես որ, եթե խնդիրներ ունեք, նրանք պետք է ձեզ ցույց տան, թե ինչ է անում յուրաքանչյուր տող:

Խորհուրդ ենք տալիս: