Diody LED czyli jak migać i świecić
Większość z nas ma za sobą podstawowe przykłady jak podłączanie diód LED. Zajmijmy się czymś ciekawszym jak linijka led czy biegnące światełko. Do tego potrzebne nam będzie 8 diod LED o dowolnym kolorze (my wykorzystaliśmy czerwone), zestaw rezystorów 200Ω ograniczających prąd i trochę kabelków.

Spójrzmy zatem na powyższy schemat co i jak ze sobą podłączyć.
Podłączenie diody LED
Nie jest to trudne i skomplikowane, ale na samym początku musimy powiedzieć dlaczego tak a nie inaczej. Oglądając diodę zapewne zauważyliście, że jedna nóżka jest dłuższa od drugiej. To nie jest żaden błąd, albo niedopatrzenie. Dłuższa nóżka to anoda (+), a krótsza to katoda (-). Każda dioda jest zasilana pewnym napięciem i ma maksymalny prąd, przy którym może działać. Jeśli przekroczymy te wartości to w najlepszym przypadku zaobserwujemy coraz słabsze świecenie diody i w końcu poczujemy zapach spalenizny. W najgorszym możemy doprowadzić nawet do wybuchu diody. Dlatego, aby temu zapobiec w naszym przykładzie zastosowaliśmy rezystory ograniczające prąd oraz napięcie, bowiem diody będą zasilane napięciem 5V. Jak dobrać odpowiedni rezystor, można skorzystać albo z Prawa Ohma, albo poszukać w sieci internetowych kalkulatorów np. takich jak ten led.linear1.org/1led.wiz. Możemy również przyjąć, iż w zależności od koloru świecenia diody, wartość naszych rezystorów może się wahać od 100-300Ω dla zasilania 5V.

Po złożeniu naszego układu czas tchnąć w niego życie.
Nasz kod będzie się składał z trzech pętli for. Każda z nich będzie realizować inny efekt świetlny.
//tworzymy tablicę pinów, pod które podłączone mamy diody LED int leds[] = {2, 3, 4, 5, 6, 7, 8, 9}; //określamy wielkość tablicy jako stałą #define SIZE 8 int i; void setup() { Serial.begin(57600); //ustawiamy piny jako wyjścia for (i = 0; i < SIZE; i++) { pinMode(leds[i], OUTPUT); } } void loop() { //biegnący punkt świetlny for (i = 0; i < SIZE; i++) { digitalWrite(leds[i], HIGH); delay(200); digitalWrite(leds[i], LOW); } //Bar graph for (i = 0; i < SIZE; i++) { digitalWrite(leds[i], HIGH); delay(200); } for (i = 0; i < SIZE; i++) { digitalWrite(leds[i], LOW); delay(200); }
Na początku przyjrzyjmy się pierwszym linijkom kodu.
//tworzymy tablicę pinów, pod które podłączone mamy diody LED int leds[] = {2, 3, 4, 5, 6, 7, 8, 9}; //określamy wielkość tablicy jako stałą #define SIZE 8 int i;
int leds[] tworzy nam tablicę definiującą piny pod, które podłączone są nasze diody LED, natomiast druga linia to nic innego jak wielkość naszej tablicy.
W tym miejscu warto wspomnieć parę słów o naszej tablicy. Tablica to nic innego jak zbiór wartości, które są dostępne z numerem indeksu. Dzięki jej zastosowaniu u nas mamy możliwość zapalania kolejno diód lub ich gaszenia. Ważne jest to, iż kolejność podana w tablicy będzie kolejnością zapalania/gaszenia fizycznie diód, nawet jeśli są one podłączone nie po kolei. Weźmy sobie przykład. Mamy 8 diód, ale chcemy aby to trzecia dioda zapalała się jako pierwsza, a pierwsza jako ostatnia. Zamiast kombinować z przenoszeniem diód i zmianą przewodów, możemy zmienić pozycję naszych diód w tablicy. Wystarczy zmienić nasz początkowy kod na int leds[] = {3,…..,1};
W części setup ustawiamy porty do których podłączone są diody LED jako wyjście. Warto wspomnieć, iż nasze porty możemy skonfigurować również jako wejścia.
void setup() { //ustawiamy piny jako wyjścia for (i = 0; i < SIZE; i++) { pinMode(leds[i], OUTPUT); } }
Skoro już przebrnęliśmy przez pierwsze ustawienie, czas przejść do kodu właściwego, od którego zależeć będzie m.in. szybkość z jaką nasze światełko będzie “biegać”.
//biegnący punkt świetlny for (i = 0; i < SIZE; i++) { digitalWrite(leds[i], HIGH); delay(200); digitalWrite(leds[i], LOW); }
Powyższa pętla ma za zadanie zapalać kolejną diodę i gasić w czasie jaki określimy w funkcji delay. To daje nam efekt biegnącego światełka. Szybkość zapalania i gaszenia kolejnych diód regulujemy funkcją delay.
Dwie ostanie pętle w kodzie to tzw. bar graph, czyli słupek led. Można go wykorzystać do wyświetlania jakiegoś poziomu.
//Bar graph for (i = 0; i < SIZE; i++) { digitalWrite(leds[i], HIGH); delay(200); } for (i = 0; i < SIZE; i++) { digitalWrite(leds[i], LOW); delay(200); }
W naszym kodzie pierwsza część odpowiada za zapalanie się kolejnej diody po czasie ustalanym funkcją delay. Za wygaszanie naszego słupka odpowiada druga pętla.
A co jeśli byśmy chcieli aby nasz słupek się zachowywał jak wskaźnik wysterowania?
Nic prostszego, wystarczy zmienić naszą drugą pętlę na poniższy kod.
//wskaźnik wysterowania for (i = 0; i < SIZE; i++) { digitalWrite(leds[i], HIGH); delay(100); } for (i = SIZE; i >= 0; i--) { digitalWrite(leds[i], LOW); delay(100); }
W powyższym przykładzie druga pętla będzie gasić diody od ostatniej do pierwszej.
Na koniec warto dodać, iż nasz kod można jeszcze zoptymalizować zmieniając chociażby naszą i ze zmiennej na bajt. Jednak wiązałoby się to ze zmianą kodu naszego wskaźnika wysterowania, co dla początkujących mogłoby się okazać zbyt dużym wyzwaniem.
Witam mam takie pytanie odnośnie zapalania diód led,jak napisać krótki szkic zapalający jednocześnie 8diód led?
Konrad: Napisałem ci przykład.
https://gist.github.com/sprae/bc7683ad25ed8494ec83
Na początku jest tablica z numerami pinów do których podłączone są diody.
Potem w funkcji setup jest pętla for, która służy do pobierania kolejnych numerów pinów z tablicy i przekazywania ich do funkcji sterujących pinami.
Dziękuję,mój błąd polegał na tym że zamiast byte leds wpisywałem int leds.Jestem jeszcze zielony i nie do końca rozumiem zmiennej byte ale powoli dojdę do tego.
To 8 bitowa zmienna, która trzyma wartości od 0 do 255.
O dziwo z int też działa błąd polegał na tym że robiłem to tak int leds[] = {2, 3, 4, 5, 6, 7, 8, 9};//w nawiasie
kwadratowym zabrakło '8′
Jeszcze raz bardzo dziękuję za pomoc
Czyli świetnie ci poszło. A literówki to nie problem. Fajnie, że mogłem pomóc.
jak można podłączyć więcej diód np: 40 (Boże Narodzenie za
pasem chciałbym przystroić balkon)
Chciałbyś wszystkie iezależnie sterować?
tak aby zmniejszyć ilość przewodów…
Użyj tego http://blog.nettigo.pl/post/96720187433/diody-rgb-z-interfejsem-szeregowym
albo tego:
http://nettigo.pl/products/662
W obydwu przypadkach steruje się 1 pinem.
….dzięki tego szukałem…
jak zrobić żeby bar graph po kolei się zaświecił od cyfrowego czujnika ruchu, świecił przez 5 minut a następnie zgasł. Kombinowałem z przerwaniami ale nie wychodzi
Bargraph zrealizowłem tu: https://starter-kit.nettigo.pl/2012/01/tlc5940-czyli-co-najmniej-16-dodatkowych-pinow-pwm-w-arduino/
A to, żeby wygasał, możesz zrobić na naszej bibliotece:
https://github.com/nettigo/Timers
Jakbyś miał problemy to pisz.
No to skoro mowa była o bibliotece timers… Nie mogę sobie poradzić z napisaniem funkcji która wywoływana w taki sposób mniej więcej
motor_on(kierunek, szybkość, czas)
powodowałaby włączenie silnika na określony czas bez delay() i tak, żeby dało się to wołać wielokrotnie z różnymi parametrami…
Podpowiecie coś – timers pomogą ?
(bawie sie dopiero tydzień więc wybaczcie niewiedzę..)
Witam
Uczę się na tym przykładzie programowania Arduino, zmodyfikowałem kod, żeby na koniec diody gasiły się od prawej strony. Wstawiony komentarz chyba mówi sam za siebie. Co jest nie tak?
//tworzymy tablicę pinów, pod które podłączone mamy diody LED
int leds[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
//określamy wielkość tablicy jako stałą
#define SIZE 10
int i;
void setup()
{
Serial.begin(57600);
//ustawiamy piny jako wyjścia
for (i = 0; i < SIZE; i++) {
pinMode(leds[i], OUTPUT);
}
}
void loop()
{
//biegnący punkt świetlny
for (i = 0; i < SIZE; i++) { //zapala po kolei po jednej diodzie od lewej
digitalWrite(leds[i], HIGH);
delay(500);
digitalWrite(leds[i], LOW);
}
//Bar graph
for (i = 0; i < SIZE; i++) { //zapala pokolei diody od lewej
digitalWrite(leds[i], HIGH);
delay(500);
}
for (i = 10; i <= SIZE; i–) { //gasi po kolei diody od prawej, ale dalej nic sie nie dziej, ki chu…
digitalWrite(leds[i], LOW);
delay(500);
}
}