Menu Zamknij

Stacja pogodowa

Cel

Budowa wielokomponentowego projektu z wykorzystaniem przesyłania złożonych komunikatów radiowych.

Wymagania

  • moduł micro:bit z akcesoriami,
  • moduł stacji pogodowej weather:bit.

Moduł weather:bit

Wśród wielu rozszerzeń dla platformy BBC Micro Bit szczególną klasę stanowią zewnętrzne czujniki zwiększające możliwości pomiarowe układu, zarówno pod względem rodzaju mierzonych wielkości fizycznych, jak i pod względem dokładności i rozdzielczości już mierzonych.

Rysunek 1. Moduł weather:bit, wraz z prawidłowo zamontowanym micro:bitem

Moduł stacji pogodowej (rysunek 1), dostarczany przez SparkFun, jednego z głównych, oprócz poznanego wcześniej Waveshare, producenta dodatków do micro:bita, zawiera na płytce czujniki:

  • temperatury,
  • ciśnienia,
  • wilgotności,
  • światła.

Dodatkowo w dolnej części płytki znajdują się gniazda do podłączenia zewnętrznych czujników:

  • kierunku i siły wiatru,
  • wilgotności gleby,
  • temperatury gleby,
  • deszczu.

Naturalne jest, że moduł micro:bit nie może być bezpośrednio wystawiony na działanie czynników atmosferycznych, stąd niektóre pomiary muszą być wyprowadzone przewodami do zewnętrznych elementów. Pełny zestaw stacji pogodowej nosi nazwę micro:climate i nie jest niestety dostępny (w momencie powstawania tego skryptu), w polskich sklepach internetowych. Tak więc podczas planowania budowy pełnej stacji pogodowej należy uwzględnić długi czas na dostarczenie przesyłki.

Ponieważ celem jest poznanie zasad pracy, a nie konstrukcja w pełni profesjonalnej stacji pogodowej, w tym rozdziale będziemy korzystać z bazowej płytki weather:bit bez zewnętrznych czujników.

Przygotowanie modułu

Bardzo dobrym źródłem informacji na temat możliwości i wykorzystania modułu stacji pogodowej jest strona producenta układu learn.sparkfun.com/tutorials/microclimate-kit-experiment-guide/about-the-weatherbit.

Pracę należy rozpocząć od właściwego, jak na rysunku 1, zamontowania micro:bita w złączu stykowym weather:bita. Uwaga z poprzedniego rozdziału dotycząca możliwości odwrotnego zamontowania układu dotyczy, ze względu na symetrię złącza, wszystkich rozszerzeń.

Dalsza praca będzie analogiczna do pracy z innymi dodatkami. Po pierwsze musimy dodać obsługę rozszerzenia do palety komponentów w edytorze MakeCode. W tym celu wybieramy Advanced/Extensions. Stacji pogodowej SparkFun nie znajdziemy od razu w domyślnych dodatkach na stronie zarządzania rozszerzeniami. Należy ją odnaleźć wpisując w pasku wyszukiwania modułów np. sparkfun lub weather. Po wybraniu właściwego dodatku w palecie pojawi się nowa grupa bloków o nazwie Weather.

Wykorzystanie czujników weather:bita

Listing 1

W grupie Weather są aż trzy bloki inicjalizujące. Ich użycie jest zależne od potrzeby obserwacji danej wielkości lub od posiadanych czujników. W naszym przykładzie użyjemy jedynie bloku Weather/start weather monitoring, który powinien znaleźć się w bloku on start.

Teraz możemy na wbudowanej matrycy LED wyświetlić wyniki pomiaru. Surowe dane z czujników wymagają przeliczenia i tak:

  • blok temperature(C) zwraca całkowitą liczbę 4-cyfrową, która po podzieleniu przez 100 daje wynik w stopniach Celsjusza,
  • blok pressure zwraca 8-cyfrową liczbę całkowitą, którą, aby otrzymać wynik w Pascalach, należy podzielić przez 256, to znaczy, dla zazwyczaj przyjętej jednostki w pomiarach ciśnienia atmosferycznego, czyli hPa, trzeba podzielić przez 25600,
  • blok humidity zwraca także liczbę całkowitą, ale 5-cyfrową, którą, dla otrzymania wyniku wilgotności względnej w procentach, należy podzielić przez 1024,
  • blok altitude(M) zwraca wynik pomiaru wysokości, wyrażony liczbą całkowitą, bezpośrednio w metrach, obliczony ze wzoru barometrycznego, przy założeniu, że ciśnienie atmosferyczne na poziomie morza wynosi 1013,25 hPa.

Cały program wyświetlający sekwencyjnie dane z weather:bita jest przedstawiony na listingu 2. Zastosowanie funkcji zaokrąglającej round jest niezbędne dla uniknięcia wyświetlania wyniku z bardzo dużą liczbą cyfr po przecinku, która może pojawić się w wyniku dzielenia (w systemie dwójkowym nawet przez 100). Wynik pomiaru wysokości, szczególnie gdy nie znajdujemy się zbyt wysoko nad poziomem morza, nie będzie poprawny ze względu na naturalną zmienność ciśnienia atmosferycznego. Ciekawostką jest, że dla depresji otrzymamy wynik ujemny.

Listing 2

Tak napisany program jest wystarczający do prezentacji wykorzystania modułu weather:bit w połączeniu z micro:bit, ale jeżeli interesuje nas konkretna wielkość, to będziemy musieli czekać na przewinięcie ekranu, aż do jej pojawienia się. Zmodyfikujemy nasz program, wprowadzając tryb, decydujący o tym, która wielkość będzie w danej chwili wyświetlana. W tym celu zadeklarujemy zmienną Tryb i będziemy ją inkrementować po każdym naciśnięciu przycisku A. Zmienna ta w bloku forever decydować będzie o wyborze mierzonej wielkości. Przy okazji usunięto z listy wysokość, aby skrócić kod. Gotowy program jest widoczny na listingu 3.

Listing 3

Zdalne przesyłanie danych

Wyświetlanie danych na wbudowanej w micro:bit matrycy LED jest mało estetyczne. Lepiej do tego celu użyć wyświetlacza opisanego w rozdziale Wizytówka, ale nie ma możliwości jego montażu, bo złącze stykowe jest już zajęte przez weather:bit. Dlatego właśnie tak istotne jest posiadanie przez moduły wbudowanych anten do komunikacji radiowej. Wyświetlacz podłączymy do drugiego micro:bita, a dane będziemy przesyłać do niego z pierwszego.

Problemem, w takim przypadku, może być ilość przesyłanych danych. Wcześniej, w przykładzie z komunikującymi się kostkami (rozdział Elektroniczne kostki do gry) wysyłaliśmy tylko jakikolwiek komunikat lub liczbę, nie wykorzystując jej wartości, a jedynie traktując jako rozkaz „losuj!”. Teraz sytuacja komplikuje się ze względu na konieczność przesyłania wartości, z zachowaniem informacji o tym, czego dana wartość liczbowa dotyczy.

Naturalnym pomysłem jest przesyłanie danych w odpowiedniej kolejności poprzez wielokrotne wysyłanie blokiem Radio/radio send number. Takie rozwiązanie ma jednak tę niedogodność, że musimy zakładać niezawodne dostarczenie danych, czego nie jesteśmy w stanie zagwarantować, w przypadku gdy urządzenia nadawcze i odbiorcze znajdują się w znacznej odległości od siebie. Pominięcie, w takim przypadku, którejś z wartości spowoduje błędną interpretację następnych. Pisanie protokołu zapewniającego niezawodną komunikację, w rodzaju TCP, polegającą na przesyłaniu, oprócz istotnych informacji, także danych kontrolnych jest możliwe, aczkolwiek kłopotliwe.

W micro:bicie mamy, oprócz możliwości nadawania liczb (radio send number) i łańcuchów znakowych (radio send string), dostępność metody Radio/radio send value przesyłania skojarzonych ze sobą par danych w postaci (nazwa, wartość). Nazwa jest krótkim, co najwyżej ośmioznakowym łańcuchem, a wartość jest liczbą całkowitą. Ograniczenia ośmiu znaków należy przestrzegać, bo nie zostaniemy ostrzeżeni, wprowadzając dłuższy ciąg, a program nie będzie działał prawidłowo.

Na listingu 4 zamieszczono przykład dwustronnej komunikacji wykorzystującej klucz (name, value). Jedno przyciśnięcie przycisku A powoduje trzykrotne uruchomienie na drugim urządzeniu bloku on radio received, nadając w każdym przebiegu zmiennej (zgodnie z komunikatem) odpowiadającej jej wartości. Wartości 1, 2 i 3 nadane temperaturze, ciśnieniu i wilgotności są przykładowe i zostaną podmienione w kodzie pracującym na stacji bazowej na zmierzone wartości.

W takim rozwiązaniu nie musimy nadawać cały czas. Dane zmierzone w jakimś interwale przechowujemy bowiem w odpowiednich zmiennych, a wyświetlanie wyników pomiaru następuje na podstawie ich wartości. Nie ma zatem znaczenia, co jaki czas będziemy odświeżać zmienne, ani w jakiej kolejności będziemy je nadawać, ani nawet to, czy w czasie nadawania któraś z danych „przepadnie”.

Listing 4


Rozdział zadań pomiędzy nadajnik i odbiornik jest jasny poza tym, kiedy formatować dane, to znaczy przeliczać wartości surowe z pomiarów na odpowiednie jednostki. Nie ma to większego znaczenia, ale wysyłanie surowych danych i przeliczanie ich przed wyświetleniem ma kilka zalet. Przede wszystkim przetwarzanie danych może być związane z utratą informacji. W naszym programie wykonywaliśmy przecież zaokrąglenie wartości. Dodatkowo surowe dane z czujników są typu całkowitego, a tylko taki może być przesłany metodami oferowanymi przez micro:bita. Ponadto, każda zmiana sposobu wyświetlania będzie wymagała zmiany „protokołu” komunikacyjnego. Widać stąd, że przesyłanie surowych danych z czujników jest znacznie wygodniejsze i logiczniej rozdziela zadania sprzętowe nadajnika od obróbki programowej odbiornika.

Listing 5

W takim przypadku program działający na nadajniku z podłączonym modułem weather:bit jest bardzo krótki (listing 5). Można zobaczyć, że czas pomiędzy nadawaniem wszystkich trzech wartości jest określony w milisekundach zmienną Przerwa i wynosi w przykładzie 5 pół minuty, ale z powodzeniem może być dłuższy.

Dodatkowy wyświetlacz

Musimy zatem napisać drugi program – odbiornika – i wyposażyć go w obsługę wyświetlacza, której nauczyliśmy się już w rozdziale Wizytówka.

Żeby móc pracować z dwoma programami jednocześnie na tym samym komputerze musimy mieć otwarte dwa okna przeglądarki. Edytor MakeCode nie pozwala na edycję dwóch lub więcej kodów na różnych kartach tej samej przeglądarki. Możemy także wykorzystywać programy zapisane w chmurze przechodząc między nimi przy pomocy panelu zarządzania projektami, do którego mamy dostęp po naciśnięciu przycisku Home. Najlepszym jednak wyjściem jest oczywiście praca zespołowa na różnych komputerach – jedna osoba pisze nadajnik, a inna lub inne odbiorniki, gdyż rozsyłana przez nadajnik informacja może być na tym samym kanale odebrana przez wiele modułów.

Program odbiornika jest nieco dłuższy, ale też odbiornik ma do wykonania więcej zadań: odebrać informacje, przetworzyć je i wyświetlić na zewnętrznym ekranie (listing 6).

Listing 6

Program ten nie posiada żadnych nowych, niepoznanych jeszcze elementów. Blok on start zawiera, poza elementami inicjalizującymi wyświetlacz, deklarację zmiennej logicznej Czy_odświeżyć, która w bloku forever będzie decydowała o wysłaniu danych na ekran. Nadanie jej wartości true następuje za każdym odebraniem jakiejkolwiek radiowej wiadomości. Testowanie w bloku forever zachodzi co około 2 sekundy, dzięki blokowi pause. Większa częstotliwość próbkowania nie ma sensu, przy nadawaniu zachodzącym z częstotliwością 2 razy na minutę.

Gdy warunek Czy_odświeżyć zachodzi, wówczas wywoływana jest funkcja Wyświetl. W niej następuje przeliczenie wartości i ich wyprowadzenie na ekran. Jej głównym zadaniem jest podzielenie kodu na mniejsze fragmenty w celu poprawy czytelności. W programie zastosowano także, co jest nieco nadmiarowe, dwie grupy zmiennych: Temperatura, Ciśnienie i Wilgotność oraz ich odpowiedniki przechowujące surowe dane z czujników Temperatura_raw, Ciśnienie_raw i Wilgotność_raw. Przeliczenie jednych wielkości na drugie też następuje w funkcji Wyświetl.

Modyfikacje

Rysunek 2. Wynik wykonania programu stacji pogodowej, zrealizowanego na dwóch, skomunikowanych radiowo, modułach micro:bit

Zakres możliwych modyfikacji tego projektu jest ogromny. Zaczynając od samego wyświetlania, można wzorem wcześniejszych przykładów wprowadzić tryby wyświetlania, reagujące na różnorakie zdarzenia, w tym na przyciski. Przy zasilaniu odbiornika bateryjnie warto pomyśleć o wygaszaniu podświetlenia.

Małą niedogodnością zaproponowanego projektu jest nieestetyczne, przez małą prędkość wysyłania danych magistralą SPI na ekran, czyszczenie całego ekranu podczas wyświetlania pomiarów. Można poprawić program, nadpisując jedynie dane, które ulegają zmianie lub sprawdzać, czy w ogóle jest potrzeba odświeżania.

Zaprezentowany układ wyświetla wartość lokalnie przechowywanych wyników. Gdy brak jest nadawania, spowodowany na przykład awarią, wyświetlacz nie będzie reagował i na ekranie możemy obserwować nieaktualne dane. Można to sprawdzić, wyłączając zasilanie weather:bita. Dobrym rozwiązaniem byłoby zareagowanie na taki stan, przykładowo analizując czas po stronie odbiorczej, czy zmienne lokalne nie są znacząco przestarzałe, i wyświetlenie zamiast wyniku liczbowego znaków „—”.

Powyższy problem może także być rozwiązany, przynajmniej częściowo, przez dalsze ograniczanie roli nadajnika. Można wprowadzić do komunikacji pomiędzy modułami żądanie dostarczenia danych wysyłanych z odbiornika. W takim wypadku o częstotliwości odczytu z czujników (i których) będzie decydowała strona odbiorcza. Może ona wówczas zareagować na nieprzesłanie danych.

Bardzo łatwym do realizacji dodatkiem jest dołączenie do programu nadajnika jakiejkolwiek informacji zewnętrznej, na przykład na wbudowanej matrycy LED micro:bita, o przesłaniu danych. Może to być krótkie mignięcie wybranej ikony i wygaszenie matrycy. Taka informacja może być przydatna w diagnostyce nieprawidłowo działającego systemu.

Nie są domeną micro:bita, przynajmniej w języku Blocks, obliczenia zmiennoprzecinkowe. Dobrym, aczkolwiek nieprostym zadaniem, jest poprawa wyświetlania, na przykład temperatury, z ustaloną po przecinku precyzją. Dane surowe zawierają bowiem informację, która w wyniku zaokrąglania jest częściowo tracona.

Zadaniem nieinformatycznym jest wyświetlanie informacji, którą można otrzymać na podstawie pomiarów, i ewentualnie innych danych, po odpowiednim przeliczeniu. Przykładem może być tu wyświetlanie wilgotności bezwzględnej. Wymaga to znalezienia wzorów przeliczeniowych lub nawet ich wyprowadzenia. W tej sytuacji uwidacznia się słabość języka Blocks. Nie dość, że wszystkie operacje matematyczne należy „wydobyć” z palety, to jeszcze ich ilość jest mocno ograniczona, a tych których w palecie nie ma, nie można wykorzystać. Gdybyśmy bowiem chcieli wprowadzić korektę ciśnienia w pomiarze wysokości, będziemy potrzebowali skorzystania z logarytmów, których w palecie Math nie ma. W takim przypadku pozostaje przełączenie się na edytor JavaScript i wpisanie ręczne funkcji matematycznych. Niestety nie uda nam się już powrócić do edytora Blocks.

Literatura

Powtórzenie zaprezentowanych projektów nie wymaga studiowania dodatkowej literatury. Dopiero wprowadzenie modyfikacji może wiązać się z koniecznością uzupełnienia wiedzy. Najlepszym źródłem informacji w przypadku jakiegoś konkretnego problemu jest internet. Książka pisana swoją wyższość ukazuje dopiero jako podręcznik czy przewodnik.

Informacje bibliograficzne dotyczące źródeł internetowych zamieściłem bezpośrednio w tekście, przy zagadnieniach, których dotyczą.

Do zapisu linków, tylko w tym spisie, wykorzystywana jest metoda skracania adresów (URL shortening). W tym skrypcie wybrano serwis TinyURL. Dostęp do wszystkich internetowych zasobów został przetestowany 27.02.2020.

Bibliografia zawiera tylko materiały pomocnicze do projektów, których dotyczą, a pominięto literaturę o charakterze ogólnoinformatycznym. Dobór materiałów do nauki kodowania, czy obsługi programów narzędziowych, pozostaje po stronie nauczyciela.

Literatury dotyczącej micro:bita jest niewiele, szczególnie w stosunku do najbardziej popularnych systemów wbudowanych. Nie można liczyć niestety na wiele informacji w języku polskim. Najbardziej godne polecenia, gromadzące także dużo społeczności są strony oficjalnego wsparcia:

oraz

Literatura uzupełniająca

W niektórych projektach nie wszystko da się podłączyć za pomocą pasujących do siebie wtyków i złącz. Należy wówczas wykonać takie podłączenia samodzielnie. Wymaga to nieco umiejętności majsterkowania i elektroniki. Bardzo ciekawą książką dla początkujących majsterkowiczów jest:

  • Roberts Dustyn, Wpraw to w ruch. Proste mechanizmy dla wynalazców, majsterkowiczów i artystów [e-book], tłum. Krzysztof Sawka, Helion, 2015.

Znajdziemy w niej oprócz podstaw elektroniki także dużo elementarnej mechaniki i materiałoznawstwa.

Majsterkowanie z użyciem systemów wbudowanych, tam gdzie nie wszystko pasuje do siebie za pomocą dedykowanych styków, wymaga elementarnej wiedzy z elektroniki. Niezmiennie najważniejszą książką na półce elektronika jest:

  • Horowitz Paul, Hill Winfield, Sztuka elektroniki, tłum. Bogusław Kalinowski, Grażyna Kalinowska, t. 1–2, wyd. 12 zmienione, WKŁ, Warszawa 2018.

Jednakże jest to pozycja dla wymagającego czytelnika. Podobnym standardem, ale skierowanym do początkujących jest:

  • Platt Charles, Elektronika. Od praktyki do teorii. Wydanie II [e-book], tłum. Konrad Matuk, Helion, 2016.

Na uwagę zasługuje ponadto, w moim przekonaniu bardzo dobra, książka polskiego autora:

  • Górecki Piotr, Wyprawy w świat elektroniki, t. 1, WKŁ, Warszawa 2006.
  • Górecki Piotr, Wyprawy w świat elektroniki. Wyższy stopień wtajemniczenia, t. 2, WKŁ, Warszawa 2011.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *