Lekce 29 - Zpět k začátkům - hrajeme si s LED

06.03.2014 15:22

Translate to English

   Rozhodl jsem se, ještě než budeme pokračovat s TFT displejem, zařadit jeden návod určený spíše začátečníkům a to po jednom dotaze. Úkol zní, k Arduinu zapojit 2 led diody, které budou po stisknutí tlačítka svítit nebo blikat. Říkáte si co je na tom složitého? No pro pokročilé asi nic, ale věnujeme trošku času pro začínající s Arduinem a problém si rozebereme. 

    Připojit k Arduinu LED diodu není problém, ale ne všechny mají stejné parametry nebo vlastnosti. Když koukneme na stránky dodavatele nebo výrobce Led diod, zjistíme, že jejich pracovní napětí je rozdílné a tak i proud, který diodou bude procházet není vždy stejný. V úkole zadání, že k Arduinu budeme připojovat LED diody 2. Máme tedy první možnost zapojit je buď sériově nebo paralelně k jednomu pinu. Já se přikláním k možnosti druhé, kdy v případě poruchy jedné, bude druhá dále fungovat (porucha LED diody přichází asi velmi zřídka, ale berme teoreticky). Ve verzi Arduina UNO je maximální proud na jednom pinu 40mA (0,04A). Vezmu nějakou LED a zjistím si její parametry. V mém případě je to pracovní napětí 2,2V a proud 20mA. Jak vidíte nebo si spočítáte při paralelním zapojení bude na jednom pinu proud hraniční pro pin což je 40mA. Já si myslím, že tomu pinu by se asi nic nestalo, ale buďme trošku opatrnější a řekneme si že použijeme pin zvlášť pro každou LED diodu (bereme v potaz, že se jedná o nějaké vícesvítivé LED diody, na trhu najdeme ledky, které mají proud i třeba 2mA). Teď si spočítáme ten předřadný odpor k diodě aby se nám při napětí 5V nespálila. Výpočet je jednoduchý. Od napájecího napětí (v našem případě 5V) odečteme pracovní napětí LEDky (v mém případě je to 2,2) a vyjde nám jaký musí být úbytek napětí na našem předřadném odporu. 

napětí na odporu = napětí zdroje - pracovní napětí LED

napětí na odporu = 5V - 2,2 = 2,8V

Víme že diodou bude protékat proud 20mA což je 0,02A. Z jednoduchého vzorce si vypočítáme odpor:

Odpor = napětí / proud

předřadný odpor = 2,8 / 0,02 = 140 Ohm 

K této hodnotě přesný odpor zřejmě nekoupíme, protože se jako nejbližší vetší hodnota dá koupit 150 Ohmů. Nikdy by jsme neměli dávat odpor menší hodnoty !!!. Já ještě uvedu příklad  pro jiný typ LED diody:

Led 3mm, barva červená, obchodní označení L-HLMP-1700, proud 2mA, napětí 1,7V

napětí na odporu = 5V - 1,7V = 3,2V

předřadný odpor = 3,2V / 0,002A = 1600 Ohmů = 1,6kOhm

Teď sami vidíte ten značný rozdíl. Ale od výpočtů zpět k Arduinu a jeho programu. V zadaní tedy je, že po stisku tlačítka se diody rozsvítí a po dalším zase zhasnou. Budeme k tomu tedy potřebovat 2 LED diody k tomu předřadné odpory (podle vašeho výpočtu) a tlačítko. Jistě jste si všimli, že jsem neuvedl ještě odpor k tlačítku, kdy v případě nestisknutého tlačítka, dává do Arduina signál na pin, který budeme číst buď log1 (TRUE, HIGH...) nebo log0 (FALSE, LOW...). Je to z důvodu, že dnes místo toho aktivujeme v Arduinu tzv. "pullup resistor", který programově tento pin připojí odporem k +5V takže použití odporu odpadá a zapojení je jednodušší. Nezapomeňme jak je také tlačítko k Arduinu připojeno. Protože v klidu je tedy Arduinem pomocí pullup rezistoru připojeno k HIGH, budeme muset aby jsme změnili jeho stav na pinu připojit ke GND (logicky LOW). Takže tlačítko jedním vývodem k pinu např. 7 a druhým vývodem ke GND.

Základní program je zde:

jak je vidět program k aktivaci pullup rezistoru používá příkaz digitalWrite(Tlacitko,HIGH);, tedy stejný jako, kdž máme pin nastaven jako výstup a chceme ho dostat do úrovně HIGH (+5V). Jinak program není složitý, já abych nepsal pokaždé zvlášť že se má dioda rozsvítit nebo zhasnout, tak jsem jejich stav protože bude stejný, uložil do proměnné Boolean ( - může nabývat pouze 2 hodnot - 0 nebo 1 (LOW nebo HIGH))  a při každém cyklu v loop()si bral jejich stav , ve kterém mají být právě z této proměnné.

Za další zmínku v programu je, že v cyklu kontrolujeme, zda je stisklé tlačítko. Je to podmínka if (Tlacitko == LOW). Protože jak jsme si řekli, když je v nestisknutém stavu tak je vstupním pinu pro tlačítko HIGH (log 1) a hlídáme si pouze když je stisknuto a k pinu přes tlačítko dostaneme z GND LOW (log 0). Když je tedy tato podmínka splněna, vykonají se dva přikazy a to  Svetla = !Svetla; - tato funkce zmení stav proměnné Světla na jeho opak, k tomuto se používá vykřičník. Pak tedy na řadu přichází funkce Delay(200); - která zastaví chod programu na 200ms. Je to ze dvou důvodů. Stisk tlačítka trvá nějakou dobu a Arduino je ve své podstatě velice rychlé, kdyby tam zpoždění nebylo tak za Váš stisk, by se proměnná změnila několikrát a ne jenom jednou a nebylo by jisté zda by to poté nebyla stejná hodnota. Také tlačítko po rozepnutí generuje nějaký šum a Arduino by to mohlo špatně vyhodnotit. Sami si můžete vyzkoušet, když smažete tuto čekací funkci, co to bude dělat. 

Tak teď k další části, kde se posuneme dál. V úkole je že po stisku tlačítka budou diody blikat a po dalším stisku zhasnou. Když se na to podíváme teoreticky nějaké to blikání jsme již popisovali v prvních tutoriálech, ale tlačítko tam nebylo. Jak tedy bude program vypadat. V prvé řade si musíme říci jak rozblikat diodu. Říkáte si no s funkcí delay() to jde přeci snadno. No jo, ale jak to vypnout a zapnout tlačítkem? Zkuste si takhle napsat program s funkcemi delay() a poté zkoušejte mačkat tlačítko. Museli by jste se strefit zrovna kdy by program byl na řádku podmínky, která zjišťuje, zda je tlačítko stisknuté. Většinu času totiž program bude stát a čekat až změní stav diod. Ani se zručností šaolinského mnicha kříženého s terminátorem, by jste se do toho okamžiku nestrefili. Budeme muset jít jinou cestou. 

Vysvětlíme si nejdříve jak rozblikat diody, zatím bez tlačítka, a nepoužít k tomu funkci delay(). Použijeme funkci millis(), která nám vrací počet milisekund od startu programu po zapnutí nebo resetu. Je to číslo ve formátu long (32 bitové číslo). Pokud si tedy tedy uložíme čas poslední zmeny stavu ledek a budeme ho porovnávat z celkovým časem tak při určitém rozdílu (v našem případě 250 milisekund) podmínka vyhodnotí, že má tento stav zase změnit. Jedná se o jednoduché a elegantní řešení v případě, že nechceme, aby se program zastavil a stále běhal v cyklu loop(). Programově to vypadá takto:

Další případ bude, kdy je požadavek, aby diody pracovali ve více režimech a ne jenom buď blikaní, nebo nic. Představíme si příklad, kdy chceme mít třeba 3 režimy, které budeme přepínat tlačítkem. V prvním případě LED diody nebudou blikat a ani svítit, ve druhém budou svítit a ve třetím budou blikat. Program si upravíme v tom, že Arduino bude při stisku tlačítka přepínat režimy. Jednoduše si vytvoříme pracovní proměnou "mode", která bude číselného formátu int. Po startu programu bude mít hodnotu 0 a při každém dalším stisku, se k tomu přičte číslo 1 s podmínkou, že když číslo je větší jak 2 (potřebujeme 3 režimy - 0,1,2) tak se hodnota vynuluje. Do programu dáme tedy podmínku co s diodama udělá proměnná mode. Program vypadá takto:

V kódu je více komentářů pro pochopení, než samotného programu. Máme tedy 3 režimy. Po startu jsou diody vypnuté, při stisku tlačítka svítí trvale a po dalším stlačení tlačítka budou blikat. V kódu kromě proměnné mode přibila také další proměnná a to boolean Blik. Do této program zapisuje při určitém intervalu jestli zrovna mají diody svítit nebo ne. S podmínky při změně režimu budeme právě na toto proměnou při blikání odkazovat. 

Já ještě uvedu příklad, kdy chceme mít těch režimů ještě více. Myslím že v tomto nejsme nějak omezeni. V programu zapíšeme, že proměnná mode muže nabývat více hodnot až do čísla např. 5 a přidáme si ještě další boolean proměnné do které si uschováme třeba rychlejší blikání s dalšího časovače, které naprogramujeme podobně jako při pomalém blikání, nebo naopak pomalejší a zkusíme pomocí logických fukcí toto blikání navzájem kombinovat. Uvidíte, že můžeme dosáhnout zajímavých efektů. Program vypadá takto:

Jak si můžete všimnou v programu u režimu nebo modu 4 až 6 jsme použili logických funkcí a to "&&" (AND - logický součin) a "||" (OR - logický součet), aby jsme získali různé kombinace času, kdy LED diody neblikají konstantně a výsledek je závislý právě na tom, když jsou 2 časovače právě v logické 1. Kombinací je určitě velmi mnoho a když si pohrajete i se změnou časů časovačů získáte určitě zajímavý výsledek.

zápis funkce popis příklad
&& AND - log. součin Vysledek bude 1, když obě proměnné budou 1 a && b
|| OR - log. součet Výsledek bude jedna, když jedna z proměnných nebo obě budou 1 a || b
! NOT - negace (opak) Výsledek bude 1 když proměná bude 0 a naopak !(a && b)

Zkuste doma trošku pohrát s logickými operátory, můžete přidat další časovače a změnit jejich hodnoty, aby jste dostali Vámi požadovaný výsledek.

Příklad Svetla = !(blik_1 && blik_3) || blik_2;

 

Zpět

Diskusní téma: Lekce 29 - Zpět k začátkům - hrajeme si s LED

Datum
Vložil
Titulek

Re: návrh

Určitě i na takové návody jednou dojde, ale v současné době je plánu hodně jiných věci ;-)

Datum
Vložil
Titulek

upozornění

Ahoj v prvním programu máš chybu INPUT není výstu, ale vstup

Datum
Vložil
Titulek

Re: upozornění

On má pravdu

Datum
Vložil
Titulek

Re: upozornění

já mám pravdu

Datum
Vložil
Titulek

Re: upozornění

on má opravdu pravdu

Datum
Vložil
Titulek

Re: upozornění

Omlouvám se, chyba pouze v komentáři.Samotný kód je správně. Ale díky za všímavost. Již opraveno

<< 1 | 2

Vyhledávání

arduino8.cz © 2015 Všechna práva vyhrazena.