Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

error105 21 Mar 2020 20:32 22278 75
Renex
  • 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:
    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.
    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):
    Code: c
    Log in, to see the code


    Kod nadajnika (będziemy sobie wysyłali "losowe" dane.
    Code: c
    Log in, to see the code


    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 ;)

    Cool? Ranking DIY
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
    About Author
    error105
    Level 14  
    Offline 
    error105 wrote 416 posts with rating 132, helped 1 times. Live in city Warszawa. Been with us since 2017 year.
  • Renex
  • #3
    khoam
    Level 42  
    japko1024 wrote:
    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/en/latest/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 wrote:
    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
    Level 25  
    error105 wrote:
    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
    Level 14  
    khoam wrote:
    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 wrote:
    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 wrote:
    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
    Level 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
    Level 25  
    sq9etc wrote:
    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
  • Renex
  • #8
    error105
    Level 14  
    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
    Level 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
    Level 42  
    sq9etc wrote:
    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/blob/master/EspNow_Slave_ESP8266/EspNow_Slave_ESP8266.ino

    Dodano po 1 [godziny] 51 [minuty]:

    error105 wrote:
    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/en/latest/esp32/api-reference/network/esp_now.html#api-reference
  • #11
    error105
    Level 14  
    Przedstawiłem najbardziej prosty kod jak się dało, co do sprawdzania czy dane wyszły, można dodać chociażby odsyłanie informacji pod dany MAC że odbiornik otrzymal dane i wtedy nie trzeba ponawiać wysyłania.
  • #12
    krzbor
    Level 25  
    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
    Level 42  
    error105 wrote:
    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
    Level 37  
    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
    Level 42  
    TvWidget wrote:
    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
    Level 14  
    khoam wrote:
    error105 wrote:
    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).
  • #17
    khoam
    Level 42  
    error105 wrote:
    Z laptopa wyjęta, nie wiem jaka dokładnie ale ma 7 cm.

    Rozumiem, że w odbiorniku (ESP32). A co z nadajnikami (ESP8266)?
  • #19
    error105
    Level 14  
    TvWidget wrote:
    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 :)
  • #20
    khoam
    Level 42  
    Dla ESP32 jest jeszcze coś takiego, jak ESP-BLE-MESH. Wtedy ESP32 może jednocześnie pracować jako Wi-Fi STA.
  • #21
    TvWidget
    Level 37  
    error105 wrote:
    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.
  • #22
    Frog_Qmak
    Level 25  
    Świetny projekt !
    Mam takie pytanie - co należy zmienić w kodzie, żeby odbiornik również działał na ESP82666 ? Nie jestem aż tak biegły w tym temacie, niestety :/
  • #23
    pier
    Level 24  
    A jak się sprawa ma do MAC adresów ESP? Nie trzeba ich wpisywać w kodzie aby nadajnik nadawał tylko do jednego odbiornika?
  • #24
    khoam
    Level 42  
    pier wrote:
    A jak się sprawa ma do MAC adresów ESP? Nie trzeba ich wpisywać w kodzie aby nadajnik nadawał tylko do jednego odbiornika?

    Protokół ESP-NOW wspiera zarówno komunikację typu broadcast, jaki i unicast. W tym DIY używana jest ta pierwsza.
    Przykład użycia komunikacji unicast:
    https://github.com/yoursunny/WifiEspNow/blob/master/examples/EspNowUnicast/EspNowUnicast.ino
    (kod został oparty o arduinową bibliotekę WifiEspNow, ale zasada jest ta sama)
  • #25
    pier
    Level 24  
    Nie wiem dlaczego ale sketch dla ESP32 nie działa. ESP wypluwa na serialu takie coś:
    Code: c
    Log in, to see the code


    O co chodzi?
  • #26
    khoam
    Level 42  
    pier wrote:
    O co chodzi?

    Sprawdź, jaki konkretnie kod zwraca funkcja esp_now_add_peer():
    Code: c
    Log in, to see the code
    ESP_ERR_WIFI_BASE równe jest 0x3000.
  • #27
    grzeg26
    Level 11  
    Chciałem nie śmiało zapytać a da się połączyć dwa Nodemcu 8266 na zasadzie
    Jeden odbiera dane z czujników i po wi fi np (one-to one) łączy się z drugim ale ten drugi jest już w sieci WIFI zalogowany, podłączony do routera wszytko po to żeby te dane wyświetlić na strone www.
    Chciałem to zrobić z użyciem protokołu espnow ale to sie chyba nie da.

    Pomoże Ktoś chociaż naprowadzić ..
  • #28
    khoam
    Level 42  
    grzeg26 wrote:
    Jeden odbiera dane z czujników i po wi fi np (one-to one) łączy się z drugim ale ten drugi jest już w sieci WIFI zalogowany, podłączony do routera

    Ten drugi musiałby naprzemiennie pracować w trybie ESP-NOW i STA (klienta dla routera WiFi). Wymagałoby to zaimplementowania wymiany potwierdzeń dla wysłanych/odebranych pakietów po ESP-NOW pomiędzy obu ESP.
  • #29
    grzeg26
    Level 11  
    Dzięki
    To trochę za skomplikowane jak dla mnie hobbysty. Chyba rozwiązaniem będzie kupienie ESP32 tam już się da to zrobić.
    Można użyć innych bibliotek do obsługi jest gotowy tutorial w necie.
    Przeszukałem neta wczoraj i nie znalazłem żadnego tutoriala na ESP8226 który sczytywał by dane z czujników np temperaturę i wyświetlał by ją na własną stronę www w sieci lokalnej i dodatkowo zbierał dane np. z innego czujnika temperaturę z za okna i wyświetlał ją również na tej stronie.
  • #30
    khoam
    Level 42  
    grzeg26 wrote:
    Chyba rozwiązaniem będzie kupienie ESP32 tam już się da to zrobić.
    Można użyć innych bibliotek do obsługi jest gotowy tutorial w necie.

    Również z ESP-NOW? Jakie to konkretnie biblioteki?

    grzeg26 wrote:
    Przeszukałem neta wczoraj i nie znalazłem żadnego tutoriala na ESP8226 który sczytywał by dane z czujników np temperaturę i wyświetlał by ją na własną stronę www w sieci lokalnej i dodatkowo zbierał dane np. z innego czujnika temperaturę z za okna i wyświetlał ją również na tej stronie.

    Długo nie szukałem:
    https://www.instructables.com/id/ESP8266-and-Multiple-Temperature-Sensors-DS18b20-W/