Lekce 5 - Arduino - Projekty s LED diodami a potenciometrem
V předchozí lekci, Arduino - Projekty s LED diodami a tlačítkem, jsme si ukázali dva jednoduché příklady, v prvním jsme rozblikali diody, v druhém jsme diodu ovládali tlačítkem.
V dnešní lekci si ukážeme, jak vytvořit uživatelsky interaktivní LED projekt pouze s Arduinem, poté si v dnešním tutoriálu ukážeme, jak ovládat stav LED pomocí potenciometru.
Blikání LED podle vstupu uživatele
Pustíme se tedy do toho. Náš první projekt vyzve uživatele, aby zadal počet bliknutí a LED diodu tolikrát rozblikáme.
Tento projekt bude odlišný v jedné věci, nebudeme potřebovat žádné součástky, postačí nám tedy jen Arduino. Ti, kteří projekt dělají pouze virtuálně, v Tinkercadu, také nebudou potřebovat nic jiného než jejich virtuální Arduino Uno.
Využijeme totiž Built-In LED v Arduinu, tedy vestavěnou LED, která už je připojena k Arduinu od začátku. Pokud by někdo chtěl pracovat s vlastní LED, jde to samozřejmě také, funkčnost projektu se tím nijak nemění. Hlavní výzvou tohoto mini-projektu bude tedy primárně program, který si samozřejmě krok po kroku vysvětlíme.
Na obrázku můžeme vidět, kde konkrétně se vestavěná LED nachází:

Program příkladu
Můžeme se tedy pustit rovnou do psaní kódu. Začneme, jako vždy, konstantami a proměnnými:
#define LED_ARDUINO 13 byte pocet_bliknuti; // Do proměnné budeme ukládáme počet bliknutí zadaný uživatelem. bool uzivatel_dotazan; // I když proměnnou pouze deklarujeme, nese výchozí hodnotu `false`.
Jako první si nadefinujeme pin naší LED. Definujeme jej jako pin 13, protože na něm je vestavěná LED připojena. Pokud však používáte vlastní LED, je nutno tento pin změnit na správnou hodnotu.
Poté si vytvoříme dvě další proměnné. Do první proměnné budeme
ukládat zadaný počet bliknutí, tedy kolikrát má LED bliknout. Ta bude
později v programu měněna uživatelem dle libosti. Druhou proměnnou, kterou
si vytvoříme, je bool
proměnná, která nám určuje, kdy je
správný čas na to, abychom uživatele vyzvali k zadání počtu bliknutí. V
cyklu loop()
by se nám totiž jinak mohlo stát, že budeme
otázku vypisovat pořád dokola. Pokud nám uživatel zrovna počet zadal,
diodu rozblikáme.
Proměnné pocet_bliknuti
jsme jako datový typ
nastavili byte
s rozsahem 0
až 255
.
Nepředpokládáme totiž, že by uživatel zadal vyšší číslo.
Dále, ve funkci setup()
Arduinu řekneme, že chceme definovat
naší LED jako výstup a zařídíme zahájení sériového monitoru pomocí
příkazu Serial.begin()
. Naše rychlost je 9600 Baudů, jak už to
u Arduina bývá zvykem:
void setup() { pinMode(LED_ARDUINO, OUTPUT); Serial.begin(9600); }
Hlavní smyčka
V hlavní smyčce nejprve zjistíme, zda nám uživatel poslal informaci o tom, kolikrát má dioda bliknout. Použijeme tedy podmínku, a pokud tak neučinil, vyzveme ho k tomu v jejím těle. Hned potom musíme hodnotu proměnné změnit, aby se program znovu nezeptal, když už má potřebnou informaci:
void loop() { if (!uzivatel_dotazan) { Serial.println("Kolikrat ma LED zablikat?"); uzivatel_dotazan = true; } // Sem za chvilku doplníme druhou podmínku. }
Hlavička podmínky výše by mohla vypadat také takto:
if (uzivatel_dotazan == false)
. My jsme však zvolili kratší a
správnější zápis, při kterém nám stačí bool
hodnotu
proměnné znegovat. To provedeme opět připojením !
na začátek
názvu proměnné.
Přidejme si nyní druhou podmínku. V té nalezneme příkaz
Serial.available()
, se kterým jsme se doposud ještě nesetkali.
Dokud uživatel nezadá do sériového monitoru odpověď, bude tento příkaz
vracet hodnotu 0
. Jakmile uživatel zareaguje, spustí se kód v
podmínce. Pojďme si ho ukázat:
if (Serial.available() > 0) { pocet_bliknuti = Serial.parseInt(); // Vložená hodnota je chápána jako text, proto se musí tzv. naparsovat na číslo Serial.print("Zvoleny pocet bliknuti je: "); Serial.println(pocet_bliknuti); Serial.println("-------------------------"); for (int i = 1; i <= pocet_bliknuti; i++) { digitalWrite(LED_ARDUINO, HIGH); delay(1000); digitalWrite(LED_ARDUINO, LOW); delay(1000); } uzivatel_dotazan = false; }
Zadanou hodnotu uložíme do naší proměnné pocet_bliknuti
.
Pomocí příkazu Serial.parseInt()
říkáme, že očekáváme
číslo. Hodnota, kterou uživatel zadá na vstupu, je totiž vždy chápána
jako textový řetězec.
Připojíme výpis zadaného počtu bliknutí a diodu rozblikáme ve
for
cyklu, který nám zařídí, aby počet LED bliknutí
nepřesáhl hodnotu čísla v naší proměnné. V těle for
cyklu
LED zapnínáme a vypnínáme s určitou pauzou.
Protože jsme již diodu rozblikali dle přání uživatele, nastavíme
naší pomocnou proměnnou na false
. Díky tomu budeme moci diodu
rozblikat znovu.
Tím máme kód hotový. Program nyní můžeme spustit a vyzkoušet.
LED diody ovládané potenciometrem
Ve druhé úloze použijeme potenciometr, tedy posuvný rezistor, který je schopen změnit svůj odpor. Potenciometrem určíme, zda chceme rozsvítit všechny čtyři diody, nebo jen některé.
Seznam součástek
Na sestavení obvodu budeme potřebovat tyto součástky:
- Arduino,
- 4x rezistor 150 [Ω],
- 4x LED - použijeme různé barvy pro odlišení,
- propojovací kabely,
- potenciometr 10 [kΩ] a
- nepájivé pole.
Příprava zapojení
Všechny čtyři LED zapojíme tak, jak to známe z předchozích úloh. Jejich katodu zapojíme přes 150 [Ω] rezistor a anodu přes libovolný digitální pin. Jedinou novinkou v našem zapojení bude potenciometr. Do potenciometru musíme přivést tři typy pinů - GND, libovolný analogový pin, v našem případě A0, a přívod napětí 5 V. A to zleva doprava, přesně ve zmíněném pořadí.
U potenciometru musíme použít analogový pin, nikoliv
digitální! Je to z toho důvodu, že potřebujeme pracovat s jinými
hodnotami, než je 0
a 1
. Analogový pin vrací na
výstupu hodnoty 0
až 255
, na vstupu dosahuje hodnot
0
až 1023
.
Finální podoba našeho zapojení vypadá takto:

Program obsluhy
Naším cílem je naprogramovat potenciometr, aby na určitých hodnotách začal postupně zapínat LED. V případě točení potenciometru na druhou stranu se diody začnou vypínat.
Nejprve si definujeme všechny komponenty a deklarujeme jednu proměnnou:
#define LED_ZELENA 2 #define LED_ZLUTA 3 #define LED_ORANZOVA 4 #define LED_CERVENA 5 #define POTENCIOMETR A0 int hodnota_potenciometr;
Do proměnné budeme v hlavní části programu ukládat hodnoty potenciometru.
Komponenty si dále inicializujeme včetně monitoru, kam budeme vypisovat získané hodnoty. Potenciometr jsme nastavili na vstup:
void setup() { pinMode(LED_ZELENA, OUTPUT); pinMode(LED_ZLUTA, OUTPUT); pinMode(LED_ORANZOVA, OUTPUT); pinMode(LED_CERVENA, OUTPUT); pinMode(POTENCIOMETR, INPUT); Serial.begin(9600); }
Můžeme se přesunout do funkce loop()
.
Hlavní smyčka
Jako první si v hlavní smyčce získáme pomocí příkazu
analogRead()
aktuální hodnotu potenciometru, uložíme ji a
vypíšeme. Výpis přidáváme, abychom věděli, na jaké hodnotě právě
jsme a která LED má tedy svítit:
void loop() { hodnota_potenciometr = analogRead(POTENCIOMETR); Serial.print("Hodnota potenciometru je: "); Serial.println(hodnota_potenciometr); ... }
Nyní bychom potřebovali doplnit čtyři podmínky, ve kterých nastavíme každé diodě, od jaké hodnoty má svítit. Výsledný kód by vypadal takto:
if (hodnota_potenciometr > 290) { digitalWrite(LED_ZELENA, HIGH); } else { digitalWrite(LED_ZELENA, LOW); } if (hodnota_potenciometr > 435) { digitalWrite(LED_ZLUTA, HIGH); } else { digitalWrite(LED_ZLUTA, LOW); } if (hodnota_potenciometr > 725) { digitalWrite(LED_ORANZOVA, HIGH); } else { digitalWrite(LED_ORANZOVA, LOW); } if (hodnota_potenciometr > 1015) { digitalWrite(LED_CERVENA, HIGH); } else { digitalWrite(LED_CERVENA, LOW); }
Není to ale moc hezké řešení. Pojďme si ukázat lepší. Představíme si ternární výraz.
Ternární výraz
K zjednodušení kódu bychom mohli také vytvořit nějakou pomocnou funkci, dnes použijeme ternární výraz, který je dobré znát.
Jeho syntaxe je následující:
(podmínka) ? hodnota1 : hodnota2
Nejdříve do závorky napíšeme podmínku, následuje otazník a první hodnota, která bude použita, pokud podmínka platí. Po dvojtečce uvedeme druhou hodnotu, již použijeme, jestliže podmínka není splněna.
Ternární výraz v našem případě vložíme do funkce
digitalWrite()
, výsledný kód bude vypadat následovně:
digitalWrite(LED_ZELENA,(hodnota_potenciometr > 290) ? HIGH : LOW); digitalWrite(LED_ZLUTA,(hodnota_potenciometr > 435) ? HIGH : LOW); digitalWrite(LED_ORANZOVA,(hodnota_potenciometr > 725) ? HIGH : LOW); digitalWrite(LED_CERVENA,(hodnota_potenciometr > 1015) ? HIGH : LOW);
Hodnoty potenciometru 0
až 1023
jsme rozdělili do
pomyslných částí. Pokud je hodnota větší než první část, rozsvítí
se první LED. Pokud je větší než druhá část, rozsvítí se první i
druhá LED a tak dále. Části mohou být libovolně velké, pokud
nepřekročíme minimální a maximální hodnotu potenciometru. Také je velice
jednoduché přidat další LED a pouze zvýšit počet částí, do kterých
rozdělíme hodnoty potenciometru.
Možná vás napadlo, že hodnoty HIGH
a
true
jsou zaměnitelné, stejně jako LOW
a
false
. Ano, v našem příkladu bychom mohli v druhém parametru
nechat pouze podmínku. Ternární výraz je ovšem konstrukce, kterou je dobré
znát využít pro zjednodušení kódu, tam kde je potřeba.
Tím máme další projekt dokončený, můžeme ho spustit a otestovat.
Příště, v lekci Arduino - Pokročilá práce s tlačítky, si ukážeme další způsob práce se samostatnými tlačítky a naučíme se, jak se vyhnout nepříjemným vedlejším efektům při použití tlačítka.