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:
Blikání více diod bez funkce delay

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 a zhasnuli skokem. 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.program;
}
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ě

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
Nové návody pro Nextion
V budoucnosti můžete na tomto webu očekávat také návody pro displej Nextion. V současnosti pracuji na meteostanici s ukládáním dat na tomto serveru.Fórum opět spuštěno
5. prosince jsem zjistil, že roboti nepřistupují tak často, aby mohli způsobit nějaký problém s výkonem webu. Proto jsem se rozhodl fórum znovu aktivovat.Redesign tmavého režimu
Na počátku prosince jsem provedl redesign tmavého režimu. Menu je nyní tmavší, stejně jako pozadí stránky. Pozadí textu je také tmavší. Rozložení prvků je stejné, jako dříve.Podezření na DDoS
Asi osmého listopadu 2022 jsem zaznamanal prudký vzestup návštěvnosti. V logu jsem zjistil, že jde pravděpodobně o robota, který přistupuje na fórum. Proto jsem fórum dočasně deaktivoval.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.© Tatatiti, Jan Cviček, 2022
Komentáře
Nový komentář