Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 5 - Podmínky v Arduinu

V minulé lekci, Proměnné - Datové typy a deklarace, jsme se naučili pracovat s proměnnými a dozvěděli se, co jsou datové typy.

V tomto tutoriálu programovacího jazyka pro Arduino se zaměříme na podmínky. Žádný dobrý programátor se bez podmínek neobejde. Jedná se o jednu ze základních a zároveň velmi podstatných látek, které se musíme v programování podrobně naučit. Tato lekce nám sice poskytne dostatečný přísun informací, ale přece jen pro zájemce zde máme podrobnější kurz Základní konstrukce jazyka C.

Podmínky v Arduinu

Podmínky nám umožňují reagovat na vzniklé situace. Zjednodušeně řečeno, když se něco stane, budeme na to muset nějak reagovat. Například: Zazvoní zvonek u dveří. Naší reakcí může být, že jdeme otevřít nebo jej ignorujeme.

Takováto rozhodnutí mají hodně společného s větvením programu. Normálně program začne prvním příkazem a vykonává jeden za druhým až konce. Podmínky však umožní přeskočit tuto posloupnost a v závislosti na aktuální situaci vykonat kód na jiném místě programu. Velmi často tuto situaci, řekněme stav programu, ovlivňuje uživatel. Ovšem může na to mít dopad také vrácená hodnota z nějakého funkce nebo připojeného zařízení. Například senzor pohybu zaznamená aktivitu a poskytne testovatelný vstup základní desce. Podle stavu se můžeme rozhodnout, zda spustit poplach a volat policii, nebo určit, že je všude klid a pohoda.

Je hodně situací, ve kterých se hodí podmínku použít. Dokonce bychom řekli, že se bez této fundamentální znalosti neobejde ani ten nejhorší možný programátor. To je důvod, proč si dnes vysvětlíme, jak s podmínkami pracovat. Podrobně se zaměříme na to jak fungují. Pro lepší představu si vše ukážeme na jednotlivých příkladech.

Všechny běžné programovací jazyky používají téměř stejnou strukturu podmínek, které schematicky vypadá takto:

Syntax If - Arduino - Programovací jazyk

Z obrázku je patrné, že pokud (if) je nějaký výraz (expr) pravdivý, vykoná se příkaz (stmt). Program pak pokračuje dále. Pro případ, že výraz pravdivý není, vykoná se větev uvozená klíčovým slovem else. Nyní si všechna klíčová slova rozebereme detailněji.

Klíčové slovo if

Pro zápis podmínky nám slouží klíčové slovo if (psáno malými písmeny). Tento výraz znamená v překladu "když, jestliže, pokud", což nám napovídá, jak tento typ podmínky funguje. Slovo if nám říká, že pokud je podmínka splněna, proběhne kus kódu, který se nachází v bloku programu pod konkrétní podmínkou.

Zkusme si to pro lepší představu ukázat na příkladu:

/*
 * Proběhne pouze jednou.
 * Nastavíme komunikační rychlost na 9600 Baud*s^(-1)
 */
void setup()
{
    Serial.begin(9600);
}

/*
 * Hlavní smyčka programu
 */
void loop()
{
    if (1 < 2) // Ptáme se: je 1 menší než 2? Vždy je to pravda, a proto proběhne blok níže
    {
        Serial.println("Podmínka platí"); // Výpis do sériového monitoru
    }
}

Pokud bychom podmínku obrátili: if (1 > 2) {...}, celý blok programu ve složených závorkách se přeskočí.

Víme tedy, že if můžeme použít v případě, že potřebujeme o něčem rozhodnout - něco se stalo a my na to reagujeme. Můžeme ho také použít, když se něco naopak nestane.

Dobrým příkladem může být, když program vyzve uživatele, aby zadal kladné číslo, které je potom porovnáváno s číslem jiným. Když podmínku uživatel nesplní a zadá například číslo záporné, můžeme podmínku if použít k tomu, aby uživateli "vynadala" za jeho chybu. Díky tomu se nám celý program nezhroutí.

Klíčové slovo else

Když se zamyslíme nad zpracováním podmínky s příkazem if, zjistíme, že něco chybí. Taková odpověď na otázku: Co když první část je špatně?

K tomuto slouží klíčového slova else (můžeme jej přeložit jako "jinak"). Převedeno do programátorské řeči:

if (nějaký stav)
{
    // stav je pravda, provedeme tedy tento kód
}
else
{
    // stav je špatně, provedeme místo toho tento kód
}

Pro lepší představu si ukážeme praktický příklad a trošku upravíme program, který jsme si ukazovali výše:

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    if (1 > 2) // Jednoduchá podmínka, kde se ptáme jestli je 1 větší než 2
    {
        Serial.println("Podmínka platí"); // Podmínka platí -> vypíše se text
    }
    else // Prvotní podmínka je neplatná
    {
        Serial.println("Podmínka neplatí"); // Vypíše se jiný text
    }
}

Více voleb else if

Abychom mohli vytvořit více možností jednotlivých podmínek, poslouží nám výraz else if. Takto můžeme nastavit neomezeně možností a tím se připravit na různé scénáře, které by mohly v průběhu programu nastat. Trochu upravíme předešlý program a ukážeme si, jak bychom tam mohli implementovat else if.

int a = 1; // Proměnná, kterou poté budeme porovnávat

void setup()
{
Serial.begin(9600);
}

void loop()
{
    if (a > 3) // Ptáme jestli je proměnná 'a' větší než 3
    {
        Serial.println("Proměnná a je větší, než 3"); // Vypíšeme text
    }
    else if (a == 1) // Ptáme jestli je proměnná 'a' rovna 1
    {
        Serial.println("Proměnná a je rovna 1"); // Ano je rovna jedné
    }
    else if (a == 2) // Ptáme jestli je proměnná 'a' rovna 2
    {
        Serial.println("Proměnná a je rovna 2");
    }
    else
    {
        Serial.println("Proměnná a je asi 0 nebo záporná"); // Víc možností nemáme
    }
}

Relační operátory

Každý (běžný) programovací jazyk má k dispozici takzvané relační operátory, které jsou nedílnou součástí výrazu v if.

Jeden relační operátor (porovnání: ==) jsme využili v kódu výše. Podívejme se na tabulku s dalšími příklady relačních operátorů, které se u podmínek také hojně používají:

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

Pozor! Je třeba odlišovat zápis x == y, kde porovnáváme dvě hodnoty a zápis x = y, kde hodnotu přiřazujeme!

Logické operátory a podmínky

Máme už jasno v tom, když je podmínka jedna. Co ale můžeme dělat v případě, když chceme, aby platilo více podmínek najednou?

I pro tuto situaci zde existuje řešení. Poslouží nám k tomu operátor &&, který v češtině znamená "současně" a ||, jehož význam je "nebo".

Zkratka pro && je Ctrl + Alt + C a pro || to je Ctrl + Alt + W.

Operátor Kompletní zápis Význam
&& x and y nebo x && y Pokud je x a současně y
|| x or y nebo x || y Pokud je x nebo y

Ukážeme si velice jednoduchý příklad toho, jak můžeme kombinování podmínek využít:

int a = 1; // Definice proměnné a s hodnotou 1
int b = 0; // Definice proměnné b s hodnotou 0

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (a == 1 && b == 0) // Pro splnění musí být 'a' rovno 1 a současně 'b' rovno 0 (v našem případě podmínka proběhne)
  {
    Serial.println("Proměnná a je rovna 1, zatímco proměnná b je rovna 0");
  }
}

Výše uvedený příklad bude zpracován celý. Zkusme nicméně podmínku změnit na if (a == 1 || b == 0) {...}. Zde se prvně porovná a s jedničkou, a pokud je výsledek pravdivý, programu to stačí. Relace b == 0 je již nedůležitá a bude přeskočena.

switch

Pokud máme podmínek více, chceme začít nějakou volbou a udržet kód přehledný. Můžeme k tomu použít sekvenci switch. Jedná se o jistou alternativu k else if, která je více přehledná. Funkcionalitou je switch dost podobný else if. Ukážeme si jednoduché využití a celkový zápis switch:

int volba = 1; // Proměnná s hodnotou 1

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    switch (volba) // Switch s dosazenou proměnnou "volba" --> hodnota proměnné je 1, což znamená, že proběhne case 1
    {
        case 1: // Volba číslo 1 - proběhne, když proměnná volba bude rovna 1
            Serial.println("Zvolena možnost 1");  // Výpis textu do sériového monitoru
            break; // Zamezíme vyhodnocení dalších voleb
        case 2:
            Serial.println("Zvolena možnost 2");
            break;
        case 3: // Volba číslo 3
            Serial.println("Zvolena možnost 3");
            break;
        default: // Výchozí volba - proběhne, nebude-li proměnná rovna žádné z možností
            Serial.println("Žádná ze zvolených možností"); // Výpis textu do sériového monitoru
     }
}

Každý blok switch jde nahradit blokem else if, záleží na osobní preferenci a na situační přehlednosti programu.

Z podmínek, voleb a větvení programu je to zatím vše.

V následujícím cvičení, Řešené úlohy k 4.-5. lekci programovacího jazyka Arduina, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Předchozí článek
Proměnné - Datové typy a deklarace
Všechny články v sekci
Arduino - Programovací jazyk
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 4.-5. lekci programovacího jazyka Arduina
Článek pro vás napsal Dominik Němeček
Avatar
Uživatelské hodnocení:
123 hlasů
Autor se věnuje programování mikropočítačů Arduino.
Aktivity