NodeMCU – pierwsza aplikacja sieciowa

Dziś chciałbym podzielić się przykładem aplikacji sieciowej IoT korzystającej z modułu NodeMCU z układem ESP8266 oraz z modułu KAmodLSM303 z akcelerometrem i magnetometremModuł z ESP8266 będzie przekazywał odczyty z akcelerometru LSM303D do dowolnego urządzenia, które będzie mogło połączyć się z nim przez sieć.

 

Obsługa I2C w NodeMCU

Obsługa I2C w NodeMCU jest banalnie prosta, zaczynam od konfiguracji interfejsu:

Pierwszy argument (0) to identyfikator interfejsu i2c, kolejne dwa parametry to numery linii, których chcemy użyć jako SDA i SCL, ostatni parametr określa czy I2C ma pracować ze standardową częstotliwością 100kHz (i2c.SLOW) czy z częstotliwością 400kHz (i2c.FAST). W chwili obecnej i2c w NodeMCU działa tylko z częstotliwością 100kHz.

Do przesyłania informacji w NodeMCU używamy czterech funkcji: i2c.start, i2c.stop, i2c.write i i2c.read, nie będę się zagłębiał w teorię, myślę, że kod moich funkcji odczytu i zapisu rejestru przez i2c wyjaśni wszystko:

Konfiguracja WiFi w NodeMCU

Chciałbym, aby mój moduł NodeMCU pracował jako access point o nazwie KAmodLSM303 z hasłem 12345678 i standardowymi ustawieniami IP (192.168.1.1/255.255.255.0). Ten kod również nie wymaga komentarza:

Serwer TCP

Tutaj niektórzy mogą mieć problem ze zrozumieniem składni, przynajmniej ja miałem, więc na początek kilka wyjaśnień:

  • w Lua bardzo często używa się funkcji jako parametrów dla innych funkcji. Mam tu na myśli sens inny niż suma(pierwiastek(2), pierwiastek(3)), chodzi o coś podobnego do przekazania wskaźnika do funkcji w języku C
  • w Lua często deklaruje się funkcje w tym miejscu, w którym przekazuje się je jako parametr, podobnie jak

Chcąc uruchomić serwer TCP tworzymy obiekt serwera (zmienna server), potem metodą listen konfigurujemy go do nasłuchiwania na porcie 111 i podajemy jako drugi argument funkcję, która będzie wywoływana przy każdym nawiązaniu połączenia otrzymując jako parametr zmienną c typu net.socket, ta funkcja z kolei ustawia dla obiektu c funkcję obsługi zdarzeń, w moim przypadku będzie to jedno zdarzenie – receive, czyli zdarzenie odebrania danych od klienta. Trochę to skomplikowane, ale opis i przejrzenie kodu powinny pozwolić zrozumieć o co chodzi.

W funkcji obsługującej zdarzenie odebrania danych zapalana jest dioda modułu NodeMCU, wysyłane są dane z rejestru czujnika LSM303 o adresie 0x28 i pięciu następnych (rejestry zawierają odczyty akcelerometru), na koniec dioda jest gaszona.

Mamy już gotowy serwer, który udostępnia dane odczytane z akcelerometru, następnym razem zajmę się stroną odbierającą i przetwarzającą te dane.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *