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

Ako zbaviť fotky hmly

08.12.2016 11:59

Hmla alebo dym sú často veľmi kreatívne nástroje. No všetkého veľa škodí. Fotka potom stráca kontrast a v podstate na nej nič nevidieť. Hmlu môžete neraz následnými úpravami odstrániť alebo zredukovať ...

Ako na to

Užitočné SW nástroje

08.12.2016 11:53

AllDup v4.0.3 Určenie: program na vyhľadávanie a odstraňovanie duplicitných súborov Vlastnosti: duplicitné súbory sa vyhľadávajú len na zvolených diskových jednotkách alebo len v rámci vybraných ...

Ako na to

Fotografovanie s bleskom

08.12.2016 11:47

Ak máte moderný fotoaparát so vstavaným alebo externým bleskom, zdá sa vám téma článku triviálna. Jednoducho nastavíte vhodný režim, vyberiete najlepšiu kompozíciu záberu, exponujete a o zvyšok sa už ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá