piątek, 8 marca 2019

Piny rzeczywiste BLYNKa w programie mikrokontrolera


Cyfrowe i analogowe to podstawowe sygnały obsługiwane przez układy elektroniczne. Są to informacje proste gdzie treścią jest wielkość (wartość) sygnału. Ale treść może zostać zakodowana w następujących po sobie kolejnych zmianach wartości. Dla napięć analogowych określa się je mianem sygnałów z modulacją (napięcia, częstotliwości, fazy) dla cyfrowych jest to grupa zwana protokołami.

Ogromną przewagą mikrokontrolerów w stosunku do układów dyskretnych jest łatwość obsługi zarówno sygnałów modulowanych jak i protokołów. Zwłaszcza protokołów co jest dosyć oczywiste.  Dziś pierwszy post z serii obsługi danych przesyłanych w systemie BLYNK. O sygnałach prostych - czyli pinach analogowych i cyfrowych.

Piny rzeczywiste - analogowe i cyfrowe

Czymże jest pin rzeczywisty w porównaniu z pinem wirtualnym? Pin wirtualny do zmienna programowa o nie określonym z góry typie i w żaden sposób nie powiązana z fizycznymi portami procesora. Pin rzeczywisty ma odwrotnie - to zmienna programowa o ściśle zdefiniowanym typie (bit lub integer) powiązana dokładnie z jednym z portów mikrokontrolera.
Odbiorem ( i nadawaniem) danych z aplikacji zajmuje się kompleksowo biblioteka BLYNKa i robi to wlaśnie za pomocą pinów. I to tak kompleksowo, iż  cały proces jest praktycznie niewidoczny w naszym programie. W przypadku pinów wirtualnych dowiązanych do widgetów mamy jeszcze wgląd do przesyłanych danych. Ale dla pinów rzeczywistych cyfrowych i analogowych nasz główny program jest całkowicie  "nieświadomy" zmian jakie dokonują się  na portach procesora w wyniku naszego operowania widgetami. Nie wiemy nic o danych wysyłanych na porty, nie wiemy nawet które z portów naszego mikrokontrolera zostały dowiązane do widgetów i podlegają zdalnym zmianom z komórki. To celowe działanie autorów BLYNKa mające maksymalnie uprościć podstawowy sposób sterowania urządzeniem przez telefon.



Dowiązanie do widgeta rzeczywistego pinu mikrokontrolera wywołuje szereg skutków. Przede wszystkim biblioteka BLYNK ustawia właściwy kierunek pracy portu jako wejście lub wyjście w zależności od rodzaju widgetu. Operacja ta dokonuje online  co oznacza, iż możemy zmienić widget na inny w każdym momencie. Po uruchomieniu aplikacji w telefonie port zostanie automatycznie prze-konfigurowany bez konieczności resetu mikrokontrolera. Potem już aplikacja w telefonie steruje bezpośrednio portem mikroprocesora lub cyklicznie odczytuje jego wartość.
Gdy sterujemy portami procesora z aplikacji BLYNK  nasz program  jest trywialnie prosty. To wersja dla typowego Arduino z modułem Ethernet (kabel jako połączenie modułu z siecią komputerową)
[c]
#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
void setup()
{ Blynk.begin("YourAuthToken");
}
void loop()
{ Blynk.run();
}
[/c]
krótki i prosty ale dla modułu UNO zajmuje ponad połowę dostępnej pamięci programu



A to kod dla jakiejś płytki z mikrokontrolerem ESP8266 np. mój ulubiony D1 MINI (połączenie z siecią poprzez WiFi)
[c]
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
void setup()
{Blynk.begin("YourAuthToken", "YourNetworkName", "YourPassword");
}
void loop()
{ Blynk.run();
}
[/c]
Ten kod zajmuje nico 20 % pamięci modułu D1 MINI ale dostępnej pamięci dla naszego kodu w ESP mamy kilkanaście razy więcej niż Arduino UNO.



Tylko 9 linii kodu potrzeba by zdalnie załączać przekaźnik na porcie procesora, sterować PWM jasnością diody, odczytywać temperaturę z układu LM35. I za kilkanaście zł załączamy oświetlenie , sterujemy bramą garażową, włączamy automat do parzenia kawy czy regulujemy temperaturę w pomieszczeniu. Wszystko zdalnie z naszego telefonu. I niczego więcej nie trzeba wiedzieć o programowania mikroprocesorów. No może troszkę o elektronice i bezpieczeństwie pracy z napięciem w sieci.
Budowa takich najprostszych układów znajdzie się w poradniku dla początkujących.

Jak widgety aplikacji ustawiają stany portów mikrokontrolera?

Jeśli dowiążemy pin rzeczywisty do widgeta wysyłającego informację (przycisk, suwak itd) to wysyłanie informacji do modułu następuje jedynie w momencie zmiany stanu widgeta (naciśniecie /zwolnienie przycisku, przesunięcie suwaka).  Informacja to wysyłane jest do serwera gdzie jest zapamiętywana a następnie przesyłana do urządzenia. Biblioteka BLYNK po odebraniu informacji z serwera odpowiednio modyfikuje stan portu mikrokontrolera.
  • Generalnie - poza jednym wyjątkiem (widget EVENTOR) jeśli aplikacja w telefonie jest nieaktywna to piny rzeczywiste dowiązane do  widgetów typu WYJŚCIE nie zmieniają swojego stanu
  • Gdy resetujemy moduł  porty ustawią się w domyślne wartości (a nie na aktualną wartość widgetu). Dopiero kolejna zmiana w widgecie zostanie przeniesiona na port procesora.
  • Oznacza to również, że jeśli w czasie wyłączenia modułu (uśpienia, zerwania łączności z serwerem itd) zmieni się stan widgetu (np. suwaka) po ponownym połączeniu z serwerem nie będzie to "widziane" na porcie procesora.
Jeśli więc sterujemy światłem widgetem połączonym z portem cyfrowym to typowym objawem powyższego  jest samoczynne zapalenie, zgaszenie światła po resecie mikrokontrolera. To dosyć denerwujące zachowanie urządzenia możemy wyeliminować poprzez wywołanie procedury
Blynk.syncAll();
wymuszającej synchronizację wszystkich pinów (rzeczywistych i wirtualnych) z wartościami zapamiętanym w serwerze. Wywołanie tej procedury powinno następować praktycznie po każdorazowym nawiązaniu połączenia z serwerem bez względu na przyczynę utraty tego połączenia. Toteż zalecane jest dodanie poniższej procedury wywoływanej każdorazowo przez bibliotekę BLYNK po przywróceniu łączności z serwerem.
BLYNK_CONNECTED() {
    Blynk.syncAll();
}

Jak widgety aplikacji wyświetlają stany portów mikrokontrolera?




Widget typu WSKAŹNIK (dispaly, gauge level itp.) po  ustawieniu początkowym portu procesora jako wejście może wyświetlić jego stan. Ale przedtem musi pobrać aktualną wartość na porcie poprzez pin rzeczywisty dowiązany do widgetu. Pobieranie wartości następuje cyklicznie co zadany czas i jet wymuszane przez widget. Czas ten (od 1 sek do 24 h) jest jednym z parametrów ustawianych w widgecie typu Wskaźnik.
  • Cykliczne odpytywanie biblioteki BLYNKa przez widget o aktualny stan portu jest jedynym sposobem przeniesienia wartości portu do widgetu poprzez pin rzeczywisty
  • Pobierana przez widget informacja mimo przejście przez serwer BLYNK nie jest na nim zapisywana!
  • Jeśli aplikacja jest nie aktywna nie ma transmisji danych o portach z mikrokontrolera do serwera

Wyłączenie możliwości sterowania za pomocą pinów rzeczywistych.

W programie możemy wyłączyć całkowicie możliwość sterowania przez widget bezpośrednio portami procesora poleceniem
#define BLYNK_NO_BUILTIN   // Disable built-in analog & digital pin operations
Najczęściej stosujemy ten zabieg dla ograniczenia miejsca zajmowanego przez biblioteki BLYNKa (oszczędność ok 1kB pamięci) lub w sytuacji gdy dostęp do pełnej aplikacji mają inni użytkownicy mogący "niechcący" sporo namieszać zmianą ustawień portów rzeczywistych.

Piny rzeczywiste mimo swoich sporych ograniczeń są chętnie używane nie tylko przez początkujących elektroników. Nadają się świetnie do zastosowań w układach testowych gdzie często trzeba dopasowywać parametry sygnałów wejść /wyjść by uzyskać pożądany efekt sterowania. O wirtualnych elementach elektronicznych z wykorzystaniem BLYNKa będzie jeszcze osobny wpis.
17

1 komentarz: