Arduino - blikání LED různě

Různé způsoby, jak rozblikat LED

Úvod

Pokud víte, tak obvyklý první projekt s Arduinem je blikání LED. Potom se často programuje LED a tlačítko nebo blikání LED bez funkce delay, která totiž zastaví program. Při prvním příkladu se nebudeme zabývat zapojováním. Využijeme totiž vestavěnou LED na desce Arduina. Tato LED je připojená na pin 13. Náš příklad blikání LED upravený pro využití této LED vypadá takto:
void setup() {  pinMode(13, OUTPUT); //Nastav pin 2 jako výstup } void loop () {  digitalWrite(13, HIGH); //Na pinu 2 nastav hodnotu HIGH  delay(1000);           //Počkej 1 sekundu (1 x 1000 = 1 = jedna vteřina)  digitalWrite(13, LOW);  //Na pinu 2 nastav hodnotu LOW  delay(1000); }
Tento příklad zde byl jen tak na úvod. Nyní již přikročme k ukázce blikání LED bez zastavení programu.

Blikání bez funkce delay()

V tomto příkladu využijeme vestavěnou funkci millis(). Tato funkce vrací počet milisekund od začátku běhu programu. S jejím využitím můžeme totiž vykonávat jiný program (například načítat data z čidel) a každou sekundu změnit stav světelné diody. Kód je zde (vysvětlení funkce je níže):
const int led = 13; //Deklarace proměnné LED, obsahující číslo pinu. unsigned long posledniZmena = 0; //Deklarace proměnné obsahující čas poslední změny stavu. boolean stav = false; //V proměnné stav je uložený poslední stav diody. void setup() {  pinMode(led, OUTPUT); } void loop() {  if(millis() >= (posledniZmena + 1000)){ //Uplynulo od poslední změny více než 1000 ms?    posledniZmena = millis(); // do proměnné posledniZmena uložíme čas poslední změny    digitalWrite(led, stav); //Nastavíme na pinu hodnotu proměnné stav    stav = !stav; //Obrátíme hodnotu proměnné stav  } }
Takto vypadá tento program spuštěný na Arduinu DUE:
LED L blikající na Arduinu Due Nejprve na začátku programu deklarujeme proměnné, jejichž účel je vysvětlen v kódu. Každé proměnné přiřadíme počáteční hodnotu, aby nedošlo k neočekávanému chování programu, způsobeného náhodnými hodnotami v paměti. Ve funkci setup() potom nastavíme pin 13 jako výstupní. Při každém opakování funkce loop() potom kontrolujeme, jestli už neuplynula jedna vteřina, tímto kódem (slovy popsaným): Je hodnota z funkce millis() větší než (hodnota proměnné posledniZmena + 1000)? Pokud je podmínka splněna, tak se do proměnné posledniZmena uloží hodnota vrácená funkcí millis() a potom se změní stav diody. Jde o relativně jednoduchý program s rozsáhlým využitím například při současném překreslování displeje, záznamu dat z čidel a monitorování tlačítek, což jsem využil při stavbě meteostanice. Ovšem vraťme se k diodě.

Blikání více diod bez funkce delay

Výše uvedený program funguje tak, že funkci loop nic nezastaví, a proto by tímto způsobem šlo rozblikat i více diod. Právě na to se nyní zaměříme. Jelikož budeme blikat více LEDkami, tak je již musíme zapojit. Vpravo máme schéma, podle kterého zapojíme jednoduchý obvod. (Můžete využít i desku Tinylab, na níž použijeme první tři LED.) Po jeho zapojení nahrajeme program, který odpovídá původnímu, proto si jeho funkci nebudeme popisovat. Jen by stálo za to zmínit, že program je opravdu téměř stejný, jen každá část je v něm třikrát a proměnné jsou číslované.
const int led1 = 13; unsigned long posledniZmena1 = 0; boolean stav1 = false; const int led2 = 12; unsigned long posledniZmena2 = 0; boolean stav2 = false; const int led3 = 11; unsigned long posledniZmena3 = 0; boolean stav3 = false; void setup() {  pinMode(led1, OUTPUT);  pinMode(led2, OUTPUT);  pinMode(led3, OUTPUT); } void loop() {  if(millis() >= (posledniZmena1 + 1000)){    posledniZmena1 = millis();    digitalWrite(led1, stav1);    stav1 = !stav1;  }    if(millis() >= (posledniZmena2 + 700)){    posledniZmena2 = millis();    digitalWrite(led2, stav2);    stav2 = !stav2;  }    if(millis() >= (posledniZmena3 + 550)){    posledniZmena3 = millis();    digitalWrite(led3, stav3);    stav3 = !stav3;  } }
Po nahrání tohoto programu uvidíte, že LED blikají zdánlivě náhodně, ovšem pokud se zaměříte na konkrétní diodu, tak uvidíte, že si bliká "svou" rychlostí a ty ostatní ji nijak neovlivňují. V programu můžete zkusit změnit hodnoty, které se přičítají k poslední změně a tím ovlivnit rychlost jednotlivých diod. Také můžete zkusit přidat ještě jednu diodu na pin 10 a dát jí frekvenci třeba jedna změna za 100 ms.
Pokud máte více diod, tak jich můžete přidat třeba 7 a nastavit každé jinou frekvenci změny. Ovšem v tomto případě by bylo lepší udělat to přes pole nebo třídu. Popis programování pole nebo třídy by však vydal na samostatný článek, a proto se mu teď věnovat nebudeme.

Plynulé zhasínání a rozsvěcení

Zatím ve všech programech jsme LED rozsvítili skokem a zhasli stejně. Tomu se dá vyhnout použitím PWM (popsáno níže). Nejde o velký problém, jen to více zpomalí program, což nevadí. Pro funkci stačí nahrát program do Arduina (lze spustit jen na Arduinu Leonardo, Due nebo Mega, jelikož jiné desky nemají na pinu 13 funkci PWM). Kód je zde:
void setup () {  //jelikož využijeme PWM, tak nemusíme nastavovat pin jako výstupní } void loop () {  for(int i = 0; i <= 255; i++){// Cyklus for je vysvětlen v textu    analogWrite(13,i);// Nastavíme na pinu 13 hodnotu proměnné i, která postupně narůstá    delay(1000/255);// počkáme 1000 ms / 255 (počet kroků)  }  delay(500);// počká me 500 ms (po tu dobu LED svítí naplno)  for(int i = 255; i >= 0; i--){    analogWrite(13,i);// Nastavíme na pinu 13 hodnotu proměnné i, která postupně klesá    delay(1000/255);  }  delay(500); }  
Na začátku funkce loop se inicializuje cyklus for(), který je vysvětlen níže, a podle hodnoty indexové proměnné nastavujeme na pinu 13 hodnotu proměnné i, která postupně přibývá. Potom vyčkáme odpovídající kousek času zhasnutí nebo rozsvícení (proto můžete změnit rychlost zhasínání a rozsvěcení změnou děleného čísla), a cyklus se opakuje. Tentýž proces jen s tím rozdílem, že proměnná i se dekrementuje.

Jak funguje cyklus for

Cyklus for je poměrně jednoduchý na pochopení. Je často využíván k vícečetným změnám téhož, přičemž se využívá indexová proměnná. Jeho syntaxe je následující:
for(inicializace, podmínka, inkrementace){
    program;
}

V našem programu se v cyklu for rozsvěcuje a zhasíná LED. Dá se též využít k výpisu mnoha po sobě jdoucích čísel nebo nastavení mnoha pinů jako výstupních nebo vstupních.
Inicializace vypadá jako normální deklarace proměnné, tedy takto datovy_typ nazev_promenne = hodnota. Podmínka je stejná, jako se dává např. do cyklu while nebo do podmínky if() a inkrementace je většinou přidání (nebo ubrání) hodnoty proměnné o 1.

Jak funguje PWM aneb Analogová hodnota digitálně

V textu výše se několikrát objevil výraz PWM, který označuje tzv. pulzně šířkovou modulaci. Ta funguje tak, že na pin, na němž je hodnota nastavena, přivádíme střídavě 5v nebo 0v. Podle poměru délky těchto pulzů se potom mění výsledná úroveň "analogového" napětí. Výhoda tohoto způsobu regulace je v jednoduchosti jeho konstrukce. Pokud dobře umíte naprogramovat softwarové přerušení na Arduinu, tak můžete velmi snadno naprogramovat tzv. softwarové PWM, které generuje Arduino z programu, a proto jej lze použít na všech pinech.

Závěr

Je pravděpodobné, že nebudete s Arduinem konstruovat projekt např. blikající LEDky, který zabudujete do krabičky a pověsíte na zeď, ale přesto vám mohl být tento článek užitečný. Způsoby blikání v něm uvedené totiž můžete využít k načasování na sobě nezávislých událostí s požadovanou frekvencí obnovy.

Novinky

Změna administrace

16. září přibylo nové menu, nastavení pravého sloupce v administraci, tmavý režim vázaný, na uživatele, nový vzhled administrace a ještě pár drobností. Většina tohoto je dostupná jen pro registrované uživatele.

Soukromé zprávy (PM)

Na tomto webu 9. září přibyly soukromé zprávy. Využívat je mohou registrovaní uživatelé. Adresát se určuje zadáním uživatelského jména a v adresním políčku funguje našeptávač. Ovšem ten, který nepíše na fórum, není v našeptávači vidět.

Nové fórum zde

24.srpna 2022 jsem na tomto webu spustil fórum. Je dostupné v menu vedle článků a jde kompletně o můj vlastní program.

Blikání LED různě

22.srpna 2022 jsem zveřejnil různé způsoby blikání LED. Tento projekt je často označován za "druhý projekt", hned po blikání LED normálním způsobem.

Stopky s Arduinem

18.srpna 2022 jsem vydal článek o stopkách. Jde o jeden z článků o "začátečnických projektech", které mají za cíl naučit vás více o programování Arduina v praxi.

Arduino kalkukačka

6. dubna tohoto roku jsem naprogramoval kalkulačku řízenou Arduinem Uno. V tomto článku jsem popsal její funkce a konstrukci.

USB konektory

Před nedávnou dobou vyšel článek o USB konektorech, jejich využití a funkci. Popisuje všechny dostupné běžné konektory i místo, kde je najdeme.

Tinylab budík

Nedávno jsem vydal článek o budíku řízeném Arduinem, co je založený na desce Tinylab. Tento článek popisuje všechny funkce budíku i desku Tinylab.

Komentáře


login key | help
Používáním tohoto webu souhlasíste se shromažďováním údajů o vás. Více informací