11. díl - Arduino - Jazyk

Hardware PC Arduino Arduino - Jazyk

S desátým dílem jsem se ohlédl za tím, co vše jsem již napsal, a zjistil, že se mi poměrně dobře dařilo vyhýbat se vysvětlování jazyka. Ve 4. dílu to bylo takové vysvětlování-nevysvětlování a v ostatních se občas objevila nějaká ta poznámka a to bylo všechno. Většina z vás již toho mnoho pochytila z minulých dílů, nebo to zná z jiných jazyků, ale pro jistotu si to projdeme. Takže v tomto díle si projdeme jazyk a završíme to tvorbou vlastní knihovny.

Co je to vůbec za jazyk?

Několik lidí se mě na to ptalo a ačkoliv se Arduinem zabývám docela dlouho, tak ani po roce se mi nepovedlo najít jednoznačnou odpověď. Teď se pohybuji na tenkém ledě, když to řeknu, ale vím zhruba toto: Jazyk je odvozený z Wiringu, upravili si ho podle sebe a jmenuje se jednoduše Arduino Language.

Základní syntaxe

Při psaní kódu je třeba dbát na několik pravidel. Nejspíše jste je odchytily z minulých dílů, ale pro úplnost je zde připomenu.

  • Na konci každého řádku s voláním funkce nebo deklarací proměnné je ; (středník). Nedává se jen za řádky s if, else, void, atd a řádky, kde jsou jen závorky, které tyto části kódu ohraničují. A jelikož výjimka potvrzuje pravidlo a abychom to neměli tak jednoduché, tak víceřádková deklarace 2D pole má jen jeden středník za ukončením deklarace.
  • Ohraničování částí kódu s { a }. Vše, co pod něco spadá, tj. věci v setupu, loopu, námi definovaných funkcí, if, else atd. se musí dát mezi ty havraní závorky. Samozřejmě výjimka potvrzuje pravidlo, takže pokud se po if, else nachází jen jeden jediný řádek, lze závorky vynechat.

Proměnné

Bez proměnných by to nešlo. Proměnné jsou místo v paměti, do kterého můžeme uložit nějakou hodnotu, libovolně ji měnit a libovolně si ji pojmenovat. Máme hned několik typů proměnných:

char Znak, nabývá hodnoty právě jednoho ASCII znaku
byte Je schopen uložit jedno 8 bitové číslo (0-255)
int Nabývá hodnot celého čísla od -32 768 do 32 767 (16 bitů)
unsigned int Podobně jako int, jen se záporné hodnoty "přelijí" do kladných, tedy uloží hodnoty 0-65 535
long Uchovává 32 bitové číslo v rozsahu -2 147 483 648 do 2 147 483 647
unsigned long Obdobně jako unsigned int. 0 - 4 294 967 295
float Desetinné číslo o velikosti 32 bitů
double Desetinné číslo s dvojnásobnou přesností
boolean Nabývá hodnoty 0 (False) až 1 (True)
word Viz. unsigned int
string Uchovává textový řetězec

Jak proměnné deklarovat?

Než proměnné začneme používat, musíme je deklarovat. Pokud se do ní bez deklarace rovnou pokusíme něco uložit, tak nám kompiler vynadá (dá se to přirovnat k tomu, když chcete něco uložit do trezoru, ale žádný trezor jste si nekoupili). Možností deklarace je hned několik:

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

Pokud proměnnou deklarujeme, nepřiřadíme jí hodnotu a poté jí vyvoláme, tak nenastane chyba. Program se bude tvářit, že je v ní 0 (v případě int, float,..), prázdný řetězec(string),...

Proměnným pak můžeme nastavovat různé hodnoty:

vstup = Serial.read();
pocet = 10

A co kdybyste chtěli hodnotu pocet zvýšit nebo snížit o hodnotu v proměnné zmena? Pokud 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

špatně to není, ale není jednodušší napsat

pocet += zmena;
pocet -= zmena;

?

Podmínky

Bez podmínek se prakticky neobejdete. Prostě se stále dostáváte do situací, kdy budete potřebovat, aby se jedna část provedla jen když něco platí. Podmínka se řeší pomocí příkazu if (anglicky pokud). Dále tu je ještě else if (nebo pokud) a else (jinak). A jak to funguje? Pokud chceme jen jednu podmínku, tak použijeme jednoduše if

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

Pokud chceme více podmínek, tak jsou dvě možnosti - záleží na tom, jestli nám je jedno, jestli se jich splní více, nebo jestli chceme, aby se něco stalo v případě, že žádná neplatí.

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

Co se zde stane? Dejme tomu, že bychom chtěli, aby se v případě podmínky jedna vykonala činnost 1, v případě podmínky 2 činnost 2 a v případě žádné podmínky činnost 3. Pokud se nesplní ani podmínka 1, ani 2, tak se vykoná činnost 3. Pokud se splní podmínka 2, tak se vykoná činnost 2, ale pokud se splní podmínka 1, tak se vykoná činnost 1 a 3. Jakto? Protože druhé if program bere jako další oddělenou část, takže vykoná podmínku 1 a přejde k druhému if s tím, že se jedná o další věc, kterou třeba otestovat. Podmínka 2 se nesplní, takže se vykoná else. Jak tedy programu říci, aby to celé bral jako jednu část?

Jednoduše, místo druhého if vložíme else if. Program tedy bude fungovat stylem:

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 fungování podmínek. A jak je používat?

Operátory k podmínkám

Takže co chceme v kódu kontrolovat? Velmi často se setkáme s tím, že nějaká funkce vrátí true nebo false, podle toho, jestli se akce povedla. Pokud chceme zkontrolovat výsledek na true, tak není třeba nic porovnávat, prostě napíšeme

if(vysledek)

A pokud je výsledek true, tak se if vykoná, pokud je false, tak nikoli. Co ale když chceme porovnat nějaká čísla? Zde máme několik operátorů. Ty napíšeme jednoduše mezi dvě hodnoty do závorek za if.

Takže máme zápis:

if( x <operator> y)

Co můžeme dosadit za operátory?

Operátor Kompletní zápis Význam
== x == y pokud se x rovná y
!= x != y pokud se x nerovná y
< x < y pokud je x menší než y
> x > y pokud je x větší než y
<= x <= y pokud je x menší nebo rovno y
>= x >= y pokud je x větší nebo rovno y

To jsou všechny operátory, které Arduino dokáže zpracovat. Ovšem musíme porovnávat věci, které se porovnávat dají. Chyba by byla napsat něco ve stylu if (pocet_kusu_nas­klade(int) >= seznam_zakazni­ku(string))!

Kombinování podmínek & logické operátory

Dejme tomu, že potřebujeme podmínek ověřit více. Jako příklad si vezměme něco ze života. Někdo si jde koupit alkohol a my potřebujeme ověřit několik věcí - bylo mu 18 let? Je Becherovka na skladě? A má u sebe dostatečný obnos? Jak na to? Pokud začnete hned bušit

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

Tak to sice taky půjde, ale použitelné to je jen v případě, když budeme chtít přijít na to, kde nastala chyba (pomocí else ke každému if). Pokud ale chceme otestovat vše bez ohledu na to, kde to neplatí, tak můžeme všechny 3 podmínky sloučit do jednoho ifu. Jak?

Pomocí logických operátorů:

  • && - neboli a (P Alt + C)
  • || - neboli nebo (P Alt + W)

    && nám vrátí True, pokud platí obě podmínky, které spojujeme. Pokud některá z nich neplatí, vrátí false.

    || nám vrátí True, pokud alespoň jedna z podmínek je True. Pokud jsou obě False, vrací False.

A jak to tedy spojit?

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

Zde je důležité dbát na to, že pokud spojujeme podmínky s ==, > atd, tak je lepší, když je každá část v závorce, jinak to dělá neplechu.

Dále existuje ještě operátor !, který 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 dílu.


 

  Aktivity (1)

Článek pro vás napsal Adam Ježek
Avatar
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.

Jak se ti líbí článek?
Celkem (5 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Arduino
Miniatura
Následující článek
Arduino - Jazyk 2

 

 

Komentáře
Zobrazit starší komentáře (7)

Avatar
Tomáš Brůna
Redaktor
Avatar
Tomáš Brůna:

Ahoj jde použít jako podmínka

if (led, HIGH)**{}**

?

Odpovědět 21.4.2015 21:09
Lepší být šprt než blbec :)
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Tomáš Brůna
Adam Ježek:

Tef te nechapu. Chces zjistit jesti je na pinu proud nebo ne?

Odpovědět 21.4.2015 21:16
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Adam Ježek
Tomáš Brůna:

chci pokus je led dioda rozsvicena aby po zmacknuti klavesy 'A' zhasla

Odpovědět 21.4.2015 22:06
Lepší být šprt než blbec :)
Avatar
CZkiniCZ
Člen
Avatar
CZkiniCZ:

Stavím si z Arduina zámek s klávesnicí, displejem a chci si tam přidat i menu k nastavování proměných (kolik s máš na otevření, kolik pokusů zadat pin máš apod . . .), jenže jsem se trochu zamotal v podmínkách. Má to fungovat tak že když přijdu ke klávesnici tak zadám pin a zmáčknu ent aby mě to odemklo (to funguje). Když se chci dostat do menu (už se ztrácím) tak musím zmáčknout F1, vybrat co chci upravit a zmáčknout ent abych tu položku zvolil. To už ale nevím jak udělat. Kod pro odemčení mám takový:
switch (eKey){
case 'E': checkPassword(); break;
case 'C': password.reset(); break;
default:passwor­d.append(eKey);
}
a tet když do toho chci přidat to menu tak mi to nepůjde.
Kod pro menu:

switch (eKey){
case '>':
case '^': uparrow(); break;
case 'v': downarrow(); break;
case '<':
case 'E': execute(); break;
}

Samostatně mi ty programy fungují, ale nevím jak je sloučit dohromady (ta podmínka je jediná věc se kterou si nemůžu poradit).

Odpovědět 3.6.2015 16:56
Age of the geek.
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na CZkiniCZ
Adam Ježek:

Asi bych si tam dal nějaký boolean, který bych po zmáčknutí F1 pro menu změnil. A pak by si měl pokud je false, tak kód pro zámek, pokud true, tak kód pro menu.

Odpovědět 3.6.2015 18:35
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
CZkiniCZ
Člen
Avatar
Odpovídá na Adam Ježek
CZkiniCZ:

Pořát to nemůžu to přinutit aby to reagovalo na stisknutí klávesi F1. Co jsem našel návody na google tak všude je to jen na spínač a já nevím jak tam implementovat tu klávesnici.

Odpovědět 3.6.2015 19:31
Age of the geek.
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na CZkiniCZ
Adam Ježek:

Zkus si přečtené znaky posílat na sériovou linku. Jestliže všechno funguje, jenom jednu klávesu nějak nezachytíš, tak buď nefunguje, nebo ji píšeš jinak než má být.

Odpovědět 3.6.2015 20:37
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
CZkiniCZ
Člen
Avatar
Odpovídá na Adam Ježek
CZkiniCZ:

Všechny klávesy mi fungují ale furt se mi to nedaří rozchodit. Spíš by mi pomohl nějaký tutoriál, nebo ukázka kodu.

Odpovědět 3.6.2015 20:48
Age of the geek.
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na CZkiniCZ
Adam Ježek:

Mě by zase pomohlo, kdyby si ukázal tvůj kód. Zkus založit vlákno ve fóru ( http://www.itnetwork.cz/…-elektronika )a hoď to tam. Ale jestli ty to samostatně funguje, tak by to mělo jít přes if spojit. Pošli a uvidíme :)

Odpovědět  +1 3.6.2015 20:50
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
ostrozan
Redaktor
Avatar
ostrozan:

ale vím zhruba toto: Jazyk je odvozený z Wiringu, upravili si ho podle sebe a jmenuje se jednoduše Arduino Language.

týká se to ale pouze hlavního - main sketche vašeho projektu - knihovny jsou psané v tom Wiringu a tak když byste si chtěli napsat svoji vlastní knihovnu, kdybyste náhodou na něco nenašli na GitHubu (což pochybuju) tak stejně jako kdybyste nějaký složitěší sketch chtěli rozdělit do více souborů - musíte to napsat ve Wiringu

Wiring je pro mikrokontrolery upravený C++ ale pozor, není to plnohodnotný objektový jazyk, protože mikrokontrolery v žádném případě objektový přístup nezvládnou - Wiring využívá spíše syntaxi C++ je to takový přechod mezi C a C++

Editováno 14. února 15:28
 
Odpovědět 14. února 15:26
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 17. Zobrazit vše