Urządzenie działa jak mikroserwer www, więc interfejsem, poprzez który komunikuje się z użytkownikiem, jest strona internetowa. Do wyświetlenia strony internetowej potrzebne jest urządzenie z zainstalowaną dowolną przeglądarką internetową oraz potrzebny jest adres ip strony.
Moduł pracuje w dwóch trybach: pierwszy z nich to praca jako punkt dostępowy Wi-Fi - access point. Jego domyślna nazwa to PRO-RELAYS i będzie widoczna na liście dostępnych sieci Wi-Fi (rysunek 1). Przy próbie dołączenia do access pointa należy wprowadzić hasło, które domyślnie ma wartość 12345678. Gdy zostanie nawiązane połączenie, można uruchomić przeglądarkę internetową i na pasku adresu wpisać adres IP, który ma wartość 10.10.10.10. Wyświetli się strona internetowa jak na rysunku 2. Należy teraz podać hasło, które jest takie samo jak hasło do access pointa, czyli domyślnie 12345678. Dopiero teraz zostanie wyświetlona strona główna urządzenia (rysunki 3 i 4). Jest to pierwszy sposób dostępu do urządzenia, całkowicie wystarczający do jego pełnej obsługi w sytuacji, gdy pracuje poza zasięgiem jakiejkolwiek sieci lokalnej (domowej).
Urządzenie może pracować w innym trybie, wygodniejszym pod względem użytkowania, wymaga tylko przeprowadzenia konfiguracji. Strona konfiguracyjna zostanie wyświetlona po naciśnięciu przycisku Settings, który znajduje się u dołu strony głównej. Wygląd strony konfiguracyjnej pokazano na rysunkach 5 i 6, w górnej części (rysunek 5) znajdują się pola umożliwiające nadanie nowej nazwy i hasła. Nazwa dotyczy nazwy access pointa ale jest także nazwą urządzenia i jest wyświetlana na stronie logowania i stronie głównej urządzenia. Hasło dotyczy hasła dostępu do access pointa oraz jest hasłem logowania na stronie internetowej. Po wprowadzeniu nowej nazwy i hasła należy nacisnąć przycisk Save umieszczony pod tymi polami. Urządzenie zapamięta nowe ustawienia w pamięci nieulotnej a po około 30 sekundach uruchomi się ponownie i będzie działało z nowymi ustawieniami.
W dolnej części strony konfiguracyjnej (rysunek 6) znajdują się pola, które pozwalają skonfigurować połączenie z lokalną siecią Wi-Fi. Urządzenie może zostać podłączone do domowego routera i wtedy każdy użytkownik podłączony do tego samego routera może mieć dostęp do urządzenia. Aby uruchomić taki tryb pracy, należy wpisać w odpowiednich polach strony konfiguracyjnej nazwę sieci Wi-Fi (tzw SSID) oraz hasło do wybranej sieci Wi-Fi i zakończyć poprzez naciśnięcie przycisku Save pod tymi polami. Urządzenie zapamięta nowe ustawienia w pamięci nieulotnej a po ok 30 s uruchomi się ponownie i jeśli wszystko przebiegło pomyślnie, podłączy się do sieci o podanej nazwie.
Aby sprawdzić, czy wszystko przebiegło prawidłowo, należy podłączyć się do urządzenia poprzez access point i na stronie konfiguracyjnej sprawdzić, czy pole IP zawiera numer IP. Należy zapamiętać ten numer, zwykle będzie miał wartość 192.168.x.xxx i będzie to numer IP, który router przydzielił dla naszego urządzenia. Teraz można rozłączyć się z access pointem, podłączyć się do domowego routera i wpisać w oknie dowolnej przeglądarki zapamiętany adres IP. Wyświetli się strona logowania naszego urządzenia.Obsługa
Na stronie głównej urządzenia, na samej górze, znajduje się nazwa urządzenia, domyślnie jest to PRO-RELAYS, poniżej wyświetlany jest czas zegara zawartego w urządzeniu. Wyświetlana wartość czasu nie jest automatycznie aktualizowana, jest to wartość z chwili ostatniego odświeżenia strony. Kolejne elementy strony głównej to cztery bliźniacze sekcje odnoszące się do czterech wyjść urządzenia. Każda sekcja opisuje aktualny stan wyjścia w postaci tekstu - Out ON lub Out OFF a poniżej wyświetla przycisk, który pozwala zmienić stan wyjścia (rysunek 7).
Następnym elementem strony głównej jest przycisk opisany jako Work time. Po jego naciśnięciu otwiera się strona, która przedstawia aktualne ustawienia pracy czasowej, podzielone na cztery sekcje odpowiadające czterem wyjściom, jak pokazano na rysunku 8. W górnej części strony znajduje się przycisk Modify, który przenosi na kolejną stronę umożliwiającą wprowadzenie zmiany w harmonogramie pracy czasowej (rysunek 9). Dla każdego wyjścia można ustawić dwa niezależne przedziały czasowe określające czas załączenia i czas wyłączenia wyjścia. Aby zrezygnować z pracy czasowej, należy ustawić wartości czasów na godzinę „24:00”. Takie ustawienia będą wyświetlane jako --:-- i będą oznaczały funkcję nieaktywną.
Każda z podstron ma u dołu przycisk opisany Back, który pozwala na powrót do poprzedniej strony. Natomiast wszelkie zmiany należy potwierdzić przyciśnięciem przycisku Save na danej stronie.
Działanie funkcjonalności pracy czasowej wymaga ustawienia prawidłowego czasu. Aby ustawić czas zegara wbudowanego w urządzenie, należy na stronie głównej kliknąć przycisk Clock set, zostanie wyświetlona strona jak na rysunku 10. W odpowiednie pola należy wpisać czas i datę i zatwierdzić przyciskiem Save. Urządzenie zawiera niezależny zegar RTC z podtrzymaniem bateryjnym, więc czas będzie odmierzany nawet przy odłączonym zasilaniu urządzenia. Oczywiście w takiej sytuacji nie będą załączane wyjścia.
Po zakończeniu pracy z urządzeniem należy się wylogować, przyciskając Log out na głównej stronie urządzenia. Urządzenie ma funkcję automatycznego wylogowywania - jeśli po zalogowaniu, nie będzie żadnej aktywności ze strony użytkownika przez 60 s, to zostanie automatycznie wylogowany.
Budowa
Schemat ideowy urządzenia zamieszczono na rysunku 11. Na schemacie widoczny jest podział na bloki funkcjonalne: blok zasilania ze stabilizatorami IC1 i IC2, blok sterowania wyjściami z driverem IC6, blok zegara RTC z układem IC4, blok modułu Wi-Fi IC5 typu ESP8266 oraz blok mikrokontrolera sterującego IC3 typu LPC824.
Do prawidłowej pracy urządzenie wymaga doprowadzenia do złącza CON5 źródła zasilania o napięciu ok. 12 V i wydajności prądowej minimum 500 mA. Do zacisków wyjściowych doprowadzone są styki przekaźników, które w stanie aktywnym zwierają zaciski danego wyjścia. Takie rozwiązanie pozwala sterować praktycznie dowolnym obwodem, nawet 230 V AC.
Stan pracy urządzenia sygnalizują dwie diody świecące:
- LED1 sygnalizuje aktywność modułu ESP8266.
- LED2 migając co około 2 sekundy, sygnalizuje aktywność mikrokontrolera.
Na płytce zamontowano listwę szpilek goldpin, która obejmuje złącza CON1...CON4 widoczne na schemacie. Złącza te służą do zaprogramowania oraz aktualizacji oprogramowania mikrokontrolera oraz modułu Wi-Fi.
Program
Najważniejszych elementów urządzenia nie widać na schemacie - są to programy sterujące zawarte w pamięci modułu Wi-Fi oraz mikrokontrolera. Program dla modułu ESP8266 został napisany w środowisku Arduino a jego główne zadania to przesyłanie treści metody GET wydzielonej z żądania HTTP Request poprzez interfejs UART do mikrokontrolera. W odpowiedzi mikrokontroler przesyła do modułu treść kodu HTML opisującego wygląd generowanej strony internetowej. Jednak na początku, w sekcji SETUP programu w Arduino, przeprowadzana jest inicjalizacja, której istotny fragment widoczny jest na listingu 1. Po pierwsze moduł wysyła żądania o nazwę dla access pointa, hasło dla access pointa, nazwę sieci Wi-Fi oraz hasło do sieci Wi-Fi, które przechowuje w pamięci nieulotnej mikrokontroler. Następnie moduł rozpoczyna pracę jako access point a jeśli otrzymał nazwę i hasło do sieci Wi-Fi to przełącza się na tryb łączony access point/station mode. Jeśli połączy się z siecią Wi-Fi, to przesyła do mikrokontrolera adres IP, który otrzymał, jeśli połączenie się nie powiedzie, to powraca do pracy w trybie access pointa. Na koniec moduł ESP8266 przesyła do mikrokontrolera komendę o treści statOK, która oznacza koniec inicjalizacji. Wszystkie komendy i żądania zachowują format metody GET i mają treść podobną do tej: GET /?statOK&HTTPr.
//get parameters
apName = SerialStringGet(„apName”);
apPass = SerialStringGet(„apPass”);
roName = SerialStringGet(„roName”);
roPass = SerialStringGet(„roPass”);
//set AP mode
WiFi.mode(WIFI_AP);
apName.toCharArray(apSSID, settStrLen);
apPass.toCharArray(apPASS, settStrLen);
WiFi.softAPConfig(apIP, apGATE, apSUBNET);
WiFi.softAP(apSSID, apPASS);
apGetIP = WiFi.softAPIP();
//if roName & roPass then set AP_STA mode
if ((roName.length() >= 4) && (roPass.length() >= 4))
{
WiFi.mode(WIFI_AP_STA);
roName.toCharArray(roSSID, settStrLen);
roPass.toCharArray(roPASS, settStrLen);
WiFi.begin(roSSID, roPASS);
//Wait for WiFi to connect
int connStatus = 10;
while(1)
{
if (WiFi.waitForConnectResult() != WL_CONNECTED)
{
digitalWrite(2, HIGH);
delay(500);
digitalWrite(2, LOW);
delay(500);
if (connStatus > 0)
{
connStatus--;
if (connStatus == 0)
{
//if connection failed
Serial.print(„GET /?roIp=0&HTTP\r”);
WiFi.mode(WIFI_AP);
break;
}
}
}else
{
//if connection success
roGetIP = WiFi.localIP();
Serial.print(„GET /?roIp=”);
Serial.print(roGetIP);
Serial.print(„&HTTP\r”);
break;
}
}
}
//set handlers
webServer.on(„/”, handleRoot);
webServer.onNotFound(handleClose);
webServer.begin();
//end of setup
delay(500);
Serial.print(„GET /?statOK&HTTP\r”);
digitalWrite(2, HIGH);
Procedura, która przygotowuje i przesyła metodę GET, realizowana jest w przerwaniu handleRoot. Jej treść widoczna jest na listingu 2, w zmiennej serialString umieszczane są nazwy parametrów i ich wartości, a następnie cała treść jest przesyłana do mikrokonrtrolera - Serial.print(serialString);. Następnie moduł oczekuje na kod opisujący treść strony internetowej BodySend(); Na koniec treść strony, poprzedzona nagłówkiem i odpowiednio zakończona, tworzy treść odpowiedzi serwera webServer.send(200, „text/html”, PageHeader + serialContent + PageClosed);
void handleRoot()
{
digitalWrite(2, LOW);
serialString = „GET /?”;
for (int i=0; i< webServer.args(); i++)
{
serialString += webServer.argName(i);
serialString += „=”;
serialString += webServer.arg(i);
serialString += „&”;
}
serialString += „HTTP/1.1\r\n”;
Serial.print(serialString);
serialContent = „”;
BodySend();
webServer.send(200, „text/html”, PageHeader + serialContent + PageCloser);
digitalWrite(2, HIGH);
}
Program mikrokontrolera realizuje mnóstwo zadań, najistotniejsze z nich to interpretacja komend odbieranych z modułu Wi-Fi. Budowa każdej komendy rozpoczyna się od GET /? a dalej znajduje się bardzo istotny parametr logId. Mikrokontroler zapamiętuje 5 ostatnich wartości tego parametru, które były powiązane z udanym logowaniem. Jeśli parametr logId ma wartość, która znajduje się w puli zapamiętanych, oznacza to potwierdzony dostęp do strony, jeśli wartości nie ma w puli zapamiętanych to wyświetlana jest strona logowania. Wartości kolejnych parametrów są generowane prostym, ale wystarczającym algorytmem. Po wylogowaniu lub po upływie czasu dana wartość logId zostaje usunięta z puli zapamiętanych. Następnym parametrem jest pageNum określający, którą stronę należy wyświetlić. Kolejne parametry dotyczą konkretnych elementów, np. actId=1 wraz z parametrem pageNum=1 pozwala zmienić stan wyjścia numer 1. Cała komenda wygląda wtedy tak:
GET /?logId=555&pageNum=1&actId= 1&HTTPr
Lista nazw wszystkich parametrów jest zamieszczona na listingu 3, po nazwach łatwo rozszyfrować ich znaczenie.
GET
const uint8_t cFrameStart[] = „GET /?”;
const uint8_t cFrameEnd[] = „HTTP”;
const uint8_t cLogId[] = „logId”;
const uint8_t cPageNum[] = „pageNum”;
const uint8_t cActId[] = „actId”;
const uint8_t cTstart[] = „tStart”;
const uint8_t cTstop[] = „tStop”;
const uint8_t cTsecStart[] = „tSecStart”;
const uint8_t cTsecStop[] = „tSecStop”;
const uint8_t cClockSet[] = „clockSet”;
const uint8_t cDateSet[] = „dateSet”;
const uint8_t cEspApName[] = „apName”;
const uint8_t cEspApPass[] = „apPass”;
const uint8_t cRouterName[] = „roName”;
const uint8_t cRouterPass[] = „roPass”;
const uint8_t cRouterIp[] = „roIp”;
const uint8_t cStatusOK[] = „statOK”;
Montaż i uruchomienie
Schematy montażowy płytki drukowanej pokazano na rysunku 12. Urządzenie zostało zbudowane w większości z elementów SMD o bardzo małym rastrze. Chociaż nie ma wielu elementów, to montaż wymaga odpowiednich narzędzi i umiejętności. Po zmontowaniu i wstępnym skontrolowaniu napięć zasilających należy wykonać programowanie dwóch układów. Na płytce znajduje się złącze, które umożliwia przeprowadzenie niezbędnych czynności. Jednak potrzebny będzie dodatkowo konwerter USB-UART z wyjściami RX i TX o poziomie napięcia 5 V. Jeśli dysponujemy tylko konwerterem z wyjściami o poziomie 3,3 V, to należy usunąć z płytki rezystor R10.
W pierwszej kolejności należy zaprogramować moduł ESP, w tym celu należy założyć zworki na szpilki goldpin, zgodnie z opisem PROGRAMOWANIE MODUŁU ESP na rysunku 13 i podłączyć zasilanie. Teraz należy otworzyć w środowisku Arduino program ProRelArd, w ustawieniach wybrać płytkę NodeMCU (ESP-12E Module) i uruchomić proces kompilacji i programowania modułu. W razie problemów dokładniejsze wskazówki dotyczące programowania modułu ESP8266 za pośrednictwem Arduino można bez problemu znaleźć w Internecie.
Następnym krokiem będzie zaprogramowanie mikrokontrolera, można tego dokonać za pomocą programu Flash Magic poprzez ten sam konwerter USB-UART, który posłużył do zaprogramowania modułu ESP. Należy wtedy założyć zworki na szpilki goldpin, zgodnie z opisem PROGRAMOWANIE UKŁADU LPC na rysunku 13 i włączyć zasilanie. W oknie programu należy wybrać typ układu - LPC824, wskazać plik - ProRelays.hex i nacisnąć przycisk Start. W razie problemów dokładniejsze wskazówki dotyczące programowania układu LPC za pośrednictwem Flash Magic można można znaleźć np. w opisie modułu z LPC824, opublikowanego w EP. Innym sposobem na zaprogramowanie układu LPC jest zastosowanie programatora LPC-LINK wraz ze środowiskiem MCUXpresso IDE. Po tych czynnościach urządzenie będzie gotowe do pracy.
Podsumowanie
Na koniec kilka przydatnych informacji:
- Wszystkie nazwy i hasła mogą mieć maksymalną długość 19 znaków.
- Jeśli zostanie ustawione niewłaściwe hasło do istniejącej sieci Wi-Fi, to moduł ESP podejmie kilka prób połączenia z tą siecią. Próby oczywiście zakończą się niepowodzeniem i ostatecznie moduł przejdzie to pracy w trybie access pointa, ale cały proces może potrwać kilka minut.
- Zapomnianego hasła nie da się usunąć, ale można je „podejrzeć”, podłączając do urządzenia konwertera USB-UART i zamieniając sygnały RX i TX. Podczas uruchamiania urządzenia mikrokontroler przesyła hasło do modułu ESP.
- Urządzenie podłączone do domowego routera po restarcie zasilania może zmienić adres IP. Aby tego uniknąć, należy w ustawieniach routera przypisać stały adres ip dla tego urządzenia.
- Jeśli urządzenie jest podłączone do routera a router, ma stały publiczny adres ip to możliwe jest sterowanie urządzeniem z dowolnego miejsca na ziemi. Należy wtedy w ustawieniach routera uruchomić funkcję przekierowania portu nr 80 na numer IP, który otrzymało urządzenie, a w przeglądarce wpisać publiczny adres ip routera.