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 |
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 |
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.
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.