Obsah:

Kalkulačka dotykové obrazovky Arduino: 7 kroků
Kalkulačka dotykové obrazovky Arduino: 7 kroků

Video: Kalkulačka dotykové obrazovky Arduino: 7 kroků

Video: Kalkulačka dotykové obrazovky Arduino: 7 kroků
Video: How to use up to 10 push button switch with 1 Arduino input pin ANPB-V1 2024, Červenec
Anonim
Dotyková kalkulačka Arduino
Dotyková kalkulačka Arduino

Ahoj! Toto je projekt výroby dotykové obrazovky kalkulačky pomocí Arduino Uno a TFT LCD štítu. Přišel jsem s konceptem své hodiny programování v domácí škole a zkušenosti s budováním tohoto projektu byly velmi zajímavé. Tato kalkulačka může provádět čtyři jednoduché matematické operace (sčítání, odčítání, násobení a dělení). Zobrazuje také až dvě desetinná místa pro odpovědi divizí, které je mají. Pojďme se ponořit přímo dovnitř! Dodávky pro tento projekt jsou uvedeny níže.

Zásoby

- Arduino Uno

-2,4 TFT LCD štít (zde jsem jej koupil:

- kabel USB A na B (kabel pro připojení Arduina k počítači)

- Počítač s nainstalovaným Arduino IDE

- Budete také muset stáhnout dvě knihovny: MCUFRIEND_kbv a Touchscreen. První z nich najdete na github (odkaz: https://github.com/prenticedavid/MCUFRIEND_kbv) nebo můžete použít zip soubor knihovny, který jsem uvedl níže. Druhý je k instalaci ve správci knihovny Arduino.

Krok 1: Hardwarová připojení

Hardwarová připojení
Hardwarová připojení
Hardwarová připojení
Hardwarová připojení
Hardwarová připojení
Hardwarová připojení

Připojení stínění dotykové obrazovky k Arduino Uno je jednoduché a rychlé. Jediné, co musíte udělat, je zarovnat nejnižší piny na štítu s nejnižšími piny na Arduinu a zasunout štít do kolíků. Horní kolík 5V a neoznačený kolík na straně napájení by v sobě neměly mít kolíky ze štítu, přičemž stejné parametry platí pro piny označené SCL a SDA na druhé straně desky. Nyní jsme připraveni kódovat!

Krok 2: Kód: Globální definice a nastavení

#zahrnout

MCUFRIEND_kbv tft; // každopádně pevné pro UNO štíty

#zahrnout

#definovat YP A3

#definovat XM A2

#definovat YM 9

#define XP 8

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

#definujte MINPRESSURE 10

Toto je začátek kódu, kam zahrneme knihovny (MCUFRIEND_kbv & Touchscreen), definujeme piny X a Y, nastavíme parametry dotykové obrazovky a definujeme minimální tlak potřebný k tomu, aby Arduino zaregistroval uživatelský tisk.

int ID;

int výběr_uživatele;

float save_number = 0;

float term1;

int op_num;

float výsledek;

int kurzorLocX = 5;

int kurzorLocY = 20;

Těsně před nastavením musíme nastavit nějaké globální proměnné. ID pomáhá s uvedením dotykové obrazovky do provozu. user_selection obsahuje číslo, které odpovídá klíči, který uživatel zvolí při stisknutí dotykové obrazovky. uložené_číslo je proměnná, kterou vytiskneme na obrazovku po zadání uživatele (více o tom ve smyčce). Je to float, takže může obsahovat desetinná čísla i celá čísla. term1 je proměnná, do které je uloženo první číslo rovnice po výběru operandu. op_num uloží operand jako číslo (1 pro sčítání, 2 pro odčítání, 3 pro násobení a 4 pro dělení). výsledkem je proměnná, která se vytiskne na obrazovku poté, co uživatel stiskne znaménko rovnosti. Je to také plovák. cursorLocX a cursorLocY jsou body mapování na dotykové obrazovce, kde je kurzor nastaven vícekrát (nachází se v šedém pruhu v horní části, jinak známé jako pole výsledků).

neplatné nastavení () {

tft.reset ();

ID = tft.readID ();

tft.begin (ID);

tft.setRotation (0);

tft.fillScreen (TFT_DARKGREY);

čtverce ();

čísla ();

tft.setTextSize (3);

tft.setTextColor (TFT_BLUE, TFT_DARKGREY);

}

Naše funkce nastavení nejprve obsahuje inicializaci štítu dotykové obrazovky (řádky 1-3). Orientace štítu se nastavuje pomocí příkazu tft.setRotation (), přičemž 0 je vzpřímený. Celá obrazovka je barevně tmavě šedá pomocí příkazu tft.fillScreen (), který napíšeme přes horní část (kromě pole s výsledky). Funkce čtverců () a číslic () nakreslí čtverečky kalkulačky, vybarvují čtverečky černobíle v šachovnicovém vzoru a na čtverce zapisují čísla/operandy modře. K těm se dostaneme v dalším kroku. Příkaz tft.setTextSize () nastaví velikost textu pole výsledků na 3, což je střední písmo. Příkaz tft.setTextColor () nastaví barvu textu pole výsledků na modrou, která je zapsána přes tmavě šedé pole.

Krok 3: Kód: Smyčka

void loop () {numberSelect ();

zpoždění (100);

if (výběr_uživatele == 16) {

;

}jiný{

if (výběr_uživatele <10) {

uložené_číslo = uložené_číslo * 10 + výběr uživatele;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (uložené_číslo);

} else if (výběr_uživatele> 10) {

přepínač (výběr_uživatele) {

případ 11:

op_num = 1;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("+");

term1 = uložené_číslo;

uložené_číslo = 0;

přestávka;

případ 12:

op_num = 2;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("-");

term1 = uložené_číslo;

uložené_číslo = 0;

přestávka;

případ 13:

op_num = 3;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("X");

term1 = uložené_číslo;

uložené_číslo = 0;

přestávka;

případ 14:

op_num = 4;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("/");

term1 = uložené_číslo;

uložené_číslo = 0;

přestávka;

případ 15:

uložené_číslo = 0;

termín1 = 0;

op_num = 0;

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

přestávka;

}

tft.setCursor (cursorLocX, cursorLocY);

Tohle je hodně k žvýkání, takže vysvětlím, co je nahoře. Začneme voláním funkce numberSelect (), která každému čtverci na dotykové obrazovce přiřadí číslo. Když uživatel stiskne jeden z těchto čtverců, funkce nastaví proměnnou user_selection na číslo čtverce. První příkaz if má procházet smyčkou pouze v případě, že byl proveden platný výběr uživatele. Pokud je, další příkaz if se zeptá, zda má user_selection v sobě uloženo číslo menší než 10 (čísla 0-9). Pokud ano, číslo_naloženého čísla se vynásobí 10 a číslo ve výběru uživatele se přidá k číslu save_number, které se vytiskne v poli výsledků na dotykové obrazovce. Pokud tomu tak není, další příkaz if se zeptá, zda má user_selection do něj uloženo číslo větší než 10 (čísla operandů: 11 pro +, 12 pro -, 13 pro X, 14 pro /a 15 pro čistý čtvereček obrazovky). Funkce přepínače se stará o každý případ (určený výběrem uživatele). Proměnné op_num je přiděleno číslo, které odpovídá vybranému operandu (1 pro +, 2 pro -, 3 pro X a 4 pro /). Hodnota v uloženém_čísle je uložena do proměnné term1, aby proměnnou uloženo_číslo bylo možné použít pro druhou polovinu rovnice. Symbol operandu se vytiskne na obrazovku spolu s vymazáním všech čísel v poli výsledků. Jedinou výjimkou je jasný čtvereček obrazovky, který resetuje všechny proměnné výpočtu a vymaže pole výsledků čehokoli na něm.

}jiný{

přepínač (op_num) {

případ 1:

výsledek = termín1 + uložené_číslo;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (double (výsledek));

přestávka;

případ 2:

výsledek = termín1 - uložené_číslo;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (double (výsledek));

přestávka;

případ 3:

výsledek = termín1 * uložené_číslo;

tft.setCursor (cursorLocX, cursorLocY);

tft.print (double (výsledek));

přestávka;

případ 4:

výsledek = float (term1) / float (uložené_číslo);

tft.setCursor (cursorLocX, cursorLocY);

tft.print (výsledek);

přestávka;

}

tft.setCursor (cursorLocX, cursorLocY);

uložené_číslo = výsledek;

termín1 = 0;

op_num = 0;

zpoždění (1000);

}

}

}

Poslední část smyčky se zabývá událostí, kdy uživatel vybral znaménko rovnosti (user_selection == 10). Další přepínací funkce funguje prostřednictvím čtyř matematických funkcí (určených op_num). Sčítací případ (případ 1) sečte term1 a uložené_číslo dohromady a uloží číslo do proměnné výsledku. Výsledek se do pole výsledků vytiskne jako dvojnásobek. Případ odečtení (případ 2) odečte uložené_číslo od term1 a uloží číslo do proměnné výsledku. Výsledek se vytiskne do pole výsledků jako dvojnásobek. Případ násobení (případ 3) vynásobí termín1 uloženým číslem a číslo uloží do proměnné výsledku. Výsledek se do pole výsledků vytiskne jako dvojnásobek. Rozdělení případu (případ 4) rozdělí term1 společně na uložené_číslo a číslo uloží do proměnné výsledku. Výsledek se do pole výsledků vytiskne jako plovák (protože odpovědi na dělení mohou být desetinná čísla). Po vytištění čísla, operandu nebo výsledku na obrazovku se kurzor resetuje, uložené číslo se nastaví na předchozí výsledek a term1 a op_num se resetují.

Několik poznámek: uživatel nemůže do kalkulačky zadávat desetinná čísla kvůli nedostatku čtverce s desetinnou čárkou. Uživatel může také provádět pouze jednu rovnici najednou. Výsledek nemůžete vypočítat a pak tento výsledek sčítat/odčítat/násobit/dělit. Ve funkci numberSelect () existuje funkce, která vymaže obrazovku po vytištění výsledku, pokud uživatel stiskl jiný čtvereček.

Krok 4: Kód: Funkce čtverců

prázdné čtverce () {

// černé a bílé čtverce se střídají v každém řádku a první a třetí řada mají opačný vzor než druhá a čtvrtá řada

tft.fillRect (0, 60, 60, 65, TFT_BLACK); // začíná první řada čtverců, černá až bílá tft.fillRect (60, 60, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 60, 60, 65, TFT_WHITE); // první řada čtverců končí

tft.fillRect (0, 125, 60, 65, TFT_WHITE); // začíná druhá řada čtverců, bílá až černá tft.fillRect (60, 125, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 125, 60, 65, TFT_BLACK); // končí druhá řada čtverců

tft.fillRect (0, 190, 60, 65, TFT_BLACK); // začíná třetí řada čtverců, černé až bílé tft.fillRect (60, 190, 60, 65, TFT_WHITE);

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

tft.fillRect (180, 190, 60, 65, TFT_WHITE); // končí třetí řada čtverců

tft.fillRect (0, 255, 60, 65, TFT_WHITE); // začíná čtvrtá řada čtverců, bílá až černá tft.fillRect (60, 255, 60, 65, TFT_BLACK);

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

tft.fillRect (180, 255, 60, 65, TFT_BLACK); // čtvrtá řada čtverců končí

}

Funkce square () je docela přímočará. Příkaz tft.fillRect (X1, Y1, X2, Y2, TFT_COLOR) nakreslí obdélník podle parametrů, které mu byly předány, což jsou první pozice x a y, druhé pozice x a y a barva, kterou je obdélník vyplněn. Tato funkce nakreslí všechny čtyři řady čtverců (technicky obdélníky) a každé čtverce vyplní předanou barvou.

Krok 5: Funkce Code: Numbers

neplatná čísla () {

tft.setTextColor (TFT_BLUE); // nastaví barvu čísla/znaku na modrou

tft.setTextSize (5); // nastaví velikost čísla/znaku na 5

tft.setCursor (18, 75); // nastaví kurzor pro první řádek čísel/znaků

tft.print ("7 8 9 /"); // vytiskne první řádek čísel/znaků

tft.setCursor (18, 140); // nastaví kurzor pro druhý řádek čísel/znaků

tft.print ("4 5 6 X"); // vytiskne druhý řádek čísel/znaků

tft.setCursor (18, 205); // nastaví kurzor pro třetí řádek čísel/znaků

tft.print ("1 2 3 -"); // vytiskne třetí řádek čísel/znaků

tft.setCursor (18, 270); // nastaví kurzor na čtvrtý řádek čísel/znaků

tft.print ("C 0 = +"); // vytiskne čtvrtý řádek čísel/znaků

}

Funkce numbers () je také přímočará. První dva řádky nastavují větší velikost textu a barvu na modrou. Příkaz tft.setCursor () nastaví kurzor na pozici v každém řádku, odkud začíná psaní čísel. Poté příkaz tft.print () vytiskne čísla/znaky na čtverečky.

Krok 6: Funkce Code: NumberSelect

zrušit číslo Vybrat () {

TSPoint p = ts.getPoint ();

pinMode (XM, VÝSTUP);

pinMode (YP, OUTPUT);

if (p.z> MINPRESSURE) {

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

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

if (result! = 0) {

výsledek = 0;

uložené_číslo = 0;

tft.print („VYMAZAT HODNOTY“);

zpoždění (500);

tft.setCursor (cursorLocX, cursorLocY);

tft.print ("");

tft.setCursor (cursorLocX, cursorLocY);

}

Chcete -li spustit funkci numberSelect (), požádáme o zadání uživatele z dotykové obrazovky pomocí příkazu ts.getPoint (). Jakmile jsou tato data shromážděna, zkontrolujeme, zda nebyl překročen minimální tlak (nebo jinými slovy, pokud uživatel stiskl někde na dotykové obrazovce). Pokud ano, souřadnice x a y jsou mapovány z kartézských souřadnic na souřadnice specifické pro dotykovou obrazovku. (0, 0) je levý horní roh dotykové obrazovky, přičemž osa x jde napříč a osa y klesá. Další část zkontroluje, zda je ve výsledku uloženo číslo. Pokud existuje, výsledek a uložené_číslo se resetují na 0. Nad polem výsledků se vytiskne zpráva „VYMAZAT HODNOTY“a obrazovka se smaže s kurzorem zpět do výchozí polohy.

if (p.y 60) {// první řada čtverců

pokud (p.x <60)

user_selection = 7;

else if (str.x <120)

výběr uživatele = 8;

else if (str.x <180)

user_selection = 9;

else user_selection = 14;

} else if (str. 125) {// druhá řada čtverců

pokud (p.x <60)

user_selection = 4;

else if (str.x <120)

user_selection = 5;

else if (str.x <180)

user_selection = 6;

else user_selection = 13;

} else if (str. 190) {// třetí řada čtverců

pokud (p.x <60)

user_selection = 1;

else if (str.x <120)

user_selection = 2;

else if (str.x <180)

user_selection = 3;

else user_selection = 12;

} else if (p.y> 255) {// čtvrtá řada čtverců

pokud (p.x <60)

user_selection = 15;

else if (str.x <120)

user_selection = 0;

else if (str.x <180)

výběr uživatele = 10;

else user_selection = 11;

}

}jiný{

user_selection = 16; // výběr uživatele_je nastaven na 16 (nic proměnného)

}

}

Toto je část, která určuje, které tlačítko bylo vybráno. Počínaje horní řadou čtverců a konče spodní řadou Arduino hledá, kde byla obrazovka ve skutečnosti stisknuta. Potom přiřadí čtverci číslo a toto číslo uloží do výběru uživatele. Čísla 0-9 odpovídají čtvercům čísel, čísla 11-15 odpovídají operandovým čtvercům a prázdnému čtverci a číslo 10 odpovídá znaménku rovnosti. Pokud nebyl vybrán žádný čtverec, pak user_selection je nastaven na 16, což způsobí, že smyčka začne znovu (viz funkce smyčky).

Krok 7: Užijte si svůj dokončený projekt

Tady to máš! Nyní máte kalkulačku na dotykové obrazovce, která umí sčítání, odčítání, násobení a dělení. Tento projekt se změnil tak, jak jsem si myslel, že funguje kalkulačka. Když jsem pracoval na tomto projektu, pamatuji si, jak jsem svému lektorovi na hodině řekl: „Už se nikdy nebudu dívat na kalkulačku stejným způsobem!“Funkce, které si jako uživatel myslíte, že jsou snadné, jsou poněkud obtížné, když jste za počítačem a snažíte se napodobit svůj nápad. Doufám, že se vám projekt líbil, a doufám, že se také změnilo vaše myšlení o tom, jak kalkulačka funguje!

Zde je celý kód pro vaše pohodlí. Je plná komentářů, takže pokud máte nějaké problémy, měli by vám ukázat, co každý řádek dělá.

Doporučuje: