Image
25.8.2015 0 Comments

ARDUINO - Výpočty v tele programu a podmienka /7.časť

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

V predošlej časti sme objasnili, ako Arduino dokáže interaktívne s nami komunikovať. Zároveň sme sa oboznámili s premennými typu string, int a float, ukázali sme si ich použitie a vysvetlili sme cykly v programe.

Zatiaľ čo predchádzajúci program v podstate „papagájoval", teda iba opakoval údaje, ktoré sme mu zadali, teraz ukážeme, ako naprogramovať Arduino tak, aby dokázalo z určitých zadaných hodnôt vypočítať nové údaje a na ich základe urobiť isté logické rozhodnutia.

BMI

Vhodný príklad, ktorý v podstate nadviaže na príklad z predchádzajúcej časti, je výpočet BMI. BMI (Body Mass Index = index telesnej hmotnosti) patrí medzi najviac využívané metódy zisťovania obezity. Obezita je definovaná ako ukladanie tuku. Index BMI nie je úplne presný, neplatí pre mladistvých, tehotné ženy a športovcov, ale môžeme povedať, že vo všeobecnosti platí pre zvyšok ľudstva. Výpočet BMI vychádza z podielu hmotnosti osoby a jej štvorca výšky podľa vzorca:

BMI = hmotnosť/výška2

kde hmotnosť udávame v kilogramoch a výšku v metroch. Výsledok je bezrozmerné číslo, ktoré v zjednodušenej forme znamená toto:

Poznámka:

Uvedená tabuľka je zjednodušená. V skutočnosti sa delí na viac možností (obezita I., II. alebo III. stupňa a rozhoduje aj to, či ide o ženu alebo muža. Pre naše programovacie potreby však delenie uvedené v tabuľke úplne postačuje.

My teda využijeme zdrojový kód programu z predošlej časti a doplníme ho o zistenie hmotnosti, výpočet BMI a následné rozhodovanie v zmysle uvedenej tabuľky.

Na výpise je uvedený zdrojový kód (skeč) upraveného programu. Ide v podstate o predchádzajúci príklad, čiastočne pozmenený a doplnený práve o výpočet BMI a rozhodovanie v zmysle spomínanej tabuľky (doplnené časti sú zvýraznené červenou farbou):

String MojeMeno;  
int vek;        
float vyska;    
float hmotnost;
float bmi;
 
void setup() {
  Serial.begin(9600);     
}
 
void loop() {
 
  Serial.print("Prosim vlozte svoje meno: ");
  while (Serial.available()==0) {            
 
  }
  MojeMeno=Serial.readString();    
  Serial.println(MojeMeno);
 
  Serial.print("Kolko mate rokov? ");       
  while (Serial.available()==0)  {
 
  }
  vek=Serial.parseInt();                     
  Serial.println(vek);
 
  Serial.print("Kolko meriate? ");     
  while (Serial.available()==0)  {
 
  }
  vyska=Serial.parseFloat();               
  Serial.println(vyska);
 
  Serial.print("Aku mate hmotnost? ");     
  while (Serial.available()==0)  {
 
  }
  hmotnost=Serial.parseFloat();               
  Serial.println(hmotnost);
 
  bmi = hmotnost/pow(vyska,2);
 
  Serial.println("");
  Serial.print("Zdravim ");                   
  Serial.print(MojeMeno);
  Serial.print(", mate ");
  Serial.print(vek);
  Serial.println(" rokov,");
  Serial.print("ste ");
  Serial.print(vyska);
  Serial.print(" cm vysoky/a a vasa hmotnost je ");
  Serial.print(hmotnost);
  Serial.println(" kg.");
  Serial.println("");
  Serial.print("Vase BMI je :");
  Serial.print(bmi);
  Serial.print(", co znaci, ze ste ");
 
  if(bmi<20){
   Serial.println("chudy!");
  }
  else if(bmi>=20 && bmi<=25) {
   Serial.println("akurat!");
  }
  else {
   Serial.println("tucny!");
  }
  Serial.println("");
}
 

V prvom rade sme v definičnej časti programu doplnili dve nové premenné, a to hmotnost a bmi, obe typu float, pretože hmotnosť človeka aj index BMI môžu byť desatinné čísla. Sekcia setup() zostala bez zmien, zato hneď na začiatku sekcie loop() sme vykonali drobné zmeny. Pri každom vyžiadaní si nejakého údaja o osobe (meno, vek a výška) sme doplnili výpis získaných hodnôt hneď vedľa textu. To sme dosiahli už známym príkazom Serial.print ln() s názvom správnej premennej. Ide len o kozmetickú úpravu - programátora to nič nestojí a na obrazovke to vyzerá podstatne lepšie (pozri obr. č. 1). Trochu sme laborovali aj s nastavením kurzora buď na tom istom riadku, alebo na novom riadku - vieme, že to dosiahneme príkazmi print() alebo println(). Samozrejme, že každý si môže urobiť aj iné nastavenie zobrazovania podľa svojich predstáv - vyskúšajte! Na ďalšom riadku je zaujímavý zápis: bmi = hmotnost/pow(vyska,2); ktorý do premennej bmi uloží výpočet podielu premennej hmotnost Zápis pow značí mocninu, prvý parameter udáva premennú alebo číslo (v našom prípade vyska) a druhý parameter udáva typ mocniny (v tomto prípade číslica 2 značí druhú mocninu). Takto sme vypočítali BMI v zmysle uvedeného vzorca. Jednoduché,a druhej mocniny premennej však?

Ďalej nasleduje výpis zistených hodnôt, tak ako sme si to ukázali minule. Pribudol výpis premennej bmi na riadkoch

Serial.print("Vase BMI je :");
Serial.print(bmi);

čo je len obdoba nám už známeho spôsobu.

Zatiaľ čo výpočet BMI je „malina", rozhodnutie, či je osoba chudá, akurátna alebo tučná, už nie je také jednoduché. Na rozhodovanie sa v programovaní používa takzvané binárne vetvenie. A to je v podstate nám už známy podmienený príkaz. Len na zopakovanie, syntaktický zápis podmieneného príkazu je

if (podmienka) {
príkaz1;
...
príkazn;
}
else {
iný_príkaz;
}
Ako sme uviedli, časť else nie je povinná.„ Binárne" preto, že má dva stavy (buď - alebo, if - else). Lenže my máme v tabuľke tri možnosti, nie dve. Ako na to? Ak do časti else vložíme znovu podmienený príkaz if (hovorí sa tomu vnorený podmienený príkaz), dosiahneme viacnásobné vetvenie. Tak sme to urobili aj v tomto prípade:
if(bmi<20){
Serial.println("chudy!");
}
else if(bmi>=20 && bmi<=25) {
Serial.println("akurat!");
}
else {
Serial.println("tucny!");
}
Všimnime si, že máme základný podmienený príkaz if - else (zelená farba), do ktorého sme vnorili ďalší podmienený príkaz if - else (modrá farba). Tak sme dosiahli trojité rozhodovanie, kde sú dve podmienky a else.

Prvá podmienka je bmi<20, kde porovnávame, či je bmi menšie ako 20.

Druhá podmienka if(bmi>=20 && bmi<=25) je zložitejšia - obsahuje dve porovnávania. Zápis bmi>=20 sa interpretuje ako väčší alebo rovný 20, zápis bmi<=25 sa interpretuje ako menší alebo rovný 25. Znaky && sa interpretujú ako „a súčasne". Celý uvedený zápis môžeme teda interpretovať takto : „Ak je obsah premennej bmi väčší alebo rovný 20 a súčasne menší alebo rovný ako 25, tak ...". Z matematického hľadiska ide o klasický interval od 20 do 25 vrátane krajných hodnôt. Ako teda môžeme interpretovať celý podmienený zápis?

obr_Screenshot 2015-08-25 09.04.00.jpg

Jednoducho - „ak (if) je premenná bmi menšia ako 20, tak vypíš text chudý, inak (else), ak (if) je premenná bmi v rozsahu od 20 do 25 vrátane, tak vypíš text akurát, inak (else) vypíš text tučný. Takto sme obsiahli rozhodovanie v zmysle uvedenej tabuľky. Niekto by mohol namietať, že sme netestovali bmi väčšie ako 25. To je pravda, ale my sme to zahrnuli do zvyšku hodnôt v poslednom else.

Program napíšeme, skompilujeme a nahráme do Arduina. Zapneme Serial Monitor (nesmieme zabudnúť na nastavenie rýchlosti 9600

baudov a No line ending na spodnom riadku, inak to nebude fungovať). Zobrazenie správnej činnosti programu by malo byť podobné tomu na obrázku č. 2.

Prosím, aby ste si začali zháňať shield s displejom a tlačidlami, pretože ho v blízkej budúcnosti začneme používať.

 

Zobrazit Galériu

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

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

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

Najnovšie videá