LED Equalizer na WS2812B

Tu możesz pisać o swoich problemach z pisaniem programów w języku C dla AVR.
Awatar użytkownika
RafPe
User
User
Posty: 177
Rejestracja: sobota 05 wrz 2015, 16:22

LED Equalizer na WS2812B

Postautor: RafPe » ś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.

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 :) - bardziej do oceny podejscia )

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 :)

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1177
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: LED Equalizer na WS2812B

Postautor: Antystatyczny » czwartek 29 paź 2015, 00:31

Pisząc o gradientach masz na myśli wskaźniki (1 wskaźnik?) wysterowania, który będzie zaczynał świecić przykładowo na czerwono, a w miarę przyrostu poziomu sygnału kolejne diody bedą się świeciły coraz bardziej na żółto, by w końcu przejść np. w kolor zielony? Nie bardzo to czuję... Nakreśl odrobinkę precyzyjniej stronę sprzętową, by pobudzić mą wyobraźnię :)
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
RafPe
User
User
Posty: 177
Rejestracja: sobota 05 wrz 2015, 16:22

Re: LED Equalizer na WS2812B

Postautor: RafPe » czwartek 29 paź 2015, 07:39

Hey @Anty :) A wiec zeby pobudzic Twoja wyobraznie planuje miec po 1 wiezy (czyli po 1 buforze na ledy ) na kazdy kanal co mniej wiecej mialoby wygladac tak jak na zalaczniku ( z uwzglednieniem gradientow )
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.


Wróć do „Programowanie AVR w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 7 gości