- liczba przegródek: 16,
- maksymalna liczba dziennych dawek: 5,
- źródło napięcia zasilającego: bateria alkaliczna typu AAA,
- prąd pobierany ze źródła zasilania (maksymalny/tryb uśpienia): 55 mA/80 μA (szczegóły w tekście artykułu).
Program sterujący
Zaczniemy od pliku nagłówkowego do obsługi diod LED RGB upraszczającego i porządkującego późniejszy kod, który to plik pokazano na listingu 1.
Listing 2. Funkcja odpowiedzialna za przesłanie jednego bitu danych interfejsu diod WS2812B-V5
__inline__ void __attribute__((__always_inline__))
ledSendBit(uint8_t Bit) {
if(Bit) {
LED_SET;
_delay_us(0.65);
LED_RESET;
_delay_us(0.65);
} else {
LED_SET;
_delay_us(0.25);
LED_RESET;
_delay_us(0.65);
}
}
Skoro mamy już funkcję umożliwiającą przesłanie jednego bitu informacji, to pora na funkcję (także odpowiednio zadeklarowaną) umożliwiającą przesłanie kompletnego bajta danych, przy udziale wspomnianego wcześniej interfejsu danych, której ciało pokazano na listingu 3.
Listing 3. Funkcja odpowiedzialna za przesłanie jednego bajta danych interfejsu diod WS2812B-V5
__inline__ void __attribute__((__always_inline__))
ledSendByte(uint8_t Byte){
ledSendBit(Byte & 0x80);
ledSendBit(Byte & 0x40);
ledSendBit(Byte & 0x20);
ledSendBit(Byte & 0x10);
ledSendBit(Byte & 0x08);
ledSendBit(Byte & 0x04);
ledSendBit(Byte & 0x02);
ledSendBit(Byte & 0x01);
}
Dalej, by uprościć zapis danych do adresowalnych diod LED RGB, przewidziano funkcję pozwalającą na przesłanie kompletnej informacji o kolorze tejże diody LED, której ciało pokazano na listingu 4.
Listing 4. Funkcja pozwalającą na przesłanie kompletnej informacji o kolorze diody LED typu WS2812B-V5
__inline__ void __attribute__((__always_inline__))
ledSendColor(uint8_t R, uint8_t G, uint8_t B){
ledSendByte(G);
ledSendByte(R);
ledSendByte(B);
}
Zapewne pamiętacie, że asynchroniczny interfejs komunikacyjny diod LED typu WS2812B-V5 przewiduje transmisję jeszcze jednego sygnału, a mianowicie sygnału RESET. Ciało funkcji odpowiedzialnej za transmisję sygnału RESET interfejsu diod WS2812B-V5 pokazano na listingu 5.
Listing 5. Funkcja odpowiedzialna za transmisję sygnału RESET interfejsu diod WS2812B-V5
inline void ledReset(void){
LED_RESET;
_delay_us(300);
}
Normalnie w tym miejscu zakończyłbym opis obsługi naszych ciekawych diod LED RGB, ale nie tym razem. Prawdę mówiąc, funkcje pokazane powyżej będą działać bez problemów wyłącznie na szybszych mikroprocesorach, dla których jeden cykl zegarowy jest najlepiej o rząd wielkości krótszy niż timingi odpowiedzialne za wysłanie poszczególnych bitów koloru diod LED. W innym przypadku, czyli jak u nas, gdzie takt zegara trwa 125 ns (dla częstotliwości taktowania 8 MHz), wykonanie każdego dodatkowego rozkazu (jak na przykład sprawdzenie wartości każdego bitu zmiennej przeznaczonej do wysłania) może dość skutecznie rozłożyć całą transmisję danych, gdyż niezachowane są wówczas rygorystyczne timingi kodujące bity informacji.