Image
28.6.2016 0 Comments

ARDUINO – Interaktívna komunikácia Arduina s počítačom /6.časť

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

V predošlej časti sme vysvetlili, ako Arduino prijíma znaky z počítača a ako ich odosiela späť. Zároveň sme objasnili, čo je to premenná, aké má vlastnosti, a venovali sme sa podmienenému príkazu if. V tejto časti si vytvoríme interaktívny program a vysvetlíme nové príkazy Arduina.

Interaktívna komunikácia

Vo všeobecnosti interaktívna komunikácia je taký typ komunikácie, kde očakávame, že druhá komunikujúca strana je prítomná (on-line) a reaguje na naše podnety. Typický príklad zo sveta počítačov je čet (chat). Len pre úplnosť, opakom je neinteraktívna komunikácia, kde neočakávame okamžitú reakciu druhej strany, vzorovým príkladom je elektronická pošta (e-mail).

Tentoraz vytvoríme program, ktorý nám položí niekoľko otázok. Postupne sa spýta na naše meno, vek a výšku, nakoniec získané informácie spoločne vypíše na obrazovku počítača.

Zdrojový kód programu je na výpise č. 1:

String Meno;  
int vek;        
float vyska;   
 
void setup() {
  Serial.begin(9600);     
}
 
void loop() {
 
  Serial.println("Prosim vlozte svoje meno: ");
  while (Serial.available()==0) {            
 
  }
  Meno=Serial.readString();
 
  Serial.println("Kolko mate rokov? ");       
  while (Serial.available()==0)  {
 
  }
  vek=Serial.parseInt();                     
 
  Serial.println("Kolko meriate? ");     
  while (Serial.available()==0)  {
 
  }
  vyska=Serial.parseFloat();               
 
  Serial.print("Zdravim ");                   
  Serial.print(Meno);
  Serial.print(", mate ");
  Serial.print(vek);
  Serial.println(" rokov,");
  Serial.print("a ste ");
  Serial.print(vyska);
  Serial.println(" m vysoky/a.");
  Serial.println("");
}
 

Všimnime si, že sa v deklaračnej časti nachádzajú tri premenné. Prvá je premenná s názvom  Meno, ktorá je dátového typu String. Typ String (z anglického reťaz, reťazec) uchováva skupinu znakov. Do tejto premennej teda môžeme ukladať skupinu textových znakov,  a ako jej názov už napovedá, budeme sem ukladať meno komunikujúceho používateľa.

Druhá premenná má názov vek a je typu int. Už vieme, že dátový typ int obsahuje celé čísla. My spresníme, že tie celé čísla môžu byť v rozsahu od -32768 do 32767. Bude nám takýto dátový typ vyhovovať? Myslíme, že áno - 32767 rokov sa asi, žiaľ, nikdy nedožijeme. Všimnime si, že stále hovoríme o celých číslach, a tak musíme pri zadávaní údaja o veku napísať celé číslo, a nie napríklad 18,5 roka.

Tretia je premenná s názvom vyska, ktorá je dátového typu float. Typ float môže obsahovať reálne číslo, má 32-bitovú veľkosť, čo značí, že môže obsahovať čísla v rozsahu od  -3,4028235 × 1038  až do 3,4028235 × 1038. Musíme uznať, že je to dostatočne veľké číslo pre mnohé číselné operácie. A prečo v našom programe požadujeme reálne čísla? Lebo výšku budeme zadávať v metroch a už to nemusia byť iba celé čísla (napríklad 1,79 m).

V časti void setup() sa nachádza príkaz Serial.begin(9600), o nej už veľmi dobre vieme, že nastavuje parametre sériového prenosu.

V slučke void loop() sa nachádza niekoľko príkazov, niektoré z nich ešte nepoznáme.

Prvý z nich Serial.println("Prosim vlozte svoje meno: ") je nám známy – na obrazovke počítača vypíše text zapísaný v úvodzovkách, teda nás požiada o vloženie nášho mena.  Podobne požiadame o zadanie veku a výšky.  Za ním nasleduje nám ešte neznámy príkaz while. Čo znamená?

Cyklus v programe

Neraz sa nielen v programátorskom, ale aj v bežnom ľudskom živote stáva, že potrebujeme vykonať niektoré činnosti opakovane. Vtedy hovoríme, že vykonávame určitý cyklus. 

Cykly môžu byť:

  • s pevným počtom opakovaní (napríklad „Natri túto stenu nabielo štyrikrát!“)
  • s podmienkou na začiatku cyklu („Ak stena nie je úplne biela, natri ju!“)
  • s podmienkou na konci cyklu („Stenu natieraj dovtedy, kým nie je úplne biela.“)

Všimnime si podstatný rozdiel medzi cyklami s podmienkou na začiatku a na konci cyklu. Ak je podmienka na začiatku cyklu, vyhodnocuje sa ešte pred tým, ako sa cyklus vykoná. Teda ak maliar príde k stene a vyhodnotí stenu ako úplne bielu, nebude predsa maľovať a nevykoná cyklus ani raz. Ak je podmienka až na konci cyklu, maliar príde k stene, natrie ju bielou farbou a až po natretí vyhodnotí, či je stena úplne biela. Ak áno, už ju natierať nebude, ak nie, opakuje náter a znova po natretí vyhodnocuje bielosť steny. Z toho vyplýva, že pri cykle s podmienkou na konci sa príkazy cyklu vykonajú aspoň raz. Toto si musíme uvedomiť pri stanovení, ktorý cyklus použijeme.

Veľmi podobne cykly fungujú aj v programovaní. Napoviem, že cyklus s pevným počtom opakovaní je vyjadrený kľúčovým slovom for , cyklus s podmienkou na začiatku je vyjadrený kľúčovým slovom while a cyklus s podmienkou na konci je vyjadrený kľúčovým slovom do while

Cyklus while

Na ďalšom riadku slučky loop() sa práve nachádza zápis cyklu while. Syntaktický zápis cyklu s podmienkou na začiatku je

 while (podmienka) {
           Príkaz1;
           .
           Príkazn;
}
Príkazy Príkaz1 až Príkazn sa budú v cykle neustále vykonávať dovtedy, kým bude podmienka splnená. Ak sa stane podmienka nepravdivou (nesplnenou), cyklus sa ukončí a program pokračuje na ďalšom riadku.

V našom prípade sa v sekcii loop() nachádza zápis

while (Serial.available()==0) {            
 
  }

Podmienku Serial.Available()==0  už poznáme. Kontroluje počet dostupných znakov na sériovom porte. Ak ich počet je nula, značí to, že na sériovom porte nie je dostupný nijaký znak. A všimnime si, že v zložených zátvorkách sa nenachádzajú žiadne príkazy. Tento cyklus teda môžeme interpretovať takto: dokiaľ počet dostupných znakov na sériovom porte je nula, vykonaj žiadne príkazy a opakuj toto dookola. Krkolomné? Dobre, tak ľudskejšie: Ak na sériovom porte nie je žiadny znak, nerob nič a čakaj, až prídu!

Prečítanie a uloženie reťazca znakov

Na ďalšom riadku sa nachádza príkaz Meno=Serial.readString().  Príkaz Serial.readString prečíta reťazec znakov zo sériového portu a uloží do premennej Meno.

Poznámka:

Musíme si uvedomiť, že ak v programe očakávame zadávanie čísel, nemôžeme zadať znak alebo reťazec znakov a naopak – program zhavaruje! Existujú postupy, ako ošetriť „blbuvzdornosť“ programu, ale to už je vyššia škola dievčenská...

Prečítanie a uloženie čísel

Pozrime sa na nasledujúce riadky. Opakuje sa náš známy príkaz Serial.println. Všimnime si riadok vek=Serial.parseInt(). Príkaz Serial.parseInt prečíta na sériovom porte platné celé číslo a uloží ho do premennej vek. V prípade, že sa v čísle nachádzajú nejaké znaky (napríklad oddeľovač rádu tisícok), ten sa vynechá. Podobne je to aj v prípade zápisu vyska=Serial.parseFloat(), kde príkaz parseFloat prečíta zo sériového portu platné reálne číslo a uloží ho do premennej vyska.

Výpis obsahu uložených premenných

My už vieme, že výpis textu po sériovej linke zabezpečuje príkaz Serial.print(). V zátvorkách tohto príkazu sa môže nachádzať text, napríklad Zdravím. Keďže ide o čistý text, musí byť uzavretý v úvodzovkách vrátane prípadných medzier, ktoré chceme takisto vypísať. No ak chceme vypísať obsah uložený v premennej, do zátvoriek uvedieme názov premennej. Program si sám zistí jej obsah, ktorý sa s každým spustením programu môže meniť. Takto môžeme prekladať text s obsahom premennej, presne ako je to v tomto prípade. Pokiaľ chceme text alebo obsah premennej vypisovať do jedného riadka, použijeme zápis Serial.print. Ak chceme po výpise textu prejsť na nový riadok, použijeme zápis Serial.println. No a ak chceme vypísať prázdny riadok, použijeme zápis Serial.println("") – teda len úvodzovky bez textu.

Spustenie programu

Keď máme tento príklad napísaný, skompilujeme ho a spustíme. Zároveň spustíme Serial Monitor s nastavením rýchlosti na 9600 baudov. Na obrazovke sa objaví text podobný ako na obrázku č. 1.

V hornom okne zadáme svoje meno, odklikneme  myšou tlačidlo Send alebo stlačíme Enter. Podobne zadáme svoj vek a výšku. Po zadaní výšky sa na obrazovke objaví pozdrav a kompletný výpis obsahu údajov, ktoré sme predtým zadávali (obr. č. 2). Následne sa vypíše prázdny riadok (aby bol text trochu opticky oddelený) a program sa začína odznova.

Nabudúce tento program trochu upravíme a doplníme o určité výpočty.

Svoje pripomienky, nápady a návrhy môžete zasielať na adresu arduino@cevaro.sk.

 

                                                                                                                   

 

 

 

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á