IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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 - 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í:

Arduino-vestavěná-led - Arduino - Hardware

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 0255. 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 0255, na vstupu dosahuje hodnot 01023.

Finální podoba našeho zapojení vypadá takto:

Potenciometr-led - Arduino - Hardware

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 01023 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.


 

Předchozí článek
Arduino - Projekty s LED diodami a tlačítkem
Všechny články v sekci
Arduino - Hardware
Přeskočit článek
(nedoporučujeme)
Arduino - Pokročilá práce s tlačítky
Článek pro vás napsal Dominik Němeček
Avatar
Uživatelské hodnocení:
32 hlasů
Autor se věnuje programování mikropočítačů Arduino.
Aktivity