IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

11. diel - Arduino - Jazyk

S desiatym dielom som sa obzrel za tým, čo všetko som už napísal, a zistil, že sa mi pomerne dobre darilo vyhýbať sa vysvetľovanie jazyka. V 4. dielu to bolo také vysvetľovanie-nevysvětlování a v ostatných sa občas objavila nejaká tá poznámka a to bolo všetko. Väčšina z vás už toho veľa pochytila z minulých dielov, alebo to pozná z iných jazykov, ale pre istotu si to prejdeme. Takže v tomto diele si prejdeme jazyk a zavŕšime to tvorbou vlastnej knižnice.

Čo je to vôbec za jazyk?

Niekoľko ľudí sa ma na to pýtalo a hoci sa Arduino zaoberám dosť dlho, tak ani po roku sa mi nepodarilo nájsť jednoznačnú odpoveď. Teraz sa pohybujem na tenkom ľade, keď to poviem, ale viem zhruba toto: Jazyk je odvodený z Wiring, upravili si ho podľa seba a volá sa jednoducho Arduino Language.

Základné syntaxe

Pri písaní kódu je potrebné dbať na niekoľko pravidiel. Pravdepodobne ste ich odchytili z minulých dielov, ale pre úplnosť je tu pripomeniem.

  • Na konci každého riadku s volaním funkcie alebo deklaráciou premennej je; (Bodkočiarka). Nedáva sa len za riadky s if, else, void, atď a riadky, kde sú len zátvorky, ktoré tieto časti kódu ohraničujú. A keďže výnimka potvrdzuje pravidlo a aby sme to nemali tak jednoduché, tak viacriadkové deklarácia 2D poľa má len jeden bodkočiarka za ukončením deklarácie.
  • Ohraničovanie častí kódu s {a}. Všetko, čo pod niečo spadá, tj. Veci v setupu, Loop, nami definovaných funkcií, if, else atď. Sa musí dať medzi tie havranie zátvorky. Samozrejme výnimka potvrdzuje pravidlo, takže ak sa po if, else nachádza len jeden jediný riadok, možno zátvorky vynechať.

Premenné

Bez premenných by to nešlo. Premenné sú miesto v pamäti, do ktorého môžeme uložiť nejakú hodnotu, ľubovoľne ju meniť a ľubovoľne si ju pomenovať. Máme hneď niekoľko typov premenných:

char Znak, nadobúda hodnoty práve jedného ASCII znaku
byte Je schopný uložiť jedno 8 bitové číslo (0-255)
int Nadobúda hodnoty celého čísla od -32 768 do 32 767 (16 bitov)
unsigned int Podobne ako int, len sa záporné hodnoty "prelejú" do kladných, teda uloží hodnoty 0-65 535
long Uchováva 32 bitové číslo v rozsahu -2 147 483 648 do 2 147 483 647
unsigned long Podobne ako unsigned int. 0 - 4 294 967 295
float Desatinné číslo s veľkosťou 32 bitov
double Desatinné číslo s dvojnásobnou presnosťou
boolean Nadobúda hodnoty 0 (False) až 1 (True)
word Viď. unsigned int
string Uchováva textový reťazec
Ako premenné deklarovať?

Než premenné začneme používať, musíme ich deklarovať. Ak sa do nej bez deklarácie rovno pokúsime niečo uložiť, tak nám kompiler vynadá (dá sa to prirovnať k tomu, keď chcete niečo uložiť do trezoru, ale žiadny trezor ste si nekúpili). Možností deklarácia je hneď niekoľko:

//první způsob - konstanty, neměnitelné proměnné
#define hodnota = 10 // Hodnotu vytvoříme a rovnou jí nastavíme na 10. Sama se nastaví na int
#define hodnota // Někdy potřebujeme nastavit hodnotu až když je třeba, k tomu slouží tento zápis

//druhý způsob - klasické proměné
int hodnota = 10; // proměnná má nastavený typ int a hodnotu 10
int hodnota; // proměnná typu int bez přiřazené hodnoty

Ak premennú deklarujeme, nepriradíte jej hodnotu a potom ju vyvoláme, tak nenastane chyba. Program sa bude tváriť, že je v nej 0 (v prípade int, float, ..), prázdny reťazec (string), ...

Premenným potom môžeme nastavovať rôzne hodnoty:

vstup = Serial.read();
pocet = 10

A čo keby ste chceli hodnotu pocet zvýšiť alebo znížiť o hodnotu v premennej zmena? Ak vás napadne:

pocet = pocet + zmena;
pocet = pocet - zmena;

//mimochodem toto se bude jevit jako že se s proměnnou nic neudělalo, protože něco přidáme a hned to samé sebereme

zle to nie je, ale nie je jednoduchšie napísať

pocet += zmena;
pocet -= zmena;

?

Podmienky

Bez podmienok sa prakticky nezaobídete. Proste sa stále dostávate do situácií, kedy budete potrebovať, aby sa jedna časť vykonala len keď niečo platí. Podmienka sa rieši pomocou príkazu if (anglicky ak). Ďalej tu je ešte else if (alebo ak) a else (inak). A ako to funguje? Ak chceme len jednu podmienku, tak použijeme jednoducho if

if( podmínka )
{
    // Udělej toto
}

Ak chceme viac podmienok, tak sú dve možnosti - záleží na tom, či nám je jedno, či sa ich splní viac, alebo či chceme, aby sa niečo stalo v prípade, že žiadna neplatí.

if( podminka1)
    cinnost1
if( podmínka 2)
    cinnost 2
else
    cinnost 3

Čo sa tu stane? Dajme tomu, že by sme chceli, aby sa v prípade podmienky jedna vykonala činnosť 1, v prípade podmienky 2 činnosť 2 a v prípade žiadnej podmienky činnosť 3. Ak sa nesplní ani podmienka 1, ani 2, tak sa vykoná činnosť 3. Ak sa splní podmienka 2, tak sa vykoná činnosť 2, ale ak sa splní podmienka 1, tak sa vykoná činnosť 1 a 3. Jakto? Pretože druhej if program berie ako ďalšie oddelenú časť, takže vykoná podmienku 1 a prejde k druhému if s tým, že sa jedná o ďalšiu vec, ktorú treba otestovať. Podmienka 2 sa nesplní, takže sa vykoná else. Ako teda programu povedať, aby to celé bral ako jednu časť?

Jednoducho, miesto druhého if vložíme else if. Program teda bude fungovať štýlom:

Pokud souhlasí první podmínka (if) //pokud ne, přejde na další
    Udělej činnost 1
Nebo pokud souhlasí tato podmínka (else if) //pokud ne, přejde na další
    Udělej činnost 2
Jinak, pokud nic nesouhlasí (else)
    Udělej činnost 3

Takže to je systém fungovania podmienok. A ako ich používať?

Operátorov k podmienkam

Takže čo chceme v kóde kontrolovať? Veľmi často sa stretneme s tým, že nejaká funkcia vráti true alebo false, podľa toho, či sa akcia podarila. Ak chceme skontrolovať výsledok na true, tak nie je potrebné nič porovnávať, proste napíšeme

if(vysledek)

A ak je výsledok true, tak sa if vykoná, ak je false, tak nie. Čo ale keď chceme porovnať nejaké čísla? Tu máme niekoľko operátorov. Tie napíšeme jednoducho medzi dve hodnoty do zátvoriek za if.

Takže máme zápis:

if( x <operator> y)

Čo môžeme dosadiť za operátorov?

operátor kompletný zápis význam
== x == y ak sa x rovná y
! = x! = y ak sa x nerovná y
< x <y ak x menšia než y
> x> y ak x väčšie ako y
<= x <= y ak x menšie alebo rovné y
> = x> = y ak x väčšie alebo rovné y
To sú všetky operátory, ktoré Arduino dokáže spracovať. Ovšem musíme porovnávať veci, ktoré sa porovnávať dajú. Chyba by bola napísať niečo v štýle if (pocet_kusu_nas­klade (int)> = seznam_zakazniku (string))!

Kombinovanie podmienok & logické operátory

Dajme tomu, že potrebujeme podmienok overiť viac. Ako príklad si vezmime niečo zo života. Niekto si ide kúpiť alkohol a my potrebujeme overiť niekoľko vecí - bolo mu 18 rokov? Je Becherovka na sklade? A má pri sebe dostatočný obnos? Ako na to? Ak začnete hneď búšiť

if( vek >= 18)
{
    if (napoj.jeNaSklade)
    {
        if( hotovost >= napoj.cena)
        {

Tak to síce taky pôjde, ale použiteľné to je len v prípade, keď budeme chcieť prísť na to, kde nastala chyba (pomocou else ku každému if). Pokiaľ ale chceme otestovať všetko bez ohľadu na to, kde to neplatí, tak môžeme všetky 3 podmienky zlúčiť do jedného IFU. Ako?

Pomocou logických operátorov:

  • && - čiže a (P Alt + C)
  • || - čiže alebo (P Alt + W) && nám vráti True, ak platia obe podmienky, ktoré spájame. Ak niektorá z nich neplatí, vráti false.
      nám vráti True, ak aspoň jedna z podmienok je True. Ak sú obe False, vracia False.
A ako to teda spojiť?
if ((vek >= 18 & (napoj.jeNaSklade == true & (hotovost >= napoj.cena))))

Tu je dôležité dbať na to, že ak spájame podmienky s ==,> atď, tak je lepšie, keď je každá časť v zátvorke, inak to robí neplechu.

Ďalej existuje ešte operátor!, Ktorý neguje, takže

!true //je false
!false //je true

if(!Serial.available())
{
    //se vykoná jen když sériový port nebude k dispozici

Pokračujte prosím k druhému dielu.


 

Predchádzajúci článok
Sedemsegmentový display a polia pre Arduino
Všetky články v sekcii
Arduino
Preskočiť článok
(neodporúčame)
Arduino - Jazyk 2
Článok pre vás napísal Adam Ježek
Avatar
Užívateľské hodnotenie:
4 hlasov
Autor se převážně věnuje Arduinu a psaní tutoriálů z této oblasti, občas napíše příležitostně nějakou tu zprávičku. Většinu svého volného času momentálně věnuje Linuxu a/nebo Raspberry Pi. Také umí C#, HTML, CSS, PHP a Python.
Aktivity