Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

5. diel - Arduino - Projekty s LED diódami a potenciometrom

V predchádzajúcej lekcii, Arduino - Polovodičové elektronické súčiastky , som si popísali LED diódy a základné druhy tranzistorov.

V dnešnej lekcii si ukážeme, ako vytvoriť užívateľsky interaktívny LED projekt iba s Arduinom, potom si v dnešnom tutoriále ukážeme, ako ovládať stav LED pomocou potenciometra.

Blikanie LED podľa vstupu užívateľa

Pustíme sa teda do toho. Náš prvý projekt vyzve používateľa, aby zadal počet bliknutí a LED diódu toľkokrát rozblikáme.

Tento projekt bude odlišný v jednej veci, nebudeme potrebovať žiadne súčiastky, postačí nám teda len Arduino. Tí, ktorí projekt robia iba virtuálne, v Tinkercade, tiež nebudú potrebovať nič iné ako ich virtuálne Arduino Uno.

Využijeme totiž Built-In LED v Arduine, teda vstavanú LED, ktorá už je pripojená k Arduinu od začiatku. Pokiaľ by niekto chcel pracovať s vlastnou LED, ide to samozrejme tiež, funkčnosť projektu sa tým nijako nemení. Hlavnou výzvou tohto mini-projektu bude teda primárne program, ktorý si samozrejme krok za krokom vysvetlíme.

Na obrázku môžeme vidieť, kde konkrétne sa vstavaná LED nachádza:

Arduino-vstavaná-ľad - Arduino - Hardvér

Program príkladu

Môžeme sa teda pustiť rovno do písania kódu. Začneme, ako vždy, konštantami a premenný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`.

Ako prvé si nadefinujeme pin našej LED. Definujeme ho ako pin 13, pretože na ňom je vstavaná LED pripojená. Pokiaľ však používate vlastnú LED, je nutné tento pin zmeniť na správnu hodnotu.

Potom si vytvoríme dve ďalšie premenné. Do prvej premennej budeme ukladať zadaný počet bliknutí, teda koľkokrát má LED bliknúť. Tá bude neskôr v programe menená užívateľom podľa ľubovôle. Druhou premennou, ktorú si vytvoríme, je bool premenná, ktorá nám určuje, kedy je správny čas na to, aby sme používateľa vyzvali na zadanie počtu bliknutí. V cykle loop() by sa nám totiž inak mohlo stať, že budeme otázku vypisovať stále dookola. Pokiaľ nám užívateľ práve počet zadal, diódu rozblikáme.

Premenné pocet_bliknuti sme ako dátový typ nastavili byte s rozsahom 0255. Nepredpokladáme totiž, že by používateľ zadal vyššie číslo.

Ďalej, vo funkcii setup() Arduinu povieme, že chceme definovať našu LED ako výstup a zariadime začatie sériového monitora pomocou príkazu Serial.begin(). Naša rýchlosť je 9600 Baudov, ako to už u Arduina býva zvykom:

void setup()
{
  pinMode(LED_ARDUINO, OUTPUT);
  Serial.begin(9600);
}

Hlavná slučka

V hlavnej slučke najskôr zistíme, či nám užívateľ poslal informáciu o tom, koľkokrát má dióda bliknúť. Použijeme teda podmienku, a pokiaľ tak neurobil, vyzveme ho k tomu v jej tele. Hneď potom musíme hodnotu premennej zmeniť, aby sa program znovu neopýtal, keď už má potrebnú informáciu:

void loop()
{
  if (!uzivatel_dotazan)
  {
    Serial.println("Kolikrat ma LED zablikat?");
    uzivatel_dotazan = true;
  }
  // Sem za chvilku doplníme druhou podmínku.
}

Hlavička podmienky vyššie by mohla vyzerať aj takto: if (uzivatel_dotazan == false). My sme však zvolili kratší a správnejší zápis, pri ktorom nám stačí bool hodnotu premennej znegovať. To vykonáme opäť pripojením ! na začiatok názvu premennej.

Pridajme si teraz druhú podmienku. V tej nájdeme príkaz Serial.available(), s ktorým sme sa doposiaľ ešte nestretli. Kým používateľ nezadá do sériového monitora odpoveď, bude tento príkaz vracať hodnotu 0. Akonáhle používateľ zareaguje, spustí sa kód v podmienke. Poďme si ho ukázať:

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;
  }

Zadanú hodnotu uložíme do našej premennej pocet_bliknuti. Pomocou príkazu Serial.parseInt() hovoríme, že očakávame číslo. Hodnota, ktorú používateľ zadá na vstupe, je totiž vždy chápaná ako textový reťazec.

Pripojíme výpis zadaného počtu bliknutí a diódu rozblikáme vo for cykle, ktorý nám zariadi, aby počet LED bliknutí nepresiahol hodnotu čísla v našej premennej. V tele for cyklu LED zapníname a vypníname s určitou pauzou.

Pretože sme už diódu rozblikali podľa priania užívateľa, nastavíme našu pomocnú premennú na false. Vďaka tomu budeme môcť diódu rozblikať znova.

Tým máme kód hotový. Program teraz môžeme spustiť a vyskúšať.

LED diódy ovládané potenciometrom

V druhej úlohe použijeme potenciometer, teda posuvný rezistor, ktorý je schopný zmeniť svoj odpor. Potenciometrom určíme, či chceme rozsvietiť všetky štyri diódy alebo len niektoré.

Zoznam súčiastok

Na zostavenie obvodu budeme potrebovať tieto súčiastky:

  • Arduino,
  • 4x rezistor 150 [Ω],
  • 4x LED - použijeme rôzne farby na odlíšenie,
  • prepojovacie káble,
  • potenciometer 10 [kΩ] a
  • nepájivé pole.
Príprava zapojenia

Všetky štyri LED zapojíme tak, ako to poznáme z predchádzajúcich úloh. Ich katódu zapojíme cez 150 [Ω] rezistor a anódu cez ľubovoľný digitálny pin. Jedinou novinkou v našom zapojení bude potenciometer. Do potenciometra musíme priviesť tri typy pinov - GND, ľubovoľný analógový pin, v našom prípade A0, a prívod napätia 5 V. A to zľava doprava, presne v spomínanom poradí.

Pri potenciometri musíme použiť analógový pin, nie digitálny! Je to z toho dôvodu, že potrebujeme pracovať s inými hodnotami, než je 0 a 1. Analógový pin vracia na výstupe hodnoty 0255, na vstupe dosahuje hodnoty 01023.

Finálna podoba nášho zapojenia vyzerá takto:

Potenciometer-ľad - Arduino - Hardvér

Program obsluhy

Našim cieľom je naprogramovať potenciometer, aby na určitých hodnotách začal postupne zapínať LED. V prípade točenia potenciometra na druhú stranu sa diódy začnú vypínať.

Najprv si definujeme všetky komponenty a deklarujeme jednu premennú:

#define LED_ZELENA 2
#define LED_ZLUTA 3
#define LED_ORANZOVA 4
#define LED_CERVENA 5
#define POTENCIOMETR A0

int hodnota_potenciometr;

Do premennej budeme v hlavnej časti programu ukladať hodnoty potenciometra.

Komponenty si ďalej inicializujeme vrátane monitora, kam budeme vypisovať získané hodnoty. Potenciometer sme 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 sa presunúť do funkcie loop().

Hlavná slučka

Ako prvé si v hlavnej slučke získame pomocou príkazu analogRead() aktuálnu hodnotu potenciometra, uložíme ju a vypíšeme. Výpis pridávame, aby sme vedeli, na akej hodnote práve sme a ktorá LED má teda svietiť:

void loop()
{
   hodnota_potenciometr = analogRead(POTENCIOMETR);
   Serial.print("Hodnota potenciometru je: ");
   Serial.println(hodnota_potenciometr);
   ...
}

Teraz by sme potrebovali doplniť štyri podmienky, v ktorých nastavíme každej dióde, od akej hodnoty má svietiť. Výsledný kód by vyzeral 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);
}

Nie je to ale veľmi pekné riešenie. Poďme si ukázať lepšie. Predstavíme si ternárny výraz.

Ternárny výraz

Na zjednodušenie kódu by sme mohli tiež vytvoriť nejakú pomocnú funkciu, dnes použijeme ternárny výraz, ktorý je dobré poznať.

Jeho syntax je nasledovná:

(podmínka) ? hodnota1 : hodnota2

Najskôr do zátvorky napíšeme podmienku, nasleduje otáznik a prvá hodnota, ktorá bude použitá, pokiaľ podmienka platí. Po dvojbodke uvedieme druhú hodnotu, ktorú použijeme, ak podmienka nie je splnená.

Ternárny výraz v našom prípade vložíme do funkcie digitalWrite(), výsledný kód bude vyzerať nasledovne:

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 potenciometra 01023 sme rozdelili do pomyselných častí. Ak je hodnota väčšia ako prvá časť, rozsvieti sa prvá LED. Pokiaľ je väčšia ako druhá časť, rozsvieti sa prvá aj druhá LED a tak ďalej. Časti môžu byť ľubovoľne veľké, pokiaľ neprekročíme minimálnu a maximálnu hodnotu potenciometra. Tiež je veľmi jednoduché pridať ďalšie LED a iba zvýšiť počet častí, do ktorých rozdelíme hodnoty potenciometra.

Tým máme ďalší projekt dokončený, môžeme ho spustiť a otestovať.


 

Predchádzajúci článok
Arduino - Polovodičové elektronické súčiastky
Všetky články v sekcii
Arduino - Hardvér
Článok pre vás napísal Dominik Němeček
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování mikropočítačů Arduino.
Aktivity