BBMagic Home – zaprogramuj sobie inteligentne otoczenie


Zaprogramowanie od przysłowiowego zera inteligentnego domu-mieszkania-pokoju skonsumowałoby z pewnością ogromną ilość czasu i energii. Aby uprościć i przyspieszyć ten proces można skorzystać z przygotowanego projektu bazowego BBMagic Home.

BBMagic Home struktura plików

W BBMagic Home zorganizowana została struktura katalogów i plików, do których łatwo można dopisywać kolejne funkcjonalności. Zaimplementowano też szereg funkcji, które umożliwiają: komunikację z sensorami i aktorami Bluetooth Smart, sterowanie w czasie względnym i bezwzględnym oraz w modelu zdarzeniowym. Oto kilka najprostszych przykładów:

Przykład 1 – plan w czasie bezwzględnym

BBMagic RELAY - Lamka nocna

Automatyczne sterowanie lampką nocną w sypialni

Jeśli planujemy zapalać i gasić lampkę nocną w sypialni w wybrane dni tygodnia w określonych porach to dopisujemy w pliku zaplanowanych akcji (’scheduled_action.c’) cztery linie:

if(bbm_time_is_now(PN|WT|SR|CZ|PT|SO|ND, 20.30))
    bbm_relay_on("sypialnia_nocna", REL_CH0) ;
if(bbm_time_is_now(PN|WT|SR|CZ|PT|SO|ND, 22.00))
    bbm_relay_off("sypialnia_nocna", REL_CH0) ;

Przykład 2 – model programowania zdarzeniowego

BBMagic DIMMER - lampa salon

Automatyczne światło w pokoju

Jeśli chcemy, aby po otwarciu drzwi do pokoju światło rozbłysło na 75% mocy maksymalnej to nad drzwiami przyklejamy bateryjny, bezprzewodowy sensor MAGNETO, a w pliku 'magneto_action.c’ dopisujemy:

if( (bbm_buf[BBM_MAGNETO_FLAGS] & BBM_MAGNETO_MAGNET_MASK) ==0 )
    if(bbm_dimmer_get("salon_dimm") != 75)
        bbm_dimmer_set("salon_dimm", 75) ;

Przykład 3 – model programowania zdarzeniowego w czasie bezwzględnym

BBMagic PWM - LED RGB

Obsługa RGB LED wielofunkcyjnm mobilnym sensorem BUTTON

Powiedzmy, że mamy ochotę, aby po pojedynczym naciśnięciu guzika sensora BUTTON LEDy rozbłysnęły na biało, po podwójnym kliknięciu zmieniły kolor na czerwony, a po przytrzymaniu guzika całkowicie się wyłączyły. Intensywność światła chcemy jednak uzależnić od pory dnia, aby po zapadnięciu zmroku (między 18.00 a 6.00) w pokoju zrobiło się przytulnie. Otwieramy zatem plik 'button_action.c’ odpowiedzialny za obsługę zdarzeń związanych z sensorem BUTTON i dopisujemy kilka linii:

if(bbm_buf[BBM_BUTTON_BUTTON_FUNCTION] == BBM_BUTTON_FN_SINGLE_CLICK )
{
    if( time_is_between(6.00, 18.00) )
        bbm_pwm_set("sal_led_strip", 100, 100, 100) ;
    else
        bbm_pwm_set("sal_led_strip", 50, 50, 50) ;
}else if(bbm_buf[BBM_BUTTON_BUTTON_FUNCTION] == BBM_BUTTON_FN_DOUBLE_CLICK)
{
    if( time_is_between(6.00, 18.00) )
        bbm_pwm_set("sal_led_strip", 100, 0, 0) ;
    else
        bbm_pwm_set("sal_led_strip", 75, 0, 0) ;
}else if(bbm_buf[BBM_BUTTON_BUTTON_FUNCTION] == BBM_BUTTON_FN_HOLDING)
{
    bbm_pwm_set("sal_led_strip", 0, 0, 0) ;
}

Przykład 4 – obsługa zdarzenia z czasem względnym i bezwzględnym

BBMagic RELAY - lamka schodowa

Autoamtyczne światło w korytarzu lub na schodach

Jeśli planujemy, aby światło w korytarzu po wykryciu ruchu zapaliło się na 10 minut, ale tylko w godzinach 18.00-5.30 to w wybranym miejscu korytarza przyklejamy bateryjny sensor MOTION, a w pliku 'motion_action.c’ dopisujemy nową funkcjonalność. Sprawdzamy czy bezwzględny czas jest odpowiedni (od 18.00 do 5.30), a jeśli tak, to włączamy przekaźnik REALY zapalający światło oraz ustawiamy trigger czasu względnego na 600 sekund (10 minut).

if( bbm_time_is_between(18.00, 5.30) )
{
    bbm_relay_on("korytarz", REL_CH0) ;
    bbm_relay_set_trigger("korytarz", 600) ;
}

W pliku 'trig_action.c’ dodajemy wyłączanie światła jak poniżej i gotowe.

if( bbm_relay_is_trigger("korytarz") )
{
    bbm_relay_off("korytarz", REL_CH0) ;
}

Po dokonaniu zmian w każdym powyższym przykładzie wystarczy skompilować projekt wpisując polecenie make, a następnie uruchomić naszą nową aplikację poleceniem sudo ./run_bbm_home.

To tylko kilka najprostszych przykładów, które możemy zrealizować w kilka chwil korzystając z technologii BBMagic.
Dzięki takiemu podejściu skupiamy się na najważniejszym: programowaniu funkcji naszego inteligentnego otoczenia i dlatego efekty pracy są widoczne niemal natychmiast.

Komponenty bazowego projektu BBMagic Home

W plikach projektu BBMagic Home znajduje się wiele opisów ułatwiających zrozumienie zasady dodawania funkcjonalności.

Pliki w głównym katalogu

  • bbmagic_home.c – główny plik programu. Jego zawartość omówiono poniżej.
  • bbmagic_lib.h – plik zawierający deklaracje funkcji zaimplementowanych w bibliotece bbmagic_lib oraz definicje wiadomości odbieranych od modułów BBMagic. Zaglądnięcie do niego na pewno spowoduje pogłębienie wiedzy.
  • Makefile – plik z instrukcjami kompilacji. Jest on tu po to abyś mógł spokojnie napisać 'make’ i nie przejmowac się przebiegiem kompilacji programu.

Pliki w katalogu 'src_actions’
Oto miejsce gdzie dodawać będziemy nowe funkcjonalności podnoszące inteligencję naszego otoczenia.

  • scheduled_action.c – tutaj wrzucamy wszystkie zadania zaplanowane w czasie. Np.: codziennie o 8.00, raz w tygodniu, w każdy poniedziałek i środę o 20.12, w dni powszednie, tylko w weekendy. Itp.
  • button_action.c – w tym pliku programujemy zdarzenia, które zostaną wykonane po naciśnięciu bezprzewodowego guzika BBMagic BUTTON.
  • motion_action.c – do tego pliku dodajemy wszystkie akcje wykonywane po wykryciu ruchu przez zainstalowane sensory BBMagic MOTION: np.: zapalenie światła w pokoju po wykryciu ruchu w drzwiach albo delikatne zapalenie lampki nocnej po wykryciu ruchu w sypialni w godzinach nocnych.
  • meteo_action.c – tu znajduje się wszystko co zależy od temperatury, wilgotności czy natężenia światła mierzonego przez sensory BBMagic METEO.
  • magneto_action.c – w tym pliku programujemy akcje podejmowane po odebraniu informacji od sensorów BBMagic MAGNETO: otwarcie drzwi, okna czy szafy lub użycie spłuczki w łazience.
  • flood_action.c – tu zawieramy wszystko co ma się wydarzyć po odebraniu alarmu od sensorów BBMagic FLOOD.
  • trig_action.c – ten tajemniczy z nazwy plik zawiera akcje wyzwalane trigerami czasu względnego, które związane są z aktorami BBMagic. Plik ten pomoże nam np. w zrealizowaniu funkcji wyłączenia światła w pokoju po 60 minutach od wykrycia tam ruchu i wentylatora w łazience po np. 10 minutach od użycia spłuczki.

Pliki w katalogu 'libs’
Biblioteki potrzebne do kompilacji.

Pliki w katalogu 'tools’
Tu znajduje się aplikacja 'bbm_scanner_2′, która umożliwia:

  • odczytywanie adresów sensorów BBMagic
  • odczytywanie adresów i kluczy szyfrujących aktorów BBMagic

Uruchamiamy ją poleceniem:

sudo ./tools/bbm_scanner_2

…i juz zaczyna działać:
bbm_scanner_2

Dodawanie własnych sensorów BBMagic

Aby dodać własny sensor do projektu bazowego należy odczytać jego adres programem 'bbmagic_scanner_2′ i skopiować go w miejsce „111111111111” w odpowiednim pliku:

  • button_action.c – jeśli dodawany sensor to BBMagic BUTTON.
  • motion_action.c – jeśli dodawany sensor to BBMagic MOTION.
  • meteo_action.c – jeśli dodawany sensor to BBMagic METEO.
  • magneto_action.c – jeśli dodawany sensor to BBMagic MAGNETO.
  • flood_action.c – jeśli dodawany sensor to BBMagic FLOOD.

Dodawanie własnych aktorów BBMagic

Aby dodać do projektu bazowego własny aktor BBMagic nalezy odczytać jego adres i klucz jak opisano w paragrafie 'W jaki sposób odczytać adres i klucz aktora BBMagic’ artykułu Sterowanie aktorami BBMagic.
Następnie w pliku 'bbmagic_home.c’ przed pętlą główną dodać go do bazy aktorów aplikacji za pomocą funkcji:

  • bbm_relay_add(„nazwa”, „adres”, „klucz”) – jeśli dodawany aktor to BBMagic RELAY
  • bbm_dimmer_add(„nazwa”, „adres”, „klucz”) – jeśli dodawany aktor to BBMagic DIMMER
  • bbm_pwm_add(„nazwa”, „adres”, „klucz”) – jeśli dodawany aktor to BBMagic PWM

Aktorowi możemy nadać dowolna nazwę. Sensowne jednak jest aby opisywała ona funkcję lub miejsce instalacji danego urządzenia. Np.: „d_nocna_sypialnia” dla dimmera lamki nocnej w sypialni lub „p_led_salon” dla aktora BBMagic PWM sterującego paskiem led w salonie. Przy tak uporządkowanym nazewnictwie dużo łatwiej zarządzać kodem i w miarę potrzeb dopisywać nowe funkcjonalności.
Teraz pozostaje już tylko sterować nowym aktorem za pomocą funkcji z biblioteki bbmagic_lib:

  • bbm_relay_on(„nazwa”, REL_CH0) i bbm_relay_off(„nazwa”, REL_CH0) – dla BBMagic RELAY
  • bbm_dimmer_set(„nazwa”, wartość) – dla BBMagic DIMMER
  • bbm_pwm_set(„nazwa”, ch1, ch2, ch3) – dla BBMagic PWM

Co się dzieje w głównym pliku aplikacji?

Otwórzmy teraz główny plik naszej bazowej aplikacji bbmagic_home.c i zobaczmy co się w nim kryje, aby zrozumieć jak działa cała maszyneria.

nano bbmagic_home.c

Na samym początku znajdziemy załączone pliki nagłównkowe, poniżej których jest miejsce na zadeklarowanie globalnych zmiennych Twojego projektu. Zmienne te będą widoczne i mogą być używane w każdym z plików projektu.

#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <signal.h>
#include "bbmagic_lib.h"
    //-Twoje zmienne globalne - Your global variables
    //...

Następnie załączone są pliki obsługi zdarzeń i zaplanowanych w czasie działań:

//-Nie zmieniaj ponizszych linii - Do not change lines below
#define SECOND_PRESC        10
#include "src_actions/button_action.c"
#include "src_actions/motion_action.c"
#include "src_actions/magneto_action.c"
#include "src_actions/meteo_action.c"
#include "src_actions/flood_action.c"
#include "src_actions/scheduled_action.c"
#include "src_actions/trig_action.c"

Poniżej definicje pinów Raspberry Pi, do których można podłączyć diody LED z szeregowymi rezystorami. Zobacz: LED sygnalizujaca transmisje Bluetooth dla Raspberry Pi .
Będą one sygnalizować kolejno odbieranie i nadawanie radiowych pakietów BBMagic oraz działanie aplikacji:

//-Skonfiguruj piny z diodami LED
//- LED PINS configuration - change it if youwant
#define RX_LED_PIN              26
#define TX_LED_PIN              19
#define RUN_LED_PIN             13

Idąc dalej napotykamy główna funkcję programu. W niej deklaracja zmiennych BBMagic, miejsce na deklaracje ewentualnych Twoich zmiennych oraz wyświetlenie informacji o aplikacji.

//===========================================================================================
//-Main point
//===========================================================================================
int main(void)
{
    //-zmienne BBMagic - BBMagic variables
    unsigned char bbm_buf[100] ;
    unsigned int bbm_cnt =0, second =0 ;
    int bbm_id ;
    //-Twoje zmienne - Your variables
    //...
    printf("\n**** BBMagic Smart Home v0.1 ***\n") ;
    printf("****     www.bbmagic.net     ***\n\n") ;

W dalszej kolejności sprawdzamy wersję bibliteki bbmagic_lib i jeśli jest odpowiednia, otwieramy komunikację BBMagic over Bluetooth Smart:

//-sprawdz wersje biblioteki bbmagic_lib
//-------------------------------------------------------------------
//-check bbmagic_lib version
bbm_id = bbm_bt_lib_version() ;
printf("bbm_lib_version: %0.4X - ",bbm_id) ;
if(bbm_id >= 0x0200) printf("ok\n") ;
else
{
    printf("nok - stop") ;
    exit(1) ;
}
//-otworz komunikacje BBMagic over Bluetooth Smart
//-------------------------------------------------------------------
//-open BBMagic over Bluetooth Smart communication
bbm_id = bbm_bt_open(RX_LED_PIN, TX_LED_PIN, RUN_LED_PIN, LIB_SHOW_CONFIG | LIB_SHOW_SENSORS | LIB_SHOW_ACTORS) ;
//bbm_id = bbm_bt_open(0, 0, 0, LIB_SHOW_CONFIG | LIB_SHOW_SENSORS | LIB_SHOW_ACTORS) ;
if(bbm_id) exit(2) ;

Jeśli wszystko dotychczas przebiegało bezbłędnie to musimy dodać do bazy aplikacji wszystkie aktory, które będą sterowane przez nasz program. Poniżej dodano przykłądowe urządzenia:

//-dodaj AKTORY BBMagic do bazy aplikacji
//-------------------------------------------------------------------
//-add BBMagic ACTORs to app database
bbm_relay_add("kuchnia", "D1461239094D9", "CE6F69EFAEB1BE960522D93E4EEB7CBB") ;
bbm_dimmer_add("nocna", "D381D2F1C959", "02030405060708091011121314151617") ;
bbm_pwm_add("pasek_led", "C224904C0078", "3D025F67023642995FB2EF6453D3ABF8") ;

Adresy i klucze szyfrujące posiadanych aktorów odczytujemy używając 'bbm_scanner_2′ jak opisano w Jak odczytać adres sensora i klucz aktora BBMagic

Dalej rozpoczyna się pętla gówna, która wykonywana jest do momentu naciśnięcia przez uzytkownika klawiszy 'Ctrl+c’ Sprawdza ona co 100ms czy nadeszły nowe dane od sensora lub aktora BBMagic i jesli tak, to wywołuje odpowiednią funkcję przekazując jej wskaźnik do bufora z odebraną właśnie wiadomością.
Biblioteczne funkcje bbm_xxx_comply(..) mają za zadanie sprawdzić czy stan ustawienia aktora jest zgodny z wysterowaniem i jeśli nie to ustawić zgodność. Pozwala to na przywrócenie stanu aktora po jego odłączeniu od zasilania i ponownym podłączeniu.

//-petla glowna
//-------------------------------------------------------------------
//-here is main loop
do
{
    bbm_cnt++ ;
    if((bbm_cnt % 10) ==0) second++ ;
    //-odczytaj wiadomość od modułów BBMagic
    //-------------------------------------------------------------------
    //-read data from BBMagic Modules
    bbm_id = bbm_bt_read(bbm_buf) ;
    //-jesli nadeszla wiadomosc przekieruj do odpowiedniej funkcji
    //-------------------------------------------------------------------
    //-if there is message go to appropriate function
    switch( bbm_id )
    {
        case BBMAGIC_M_BUTTON:
            button_action( bbm_buf ) ;
        break ;
        case BBMAGIC_M_MOTION:
            motion_action( bbm_buf ) ;
        break ;
        case BBMAGIC_M_METEO:
            meteo_action( bbm_buf ) ;
        break ;
        case BBMAGIC_M_MAGNETO:
            magneto_action( bbm_buf ) ;
        break ;
        case BBMAGIC_M_FLOOD:
            flood_action( bbm_buf ) ;
        break ;
        case BBMAGIC_M_RELAY:
            bbm_relay_comply(bbm_buf) ;
        break ;
        case BBMAGIC_M_DIMMER:
            bbm_dimmer_comply(bbm_buf) ;
        break ;
        case BBMAGIC_M_PWM:
            bbm_pwm_comply(bbm_buf) ;
        break ;
        default:
        break ;
    } ;

Następnie wywoływana jest funkcja reagująca na trigery aktorów oraz funkcja wykonująca zaplanowane w czasie zadania:

    //-obsluz triggery - nie ma potrzeby tego zmieniać
    //-------------------------------------------------------------------
    //-check triggers - no need to change it
    trig_action() ;
    //-obsluz zaplanowane zadania - nie ma potrzeby tego zmieniać
    //-------------------------------------------------------------------
    //-check scheduled action - no need to change it
    if(bbm_cnt % (60 * SECOND_PRESC) == 0)
    {
        scheduled_action() ;
    }

Pętlę główną kończy okres oczekiwania o długości 100ms.
Po przerwaniu działania petli głównej bbm_bt_close() zamyka komunikację BBMagic over Bluetooth Smart, a funkcja 'exit’ kończy działanie programu.

        //-nie ma potrzeby tego zmieniać
        //-------------------------------------------------------------------
        //-no need to change it
        bbm_sleep_ms(100) ;
    }while(bbm_id != -1) ;
    bbm_bt_close() ;
    exit(0) ;
}

Pliki projektu BBMagic Home dostępne są w dziale Download
Po rozpakowaniu archiwum ten bazowy projekt znajdziesz w katalogu bbmagic_home_start

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

Komentarze są wyłączone.