Ta strona używa ciasteczek (cookies), dzięki którym możliwe jest między innymi poprawne wyświetlanie elementów strony, zapamiętywanie sesji użytkowników. Dodatkowo na stronie znajduje się skrypt Google Analytics oraz PIWIK (statystyki oglądalności). Znajdują się również skrypty przycisków serwisów społecznościowych Facebook, Twitter i Google+ oraz YouTube, które również mogą zapisywać ciasteczka.

ESP8266 w praktyce (UDP)

Na samym początku uprzedzam że zamieszczone przykłady nie są specjalnie wyrafinowane. Jak wielokrotnie pisałem, język LUA nie został moim przyjacielem. Tak więc są to dość proste kody, ale działają w zamierzony sposób. Druga kwestia jest taka, że w tym poradniku skupię się tylko na przykładowym kodzie. Nie będę tłumaczył jak wgrać firmware do ESP8266, jak korzystać z programu ESPlorer i co to jest LUA i NodeMCU. To wszystko można znaleźć w innych moich poradnikach. Jeśli więc nie miałeś jeszcze do czynienia z ESP a świerzbią Cię palce żeby już ten układ zaprogramować, to polecam najpierw zapoznać się z moimi poradnikami traktującymi o ESP8266. I jeszcze jedno, proszę nie odbierać schematu połączeń jaki widać na głównym zdjęciu do poradnika, jako wzorca według którego należy zmontować opisywany układ. To tyle gwoli wstępu.

Chcąc osiągnąć efekt jak na tym filmie potrzebny jest moduł z ESP8266 który ma wgrany firmware NodeMCU. Mając tak przygotowany moduł można rozpocząć zabawę z diodami. Od tego jakim dysponujemy modułem, zależy ile diod możemy podłączyć. Mając ESP-01, do wykorzystania mamy dwa piny, GPIO2 i GPIO0, przy czym trzeba pamiętać aby na pinie GPIO0 występował stan wysoki podczas startu modułu. W innym przypadku moduł będzie przy starcie od razu ustawiał się w tryb programowania firmware i program w nim zapisany się nie uruchomi. Oznacza to że np dioda musi być do tego pinu podłączona katodą, a więc sterowana stanem niskim.

Na filmie który podlinkowałem wcześniej, użyłem modułu ESP-07, teraz jednak opiszę jak to samo wykonać na module ESP-01.

Potrzebne elementy to oczywiście ESP-01 z wgranym firmware NodeMCU, konwerter FTDI232 do programowania, dwie diody, dwa rezystory i stabilne źródło zasilania dla ESP. Pozostaje teraz rozwiązać problem montażu tych wszystkich elementów. Najprostszym sposobem wydaje się płytka stykowa. Jednak z moich doświadczeń z ESP8266 na płytce stykowej wynika, że nie do końca to rozwiązanie się sprawdza, a zwłaszcza jak płytka była intensywnie wcześniej eksploatowana. Najlepszym rozwiązaniem było by polutowanie płytki prototypowej dla ESP-01 chociażby na uniwersalnej płytce PCB. Jeśli jednak zdecydujesz się użyć płytki stykowej, to proponuję zasilanie doprowadzić bezpośrednio do pinów modułu z ESP8266, a nie poprzez listwy zasilania jakie znajdują się na stykówce. Tak samo jeśli chodzi o połączenia, niech będą poprowadzone płasko po płytce na porządnych przewodach. Możesz wierzyć lub nie, ale ESP8266 jest wrażliwe na spadki napięcia i można sporo nerwów i czasu stracić na dochodzenie czemu coś nie działa, nie przykładając należytej staranności do doprowadzenia zasilania.

Po uporaniu się z połączeniem wszystkich komponentów można przejść do programowania. W tym celu należy otworzyć program ESPlorer, upewnić się że w oknie po lewej stronie jest zaznaczone NodeMCU i można wpisać kod w polu edytora:

-- ESP-01
gpio.mode(3,gpio.OUTPUT)
gpio.write(3,gpio.HIGH)
gpio.mode(4,gpio.OUTPUT)
gpio.write(4,gpio.HIGH)

mySSID = "TUTAJ NAZWA SIECI WI-FI"
myPassword = "HASŁO SIECI WI-FI"

wifi.setmode(wifi.STATION)
wifi.sta.config(mySSID, myPassword)
wifi.sta.connect()
wifi.ap.dhcp.stop()
wifi.sta.setip({
  ip = "192.168.1.51",
  netmask = "255.255.255.0",
  gateway = "192.168.1.1"
})
dofile("udp.lua")

Na początku trzeba utworzyć plik "init.lua". Powyższy kod powinien się właśnie znaleźć w tym pliku. Przypomnę tylko że plik "init.lua" jest plikiem który musi być zawsze zapisany do ESP8266 z wgranym firmware NodeMCU. Jest to plik inicjalizacyjny i jeśli nawet nie chcemy w nim zapisać startowych parametrów dla ESP, to i tak musi być zapisany do pamięci układu. W moim przykładzie w tym pliku znajdują się komendy konfigurujące niektóre piny układu ESP, konfigurujące dostęp do sieci a ostatnia linia kodu wskazuje jaki ma zostać odczytany plik dodatkowy.

W pierwszej linii kodu, pin nr 3 zostaje ustawiony jako wyjście. Następnie na pinie tym zostaje ustawiony stan wysoki. Wynika to ze sposobu podłączenia przeze mnie diod do ESP, katodami. Analogiczna sytuacja ma miejsce w dwóch kolejnych liniach kodu, tym razem dla pinu nr 4. W tym miejscu ważna uwaga dotycząca numeracji pinów ESP i firmware NodeMCU. Numery pinów modułu ESP nie są bezpośrednio przełożone na numerację pinów w NodeMCU. Pin GPIO3 w ESP to nie pin GPIO3 w NodeMCU. Chcąc na przykład ustawić pin GPIO3 w ESP na wyjście, należałoby wpisać polecenie "gpio.mode(9,gpio.OUTPUT)". Czyli ma się to nijak do numeru pinu z ESP. Zanim więc zacznie się konfigurację pinów modułu ESP, należy zapoznać się z dokumentacją do NodeMCU gdzie dokładnie jest opisana numeracja pinów.

Po konfiguracji pinów, w dwóch kolejnych liniach powołane zostają stałe, gdzie pierwsza będzie przechowywać nazwę sieci WIFI z którą ma się połączyć ESP a druga hasło do tej sieci. W następnych liniach kodu konfigurujemy moduł ESP do pracy jako stacja, służą do tego trzy pierwsze polecenia zaczynające się od "wifi...". Pierwsze ustawia ESP właśnie w tryb pracy "stacja", drugie nawiązuje komunikację z siecią WIFI na podstawie parametrów przekazywanych jako argumenty a skonfigurowanych wcześniej jako stałe, trzecie polecenie łączy się ze wskazaną siecią.

Jeśliby na tym etapie zakończyć program, to ESP po połączeniu się z siecią WIFI otrzymałby numer IP przyznany przez DHCP, czyli dynamiczne IP. Ma to swoje zalety i wady. Zaleta jest taka, że to protokół DHCP martwi się o prawidłowe przyznanie numeru IP tak aby nie pokrywał się z innym urządzeniem podłączonym do tej samej sieci co ESP. Wadą w tym przypadku natomiast jest to, że potrzeba by było napisać kolejne linie kodu aby sprawdzić jaki ESP otrzymało numer IP, a następnie zapisać w zmiennej aby można go było później wykorzystać. Ja poszedłem na skróty i uznałem że lepiej wyłączyć przyznawanie numeru IP dla ESP po DHCP, a ustawić go jako statyczny. Należy tylko pamiętać aby statyczny numer IP dla ESP nie pokrywał się z numerem IP innego urządzenia. Musi się on również zawierać w puli adresowej naszej sieci. W moim przypadku bramka ma adres "192.168.1.1" a to oznacza że mogę ustalać adresy w przedziale "192.168.1.1" do "192.168.1.255". Oczywiście wiedząc ile mam urządzeń w domu które się łączą po DHCP wiem od jakiego numeru mam adresy IP wolne. Ale dla świętego spokoju ustawiłem adres "192.168.1.51". Podsumowując, wyłączmy DHCP poleceniem "wifi.ap.dhcp.stop()", i ustawiamy statyczny adres IP dla ESP podając jako pierwszy parametr adres IP jaki chcemy przypisać do ESP, następnie maskę sieci, oraz bramkę, która najczęściej jest adresem routera przez który łączymy się z internetem. Tyle jeśli chodzi o konfigurację ESP. Ostatnia linia kodu wskazuje jaki kolejny plik ma być wczytany. Pozostało tylko zapisać kod do pliku, oczywiście jako "init.lua".

Czas na plik "udp.lua".

function esp_send(data)
    socket=net.createConnection(net.UDP,0)
    socket:connect(55056,"255.255.255.255")
    socket:send(data)
    socket:close()
end

udp_server=net.createServer(net.UDP)
udp_server:listen(10000)
udp_server:on("receive",function(udp_server,data1)
    if data1 == "1" then
    gpio.mode(3,gpio.OUTPUT)
    gpio.write(3,gpio.LOW)
    esp_send("LED_1 ON")
    print("LED 1 ON")
    end
    if data1 == "01" then
    gpio.mode(3,gpio.OUTPUT)
    gpio.write(3,gpio.HIGH)
    esp_send("LED_1 OFF")
    print("LED 1 OFF")
    end
    if data1 == "2" then
    gpio.mode(4,gpio.OUTPUT)
    gpio.write(4,gpio.LOW)
    esp_send("LED_2 ON")
    print("LED 2 ON")
    end
    if data1 == "02" then
    gpio.mode(4,gpio.OUTPUT)
    gpio.write(4,gpio.HIGH)
    esp_send("LED_2 OFF")
    print("LED 2 OFF")
    end
end)

Na początku zostaje utworzona funkcja, która będzie wykorzystywana do wysyłania przez moduł ESP danych na wskazany port. Polecenia jakie zawiera pochodzą z biblioteki net NodeMCU. Po krótce, utworzone zostaje połączenie po protokole UDP na porcie 55056, następnie wysłanie danych, i na koniec zamknięcie połączenia. Funkcja ta nie jest konieczna do nawiązania komunikacji po UDP, ale dzięki niej można na przykład wysłać tekst, który następnie może być odebrany przez inny program.

To co najważniejsze, znajduje się w następnych liniach. Tutaj również są wykorzystywane polecenia z biblioteki NodeMCU. Jako pierwszy zostaje utworzony serwer UDP. Po utworzeniu serwera zostaje ustalony port na którym będzie prowadzony nasłuch. Wpisując port do nasłuchu trzeba mieć na uwadze aby wybrać taki który nie jest wykorzystywany w komunikacji do jakichś konkretnych celów. Można o tym znaleźć informacje w internecie, jakie protokoły z jakich portów korzystają. Po ustaleniu portu do nasłuchu, ESP będzie czekało na cokolwiek co na tym porcie się pojawi. Gdy tylko odbierze jakieś dane, to natychmiast zostaną one porównane z tym co znajduje się w funkcji w poleceniu "udp_server:on("receive",function(udp_server,data1)". Funkcja ta zawiera cztery warunki które sprawdzają czy odebrane dane są równe 1,01,2 lub 02. Gdy tylko któryś z tych warunków zostanie spełniony, wykonane zostaną polecenia w tych warunkach zawarte. Tu chyba nie muszę już tłumaczyć co jaki warunek robi, bo polecenia są dość oczywiste.

Mając powyższy kod wpisany w polu edytora programu ESPlorer, należy go zapisać na dysku pod nazwą "udp.lua". W ten oto sposób mamy dwa pliki które teraz należy wgrać do ESP. Możliwości jest kilka. Można skorzystać z przycisku "Save to ESP", "Send to ESP" lub "UPLOAD...". Osobiście preferuję ostatnią metodę, inne generowały błędy podczas ich używania i pliki do ESP się nie wgrywały. Po naciśnięciu "UPLOAD..." należy wskazać plik który chcemy wgrać, dlatego wcześniej pisałem żeby każdy z plików zapisać na dysk. Czy wgramy pierwszy "init.lua" czy "udp.lua" nie ma znaczenia, ważne aby oba znalazły się w ESP. Po umieszczeniu obu plików w ESP restartujemy moduł i możemy zacząć wysyłać polecenia.

Na początek proponuję użyć programu PacketSender. Umożliwia on zarówno wysyłanie danych ale też nasłuchuje na wskazanym porcie i odbiera otrzymane dane. Po uruchomieniu programu należy się upewnić czy port UDP jest włączony i czy ma ustawiony właściwy numer portu do nasłuchu, czyli 55056, bo na ten port ESP będzie wysyłało dane. Jeżeli tak nie jest to w preferencjach programu trzeba wpisać właściwy numer portu i włączyć komunikację po UDP. Teraz trzeba skonfigurować program do wysyłania danych. A więc wpisz adres IP jaki przypisałeś modułowi ESP, u mnie 192.168.1.51, następnie numer portu na jaki dane mają zostać wysłane, czyli 10000, a na koniec ustal protokół komunikacji wybierając z rozwijanej listy pozycję UDP. W tym momencie program jest skonfigurowany do wysyłania i nasłuchiwania po protokole UDP. Acha, ważne jest, na ten moment, aby komputer z którego wysyłamy dane do ESP, był połączony z tą samą siecią co ESP. Jeśli tak jest można zacząć testować działanie programu. A więc chcąc zapalić pierwszą diodę, wpisz 1 w polu opisanym jako ASCII i naciśnij Enter. Teraz wystarczy tylko nacisnąć przycisk SEND i dioda powinna się zaświecić.

Jeżeli tak się stało, możesz przejść do następnego akapitu. W innym wypadku należy znaleźć przyczynę problemu. Powodów może być kilka, od sprzętowego po błąd w programie. Proponowałbym zacząć od sprawdzenia ustawień sieci, a dokładnie zabezpieczeń sieci z którą ma się połączyć moduł ESP. Powyższy kod nie zawiera funkcji które by informowały o tym że moduł się nie połączył i co jest tego przyczyną, więc trzeba tak sieć skonfigurować aby ESP łączył się z nią bez problemu. Najczęstszą przyczyną niemożności nawiązania połączenia, jest włączona filtracja MAC adresów kart sieciowych urządzeń chcących się połączyć z naszą siecią. Sam korzystam z takiego sposobu zabezpieczenia i niestety muszę się przyznać że o tym zapomniałem jak rozpoczynałem pierwsze zabawy z ESP. Trochę krwi mi to napsuło. Tak więc jeśli też korzystasz z takiej formy zabezpieczenia sieci, musisz albo wyłączyć filtrowanie MAC adresów albo dopisać MAC adres ESP do obsługiwanych wyjątków. Kolejna sprawa to firewall. Generalnie użytkowników macOS to nie powinno dotyczyć, ponieważ system za każdym razem gdy jakiś program, w tym przypadku PacketSender, chce korzystać z dostępu do sieci, pyta o pozwolenie. Wystarczy wyrazić zgodę. Jeśli jednak używasz innego firewalla niż systemowy, to musisz go tak skonfigurować aby dawał możliwość korzystania z sieci programom które tego potrzebują. Podobno też antywirusy mogą blokować dostęp do portów, ale tutaj nie pomogę. Nie korzystam z antywirusów. Jeżeli w kwestii dostępu do sieci jest wszystko w porządku, a mimo to diody nadal nie można włączyć, trzeba szukać dalej. W tym wypadku proponowałbym sprawdzić czy zasilanie układu ESP jest stabilne i wynosi 3,3V. W następnej kolejności czy diody zostały właściwie podłączone. Korzystając z powyższego kodu muszą być podłączone katodami do pinów ESP. Gdy tutaj również jest wszystko jak należy, to ostatnią rzeczą do sprawdzenia jest program. Czy gdzieś nie ma jakieś literówki czy tym podobnych błędów.

Skoro pierwsza dioda się zaświeciła, można spróbować włączyć drugą wpisując 2, następnie Enter i SEND. Jak wyłączyć to już chyba nie muszę pisać. Podobnie sytuacja będzie wyglądała przy sterowaniu telefonem. Pobieramy z AppStore aplikację na przykład "UDP-TCPClient", ewentualnie inną która umożliwia wysyłanie danych po protokole UDP, wybieramy "UDP Connection", następnie wpisujemy IP modułu ESP i port na który mają być wysyłane dane. W polu "Message" należy wpisać to co chcemy wysłać i nacisnąć SEND. Tak jak to miało miejsce z komputerem, tak i telefon musi być połączony z tą samą siecią co ESP8266.

Marna to jednak funkcjonalność jeśli możemy sterować ESP tylko w obrębie własnej sieci. To tak jak włączyć światło dopiero po wejściu do mieszkania. Prawdziwa przyjemność to wykorzystywanie ESP spoza naszej sieci. Na przykład korzystając z przesyłu danych poprzez sieć komórkową.

W najlepszej sytuacji są tutaj osoby mające stałe IP zewnętrzne. Do takich szczęśliwców ja się zaliczam. Jedyna rzecz jaką należy zrobić, to ustawić przekierowywanie portów w preferencjach routera. Jak się do nich dostać, to już każdy musi sam sprawdzić. Generalnie chodzi o to aby po wejściu w preferencje routera, znaleźć opcję "Forwarding". To właśnie tam można ustawić przekierowywanie portu na konkretny adres IP. Na zdjęciu poniżej widać jak to wygląda w przypadku routera TPLink, czyli podajemy IP modułu ESP oraz numer portu który ma zostać przekierowany. Należy zapisać ustawienia i zrestartować router jeśli będzie taka potrzeba.

Aby sprawdzić czy przekierowywanie portu działa, najwygodniej będzie użyć do tego celu telefonu. Wyłączyć należy w telefonie dostęp do WIFI aby przełączył się on na transfer danych. Otwierasz program "UDP-TCPClient" i wpisujesz adres IP i numer portu. Różnica teraz jest tylko taka, że zamiast wpisywać IP modułu ESP musisz wpisać swoje zewnętrzne IP przyznane przez usługodawcę dostępu do internetu. Jeśli nie pamiętasz jaki to adres, możesz go sprawdzić na tej stronie. Jest to Twój publiczny adres IP przez jaki łączysz się z internetem. Jeżeli dobrze skonfigurowałeś przekierowania, to teraz wszystkie dane jakie dotrą na wpisany port będą wysyłane do ESP. Tam już program zadba o sprawdzenie czy są to dane których oczekuje.

W trochę gorszej sytuacji są osoby które mają zewnętrzny adres IP dynamiczny. Najczęściej taki adres jest przyznawany na określoną ilość czasu. Dawno, dawno temu, Neostrada zmieniała taki adres nawet co godzinę. Jak to wygląda dzisiaj, nie wiem. W każdym bądź razie jeśli masz adres IP przyznawany dynamiczne, to na czas testowania połączenia z ESP możesz skorzystać z przekierowywania portów. Pamiętać tylko musisz aby sprawdzać jaki masz publiczny adres IP za każdym razem gdy będziesz chciał się połączyć z ESP spoza własnej sieci WIFI. Niestety to rozwiązanie nie sprawdzi się w sytuacji, kiedy zbudujesz docelowe urządzenie z ESP i dostęp do urządzenia spoza Twojej domowej sieci będzie miał być ciągle możliwy. W takim przypadku należy zainteresować się usługą DDNS, czyli dynamiczną zmianą adresów IP na domenową. Dzięki temu nie będziesz musiał martwić się zmieniającym adresem IP i sprawdzaniu jaki ma numer, zadba o to właśnie DDNS. Jest to rozwiązanie stosowane powszechnie w kamerach IP, w systemach domów inteligentnych i tym podobnych rozwiązaniach. Nie jest to nic skomplikowanego, po prostu czeka Cię trochę więcej klikania niż tych co mają stały publiczny adres IP. Więcej i dokładniej o DDNS przeczytasz tutaj.

Pozostaje jeszcze kwestia osób które mają internet mobilny. I nie chodzi mi o transfer danych, czy LTE w komórce. Chodzi o sytuację kiedy to operator sieci mobilnej jest usługodawcą dostępu do internetu. Bardzo często jest tak, że umożliwia on tylko połączenie z internetem, natomiast z internetu nic do nas nie dotrze. Po prostu porty które obsługują taką komunikację są zablokowane. Z tego co czytałem, włączenie dostępu do portów jest dodatkowo płatne. Tak więc jeśli masz internet mobilny w domu i problemy w komunikacji z ESP, zapytaj się swojego dostawcy jak wygląda kwestia blokowania przez niego portów.

To by było na razie tyle w kwestii użycia ESP8266 do sterowania urządzeniami. Przykład jest prosty, ale myślę że pokazuje jakie kryją się możliwości w modułach z ESP na pokładzie.

Tags: ESP8266

E-mail

Dodaj komentarz