piątek, 20 maja 2016

BLYNK - ależ to takie proste

BLYNK ...BLYNK ...BLYNK ...BLYNK ...BLYNK ...BLYNK ..........

To co o nim wiem.
W sumie niewiele. Trzy główne elementy systemu - aplikacja tel/tablet, serwer, biblioteka/y w mikrokontrolerze. Wszystko dostarczane razem - do niedawna bezpłatnie a od marca już nie (można zrobić niewielki działający system za free).

Aplikacja w telefonie znakomicie elastyczna i intuicyjna. Po prostu 5++ za wygląd i obsługę.
O serwerze wiem niewiele - to serce systemu zarządzające i aplikacją e telefonie i kodem w procesorze. Duży plus za możliwość pobrania i uruchomienia własnego serwera BLYNK  niezależnego od tego ogólnie dostępnego  gdzieś w Internecie.
I biblioteka a w zasadzie komplet różnych bibliotek dopasowanych do przebogatej gamy platform i procesorów. I jak to w Arduino wszystko objaśniane dużą ilością przykładów dostępną wprost z Arduino IDE.



Najprostsze ale w sumie najmniej ciekawe jest bezpośrednie sterowanie (lub czytanie) portami z aplikacji telefonu (APP). W ustawieniach projektu wybieramy platformę (Arduino UNO np.). Widget  typu Przycisk w trybie digital i analog"zna" numerację portów i je proponuje do przyłączenia. Przypisanie widgeta do realnego portu jakoś przekłada się na kod zawarty w bibliotece BLYNK zainstalowanej w Arduino, tak iż rzeczywiście  port ten zostaje ustawiony (pewnie podczas procedury SETUP) jako wyjście lub wejście. Zmiana stanu przycisku na telefonie prawie natychmiast odzwierciedla się na stanie portu procesora.

Polecam każdemu uruchomienie podstawowego programu BlynkBlink tzn. "zapal LED" na porcie 9. Robi to niesłychane wrażenie gdy do uruchomienia przecież tak złożonego w istocie systemu potrzebujesz telefonu, kabla USB i sieciowego i UNO oraz trochę ściągniętego za darmo oprogramowania. I nic więcej! I masz już gotowy pełnowymiarowy profesjonalnie wyglądający IoT.

Dużo ciekawszymi i stanowiącymi de facto o mocy i możliwościach BLYNKa są porty wirtualne. To trochę bardzie złożona  sprawa.

Porty wirtualne przesyłające informację od Arduino do aplikacji.

To jest w miarę zrozumiałe - widgety są tworami wirtualnymi więc by nimi sterować musimy odwołać się do wirtualnej rzeczywistości. Oznacza to, że danemu widgetowi przypisujemy konkretny wirtualny numer pinu ( od 0 do 30 czyli np V20) i tym wirtualnym pinem posługujemy się w naszym programie w Arduino. Do wirtualnego pina w programie wpisujemy dowolne dane w formacie, które są zrozumiałe dla tego widgetu. Do najprostszego widgeta vLED (wirtualny LED  w telefonie) nie wpisujemy nic - po prostu wywołujemy jego zapalanie i gaszenie dwoma procedurami bez parametrów  np. led5.on() , led5.off. Procedury te odwołują się do serwera BLYNK który rejestruje nowy stan wirtualnego portu i przesyła go do APP.
>>> WidgetLED led1(V1); <<<  deklaruje w programie powiązanie widgetu typu LED przypisanego do wirtualnego portu V1 z procedurą led1 naszego programu, której wywołanie powoduje zapalanie i gaszenie vLED w telefonie.  (znawcy języka C niech mi wybaczą to tłumaczenie).

Jeśli chcemy wpisać jakąś konkretną daną do widgeta np typu wyświetlacz (czyli przesłać ją z Arduino do APP poprzez serwer) możemy zrobić to na dwa sposoby.
1. Wstawić w nasz program procedurę wywoływaną cyklicznie przez bibliotekę BLYNK (co ok 1 s lub w odstępach określonych przez nas w widgecie) która odpowiada za "przeniesienie" naszej danej do serwera a potem do APP. Procedury te umieszczamy poza dwoma głównymi blokami programu void setup() i void loop().
np.
BLYNK_READ(V11) // przesyłana odczytanej temperatury z sensora DTH do wirtualnego pinu nr 11 który jest wyświetlaczem
{
  dht_sensor_t =  sensor.getTemperature();
  Blynk.virtualWrite(V11, dht_sensor_t);
}

2. Wywołać w programie  Blynk.virtualWrite() która NATYCHMIAST wyśle daną wartość do Serwera i dalej do widgeta

Procedura BLYNK_READ  przesyła cyklicznie wartość z czujnika temperatury DTH11 do serwera a potem do widgeta o nr v11 w telefonie.
UWAGA:
  1. procedura działa jedynie gdy "patrzymy" na aplikację w telefonie - tzn kiedy jest ona otwarta i aktywna.
  2. procedura NIE zapisuje danych na serwerze BLYNK - dana jest przesyłana jak gdyby bezpośrednio do telefonu. Nie możemy więc jej historycznie odtworzyć np. po resecie procesora.
 Blynk.virtualWrite() natychmiast wysyła dane z czujnika temperatury DTH11 do serwera a potem do widgeta o numerze V11 w telefonie. Dana zapisywana jest na serwerze i dostarczana do telefonu po otwarciu aplikacji BLYNK


W pierwszym momencie nie moglem zrozumieć tej  konwencji dlaczego procedura BLYNK_READ() wywołuje procedurę  Blynk.virtualWrite () i czemu one tak odwrotnie się nazywają mimo, że ich efekt działania jest podobny - wartość temperatury z naszego programu zostanie zobrazowana na widgetcie nr 11
Wynika to chyba stąd że autorzy BLYNKa przy tych procedurach, patrzą na system od strony inicjującej proces pobrania/zapisu. Jeśli więc Serwer inicjuje poprzez swoje biblioteki w programie przesłanie do niego naszych danych to je" czyta". I serwer robi to cyklicznie.
Natomiast gdy proces przesłania danych inicjowany jest przez nas w programie to my  je "zapisujemy" do serwera. Wywołaniem tej procedury dokonujemy zapisu natychmiast.

Skąd takie zamieszanie. Ano z uzasadnionej obawy autorów by nie zapchać im serwera gdy w pętli głównej umieścimy procedurę Blynk.virtualWrite() wywoływaną tysiące razy w ciągu sekundy. My to pryszcz ale jeśli zrobi tak tysiąc, 10 tysięcy, czy 100 tysięcy użytkowników systemu?
Dlatego twórcy BLYNKa kategorycznie zalecają stosowanie pierwszego sposobu przesyłania danych do serwera- a dokładniej - zalecają by serwer sam sobie te dane czytał z naszego programu w określonych interwałach. Ostrzegają również, że jeśli nieumiejętnie będziemy posługiwać się procedurą Blynk.virtualWrite() to przy zapisach na serwer częstszych niż 10/sek odłączą nasz moduł od swojego serwera :(. Po prostu

I to w zasadzie wszystko co trzeba wiedzieć na początek by skutecznie skomunikować UNO z BLYNKiem i odwrotnie. Proste, łatwe, przyjemne

cdn  .....

Brak komentarzy:

Publikowanie komentarza