Elektroda.pl
Elektroda.pl
X
flexghzflexghz
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ESPnow - czyli budujemy naszą małą domową sieć wymiany danych.

error105 21 Mar 2020 20:32 3426 20
  • ESPnow - czyli budujemy naszą małą domową sieć wymiany danych.

    Hej, może ktoś z was planuje zrobić domową sieć kilkunastu czujników ale nie wie jaki protokół bezprzewodowy wybrać ?
    Jest tego masa, od Bluetooth, WiFi...... ale dzisiaj skupimy się na mało popularnym, ale wdg mnie, świetnym protokołem ESPnow opracowanych z tego co wiem przez Chińczyków :)
    Może zacznijmy czym jest ESPnow?
    ESPnow używa podobnie jak WiFi pasma 2,4 GHz, podzielonego na 13 kanałów. Jednak z Wi-Fi nie ma więcej nic wspólnego. Za jednym zamachem można przesłać aż 256 bajtów (ESP32) bądź 200 bajtów (ESP8266) co jest przyzwoitym wynikiem. Jedno urządzenie może komunikować się z 10 innymi w sposób szyfrowany lub 20 bez szyfrowania. W praktyce mam 25 nadajników i jeden odbiornik i w sumie to wszystko działa ok :)
    Zasięg ma świetny, na otwartej przestrzeni z malutką anteną dane lecą sobie do 200m. Nie tracimy też czasu na połączenie się z bazą, po prostu dane lecą w eter i odbiornik sobie wybiera co tam go interesuje :)

    Więc słów kilka było, to teraz do rzeczy. Dzisiaj zbudujemy mały zestaw złożony z nadajnika i odbiornika. Żeby było ciężej to odbiera dane ESP32, a wysyła ESP8266.
    Wszystko będzie wykonane w Arduino 1.8.33.0.

    1. Przygotujmy Arduino by mogło współpracować z naszymi ESP,
    Uruchamiamy aplikację, klikamy Plik -> Preferencje i klikamy na przycisk po prawej stronie "Dodatkowe adresy URL....
    ESPnow - czyli budujemy naszą małą domową sieć wymiany danych.
    wklejamy dwa linki:
    Code:
    https://arduino.esp8266.com/stable/package_esp8266com_index.json
    
    https://dl.espressif.com/dl/package_esp32_index.json
    i klkamy OK.
    Potem z menu wybieramy Narzędzia -> Płytka ->Menadżer płytek
    ESPnow - czyli budujemy naszą małą domową sieć wymiany danych.

    Wklepujemy ESP, i instalujemy esp32 oraz esp8266
    ESPnow - czyli budujemy naszą małą domową sieć wymiany danych.

    I gotowe, możemy teraz wgrać moje dwa przykładowe kody do Odbiorniak (ESP32) oraz nadajnika (ESP8266).
    Opis co za co odpowiada jest w komentarzach w kodzie, myślę że każdy się połapie o co chodzi, ale jeśli będzie problem to na samym dole dam opis jak dodać więcej zmiennych do wysłania. Generalnie najważniejsze by stworzyć taka samą strukturę danych w nadajniku (nadajnikach) i odbiorniku.
    Code:
    typedef struct struct_message {
    
        int DaneZczujnika1;
        int DaneZczujnika2;
    } struct_message;

    Typy danych mogą być dowolne, byle byśmy się zmieścili w 200 (256bajtach).

    Kod odbiornika (ESP32):
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod nadajnika (będziemy sobie wysyłali "losowe" dane.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jak zapewne zauważyliście, ESP8266 idzie grzecznie spać by nie marnować nam bez sensu baterii jeśli ma to być urządzenie bezprzewodowe. Tutaj proponuję użyć LOLIN D1 Mini Pro V2, z racji że można podłączyć do niego Liiona, ma LDO oraz aktywowany tryb wybudzania ze snu Timerem (D0 z RST połączony). Przy tym układzie, nadajnik średnio wytrzymuje mi pół roku na jednym ładowaniu baterii 1000mah.

    Co do czasu nadawania, gdybyśmy chcieli dać przykładowo guzik, to od momentu kliknięcia guzikiem do pojawienia się danych w Odbiorniku upływa około 5-6ms (ciężko zmierzyć tak małe wartości) - więc w zasadzie bez żadnego opóźnienia :)

    I to byłoby na tyle, dodam też że dopiero raczkuję w programowaniu więc mogę nie być w stanie odpowiedzieć na każde pytanie szczegółowe. Czekam taż na zapewne krytyczne komentarze ;)

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    error105
    Poziom 12  
    Offline 
    error105 napisał 210 postów o ocenie 75, pomógł 1 razy. Mieszka w mieście Warszawa. Jest z nami od 2017 roku.
  • flexghzflexghz
  • flexghzflexghz
  • #3
    khoam
    Specjalista - ESP32, ESP8266
    japko1024 napisał:
    Jak to zrobić bez środowiska Arduino

    Użycie esp_now nie wymaga Arduino HAL, a kod biblioteki jest napisany w C.
    https://docs.espressif.com/projects/esp-idf/e...test/esp32/api-reference/network/esp_now.html
    https://www.espressif.com/en/products/software/esp-now/resources
    https://github.com/esp8266/Arduino/blob/master/tools/sdk/include/espnow.h
    https://github.com/espressif/esp-idf/tree/master/examples/wifi/espnow

    japko1024 napisał:
    Do tej pory używałem kompilatora avr-gcc w wierszu polecenia.

    W tym wypadku wymagany jest kompilator xtensa-gcc ;)


    @error105 Nie wiem, czy wiesz, ale jest też "arduinowy" odpowiednik biblioteki esp_now o nazwie WifiEspNow - wspólna dla ESP8266 oraz ESP32.
    https://github.com/yoursunny/WifiEspNow
  • #4
    krzbor
    Poziom 18  
    error105 napisał:
    ESPnow używa podobnie jak WiFi pasma 2,4 GHz, podzielonego na 13 kanałów. Jednak z Wi-Fi nie ma więcej nic wspólnego.
    To nie do końca tak. Ze strony espressif: "ESP-NOW to rodzaj bezpołączeniowego protokołu komunikacyjnego Wi-Fi zdefiniowanego przez Espressif." Zatem to jest WiFi, ale ramki są zbudowane "po swojemu". Oczywiście router WiFi tego nie zrozumie. Ogólnie jednak technologia warta zainteresowania.
  • #5
    error105
    Poziom 12  
    khoam napisał:
    Nie wiem, czy wiesz, ale jest też "arduinowy" odpowiednik biblioteki esp_now o nazwie WifiEspNow - wspólna dla ESP8266 oraz ESP32.

    Nawet nie wiedziałem, w sumie to nawet nie szukałem jak jest to już od razu dostępne po pobraniu samych płytek :)

    krzbor napisał:
    To nie do końca tak. Ze strony espressif: "ESP-NOW to rodzaj bezpołączeniowego protokołu komunikacyjnego Wi-Fi zdefiniowanego przez Espressif." Zatem to jest WiFi, ale ramki są zbudowane "po swojemu". Oczywiście router WiFi tego nie zrozumie. Ogólnie jednak technologia warta zainteresowania.

    Pozwolę sobie w takim razie edytować post i dodam Twoją uwagę :)

    AbRe napisał:
    Obserwuję co się dzieje regularnie i im więcej zakażonych tym więcej ciekawostek w dziale DIY.

    Projekt u mnie powstał dawno temu, wczoraj zamontowałem po testach ustrojstwo w samochodzie wiec stwierdziłem że mogę kod pokazać by ktoś inny do innych rzeczy mógł wykorzystać go :)
  • #6
    sq9etc
    Poziom 12  
    Czy z użyciem tego ESPnow można zrealizować coś takiego?
    Sieć czujników na ESP8266 wysyła dane do jednego głównego modułu z ESP8266 z użyciem ESPnow. Moduł główny wysyła dane z użyciem Wi-Fi gdzieś dalej.
  • #7
    otapi
    Poziom 25  
    sq9etc napisał:
    Czy z użyciem tego ESPnow można zrealizować coś takiego?
    Sieć czujników na ESP8266 wysyła dane do jednego głównego modułu z ESP8266 z użyciem ESPnow. Moduł główny wysyła dane z użyciem Wi-Fi gdzieś dalej.


    Można, chociaż są z tym pewne problemy.
    Generalnie rozchodzi się chyba o to, że wszystkie ESP działające z protokołem ESPnow jak i accespoint do którego podłączony jest ESP pełniący rolę bramy do internetu, muszą działać na tym samym kanale WiFi.

    Więcej informacji z tym związanych: Link
  • #8
    error105
    Poziom 12  
    I tak i nie, użycie ESPnow wyłącza możliwość połaczenia z routerem, ale:
    1. Jak zbierze ESP dane z czujników to gdy one śpią, ESP się przełącza w tryb klienta, łączy się z routerem wysyłając dane, i znowu wraca w tryb nasłuchu w ESPnow.
    2. Po porcie szeregowym wysyła wszystkie dane do drugiego ESP8266 i on wysyła dane na serwer.
  • #9
    sq9etc
    Poziom 12  
    Nie pamiętam. Czy ESP8266 nie ma przypadkiem trybu AP+client?
    Wtedy moduł główny byłby AP dla modułów z czujnikami, a sam byłby klientem jakiegoś routera.
  • #10
    khoam
    Specjalista - ESP32, ESP8266
    sq9etc napisał:
    Czy ESP8266 nie ma przypadkiem trybu AP+client?

    Będzie działał pod warunkiem utrzymania tego samego kanału WiFi dla STA i AP. To może być trudne w wypadku STA.

    Pod tym linkiem jest przykład programu, gdzie po otrzymaniu pakietu z ESP-NOW, wysyłana jest dalej informacja jako wiadomość MQTT.
    https://github.com/SensorsIot/ESP-Now-Tests/b...EspNow_Slave_ESP8266/EspNow_Slave_ESP8266.ino

    Dodano po 1 [godziny] 51 [minuty]:

    error105 napisał:
    Jak zbierze ESP dane z czujników to gdy one śpią, ESP się przełącza w tryb klienta

    Może się pojawić problem z synchronizacją tych działań. Każdy z "nadajników" może zasypiać w różnym czasie. Może się zdarzyć, że "odbiornik" przełączy się w tryb klienta akurat wtedy, kiedy jeden z nadajników wysyła dane. Należałoby przynajmniej sprawdzać, czy funkcja esp_now_send() zwraca wartość ESP_OK. Jeżeli nie, to powtórzyć wysyłanie danych.

    Generalnie w kodzie, który przedstawiłeś nie ma żadnej obsługi błędów w ESP-NOW, poza tym, że sprawdzasz, że dane "wyszły" z nadajnika. Jest to dość istotne przy tego rodzaju rozproszonej architekturze. Kody błędów są dobrze udokumentowane tutaj:
    https://docs.espressif.com/projects/esp-idf/e...-reference/network/esp_now.html#api-reference
  • #12
    krzbor
    Poziom 18  
    Tak mi przyszło na myśl, ESP odbierający (ESP-NOW) połączyć z ESP pracującym jako klient WiFi. Oba ESP połączyć przez UART. Cena ESP jest na tyle mała, że nie powinno to stanowić problemu, a do zasilania obu i tak mamy 3,3V. W komercyjnym produkcie raczej by to nie przeszło, ale w domowym zastosowaniu wydaje się dobrym pomysłem. Jedną z zalet jest możliwość niezależnego uruchamiania obu programów i podsłuchu UARTa
  • #13
    khoam
    Specjalista - ESP32, ESP8266
    error105 napisał:
    Zasięg ma świetny, na otwartej przestrzeni z malutką anteną dane lecą sobie do 200m.

    Trochę chyba poniosła kolegę fantazja ułańska ;) Jakie są to wtedy te "malutkie" anteny? Czy sprawdzałeś, jaka jest wtedy stopa błędów w transmisji danych? Bo to, że się "widzą" urządzenia, to trochę za mało.
  • #14
    TvWidget
    Poziom 34  
    W przypadku EPS32 można wykorzystać BLE i wysyłać dane w trybie bezpołączeniowym podobnie jak przez ESP-NOW. Odbiornik (ESP32) może jednocześnie odbierać te dane wysyłać je do serwera przez WiFi.
    Informacje z czujników są możliwe też do odebrania na smartfonie.
  • #15
    khoam
    Specjalista - ESP32, ESP8266
    TvWidget napisał:
    W przypadku EPS32 można wykorzystać BLE i wysyłać dane w trybie bezpołączeniowym podobnie jak przez ESP-NOW.

    ESP-NOW ma zdecydowanie większą przepustowość niż BLE w ESP32.
  • #16
    error105
    Poziom 12  
    khoam napisał:
    error105 napisał:
    Zasięg ma świetny, na otwartej przestrzeni z malutką anteną dane lecą sobie do 200m.

    Trochę chyba poniosła kolegę fantazja ułańska ;) Jakie są to wtedy te "malutkie" anteny? Czy sprawdzałeś, jaka jest wtedy stopa błędów w transmisji danych? Bo to, że się "widzą" urządzenia, to trochę za mało.


    Z laptopa wyjęta, nie wiem jaka dokładnie ale ma 7 cm.
    Stopa błędu ? aż tak dociekliwy nie byłem, dane które odbierałem były w porządku (zmienna bool).
  • #19
    error105
    Poziom 12  
    TvWidget napisał:
    W przypadku EPS32 można wykorzystać BLE i wysyłać dane w trybie bezpołączeniowym podobnie jak przez ESP-NOW. Odbiornik (ESP32) może jednocześnie odbierać te dane wysyłać je do serwera przez WiFi.
    Informacje z czujników są możliwe też do odebrania na smartfonie.


    Powiesz coś więcej ? Czy można szyfrować połączenie, czy dane te są wysyłane natychmiast, czy po sparowaniu. Czy odbiornik może cały czas czuwać i odbierać je ? Ogólnie napisz coś więcej o tym bo zaciekawiłeś mnie :)
  • #21
    TvWidget
    Poziom 34  
    error105 napisał:
    Powiesz coś więcej ?

    Urządzenie BLE typu czujnik temperatury okresowo (typ. co ~1 sek.) się rozgłasza. Czyli wysyła ramkę rozgłoszeniową i się usypia.
    Urządzenie typu smartfon w wyniku operacji skanowania odbiera te ramki. Nazywa się to wyszukiwanie urządzeń Bluetooth. Odebranie ramki rozgłoszeniowej jest też konieczne do ew. nawiązania połączenia z czujnikiem.
    ESP32 może jednocześnie skanować jak i się rozgłaszać. Rozgłaszanie BLE i komunikacja WiFi też mogą odbywać się jednocześnie.
    Ramki rozgłoszeniowe są dość, krótkie (~22 bajtów). To jednak wystarczy do przesyłania różnych informacji np. wyniku pomiaru temperatury. Rozpoczęcie okresowego wysyłania ramki następuje natychmiast. Mogą być one odbierane przez każde urządzenie z typu smartfon, tablet, PC czy ESP32.

    ESP32 może skanować pasywnie jak i aktywnie. To pierwsze polega jedynie na dobieraniu podstawowych ramek. W drugim po odebraniu podstawowej ramki wysyłane jest żądanie przesłania dodatkowych np. z przyjazną nazwą urządzenia.
    W energooszczędnych urządzeniach BLE nie ma sensu marnować energii na wysyłanie danych, których nikt nie odbiera.

    Ja używam interfejsu BLE do konfiguracji urządzeń opartych na ESP32 NodeMCU. Mogę tą drogą wpisać plik do pamięci. W ramce rozgłoszeniowej wysyłam np. adres IP. Aplikacja w smartfonie odbiera ją i może nawiązać połączenie z ESP przez sieć.

    Odbiornik w ESP32 jest dość czuły. Z miniaturową paskową anteną (17x8 mm) ramki rozgłoszeniowe z czujników opartych na innych układach (o większej mocy) odbiera z 250m.