Lekce 4
Čtvrtá lekce Arduino kurzu pro začátečníky: k tekoucím LED přidáte potenciometr a naučíte se jím za běhu řídit rychlost celého efektu. Ukážeme si zapojení, kód do Arduino IDE i to, jak Arduino čte analogový vstup – otočením knoflíku zrychlíte nebo zpomalíte přebíhání světel.
Popisek obrázku: osm LED v řadě, každá přes vlastní rezistor 220 Ω do GND. Anody LED vedou postupně na piny 2 aķ 9. Potenciometr má krajní nožičky na 5 V a GND, prostřední (běžec) na analogový vstup A0.
| Komponenta | Arduino |
|---|---|
| LED 1 – 8 (anody, každá přes 220 Ω) | piny 2 – 9 |
| LED (katody) | GND |
| Potenciometr (krajní nožičky) | 5V a GND |
| Potenciometr (běžec, prostřední) | A0 |
LED se rozsvěcují jedna po druhé a vytvářejí dojem tekoucí vlny, která se na konci řady odrazí a vrací zpět. Novinkou je potenciometr: jeho běžec posílá na vstup A0 napětí, které Arduino přečte funkcí analogRead jako číslo 0 – 1023. Tuto hodnotu použijeme jako pauzu mezi přepnutím LED. Otáčením knoflíku tak měníte interval – čím větší číslo, tím delší prodleva a pomalejší světla. Aby čas běžel hladce, nepoužíváme delay, ale funkci millis, která hlídá uplynulý čas na pozadí.
// Interaktivní LED tekoucí potok
// Osm LED se rozsvěcuje jedna po druhé a potenciometrem měníte rychlost.
// Email: podpora@laskakit.cz · Web: laskakit.cz
int ledNum = 8; // počet LEDek
byte ledPin[] = { 2, 3, 4, 5, 6, 7, 8, 9 }; // pole pinů s LED
int ledDelay; // pauza mezi změnami
int direction = 1; // směr přebíhání
int currentLED = 0; // právě svítící LED
unsigned long changeTime; // čas poslední změny
int potPin = A0; // pin potenciometru jako vstup
void setup() {
for (int x = 0; x < ledNum; x++) {
// nastavení pinů 2 až 9 jako výstupů
pinMode(ledPin[x], OUTPUT);
}
changeTime = millis();
}
void loop() {
ledDelay = analogRead(potPin); // přečíst hodnotu potenciometru
// po uplynutí intervalu přepnout na další LED
if ((millis() - changeTime) > ledDelay) {
changeLED();
changeTime = millis();
}
}
void changeLED() {
for (int x = 0; x < ledNum; x++) {
// vypnout všechny LEDky
digitalWrite(ledPin[x], LOW);
}
// zapnout aktuální LEDku
digitalWrite(ledPin[currentLED], HIGH);
currentLED += direction;
// na konci řady otočit směr
if (currentLED == ledNum - 1) {
direction = -1;
}
if (currentLED == 0) {
direction = 1;
}
}
QCo v tomto obvodu ovlivňuje otáčení potenciometrem?