piątek, 30 września 2016

Własny program - co zrobić gdy brakuje klocka LEGO?

Nie ma łatwo

Udostępnianie gotowych projektów innym wiąże się z koniecznością dopasowania niektórych parametrów do nowego użytkownika. Widać to szczególnie boleśnie w aplikacji BLYNK, która musi mieć połączenie WiFi z Internetem. Wpisanie własnych ustawień dostępu  do sieci WiFi nie zda się na nic, a pozyskiwanie tych danych od klienta nie zawsze jest możliwe czy celowe. Najlepiej by klient sam mógł je zmienić według własnych potrzeb. Tylko jak ma to zrobić bez możliwości ingerencji w oprogramowanie? Najlepiej by nowe dane logowania do sieci wprowadzone w jakiś sposób do urządzenia zostały trwale zapisane w pamięci. Podczas restaru program powinien wiedzieć, że ma użyć nowych danych do logowania w sieci WiFi.

Przeszukania Internetu by odnaleźć kawałek potrzebnego do tego kodu trwały dni kilka i przyniosły mizerne efekty. Jest co prawda bardzo dobry  program (biblioteka) o nazwie WiFiManager autorstwa tazapu tu>>>>>> rozwiązująca ten problem kompleksowo ale .....jedynie dla modułu ESP8266. Dla Arduino połączonego z ESP taka biblioteka czy rozwiązanie chyba nie istnieje.

Nadeszła więc chwila prawdy - czy można coś takiego napisać samemu przy moim poziomie umiejętności (a raczej poziomie niewiedzy) w programowaniu językiem C.

Spróbujemy
Na początek założenia.
  1. Nowe parametry logowania do sieci (nazwa punktu dostępowego tzw SSID i hasło do routera) musi mieć możliwość wprowadzenia sam klient i to najlepiej bez dodatkowej pomocy poza instrukcją obsługi.
  2. Moduł nie ma innych elementów do komunikacji człowiek <> procesor poza aplikacją BLYNK. Żadnych dodatkowych klawiatur wyświetlaczy LED czy LCD - no może jedynie  diodę LED
  3.  Wpisanie nowych danych nie może wiązać się ze zmianą oprogramowania - to oczywiste - klient nie ma ochoty na uczenie się programowania w C
  4. Najlepiej by klient nie był zmuszany do otwierania obudowy by wprowadzić nowe ustawienia
Z punktu 1 i 2 wynika, że jedynym narzędziem możliwym do wprowadzenia nowych danych jest  widget TERMINAL w aplikacji BLYNK umożliwiający dwustronną komunikację. Trzeba "tylko" zapewnić jakiekolwiek chwilowe połączenie modułu z Internetem  na moment wprowadzania danych. Choć wydaje się to kwadraturą koła (żeby wpisać nowe dane klient musi mieć połączenie z internetem, ażeby się z tym internetem połączyć te dane muszą już być wpisane) to sprawa jest dość prosta do rozwiązania. Jak?

Należy z dużą dozą pewności założyć, że klient posługuje się już nowoczesnym telefonem, smartfonem czy tabletem. Nie może być inaczej jeśli chce korzystać z urządzenia za pomocą aplikacji BLYNK. Oznacza to, ze ma on w zasięgu ręki (w swoim telefonie) narzędzie nazywające się HOTSPOT (osobisty lub mobilny). Za pomocą tej funkcji można udostępnić Internet z telefonu innym urządzeniom. Co więcej parametry HOTSPOT (nazwa i hasło) są łatwo definowane przez użytkownika. Jeśli klient ma w instrukcji obsługi nazwę i hasło na jakie oczekuje moduł by zalogować się do sieci - dane te trzeba ustawić na chwilę w parametrach swojego telefonicznego HOTSPOTa. I włączyć urządzenie które automatycznie powinno nawiązać komunikację z Internetem via telefon.
No więc połączenie z Internetem na moment konfiguracji już mamy

Teraz sama konfiguracja.

  1. Użytkownik ustawia przełącznik pracy modułu w  pozycję SET i załącza moduł. U mnie przełącznik dołączony jest do portu nr 8 NANO.
  2. Dane logowania do nowej sieci wprowadzane są aplikacją BLYNK a konkretnie widgetem TERMINAL (rozpoczynamy procedurę przciskiem SETUP)
  3. Dane po wprowadzeniu w polu "Type here" i naciśnięciu ENTER wysyłane są z aplikacji do modułu
  4. Po zatwierdzeniu danych przyciskiem OK następuje zapisanie danych w w pamięci nieulotnej typu EEPROM modulu
  5. możemy sprawdzić jakie dane pamięta moduł - przycisk DOM wyświetla domyślne parametry logowania do HOTSPOT, przycisk TWOJ wyświetla parametry wprowadzone przez użytkownika. Przycisk READ jest bez znaczenia - tylko do testów
  6. Wyłączamy urządzenie i przestawiamy przełącznik w pozycję PRACA
  7. Po ponownym załączeniu urządzenia powinno się automatycznie zalogować do nowej sieci o ile parametry sieci zostały prawidłowo wpisane a sieć jest dostępna (moduł obsługuje szyfrowanie WPA2-PSK). Jeśli nie - trzeba wrócić do punktu 1

Do ustawienia/zmiany danych sieci do logowania posłuży specjalnie stworzony ekran konfiguracji parametrów sieci w aplikacji BLYNK np taki:





W teorii wygląda to dosyć prosto ale napisanie od podstaw działającego kodu tj nauka, pisanie i testowanie całości zabrało mi bite trzy dni z życia.

Kod nie wygląda na mocno skomplikowany:


Kluczem było zrozumienie działania funkcji zamiany typu string na char[] a w zasadzie odkrycie konieczności jej użycia

( y_auth.toCharArray(t_auth, dl_i); //change string to char[]) 

i właściwe zadeklarowanie tablic w linii 12-14. 

Oczywiście  wcześniej wypróbowałem dziesiątki innych wariantów - ale tylko ten dał w miarę oczekiwany i przewidywalny wynik.
No i jeszcze problemy z zapisem do EEPROM - ale o tym przy innej okazji
 
Za plus tego rozwiązania uznaję brak konieczności stosowania wskaźników, struktur, pointerów indeksów i innych zaklęć tak ulubionych przez zawodowych programistów.
Fragment wspomnianego tu programu WiFiManager wygląda mniej więcej tak:

const char* WiFiManagerParameter::getValue() {return _value;}
const char* WiFiManagerParameter::getID() {return _id;}
  server->on("/", std::bind(&WiFiManager::handleRoot, this));
  server->on("/wifi", std::bind(&WiFiManager::handleWifi, this, true));
server->on("/0wifi", std::bind(&WiFiManager::handleWifi, this, false));


I tak przez całe  750 linii!!!!!

A więc jestem o trzy dni starszy i o gram wiedzy mądrzejszy - tylko wciąż pozostaje otwarte pytanie czy warto????

 Nie opisuję programu dokładnie bo to wersja testowa - ale działa!

To tyle. Idę odpocząć bo obawiam się czy cdn ..............



1 komentarz: