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.
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.