Raspberry Pi piszemy program dla BBMagic FLOOD


Poniższy materiał stanowi całość z tym wpisem:

Napiszmy program dla Raspberry Pi, który:

  • sprawdzi kompatybilność biblioteki bbmagic_lib funkcją: bbm_bt_lib_version()
  • włączy komunikację BBMagic Bluetooth w Raspberry Pi aby możliwe było odbieranie danych z modułów BBMagic. Funkcja: bbm_bt_open(..)
  • odbierze dane z modułu BBMagic funkcją: bbm_bt_read(..)
  • wyświetli odebrane informacje na ekranie
  • po naciśnięciu przez użytkownika ‚ctrl+c’ wyłączy komunikację BBMagic Bluetooth funkcją bbm_bt_close() i zakończy działanie

Budowa aplikacji

Nasza projekt będzie składał się z następujących plików:
program dla BBMagic FLOOD

  • bbmagic_lib_1.2.a to biblioteka obsługująca moduły BBMagic przez interfejs Bluetooth Low Energy – dla Raspberry Pi zero W i Raspberry Pi 3, które posiadają chipset bluetooth.
  • bbmagic_lib.h to plik nagłówkowy biblioteki bbmagic_lib zawierający definicje potrzebnych stałych
  • libbluetooth.a to biblioteka z pakietu libbluetooth-dev Debiana zawierającego pliki deweloperskie używane z biblioteką BlueZ. Powinieneś ja mieć już na swojej Malinie, ale gdybyś nie miał to dla ułatwienia zawieramy ją w naszym projekcie.
  • bbmagic_flood_sketch.c to plik aplikacji, który właśnie napiszemy
  • Makefile to plik z instrukcjami dla programu make kontrolującego przebieg kompilacji

Przygotowanie projektu

Stwórz nowy katalog dla naszego projektu: mkdir bbmagic_flood_sketch
i przejdź do niego cd bbmagic_flood_sketch
Otwórz swój ulubiony edytor. Jeśli jeszcze nie masz ulubionego otwórz nano – jest prosty i intuicyjnynano bbmagic_flood_sketch.c
BBMagic_FLOOD_sketch nano start

Piszemy program odbierający dane BBMagic FLOOD

1. Załączamy niezbędne pliki nagłówkowe oraz wstawiamy funkcję main#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "bbmagic_lib.h"
int main(void)
{

2. Deklarujemy potrzebne zmienneunsigned char bbm_buf[BBLIB_FRAME_SIZE] ;
int i, data_length ;
float vcc_f ;

  • bbm_buf – bufor na dane od modułu BBMagic FLOOD – rozmiar bufora BBLIB_FRAME_SIZE zdefiniowany jest w pliku ‚bbmagic_lib.h’
  • vcc_f – zawierać będzie wartość napięcia zasilania modułu BBMagic FLOOD
  • i, data_length – potrzebne do … okaże się za moment, poniżej

3. Sprawdzamy zgodność wersji biblioteki bbmagic_lib.
Jeśli to wersja 0x0102 to jest ok – nasz program jest z nią kompatybilny.
i = bbm_bt_lib_version() ;
printf("bbm_lib_version: %0.4X - ",i) ;
if(i == 0x0102) printf("ok\n") ;
else
{
printf("nok - stop\n\n") ;
exit(1) ;
}

4. Włączamy komunikację Bluetooth przy użyciu funkcji z biblioteki ‚bbmagic_lib_1.2’.
Wszystkie dostępne funkcje zawarte są w pliku ‚bbmagic_lib.h’.
i = bbm_bt_open(17) ;
if(i) exit(2) ;

Argumentem funkcji jest numer pinu Raspberry Pi, do którego podłączona będzie dioda sygnalizująca transmisję danych od modułów BBMagic.
Jeśli zawiera się w przedziale od 1 do 27 sygnalizacja zostanie włączona na wskazanym pinie. Jeśli jest równy zero lub większy niż 27 sygnalizacja nie zostanie włączona.
Diodę LED podłączyć można na dwa sposoby:
BBMagic RPI LED podłączenie

Dwiedz się więcej jak podłączyć diodę LED
5. Sprawdzamy czy nadeszły dane od któregoś z modułów BBMagic.
do
{
data_length = bbm_bt_read(bbm_buf) ;
if(data_length > 0)
{

Jeśli odebrano dane to znajdują się one w buforze ‚bbm_buf’, a zmienna ‚data_length’ pamięta liczbę odebranych bajtów.
Podstawowe wartośći, które funkcja bbm_bt_read(..) może zwrócić to:

  • data_length < 0 : odebrano ‚data_length’ bajtów danych od modułu BBMagic
  • data_length == 0 : nie odebrano danych od modułu BBMagic
  • data_length == -1 : użytkownik przerwał program naciskając ‚ctrl+c’
  • data_length == -10 : odebrane dane od modułu BBMagic nie są autentyczne. Niezgodny podpis cyfrowy.

Wszystkie możliwe wartośći, które funkcja bbm_bt_read(..) może zwrócić zawiera plik ‚bbmagic_lib.h’.

6. Sprawdzamy czy odebrane dane pochodzą od BBMagic FLOOD.
switch(bbm_buf[BBMAGIC_DEVICE_TYPE])
{
case BBMAGIC_M_FLOOD :

Stałe ‚BBMAGIC_DEVICE_TYPE’ oraz ‚BBMAGIC_M_FLOOD’ zdefiniowane są w pliku ‚bbmagic_lib.h’.

7. Konwertujemy i wyświetlamy podstawowe informacje przysłane przez BBMagic FLOOD.

  • Wypisujemy nazwę modułu, który przysłał dane:printf("BBM_FLOOD_") ;
  • Wyświetlamy sześciobajtowy adres Bluetooth modułufor(i=0; i<BBM_BT_ADDR_SIZE; i++)
    printf("%0.2X", bbm_buf[BBMAGIC_DEVICE_ADDR_5 + i]) ;
  • Następnie przeliczamy i wypisujemy wartość napięcia zasilaniavcc_f = bbm_buf[BBM_FLOOD_V_SUP] ; vcc_f/=BBMAGIC_VCC_DIVIDER ;
    printf(" | %0.2fV", vcc_f) ;
  • Czas pracy modułu od momentu włączenia zasilania w sekundachi =bbm_buf[BBM_FLOOD_WORKTIME_3] ; i<<=8 ;
    i |=bbm_buf[BBM_FLOOD_WORKTIME_2] ; i<<=8 ;
    i |=bbm_buf[BBM_FLOOD_WORKTIME_1] ; i<<=8 ;
    i |=bbm_buf[BBM_FLOOD_WORKTIME_0] ;
    printf(" | %4d",i) ;
  • Moc odbieranego sygnałuprintf(" | %ddBm | ", (signed char)bbm_buf[BBMAGIC_DEVICE_RSSI]) ;

8. Sprawdzamy czy wystąpił alarm zalaniowy.
Jeśli wystąpił alarm wypiszemy: ‚FLOOD ALERT !!’, a jeśli nie to: ‚NO FLOOD :-)’
if(bbm_buf[BBM_FLOOD_ALERT_FLAGS] & BBM_FLOOD_ALERT_MASK) printf(" FLOOD ALERT !!") ;
else printf(" NO FLOOD :-)") ;
break ;

9. Zamykamy switch’a.
Jeśli odebrane zostaną dane od innego modułu BBMagic to wyświetlamy jego adres bluetooth i typ.
default:
printf("BBM_UNKNOWN_") ;
for(i=0; i<BBM_BT_ADDR_SIZE; i++)
{
printf("%0.2X", bbm_buf[BBMAGIC_DEVICE_ADDR_5 + i]) ;
}
printf(" BBM_TYPE=%0.2X", bbm_buf[BBMAGIC_DEVICE_TYPE]) ;
break ;
} ;

10. Zamykamy if(data_length > 0)
Wyświetlamy znak nowej linii aby funkcja ‚printf’ wysłała zawartość swojego bufora na ekran i zamykamy ‚if’a’
printf("\n") ;
}

11. Zamykamy do{
Czekamy 100 mikrosekund i wykoujemy całą pętlę odczytującą i wyświetlającą dane aż do momentu naciśnięcia przez użytkownika ‚ctrl+c’ (funkcja bbm_bt_read(..) zwróci -1)
usleep(100) ;
}while(data_length != -1) ;

12. Zamykamy komunikację bluetooth i kończymy program
Jeśli użytkownik nacisnął kombinację klawiszy ‚ctrl+c’ zamykamy komunikację bluetooth i kończymy program.
bbm_bt_close() ;
exit(0) ;
}

I gotowe. Dobra robota. Gratulacje !!

BBMagic_flood_sketch działa

Gotowy plik ‚bbmagic_flood_sketch.c’ z wszystkimi pozostałymi plikami projektu dostępny jest w spakowanym ‚bbmagic_flood_sketch.tar.gz’, który można pobrać z działu Download.
Zobacz jak skompilować i uruchomić cały projekt


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 *