Image
14.10.2015 0 Comments

ARDUINO - jednoduchá kalkulačka /8.časť

Späť na úvod >> Späť na programovanie >> Späť na seriál

V predošlej časti sme si vytvorili program na výpočet indexu telesnej hmotnosti BMI. Zároveň sme ukázali, ako sa tvorí n-tá mocnina čísla, a vysvetlili sme, čo je to vnorený podmienený príkaz. Teraz vytvoríme jednoduchú kalkulačku, na ktorej sa naučíme ďalšie finesy programovania Arduina.

Kalkulačka

Niekoho možno napadlo, načo vytvárať program pre kalkulačku, keď je kalkulačka základnou súčasťou každého operačného systému počítača, ku ktorému je Arduino pripojené a s ktorým komunikuje. Uvedomme si však, že výpočet sa bude vykonávať v Arduine, pripojený počítač slúži len ako terminál, teda „vynesená“ obrazovka a klávesnica. Zároveň sa naučíme napísať aritmetické operácie, ktoré sa nám budú neskôr hodiť v určitých konkrétnych aplikáciách.

Čo vlastne robí najjednoduchšia kalkulačka? V podstate načíta dve čísla a takzvaný operand, na základe ktorého vykoná aritmetickú operáciu. Najznámejšie operandy používané v informatike sú + (sčitovanie), - (odčitovanie), * (násobenie), / (delenie) a ^ (umocňovanie). Existujú aj iné, pre náš ilustračný príklad tieto vymenované stačia.

Príklad skeče jednoduchej kalkulačky je na výpise:

char operand;  
float a; 
float b;      
float vysledok;   
 
 
void setup() {
  Serial.begin(9600);     
}
 
void loop() {
 
  Serial.print("Vlozte cislo a: ");
  while (Serial.available()==0) {            
 
  }
  a=Serial.parseFloat();    
  Serial.println(a);
 
  Serial.print("Vlozte operand: ");     
  while (Serial.available()==0)  {
 
  }
  operand=Serial.read();               
  Serial.println(operand);
 
 
  Serial.print("Vlozte cislo b: ");       
  while (Serial.available()==0)  {
 
  }
  b=Serial.parseFloat();                     
  Serial.println(b);
  Serial.println("");
 
  switch (znak) {
    case '+':   
      vysledok = a + b;
      Zobraz();
      break;
    case '-':   
      vysledok = a - b;
      Zobraz();
      break;
    case '/':   
      vysledok = a/b;
      Zobraz();
      break;
    case '*':   
      vysledok = a * b;
      Zobraz();
      break;
    case '^':   
      vysledok = pow(a,b);
      Zobraz();
      break;  
    default:
      Serial.println("Zadany neplatny operand! ");
     
      }
   
  Serial.println("");
  Serial.println("");
 
}
  void Zobraz() {
      Serial.print("Vysledok je: ");                   
      Serial.print(a);
      Serial.print(operand);     
      Serial.print(b);
      Serial.print("=");
      Serial.print(vysledok);
}  
    
 

Pozrime sa teraz na výpis bližšie:

V deklaračnej časti sa nachádzajú štyri premenné. Prvou je premenná s názvom operand a je typu char (z angl. character = znak). Do tejto premennej budeme načítavať znak symbolizujúci aritmetické operácie. Zvyšné tri premenné sú čísla a, bvysledok. Všetky sú typu float, teda desatinné čísla. Prečo? Nuž, keby sme napríklad chceli deliť dve celé čísla (napr. 5:2), výsledok bude nie celé číslo, ale desatinné. Tak povieme, že stačí, ak výsledok bude float, vstupné čísla môžu byť typu int. Nestačí! Keby sme to takto aj nadefinovali, výsledok by stále bolo číslo 2, nie 2,5. To preto, že ak sa delia dve čísla typu int, výsledok je vždy celé číslo bez ohľadu na typ výslednej premennej. Zapamätajme si, že ak chceme skutočne desatinný výsledok, deliteľ tiež musí byť typu float. A ešte jedna vec – čísla typu int majú pomerne malý rozsah (medzi -32768 až 32767), čo by nám v niektorých aplikáciách nemuselo stačiť, a nakoniec v kalkulačke predsa môžeme sčitovať aj desatinné čísla, nie?

Sekciu setup() už dobre poznáme a nastavuje sériový prenos.

Úvod sekcie loop() je nám takisto už dobre známy. V tomto prípade načítame prvé číslo a uložíme do premennej a, potom načítame znak operandu (znamienko) a uložíme do premennej operand a nakoniec načítame druhé číslo a uložíme do premennej b. To všetko s príslušnými výpismi na obrazovke počítača.

Po načítaní nasleduje spracovanie zadania, teda vykonanie správnej matematickej operácie medzi číslami a a b na základe znamienka. Už tušíme, že tu pôjde o rozhodovanie na základe premennej operand. Ako na to? My už poznáme binárne vetvenie pomocou if – else, dokonca by sme mohli urobiť vnorené vetvenie if – else if – else. Vnorené vetvenie sa dá urobiť do dostatočnej hĺbky, ale je to skutočne veľmi nepraktické a neprehľadné. Preto existuje takzvaný prepínač (angl. switch).

Tu je všeobecný zápis prepínača:

switch (meno_premennej){
 case hodnota_premennej:
    príkazy;
    break;
 case iná_hodnota_premennej:
    príkazy;
    break;
 case zase_iná_hodnota_premennej:
    príkazy;
    break;
 default:
    príkazy;
}
Vykonávanie prepínača je takéto: Ak príslušná premenná obsahuje hodnotu napísanú za slovom case, vykonajú sa príkazy v tejto sekcii. Príkaz break značí, že po vykonaní spomenutých príkazov sa celé vyhodnocovanie prepínača ukončí a preskočí. Položka default obsahuje príkazy, ktoré sa vykonajú, ak obsah premennej nie je žiadna z hodnôt uvedených na riadkoch case. Táto časť nie je povinná.

Prejdime teraz na náš konkrétny príklad (zvýraznený zelenou farbou):

V prepínači switch vyhodnocujeme premennú operand. Ak premenná operand obsahuje znamienko + (case '+':), vykonajú sa príkazy vysledok = a + b, Zobraz() a 

break, teda sčítanie čísiel a a b a následné uloženie do premennej vysledok, potom nám zatiaľ neznámy príkaz Zobraz() a prerušenie (break) vyhodnocovania celého prepínača – čiže prechod rovno na príkaz Serial.println(""); za koncom zelenej časti.

Ak bude obsahom premennej operand znamienko -, vykoná sa odčítavanie, ak znamienko *, vykoná sa násobenie, ak znak /, vykoná sa delenie. A ak je obsahom premennej operand znak ^, vykoná sa b-tá mocnina čísla a (funkciu pow už poznáme!). No ak premenná operand obsahuje iný znak (teda ani jeden z vymenovaných!), na obrazovke sa vypíše hlásenie Zadany neplatny operand!

Na konci sekcie loop() nasledujú dva výpisy prázdnych riadkov.

Funkcie definované používateľom

Všimnime si, že v každom bloku case prepínača sa nachádza nový príkaz Zobraz(). Čo to je?

Už podľa slovenského názvu tušíme, že to nebude interná funkcia programovacieho jazyka Arduina. A naozaj! Je to funkcia, ktorú sme si sami nadefinovali.

Nami definované funkcie sa píšu na koniec sekcie loop(). Aj my sme v tejto časti vytvorili novú funkciu s názvom Zobraz() (modrou farbou). Zápis novej funkcie sa začína slovom void, nasleduje jej názov a v zložených zátvorkách { a } sa nachádzajú tieto príkazy (tzv. telo funkcie):

void Zobraz() {
      Serial.print("Vysledok je: ");                   
      Serial.print(a);
      Serial.print(operand);     
      Serial.print(b);
      Serial.print("=");
      Serial.print(vysledok);
}  
Už na základe našich znalostí vieme, že funkcia Zobraz() vypíše na obrazovku text Vysledok je:  , obsahy premennej a a b, znamienko rovná sa a výsledok operácie. Takto definovaná funkcia má veľkú výhodu – jej príkazy sú definované iba raz, a keď ich v tele slučky loop() potrebujeme, nemusíme ich opakovane vypisovať, ale stačí zavolať definovanú funkciu jej menom. Keby sme nepoužili definovanú funkciu, museli by sme v prepínači v každej časti case prácne napísať šesť príkazov Serial.print, teda o 24 riadkov viac.

Definovaním funkcie Zobraz() sme nielen sprehľadnili celý kód skeče, ale hlavne sme skrátili celý strojový kód pre procesor. Tak sme ušetrili drahocenné bajty pamäte mikrokontroléra.

Program napíšeme, skompilujeme a spustíme. Výpis činnosti programu je na obrázku č. 1 (nezabudnime správne nastaviť Serial Monitor!).

Dúfam, že ste si zabezpečili LCD displej, lebo nabudúce sa s ním začneme hrať.

 

                                                                                                                    

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

CES 2017: Lenovo predstavilo nové notebooky ThinkPad X1, Miix 720 a prvý smartfón s podporou Tango - Lenovo Phab 2

03.01.2017 00:09

Lenovo odštartovala ďalší ročník veľtrhu s celou škálou nových produktov. Nová generácia produktov radu ThinkPad X1 Carbon 2017 je najľahším 14-palcovým biznis notebookom, ktorý váži len 1,14kg a obsa ...

Ako na to

Tipy a triky: Ako správne poskytovať IT pomoc a ako o ňu správne žiadať?

14.12.2016 09:40

Či už ste pokročilý používateľ počítača, ktorý často poskytuje IT pomoc známym a rodine, alebo ste to vy, kto o takúto pomoc zvyčajne žiada, ľahko sa stanete nechcenou príčinou frustrácie a obrovskej ...

Ako na to

Tipy a triky: Ako diagnostikovať a opravovať neúspešné upgrady Windows 10

14.12.2016 09:37

Microsoft prešiel s Windows 10 do celkom novej éry vývoja. Namiesto samostatných verzií Windows, vydávaných zvyčajne s odstupom dvoch až piatich rokov (XP, Vista, 7 a podobne), začal svoj systém vyvíj ...

Žiadne komentáre

Vyhľadávanie

qubitconference

Najnovšie videá