BBMagic Home – Sterowanie w czasie względnym


Istnieją w zasadzie dwie możliwości sterowania w czasie dowolnym urządzeniem. Dla przykładu posłużmy się dekoracyjnym oświetleniem w pokoju.

Pierwszy model sterowania

Sposób pierwszy to zaprogramowanie harmonogramu, który nie zależy od żadnych zdarzeń, a jedynie realizowany jest cyklicznie w czasie – mogą to być cykle godzinne, dobowe, tygodniowe, itd. Praktycznie wyglądałoby to tak, że np.: włączamy dekoracyjne światło codziennie o 18.00 i wyłączamy o 22.00. Albo w dni powszednie włączamy o 17.00 i wyłączamy o 22.00, a w weekendy pozostawiamy zapalone do 23.00. Więcej o sterowaniu w czasie bezwzględnym napisano tutaj: BBMagic Home – Programowanie w czasie bezwzględnym.

Drugi model sterowania

Drugim sposobem automatycznej obsługi dekoracyjnego światła byłoby zapalenie żarówek na określony czas po wystąpieniu zdarzenia: np.: wykryciu ruchu w pokoju czujnikiem MOTION albo otrzymaniu sygnału z sensora MAGNETO informującego np. o otwarciu drzwi. Nie istnieje wtedy z góry zaprogramowany scenariusz włączeń i wyłączeń oświetlenia lecz w zależności od sygnałów płynących z sensorów podejmowana jest decyzja na jaki czas uruchomić sterowane urządzenie.

Istnieją oczywiście niezliczone możliwości sterowania będące najróżniejszymi kombinacjami powyżej opisanych modeli.

Na czym polega sterowanie w czasie względnym w BBMagic Home

Sterowanie w czasie względnym polega na zmianie nastaw (np.: włączanie, wyłączanie, zmiana mocy, barwy itp.) aktorów na określony czas po wystąpieniu zdefiniowanego zdarzenia. W aplikacji BBMagic Home zaimplementowany został mechanizm, który zdejmuje z programisty konieczność odmierzania czasu, jaki upływa od wystąpienia zdarzenia. Każdy aktor zarejestrowany w aplikacji posiada swój własny timer, którego możemy użyć do sprawnego programowania w czasie względnym.

Jak to jest zorganizowane

Przed użyciem w aplikacji każdego aktora musi on zostać najpierw zarejestrowany. Dokonujemy tego w odpowiednim miejscu głównego pliku aplikacji: bbmagic_home.c. Poniżej przykładowy kod rejestrujący trzy aktory BBMagic:

//-dodaj AKTORY BBMagic do bazy aplikacji
//-------------------------------------------------------------------
//-add BBMagic ACTORs to app database
bbm_relay_add("relay_1", "CB48A52CEA24", "25CE2B0DDCE1A30BF0748C38C64FAC17") ;
bbm_dimmer_add("dimmer_1", "C22689A7DB4C", "070C20BDC814CB7DDB76FC0121283144") ;
bbm_pwm_add("pwm_1", "CE72E4C2490A", "2A859007735202117832497DC52A190D") ;

relay_1, dimmer_1, pwm_1 to dowolnie wybrane nazwy służące do identyfikacji w aplikacji aktora i/lub urządzenia którym steruje. Kolejne dane to adres i klucz aktora. Należy odczytać je z modułu BBMagic tak, jak szczegółowo opisano to tutaj: Jak odczytać adres sensora i klucz aktora BBMagic.
Teraz mając już zarejestrowane aktory możemy zwracać się do nich po imieniu.

Do włączania timerów zaimplementowano trzy funkcje. Należy podać nazwę aktora, którego timer ustawiamy i czas w sekundach jaki chcemy odmierzyć.

  • int bbm_relay_set_trigger(const unsigned char *name, unsigned int time_s)
  • int bbm_pwm_set_trigger(const unsigned char *name, unsigned int time_s)
  • int bbm_dimmer_set_trigger(const unsigned char *name, unsigned int time_s)

Aby ustawić timer aktora BBMagic RELAY zarejestrowanego jako relay_1 na trzy minuty piszemy: bbm_relay_set_trigger(„relay_1”, 180) ;

Do wyłączania timerów zaimplementowano trzy funkcje, które w dowolnym momencie pozwalają zdezaktywować uruchomiony timer. Należy podać nazwę aktora, którego timer zamierzamy wyłączyć.

  • int bbm_relay_clear_trigger(const unsigned char *name)
  • int bbm_pwm_clear_trigger(const unsigned char *name)
  • int bbm_dimmer_clear_trigger(const unsigned char *name)

Polecenie dezaktywujące timer aktora BBMagic DIMMER zarejestrowanego jako dimmer_1 wygląda tak: bbm_dimmer_clear_trigger(„dimmer_1”) ;

Do sprawdzania stanu timera zaimplementowano również trzy funkcje. Podając nazwę aktora funkcja zwróci stan jego timera: 1 oznacza, że ustawiony czas właśnie upłynął. 0 oznacza, że timer nie odmierzył jeszcze ustawionego czasu lub jest wyłączony.

  • int bbm_relay_is_trigger(const unsigned char *name)
  • int bbm_pwm_is_trigger(const unsigned char *name)
  • int bbm_dimmer_is_trigger(const unsigned char *name)

Poniższy kod sprawdza czy timer aktora BBMagic PWM zarejestrowanego jako pwm_1 właśnie odmierzył zadany czas i jeśli tak wykonuje akcję.

if( bbm_pwm_is_trigger("pwm_1") )
    bbm_pwm_set("pwm_1",0, 0, 0) ;

Jak to działa w praktyce w aplikacji BBMagic Home

Poniższy obrazek dla przypomnienia pokazuje strukturę aplikacji BBMagic Home.

BBMagic Home struktura plików
Aby łatwo zrozumieć jak kilka linii kodu dopisane w odpowiednim miejscu może zaprogramować całą funkcjonalność wróćmy do naszego przykładu oświetlenia z początku artykułu. Zaprogramujmy dekoracyjną iluminację w następujący sposób:

  • każde wykrycie ruchu w pomieszczeniu przez sensor MOTION spowoduje włączenie dekoracyjnego światła w kolorze białym na 75% mocy na 30 minut (to zaprogramujemy w pliku motion_action.c),
  • każde wykrycie ruchu gdy światło jest już odpowiednio ustawione (75% na biało) spowoduje odliczanie czasu 30 minut od początku (to zaprogramujemy w pliku motion_action.c),
  • po 30 minutach światło zmieni kolor na lekko czerwonawy i nieco przygaśnie (to zaprogramujemy w pliku trig_action.c).

W pliku motion_action.c kodujemy działanie wykonywane po wykryciu ruchu przez sensor MOTION w następujący sposób:

if( bbm_check_addr("111111111111", bbm_buf) )
{
    if(bbm_buf[BBM_MOTION_FLAGS] & BBM_MOTION_ALERT_MASK)
    {
        bbm_pwm_set("pwm_1", 75, 75, 75) ;   //-biały 75%
        bbm_pwm_set_trigger("pwm_1", 1800) ; //-timer na 30 minut
    }
}

W miejsce „111111111111” należy oczywiście wkleić adres odczytany z zainstalowanego w pokoju sensora BBMagic MOTION. Jak odczytać adres szczegółowo opisano tutaj: Jak odczytać adres sensora i klucz aktora BBMagic.
W pliku trig_action.c kodujemy działanie wykonywane po odmierzeniu ustalonego czasu przez uprzednio nastawiony timer:

if( bbm_pwm_is_trigger("pwm_1") )
    bbm_pwm_set("pwm_1", 50, 25, 25) ;  //-delikatny odcień czerwieni

Oczywiście pokazany tu przykład ma na celu wyłącznie pokazanie schematu działania przy tego rodzaju programowaniu. Mając już odpowiednią wiedzę bardzo łatwo dodawać złożone zachowania systemu jak np.:

  • uzależnienie koloru włączanej iluminacji od poziomu oświetlenia zmierzonego przez sensor MOTION,
  • dodatkowe włączanie iluminacji np.: na 100% po wykryciu otwarcia drzwi sensorem MAGNETO – kod należy dopisać w pliku magneto_action.c
  • dodatkowa możliwość zmiany lub wyłączenia iluminacji bezprzewodowym sensorem BUTTON – programujemy w pliku button_action.c
  • tryb włączania iluminacji po wykryciu ruchu może być zależny od pory doby. W nocy po wykryciu ruchu pomiędzy 23.00 a 6.00 iluminacja jest włączana delikatnie na 10% mocy maksymalnej na czas dwóch minut, po upływie których jest wyłączana. W godzinach 18.00-23.00 światło włączane jest na pełną moc na 15 minut po czym następuje przyciemnienie do 50% na czas 10 minut aby ostatecznie wyłączyć iluminację. W pliku trig_action.c mamy wtedy kod:
    if( bbm_pwm_is_trigger("pwm_1") )
    {
        if( bbm_time_is_between(23.00, 6.00) )
        {
            bbm_pwm_set("pwm_1", 0, 0, 0) ;
        }else if( bbm_time_is_between(18.00, 23.00) )
        {
            if( bbm_pwm_get_ch0("pwm_1") == 100 )
            {
                bbm_pwm_set("pwm_1", 50, 50, 50) ;
                bbm_pwm_set_trigger("pwm_1", 600) ;
            }else
            {
                bbm_pwm_set("pwm_1", 0, 0, 0) ;
            }
        }
    }
    
  • kaskadowa zmiana koloru/natężenia iluminacji poprzez wielokrotne uruchamianie timera w pliku trig_action.c. Każdy kolejny kolor świeci coraz krócej (180,120,60 sekund) po czym następuje zgaszenie iluminacji:
    if( bbm_pwm_is_trigger("pwm_1") )
    {
        if( bbm_pwm_get_ch0("pwm_1") == 75 )
        {
            bbm_pwm_set("pwm_1", 100, 0, 0) ;
            bbm_pwm_set_trigger("pwm_1", 180) ;
        }else if( bbm_pwm_get_ch0("pwm_1") == 100 )
        {
            bbm_pwm_set("pwm_1", 0, 100, 0) ;
            bbm_pwm_set_trigger("pwm_1", 120) ;
        }else if( bbm_pwm_get_ch1("pwm_1") == 100 )
        {
            bbm_pwm_set("pwm_1", 0, 0, 100) ;
            bbm_pwm_set_trigger("pwm_1", 60) ;
        }else if( bbm_pwm_get_ch2("pwm_1") == 100 )
        {
            bbm_pwm_set("pwm_1", 0, 0, 0) ;
        }
    }
    

I wiele, wiele innych możliwości, które podpowie potrzeba lub wyobraźnia.

Implementację dwóch powyżej opisanych przykładów można znaleźć w demonstracyjnym projekcie bbmagic_home_triggers w pakiecie BBMagic_Home dostępnym w dziale Download.



Aby pobrać i rozpakować projekt BBMagic Home zaloguj się do systemu i wpisz w linii poleceń:

wget http://bbmagic.net/download/proj/bbmagic_home_project.tar.gz
tar -zxvf bbmagic_home_project.tar.gz
cd bbmagic_home_project
cd bbmagic_home_triggers


Przed skompilowaniem należy w pliku bbmagic_home.c w miejsce „222222222222”, „33333333333333333333333333333333” wkleić adres i klucz odczytany z posiadanego aktora BBMagic PWM, a w pliku motion_action.c w miejsce „111111111111” wkleić odczytany adres sensora BBMagic MOTION.
Po dokonaniu powyższych zmian kompilujemy projekt poleceniem make i uruchamiamy aplikację poleceniem sudo ./run_bbm_home.

BBMagic Home triggers run

Tagi , , , , .Dodaj do zakładek Link.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *