LED Equalizer na WS2812B
: środa 28 paź 2015, 23:48
Hey ,
W nawiazaniu do mojego projektu http://microgeek.eu/viewtopic.php?f=22&t=99 przymierzam sie aby uzyc popularnego LM3916 i wykorzystac go aby sterowac WS2812b.
Wpadlem na pomysl , ze najfajniej by bylo gdyby osobny uC analizowal stan pinow LM3916 a w odpowiedzi sterowal ledami. No i tutaj chcialem zweryfikowac tok myslenia w zakresie pisania oprogramowania.
Zakladam , ze uC bedzie mogl odczytac stan od 0-10 gdzie 0 to jest totalna cisza a 10 bedzie oznaczalo , ze jest naprawde duza impreza na maxa i sasiedzi sa wniebowzieci
Aby umilic te efekty dla oka mysle ze fajnie by bylo wykorzystac gradienty. I tutaj pojawil mi sie pomysl - stworzylbym strukture opisujaca od jakiego koloru zaczac a na jakim zakonczyc oraz jakie sa indexy startowe i koncowe ledow. Utworzylbym tablice 10 takich obiektow i umiescil je w tablicy.
Majac cos takiego gotowego dobrze by bylo miec funkcje do obslugi gradientow - mysle ze cos w rodzaju ponizszej funkcji powinno sie sprawdzic ( *jak poprzednio kod na razie jest tylko pogladowy
- bardziej do oceny podejscia )
No i chyba ostatnie to po odczytaniu wartosci 0-10 wykonalbym operacje iteracji po kazdym elemencie tablicy moich struktur az do wartosci rownej wartosci odczytanej - i dla kazdej z opcji ustawil odpowiednio ledy przy wykorzystaniu w/w funkcji
I kiedy to sie zakonczy po prostu wyslij_na_pasek();
Ciekawy jestem co myslicie i czy wg was cos warto byloby zrobic inaczej i bardziej optymalnie
W nawiazaniu do mojego projektu http://microgeek.eu/viewtopic.php?f=22&t=99 przymierzam sie aby uzyc popularnego LM3916 i wykorzystac go aby sterowac WS2812b.
Wpadlem na pomysl , ze najfajniej by bylo gdyby osobny uC analizowal stan pinow LM3916 a w odpowiedzi sterowal ledami. No i tutaj chcialem zweryfikowac tok myslenia w zakresie pisania oprogramowania.
Zakladam , ze uC bedzie mogl odczytac stan od 0-10 gdzie 0 to jest totalna cisza a 10 bedzie oznaczalo , ze jest naprawde duza impreza na maxa i sasiedzi sa wniebowzieci
Aby umilic te efekty dla oka mysle ze fajnie by bylo wykorzystac gradienty. I tutaj pojawil mi sie pomysl - stworzylbym strukture opisujaca od jakiego koloru zaczac a na jakim zakonczyc oraz jakie sa indexy startowe i koncowe ledow. Utworzylbym tablice 10 takich obiektow i umiescil je w tablicy.
Kod: Zaznacz cały
typedef struct
{
uint color_start;
uint color_stop;
uint index_start;
uint index_stop;
} TAUDIOCOLOR;
// ...
// ... Nastepnie utworzenie 10 obiektow
// ...
TAUDICOLOR tablica_danych[10]; // Kod jest tylko pogladowy i pisany w przegladarce :)
Majac cos takiego gotowego dobrze by bylo miec funkcje do obslugi gradientow - mysle ze cos w rodzaju ponizszej funkcji powinno sie sprawdzic ( *jak poprzednio kod na razie jest tylko pogladowy
Kod: Zaznacz cały
function ustaw_gradient( *wskaznik_na_taudiokolor, *wskaznik_na_tablice_z_ws2812)
{
// tutaj kod odpowiednio ustawiajacy gradient dla naszego paska
}
No i chyba ostatnie to po odczytaniu wartosci 0-10 wykonalbym operacje iteracji po kazdym elemencie tablicy moich struktur az do wartosci rownej wartosci odczytanej - i dla kazdej z opcji ustawil odpowiednio ledy przy wykorzystaniu w/w funkcji
Kod: Zaznacz cały
for (uint var=0; var < odczytana_wartosc ; var++)
{
ustaw_gradient( tablica_danych[ var ] , *wskaznik_na_tablice_z_ws2812);
}
I kiedy to sie zakonczy po prostu wyslij_na_pasek();
Ciekawy jestem co myslicie i czy wg was cos warto byloby zrobic inaczej i bardziej optymalnie