Po vzoru předchozího dílu, kdy jsme sepínali diody proti sobě na dvou okruzích, se dnes podíváme na to, jak vytvořit světlo, které mělo auto se jménem K.I.T.T. ze seriálu Knight Rider. Způsobů by se jistě našlo více, nicméně ten, který se zde pokusím popsat je podle mě ten nejjednodušší.
V tomto díle budeme potřebovat:
- Desku Arduino dle výběru, na připojení deseti diod, na kterých budu celý příklad demonstrovat stačí deska UNO, nicméně pokud jich chcete připojit třeba 30, zvolte desku MEGA, já budu volit desku DUE. Celý návod včetně odporů budu popisovat, jakoby šlo o desku s 5V i když to DUE není. To, že používám k těm diodám 47 ohmové odpory, neřešte, protože pro UNO budou potřeba 100 ohmové, aneb pořád jedeme podle vzorečku R=U/I jako v předchozích dílech.
- 10 LED diod, které jsme používali v předchozích dílech, nicméně pokud jich budete chtít více, je to na vás.
- 10 odporů (100 ohmů v případě diod co neustále používáme), zde zase platí, kolik LED diod, tolik odporů.
- Propojovací kabely
- Bastldesku
V minulém díle jsme zapojili celkem dva obvody. Úplně stejným postupem zapojíme nyní celkem 10 obvodů, nebo 9 popřípadě 15, jak každému bude vyhovovat a jak moc se mu s tímto příkladem chce dělat. Nebudu zde opět psát jak to provést, protože je to pořád jedno a to samé. Můžete se ale podívat na fotografie, jak to mám zapojené já.
Ještě jedna fotka zboku, kde je lépe vidět zapojení odporů, drátku k Arduino a samotných diod.
My se budeme nyní soustředit hlavně na programování Arduina, aby to výsledný efekt udělalo. Funkce setup() nám tedy nabobtná o všechny digitální piny, ke kterým je připojena dioda, vypadat nyní může třeba takto:
void setup(){
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
Tímto zaručíme, že všechny digitální piny, ke kterým máme připojené LED diody, budou nastaveny jako výstupy. Také není vůbec špatné pro začátek do funkce setup() nastavit, aby všechny použité piny byly vypnuté. Tedy do funkce přidáme pro každý pin funkci digitalWrite s druhým parametrem LOW. U některých desek se totiž stane, že po nahrání programu či připojení napájení se piny zapnou a tak se může stát, že první část cyklu bude vypadat jinak, než by měla. Nyní ta hlavní část, která zajistí, že světlo půjde z jedné strany na druhou a zase zpět. Musíme počítat s tím, že se jedná o cyklus, který když se dostane ke svému konci, začne zase od začátku a bude tedy potřeba v jednom cyklu naprogramovat postup diod od pinu číslo 2 k pinu číslo 11 a zase zpět. Protože kdybychom vytvořili postup jen na jednu stranu, vždy by se rozsvěcely diody jen třeba zprava doleva, ale už né zpět.
Budeme tedy každou diodu na každém pinu rozsvěcet a tu předchozí v tu samou chvíli zhasínat. Tím se dostaneme k tomuto efektu.
void loop(){
digitalWrite(2,HIGH);
delay(1000);
digitalWrite(3,HIGH);
digitalWrite(2,LOW);
delay(1000);
digitalWrite(4,HIGH);
digitalWrite(3,LOW);
delay(1000);
digitalWrite(5,HIGH);
digitalWrite(4,LOW);
delay(1000);
digitalWrite(6,HIGH);
digitalWrite(5,LOW);
delay(1000);
digitalWrite(7,HIGH);
digitalWrite(6,LOW);
delay(1000);
digitalWrite(8,HIGH);
digitalWrite(7,LOW);
delay(1000);
digitalWrite(9,HIGH);
digitalWrite(8,LOW);
delay(1000);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
delay(1000);
digitalWrite(11,HIGH);
digitalWrite(10,LOW);
delay(1000);
}
Tímto zápise tedy docílíme, že se každou vteřinu rozsvítí dioda vedle a ta předchozí, co svítila, zhasne, bohužel toto je jen zápis na jednu stranu. Nyní nás to samé bude čekat na stranu druhou. Tuto funkci loop() tedy ještě doplníme o tyto řádky:
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
delay(1000);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
delay(1000);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
delay(1000);
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
delay(1000);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
delay(1000);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
delay(1000);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
delay(1000);
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
delay(1000);
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
Konec je jen takto, bez funkce delay, protože hned jak se rozsvítí první dioda a předposlední zhasne, se cyklus opakuje, a na začátku je že dioda na začátku svítí dvě vteřiny před tím, než se vypne. Z tohoto důvodu se již na konci nečeká na nic. Toto přeblikávání má k tomu, co bylo v seriálu ale ještě daleko, protože tam přechod mezi jednotlivými segmenty byl daleko plynulejší a svítilo jich v jednom momentu více, třeba dva. Z tohoto důvodu ještě můžeme dát mezi funkce, která zapíná a na následujícím řádku vypíná předchozí ještě čas, který se má vyčkat, tedy třeba 20ms. Nyní efekt vypadá o dost lépe, nicméně perfektního vzhledu dosáhnou ti, kteří budou připojovat velké množství LED diod a pouštět je rychleji za sebou.
Také hodnota 1000ms je pro tento efekt opravdu hodně pomalá a lepší je, když použijete proměnnou, kterou deklarujete někde na začátku, třeba ve funkci setup() a z funkce delay jen voláte její hodnotu. Je to lepší z toho důvodu, že pokud se rozhodnete přepisovat interval na kratší či delší, nemusíte již přepisovat na tolika místech, stačí pouze a jen na jednom. Mně osobně se nejvíce osvědčil čekací čas 100ms, stejně je to na následujícím videu, které jsem ze své desky natočil pro tento díl.