V dnešním díle zkusím rozebrat cykly, tedy jak donutit arduino vykonávat opakované činnosti, nekonečně nebo třeba jenom několikrát.
Základní a věčný cyklus v arduinu je funkce “loop()”, do té píšeme hlavní část programu. Tato hlavní část programu se vykonává pořád dokola v nekonečném cyklu. Na příkladu prvního programu jste určitě rozpoznali obsah cyklu:
- zapni led
- pockej vterinu
- vypni led
- pockej vteřinu
/* Blink Zapne led diodu na jednu vteřinu, následně ji na vteřinu vypne, takhle pořád dokola. Tento příklad je možno volně šířit. */ // k pinu 13 je připojena led dioda na většině Arduino desek. // provedeme pojmenování: int led = 13; // následující funkce setup se provede vždy jen jednou a to po stisknutí tlačítka reset nebo zapnutí desky: void setup() { // nastavíme pin s LED jako výstupní(EN: output). pinMode(led, OUTPUT); } // funkce loop(CZ: smyčka) se pouští pořád dokola dokud je deska zapnutá: void loop() { digitalWrite(led, HIGH); // zapni LED (HIGH (CZ: vysoká) je úroveň napětí nebo taky logická úroveň delay(1000); // čekej 1000ms digitalWrite(led, LOW); // vypni LED nastavením napětí nebo logické úrovně na LOW (CZ: nízká) delay(1000); // čekej 1000ms }
Pro vysvětlení dalších cycklů napíšeme program, který 10krát blikne rychle a 10krát pomaleji. Pro začátek použijeme cyklus “for”, ten má tři parametry:
- nastavení počitadla, nebo příkaz který se provede jenom na začátku. Klasicky začínáme od nuly: “pocitadlo=0;”
- podmínka pro ukončení, v našem případu dokud je pocitadlo menší než 10: “pocitadlo<10;”
- Navýšení počitadla, v našem příkladu je to navýšení počitadla o jedničku příkazem: “pocitadlo++;”
Cyklus “for” je ideální pro případy kdy předem znáte počet opakování, který má cyklus vykonat.
Následuje zdrojový kód s dvěma cykly, jeden pro rychlé blikání a druhý pro pomalé a ty se budou navěky opakovat. Oproti předchozímu příkladu jsem přidal ještě deklaraci proměnné “poc” v úvodu, která slouží jako počitadlo cyklů.
/* Blink cykly Tento příklad je možno volně šířit. */ int led = 13; int poc; //jedna promenna na pocitani cycklu void setup() { pinMode(led, OUTPUT); } void loop() { for(poc=0;poc<10;poc++){ //rychle blikani digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW); delay(500); } for(poc=0;poc<10;poc++){ //pomale blikani digitalWrite(led, HIGH); delay(2000); digitalWrite(led, LOW); delay(2000); } }
Zbývají nám k vysvětlení dva druhy cyklů a to je “while” a “do while”. Dělají v podstatě to samé jenom jejich syntaxe je trochu jiná. While cyklus má jediný parametr a to je podmínka pro ukončení. “While” a “do while” se liší jenom tím, že jeden kontroluje podmínku než začne provádět činnosti a “do while” kontroluje podmínku na konci činností. V praxi to znamená, že “do while” proběhne alespoň jednou, kdežto “while” nemusí proběhnout ani jednou. Tyto cykly se hodí tam kde neprovádíte jednoduché počítání, ale kontrolujete nějaký parametr co se mění v průběhu cyklu. Na vykonávání jednoduchého počítání je lepší “for”, protože všechny parametry a nastavení máte hezky pohromadě na jednom místě.
V následujícím příkladu je ukázka použití obou druhů cyklů.
/* Blink cykly */ int led = 13; int poc; //jedna promenna na pocitani cycklu void setup() { pinMode(led, OUTPUT); } void loop() { poc=0; //nejddriv nastaveni pocitadla while(poc<10){ //cyklus pro rychle blikani digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW); delay(500); poc++; //navyseni pocitadla o jednicku } poc=0; //nejddriv nastaveni pocitadla do{ //cyklus pro pomale blikani digitalWrite(led, HIGH); delay(2000); digitalWrite(led, LOW); delay(2000); poc++; //navyseni pocitadla o jednicku }while (poc<10); //podminka pro ukonceni nakonci }
Jenom jako zopakování předchozí lekce přidám kód doplněný o výpisy na sériový port, aby jste nemuseli počítat blikání, když si budete zkoušet cykly upravovat.
/* Blink cykly */ int led = 13; int poc; //jedna promenna na pocitani cycklu void setup() { pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { poc=0; //nejddriv nastaveni pocitadla while(poc<10){ //cyklus pro rychle blikani digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW); delay(500); poc++; //navyseni pocitadla o jednicku Serial.print("rychle "); Serial.println(poc); } poc=0; //nejddriv nastaveni pocitadla do{ //cyklus pro pomale blikani digitalWrite(led, HIGH); delay(2000); digitalWrite(led, LOW); delay(2000); poc++; //navyseni pocitadla o jednicku Serial.print("pomalu "); Serial.println(poc); }while (poc<10); //podminka pro ukonceni nakonci }