LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
IoT

ISIX-RTOS – trzy wątki, przykłady w języku C: termometr z wyświetlaczem LED-RGB

Wątek wizualizacji rozpoczyna działanie od inicjalizacji modułu KAmodRGB poprzez wywołanie funkcji rgb_init() (list. 5). W przypadku niepowodzenia (rezultat <0) funkcja isix_task_delete(NULL) kasuje bieżący wątek który ją wywołał. Jeżeli inicjalizacja przebiegła poprawnie zadanie przechodzi do pętli realizującej cykl sterowania modułem KAmodRGB.

List. 5. Wątek inicjalizacji modułu KAmodRGB

//Initialize rgb controller
static int rgb_init(void)
{
  int errcode;
  static const uint8_t init_reg[RGB_INIT_NUMREG][RGB_INIT_NSEQ] =
     { { 0, 0 }, { 1, 0 }, { 8, 255 } };
  for(int i=0;i

Inicjalizacja modułu KAmodRGB sprowadza się do przesłania parametrów konfiguracyjnych do rejestrów układu PCA9633. Do rejestru konfiguracyjnego MODE1 (0x00) przesyłana jest wartość 0, co oznacza że układ PCA będzie reagował tylko na adres własny (istnieje również możliwość reakcji na adres grupowy, co umożliwia równoczesne sterowanie kilku układów na magistrali). Do rejestru konfiguracyjnego MODE2 (0x01) wpisywana jest również wartość 0, co powoduje skonfigurowanie wszystkich wyjść sterujących pracą LED jako open-drain . Na koniec inicjalizacji do rejestru LEDOUT (0x08) jest wpisywana wartość 255, co powoduje uruchomienie wszystkich 4 kanałów PWM.
Jeżeli inicjalizacja przebiegła pomyślnie, wówczas program wchodzi do pętli głównej, w której cyklicznie odczytywane są wiadomości otrzymywane od wątku odczytującego temperaturę z czujnika. Jeżeli w strukturze wiadomości nie został ustawiony kod błędu, wówczas wyznaczany jest poziom nasycenia poszczególnych barw RGB na podstawie aktualnej temperatury. Wartości skrajne temperatury COLD_VALUE (kolor niebieski) i HOT_VALUE (kolor czerwony) zdefiniowano odpowiednio na wartości 24 i 30°C, dzięki czemu jedynie poprzez dotknięcie ręką czujnika, temperatury będziemy mogli zobaczyć zmieniające się barwy od niebieskiego do czerwonego. Ponieważ układ PCA9633 ma 8-bitowe PWM-y, wartość 0 odpowiada odpowiednio wygaszeniu diody dla danego kanału, a 255 pełną jasność diody. Wyznaczenie współczynnika PWM dla nasycenia kolorów R i B została zrealizowana jako prosta funkcja liniowa. Natomiast nasycenie koloru zielonego zrealizowano jako funkcję kwadratową z miejscami zerowymi występującymi dla skrajnych wartości temperatury (zimno, gorąco) oraz ekstremum przypadające mniej więcej w połowie zakresu temperatur. Po wyliczeniu nasycenia poszczególnych składowych, wywoływane jest makro, grupujące poszczególne kolory w jedną 32-bitową zmienną reprezentującą wszystkie składowe kolorów. Funkcja rgb_set_color() (list. 6), przesyłająca wartości kolorów do układu PCA9633 wywoływana jest jedynie wtedy, gdy nastąpiła zmiana nasycenia w stosunku do poprzedniego cyklu.

List. 6. Funkcja modyfikująca kolor wyświetlany na LED-RGB

static int rgb_set_color (unsigned c)
{
  uint8_t txbytes[] =
      {0x82,  //Color register
                
      (c)>>24,   //A
      (c)>>16,   //B
      (c),             //R                
      (c)>>8     //G
      };
  return i2cm_transfer_7bit( RGBCTRL_I2CADDR, txbytes,sizeof( txbytes), NULL, 0);
}

Działanie funkcji ustawiającej nasycenie jest bardzo proste i sprowadza się do przesłania wartości nasycenia kolorów do rejestrów (PWM0…PWM3), w wyniku czego następuje ustawienie odpowiedniego koloru diody LED.
W rzeczywistej aplikacji termometru należy poszerzyć zakres temperatur ciepło-zimno, można także pomyśleć o wyznaczeniu różnych wartości ciepło-zimno w zależności od pory roku itp.