Lekcja 11: Shine on You Crazy Diamond - tęczowe rozbłyski.
Każdy z nas zastanawiał się jak to jest, że ozdoby świąteczne w postaci diód świecą różnymi kolorami. Oczywiście jest
na to proste wyjaśnienie: dioda LED RGB, czyli element, który potrafi świecić trzema podstawowymi barwami czerwoną (R - red),
zieloną (G - green) i niebieską (B - blue).
Z teorii barw wiemy, że jest to jeden z modeli (oprócz CMYK), który wynika z możliwości ludzkiego oka. Każda barwa widziana przez człowieka może być
mieszanką trzech podstawowych barw, czyli właśnie RGB.
Wartości poszczególnych barw zmieniają się od 0 do 255 i aby otrzymać zadany kolor można skorzystać ze wzoru:
My wykorzystamy przyrząd, którego specyfikacja jest poniżej:
Kolor czerwony:
|
Kolor zielony:
|
Kolor niebieski:
|
Dioda RGB (jak widać na zdjęciu) posiada cztery wyprowadzenia. Trzy z nich sterują trzema kolorami, zaś czwarte jest masą (najdłuższa nóżka). W celu
obniżenia napięcia podawanego na poszczególne nóżki zastosujemy oporniki 220 Ohm.
Wykorzystamy diodę do generowania tęczowych rozbłysków przechodzących z jednego koloru w drugi. Będzie to bardzo efektowne
i projekt można wykorzystać do dekoracji na najbliższe święta;)
Kod:
int Rpin = 9; int Gpin = 10; int Bpin = 11; void blysk(float r1, float g1, float b1, float r2, float g2, float b2, float t){ float grad_r, grad_g, grad_b; float out_r, out_g, out_b; grad_r = (r2-r1)/t; grad_g = (g2-g1)/t; grad_b = (b2-b1)/t; for ( float i=0; i<=t; i++ ){ out_r = r1 + grad_r*i; out_g = g1 + grad_g*i; out_b = b1 + grad_b*i; out_r = map (out_r,0,255,255,0); out_g = map (out_g,0,255,255,0); out_b = map (out_b,0,255,255,0); analogWrite(Rpin, (int)out_r); analogWrite(Gpin, (int)out_g); analogWrite(Bpin, (int)out_b); delay(1); } } void setup(){ } void loop(){ blysk(255,0,0,0,255,0,500); blysk(0,255,0,0,0,255,500); blysk(0,0,255,255,0,0,500); }
W liniach 1 - 3 deklarujemy piny odpowiadające za włączanie poszczególnych barw.
W linii 4 zadeklarowana jest nowa funkcja o nazwie blysk, której argumentami
są początkowe i końcowe wartości poszczególnych barw oraz czas trwania przejścia.
Zmienne grad_r i pozostałe będą przechowywać wartość pośrednią koloru (r3-r1/t).
W linii 10 zaczyna się pętla for, w której będą liczone poszczególne wartości wyjściowe kolorów out_r
przez dodanie do wartości początkowej koloru r1 iloczynu obliczonej wyżej wartości grad_r
i zmiennej iteracyjnej i.
W linii 14 wykorzystujemy funkcję mapowania map, której zadaniem jest ustalenie zakresu zmian danej wartości. Składnia tej funkcji
to: map(value, fromLow, fromHigh, toLow, toHigh), co można przetłumaczyć: zmapuj wartość value w zakresie od fromLow do
toLow i od fromHigh do toHigh.
Poszczególne parametry oznaczają odpowiednio:
- value - wartość,
- fromLow - najniższa granica obecnego zakresu,
- fromHigh - najwyższa granica obecnego zakresu,
- toLow - najniższa granica zakresu docelowego,
- toHigh - najwyższa granica zakresu docelowego.
W linii 26 mamy wywołanie funkcji blysk dla danego przejścia kolorów (z zielonego do niebieskiego w pół sekundy).
Więcej informacji na temat funkcji map można znaleźć na stronie Arduino.
Powrót do spisu materiałów