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í.
Pouze tento týden sleva až 80 % na e-learning týkající se Java. Zároveň využij akce až 80 % zdarma při nákupu e-learningu. Více informací:

Lekce 8 - Pole a konstanty

V minulé lekci, Čtení uživatelských vstupů v Arduinu, jsme se naučili zpracovávat uživatelské vstupy a ukázali si, jaké použít funkce pro textové řetězce a číselné hodnoty.

V tomto tutoriálu programovacího jazyka pro Arduino se zaměříme na datovou strukturu pole a vyzkoušíme si, co všechno umí. Ukážeme si také reálný příklad využití pole v praxi. Nakonec prozkoumáme i předem definované konstanty.

Pole

Představme si, že si chceme uložit nějaké údaje o více prvcích. Např. chceme v paměti uchovávat deset čísel, případně jména padesáti uživatelů:

String user1 = "Josef";
String user2 = "Karel";
...
String user50 = "Dominik";

Je zřejmé, že v programování bude nějaká lepší cesta, než začít vytvářet proměnné uzivatel1, uzivatel2..., až třeba uzivatel50. Nehledě na to, že těch prvků, které ve svém programu potřebujeme, může být třeba 1000. Jak na to?

Pokud potřebujeme uchovávat větší množství proměnných stejného typu, tento problém nám řeší pole. Můžeme si ho představit jako řadu přihrádek, kde v každé máme uložený jeden prvek. Přihrádky jsou očíslované tzv. indexy, kdy ten první má index 0:

// Pole uživatelů
String uzivatele[5] = { "Josef" , "David", "Franta", "Karel", "Michal" };

Všimněme si, že před názvem musíme udat typ proměnných, které v poli skladujeme. Podívejme se nyní, jak se k jednotlivým prvkům pole přistupuje:

Serial.println(uzivatele[0]);
Serial.println(uzivatele[4]);
Serial.println(uzivatele[1]);

Výstup v konzoli:

Konzolová aplikace
Josef
Michal
David

Protože programátoři začínají vždy od nuly, není Josef pod indexem 1, ale pod indexem 0. Pod jedničkou je David, trojku má Franta a tak dále. A co kdybychom chtěli kromě uživatelů ukládat i redaktory a administrátory? Určitě si můžeme založit vlastní pole pro uživatele, pole pro redaktory a pole pro administrátory. Existuje ovšem i výrazně jednodušší řešení.

2D pole

Dvourozměrné pole si můžeme představit tak, že kartičky jsou v pořadačích a pořadače jsou umístěny do skříně. Jedná se o takzvané "pole polí". V kódu vypadá například takto:

String zamestnanci[3][5] = {
    {"Honza", "Jenda", "Mirek", "Jirka", "Josef"}, // Uživatelé
    {"Nikola", "Adam", "Zdenda"}, // Redaktoři
    {"David", "Michal"}, // Administrátoři
};

Všimněme si, že za složenou závorkou na konci deklarace pole je středník (;). Je to výjimka z pravidla!

V kódu opět musíme definovat, jaký typ proměnných v poli ukládáme. V našem případě tam je řetězec, takže pole je typu String. Poté musíme do hranatých závorek napsat počet polí a maximální hodnotu, kterou každé pole pojme. Pokud bychom 5 snížili na 4, tak redaktoři a admini projdou, ale protože uživatelů je 5, vyhodí nám překladač chybu. Přístup k jednotlivým proměnným je jednoduchý:

Serial.println(clenove[2][0]);
Serial.println(clenove[0][3]);

Výstup v konzoli:

Konzolová aplikace
David
Jirka

Programovací jazyky se velmi liší v tom, jak s polem pracují. V nižších jazycích, kterým je právě i jazyk Arduino, se musí specifikovat pevná velikost pole ve zdrojovém kódu, která již za běhu nelze měnit. Do pole tedy není možné přidávat další přihrádky, a proto musíme myslet na to, aby nám pro zamýšlené účely vždy stačilo.

Plnění polí

Pro hromadnou manipulaci s prvky pole se používají cykly:

int pole[10];

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

    for (int i = 0; i < 10; i++)
    {
      pole[i] = i + 1;
    }
}

void loop()
{
}

Abychom si obsah pole vypsali, doplníme do předchozího kódu:

int pole[10];

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

    for (int i = 0; i < 10; i++)
    {
      pole[i] = i + 1;
    }

    for (int i = 0; i < 10; i++)
    {
      Serial.println(pole[i]);
    }
}

Uveďme si nyní komplexnější příklad využití polí v kódu, který si můžeme vyzkoušet jak v reálném zapojení Arduina, tak i v simulaci. V příkladu si ukážeme, jak můžeme postupně zapnout sekvenci pinů. Výhodou pole je, že jeho obsažené proměnné spolu kromě typu nijak nemusí souviset. Mohou tedy být zcela různé. K iteraci pole použijeme cyklus for:

int prodleva = 200; // Nastavíme prodlevu blikání, čím vyšší číslo (v ms), tím bude pomalejší
int polePinu[] = { 5, 6, 4, 1, 2, 3 }; // Pole pinů, na kterých jsou připojené diody
int pocetPinu = 6;

void setup()
{
  // Ve for cyklu inicializujeme piny jako výstupní
  for (int i = 0; i < pocetPinu; i++)
  {
     pinMode(polePinu[i], OUTPUT);
  }
}

void loop()
{
  // Ve for cyklu budeme piny postupně zapínat a po uplynutí prodlevy vypínat
  for (int i = 0; i < pocetPinu; i++)
  {
    digitalWrite(polePinu[i], HIGH); // Zapneme pin na indexu i
    delay(prodleva); // Počkáme
    digitalWrite(polePinu[i], LOW); // Vypneme pin na indexu i
  }
}

Kód je jednoduchý, nicméně přesto si jej projděme. Ve funkci setup() musíme piny v našem poli nastavit pomocí funkce pinMode() na výstup. Cyklus postupně projde všechny prvky polePinu a nastaví jim režim OUTPUT.

Ve funkci loop() pak opět cyklem for naše pole iterujeme od nuly do pěti (máme šest pinů a první je pod indexem 0). Aktuálnímu pinu (podle indexu i) zapíšeme hodnotu HIGH. Poté pomocí funkce delay() a námi zvolené hodnoty proměnné prodleva vyvoláme přerušení provádění programu na čas v milisekundách, který jsme si nastavili. Následně opět aktuálnímu pinu zapíšeme hodnotu LOW. Tento for cyklus, jak jsme si již řekli, proběhne šestkrát. Po jeho skončení se program vrátí na začátek funkce loop() a celý cyklus se bude opakovat znovu.

Specifické Arduino konstanty

Jazyk Arduino má pro nás také několik předem definovaných hodnot. Nazývají se konstanty a už jsme se s nimi před chvílí setkali.

Konstanty HIGH / LOW

Tyto konstanty nám definují načtenou nebo zapisovanou logickou úroveň digitálních pinů Arduina. Konstanta HIGH je definována jako logická 1, stav ON, nebo napětí 5 V. Konstanta LOW je logická 0, stav OFF, nebo napětí 0 V.

Konstanty INPUT / OUTPUT

Tyto konstanty se používají pro přepnutí funkce digitálního pinu na vstup (INPUT) nebo výstup (OUTPUT).

V této lekci jsme probrali důležité znalosti. Práce s poli je podstatným prvkem každého programovacího jazyka, nicméně pro Arduino, či mikrokontrolery obecně, je důležitá zcela zásadním způsobem. V dalších lekcích tyto znalosti často využijeme.

V příští lekci, Funkce a knihovny, se naučíme vytvářet vlastní funkce, předávat jim parametry a vracet návratovou hodnotu.


 

Předchozí článek
Čtení uživatelských vstupů v Arduinu
Všechny články v sekci
Arduino - Programovací jazyk
Přeskočit článek
(nedoporučujeme)
Funkce a knihovny
Článek pro vás napsal Adam Ježek
Avatar
Uživatelské hodnocení:
44 hlasů
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