Lekce 8 - Pole a konstanty
V předešlém cvičení, Řešené úlohy k 6.-7. lekci programovacího jazyka Arduina, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
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.