Spisu treści:

Jak zrobić wiele rozmów ESP przez ESP-NOW za pomocą ESP32 i ESP8266: 8 kroków
Jak zrobić wiele rozmów ESP przez ESP-NOW za pomocą ESP32 i ESP8266: 8 kroków

Wideo: Jak zrobić wiele rozmów ESP przez ESP-NOW za pomocą ESP32 i ESP8266: 8 kroków

Wideo: Jak zrobić wiele rozmów ESP przez ESP-NOW za pomocą ESP32 i ESP8266: 8 kroków
Wideo: MK ESP TOOL - nowe fantastyczne i darmowe narzędzie do pracy z modułami ESP8266 i ESP32 2024, Lipiec
Anonim
Jak zrobić wiele rozmów ESP przez ESP-NOW za pomocą ESP32 i ESP8266?
Jak zrobić wiele rozmów ESP przez ESP-NOW za pomocą ESP32 i ESP8266?

W moim trwającym projekcie potrzebuję wielu ESP, aby komunikować się ze sobą bez routera. Aby to zrobić, użyję ESP-NOW, aby bezprzewodowo komunikować się ze sobą bez routera na ESP.

Kieszonkowe dzieci

Rzeczy, których użyłem:

Moduł DEV ESP32

NODEMCU 1.0 (moduł ESP12E)

Krok 1: Uzyskaj adres Mac tablicy

Uzyskaj adres Mac tablicy
Uzyskaj adres Mac tablicy
Uzyskaj adres Mac tablicy
Uzyskaj adres Mac tablicy

Dzięki ESP-now urządzenia ESP komunikują się ze sobą, wysyłając dane na swój unikalny adres, gdy są połączone z wewnętrzną siecią punktów dostępowych utworzoną po uruchomieniu esp now.. W ten sposób określ adres MAC każdego urządzenia. Dołączone są moje ustawienia płyty ESP32 i ESP8266

DLA ESP32

#include "WiFi.h" //Aby uzyskać dostęp do funkcji WIFI ESP32

void setup(){ Serial.begin(115200); Serial.print("Adres MAC płyty ESP32: "); Serial.println(WiFi.macAddress()); //wypisuje swój adres MAC } void loop(){}

DLA ESP8266

#Include //Biblioteka używana do uzyskiwania dostępu do funkcji WIFI ESP8266

void setup(){ Serial.begin(115200); Serial.println(); Serial.print("Adres MAC płyty ESP8266: "); Serial.println(WiFi.macAddress()); //wypisuje swój adres MAC } void loop(){}

Mój ADRES MAC to:

  • ESP32 - 30:AE:A4:F5:03:A4
  • ESP8266: A4:CF:12:C7:9C:77

Krok 2: Jak sprawić, by ESP-TERAZ działał?

Oto przegląd, jak to zrobić:

  1. Dołącz teraz esp i biblioteki Wi-Fi
  2. Zapisz adres mac odbiorcy ESP
  3. Zdefiniuj strukturę danych wysyłanej/odbieranej wiadomości
  4. W konfiguracji ustaw Wi-Fi w trybie stacji
  5. Zainicjuj esp_now
  6. wykonać i zarejestrować funkcję oddzwaniania wywoływaną po wysłaniu i odebraniu danych
  7. W przypadku Esp8266 określ jego rolę
  8. zarejestruj partnera lub odbiorcę, esp
  9. Wyślij dane

Krok 3: FUNKCJE ESP-NOW (ESP32)

esp_now_init(nieważne)

Powrót:

  • ESP_OK: sukces
  • ESP_ERR_ESPNOW_INTERNAL: Błąd wewnętrzny

Opis:

Zainicjuj funkcję ESPNOW

esp_now_register_send_cb(cb)

Zwroty:

  • ESP_OK: sukces
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW nie jest zainicjowany
  • ESP_ERR_ESPNOW_INTERNAL: błąd wewnętrzny

Parametry:

  • cb: nazwa funkcji zwrotnej po wysłaniu danych ESPNOW z następującymi parametrami:

    • void cb (const uint8_t *mac_addr, esp_now_send_status_t status)

      • mac_addr: adres mac odbiorcy
      • status:

        • 1 = sukces
        • 0 = niepowodzenie

Opis:

Wywołaj funkcję OnDataSent po przesłaniu danych ESPNOW

esp_now_add_peerconst esp_now_peer_info_t *peer)

Zwroty:

  • ESP_OK: sukces
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW nie jest zainicjowany
  • ESP_ERR_ESPNOW_ARG: nieprawidłowy argument
  • ESP_ERR_ESPNOW_FULL: lista równorzędna jest pełna
  • ESP_ERR_ESPNOW_NO_MEM: brak pamięci
  • ESP_ERR_ESPNOW_EXIST: równorzędny istnieje

Parametry:

  • peer:peer informacje z następującymi danymi:

    • uint8_t

      peer_addr[ESP_NOW_ETH_ALEN]; Adres MAC peera ESPNOW będący jednocześnie adresem MAC stacji lub softap

    • uint8_t lmk[ESP_NOW_KEY_LEN]

      Lokalny klucz główny ESPNOW używany do szyfrowania danych

    • kanał uint8_t

      Kanał Wi-Fi używany przez peera do wysyłania/odbierania danych ESPNOW. Jeśli wartość wynosi 0, użyj bieżącego kanału, na którym jest włączona stacja lub program. W przeciwnym razie musi być ustawiony jako kanał, na którym jest stacja lub program

    • wifi_interface_t ifidx

      Interfejs Wi-Fi, którego peer używa do wysyłania/odbierania danych ESPNOW

    • szyfrowanie logiczne

      Dane ESPNOW, które wysyła/odbiera ten partner, są zaszyfrowane lub nie

    • nieważne *prywatne

      Prywatne dane równorzędne ESPNOW

Opis:

Dodaj listę peer to peer

esp_now_send(const uint8_t *peer_addr, const uint8_t *dane, size_t len)

Zwroty:

  • ESP_OK: sukces
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW nie jest zainicjowany
  • ESP_ERR_ESPNOW_ARG: nieprawidłowy argument
  • ESP_ERR_ESPNOW_INTERNAL: błąd wewnętrzny
  • ESP_ERR_ESPNOW_NO_MEM: brak pamięci
  • ESP_ERR_ESPNOW_NOT_FOUND: nie znaleziono partnera
  • ESP_ERR_ESPNOW_IF: obecny interfejs WiFi nie pasuje do interfejsu równorzędnego

Parametry:

  • peer_addr: adres MAC równorzędnego użytkownika
  • dane: dane do wysłania
  • len: długość danych

Opis:

Wyślij dane ESPNOW. W niektórych przypadkach tak się dzieje:

  • Jeśli peer_addr nie jest NULL, wyślij dane do peera, którego adres MAC pasuje do peer_addr
  • Jeśli peer_addr ma wartość NULL, wyślij dane do wszystkich peerów dodanych do listy peerów
  • Maksymalna długość danych musi być mniejsza niż ESP_NOW_MAX_DATA_LEN
  • Bufor wskazywany przez argument data nie musi być poprawny po zwrocie esp_now_send

esp_now_register_recv_cb(cb)

Zwroty:

  • ESP_OK: sukces
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW nie jest zainicjowany
  • ESP_ERR_ESPNOW_INTERNAL: błąd wewnętrzny

Parametry:

  • cb: funkcja zwrotna do odbierania danych ESPNOW

    • void cb (const uint8_t *mac_addr, const uint8_t *data, int data_len)

      • mac_addr:

        adres mac odbiorcy

      • *dane:

        odbieranie danych

      • data_len

        długość w bajtach danych

Opis:

Wywołaj funkcję cb po otrzymaniu danych ESPNOW

Krok 4: FUNKCJE ESP-NOW (ESP8266)

FUNKCJE OPIS ESP32 ESP8266

int esp_now_init(nieważne)

Zwroty:

  • 1 = sukces
  • 0=niepowodzenie

Opis

Zainicjuj funkcję ESPNOW

int esp_now_set_self_role (rola u8)

Parametry:

  • ESP_NOW_ROLE_IDLE: transmisja danych nie jest dozwolona.
  • ESP_NOW_ROLE_CONTROLLER: pierwszeństwo ma interfejs Sation
  • ESP_NOW_ROLE_SLAVE: pierwszeństwo ma interfejs SoftAP
  • ESP_NOW_ROLE_COMBO: pierwszeństwo ma SoftAPinterface

Opis

Ustawia rolę urządzenia

int esp_now_register_send_cb(cb)

Zwroty:

  • 1 = sukces
  • 0 = niepowodzenie

Parametry:

  • cb: nazwa funkcji zwrotnej po wysłaniu danych ESPNOW z następującymi parametrami:

    • void cb (const uint8_t *mac_addr, esp_now_send_status_t status)

      • mac_addr: adres mac odbiorcy
      • status:

        • 1 = sukces
        • 0 = niepowodzenie

Opis

Wywołaj funkcję OnDataSent po przesłaniu danych ESPNOW

int esp_now_add_peer(u8 *mac_addr, rola u8, kanał u8, u8 *key, u8 key_len)

Zwroty:

  • 1 = sukces
  • 0 = niepowodzenie

Parametry:

  • mac_addr

    adres mac peera

  • rola
  • kanał

    Jeśli wartość wynosi 0, użyj bieżącego kanału, na którym jest włączona stacja lub program. W przeciwnym razie musi być ustawiony jako kanał, na którym jest włączona stacja lub program

  • *klucz

    klucz do szyfrowania

  • key_len

    długość klucza

Opis:

Dodaj listę peer to peer

int esp_now_send(const uint8_t *peer_addr, const uint8_t *dane, size_t len)

Zwroty:

  • 1 = Sukces
  • 0 = niepowodzenie

Parametry:

  • peer_addr: adres MAC równorzędnego użytkownika
  • dane: dane do wysłania
  • len: długość danych

Opis:

Wyślij dane ESPNOW. W niektórych przypadkach tak się dzieje:

  • Jeśli peer_addr nie jest NULL, wyślij dane do peera, którego adres MAC pasuje do peer_addr
  • Jeśli peer_addr ma wartość NULL, wyślij dane do wszystkich peerów dodanych do listy peerów
  • Maksymalna długość danych musi być mniejsza niż ESP_NOW_MAX_DATA_LEN
  • Bufor wskazywany przez argument data nie musi być poprawny po zwrocie esp_now_send

int esp_now_register_recv_cb(cb)

Zwroty:

  • 1 = Sukces
  • 0 = niepowodzenie

Parametry:

  • cb: funkcja zwrotna do odbierania danych ESPNOW

    • void cb (const uint8_t *mac_addr, const uint8_t *data, int data_len)

      • mac_addr:

        adres MAC odbiorcy

      • *dane:

        odbieranie danych

      • data_len

        długość w bajtach danych

Opis:

Wywołaj funkcję cb po otrzymaniu danych ESPNOW

Krok 5: Komunikacja w jedną stronę (ESP32 jako nadawca)

ESP32 wysyła dane do ESP8266. z tym kodem. Zmień adres rozgłoszeniowy na odpowiedni adres mac odbiorcy. Mój był A4:CF:12:C7:9C:77

//Dodaj potrzebne biblioteki

#include //Aby uzyskać dostęp do esp teraz działa #include //Aby dodać możliwości Wi-Fi w ESP32 //zapisz adres MAC w tablicy o nazwie broadcastAddress; uint8_t adres rozgłoszeniowy = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; //Adres MAC mojego odbiornika /*zdefiniuj typy danych wielu zmiennych ustrukturyzowanych i zmień ich nazwy na struct_message*/ typedef struct struct_message { char a[32]; intb; pływak c; ciąg d; bool e; } struct_message; // Utwórz struct_message o nazwie myData struct_message myData; // funkcja wywoływana, gdy dane są wysyłane w celu wydrukowania ich statusu void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { Serial.print("\r\nStatus ostatniego wysyłania pakietu:\t"); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Powodzenie dostawy": "Niepowodzenie dostawy"); } void setup() { //Ustaw szybkość transmisji dla komunikacji szeregowej z ESP Serial.begin(115200); // Ustaw urządzenie jako stację Wi-Fi WiFi.mode(WIFI_STA);//Uruchamia Wi-Fi // Init ESP-NOW i zwraca jego status if (esp_now_init() != ESP_OK) { Serial.println("Błąd podczas inicjalizacji ESP -TERAZ"); powrót; } //wywołanie funkcji OnDataSent po przesłaniu danych ESPNOW esp_now_register_send_cb(OnDataSent); // Zarejestruj peera esp_now_peer_info_t peerInfo; //zainicjuj i przypisz informacje o peerach jako wskaźnik do adresu memcpy(peerInfo.peer_addr, broadcastAddress, 6); //skopiuj wartość broadcastAddress z 6 bajtami do peerInfo.peer_addr peerInfo.channel = 0; //kanał, na którym rozmawiają esp. 0 oznacza niezdefiniowany i dane będą wysyłane na bieżącym kanale. 1-14 to prawidłowe kanały, które są takie same jak w przypadku lokalnego urządzenia peerInfo.encrypt = false; //niezaszyfrowane //Dodaj urządzenie do listy sparowanych urządzeń if (esp_now_add_peer(&peerInfo) != ESP_OK){ Serial.println("Nie udało się dodać peera"); powrót; } } void loop() { // Ustaw wartości do wysłania strcpy(myData.a, "TO JEST ZNAK"); //zapisz "THIS IS A CHAR" do zmiennej a moich "danych" zdefiniowanych wcześniej myData.b = random(1, 20); //zapisz losową wartość myData.c = 1.2; //zapisz element zmiennoprzecinkowy myData.d = "Hello"; //zapisz ciąg myData.e = false; //zapisz wartość bool //Wyślij dane mniejsze lub równe 250 bajtom przez ESP-NOW i zwracaj ich status esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData)); if (result == ESP_OK) { Serial.println("Wysłano z powodzeniem"); } else { Serial.println("Błąd wysyłania danych"); } opóźnienie(2000); }

ESP8266 odbiera dane z ESP32 za pomocą tego kodu.

//Dodaj potrzebne biblioteki

#include //Aby dodać możliwości Wi-Fi w ESP32 #include //Aby uzyskać dostęp do esp teraz funkcje /*zdefiniuj typy danych wielu zmiennych ustrukturyzowanych i przemianuj je wszystkie na struct_message*/ typedef struct struct_message { char a[32]; intb; pływak c; ciąg d; bool e; } struct_message; // Utwórz zmienną struct_message o nazwie myData struct_message myData; // funkcja wywoływana po otrzymaniu danych i wydrukowaniu ich void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) { memcpy(&myData, initialData, sizeof(myData)); Serial.print("Odebrano bajty: "); Serial.println(dł); Serial.print("Znak: "); Serial.println(mojeDane.a); Serial.print("Int: "); Serial.println(mojeDane.b); Serial.print("Liczba zmiennoprzecinkowa: "); Serial.println(mojeDane.c); Serial.print("Ciąg: "); Serial.println(mojeDane.d); Serial.print("Bool: "); Serial.println(mojeDane.e); Serial.println(); } void setup() { //Ustaw szybkość transmisji dla komunikacji szeregowej z ESP Serial.begin(115200); // Ustaw urządzenie jako stację Wi-Fi WiFi.mode(WIFI_STA); //Uruchamia Wi-Fi // Init ESP-NOW i zwraca jego status if (esp_now_init() != 0) { Serial.println("Błąd podczas inicjowania ESP-NOW"); powrót; } esp_now_set_self_role(ESP_NOW_ROLE_SLAVE); //Określa rolę tego esp esp_now_register_recv_cb(OnDataRecv); //wywołanie funkcji OnDataRecv po otrzymaniu danych ESPNOW } void loop() {}

Krok 6: Komunikacja w jedną stronę (ESP8266 jako nadawca)

ESP8266 wysyła dane do ESP32. z tym kodem. Zmień adres rozgłoszeniowy na odpowiedni adres mac odbiorcy. Mój adres esp32 to 30:AE:A4:F5:03:A4. Aby uzyskać inne funkcje dla esp8266, przejdź tutaj

//Dodaj potrzebne biblioteki

#include //Aby dodać możliwości Wi-Fi na ESP32 #include //Aby uzyskać dostęp do esp teraz funkcje //zapisz adres MAC w tablicy o nazwie broadcastAddress; uint8_t adres rozgłoszeniowy = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; /*zdefiniuj typy danych wielu zmiennych ustrukturyzowanych i przemianuj je wszystkie na struct_message*/ typedef struct struct_message { char a[32]; intb; pływak c; ciąg d; bool e; } struct_message; // Utwórz zmienną strukturalną o nazwie myData struct_message myData; // funkcja wywoływana, gdy dane są wysyłane i wyświetla ich status void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) { Serial.print("\r\nStatus ostatniego wysyłania pakietu:\t"); Serial.println(sendStatus == 1 ? "Dostawa powiodła się": "Dostawa nie powiodła się"); } void setup() { //Ustaw szybkość transmisji dla komunikacji szeregowej z ESP Serial.begin(115200); // Ustaw urządzenie jako stację Wi-Fi WiFi.mode(WIFI_STA);//Uruchamia Wi-Fi // Init ESP-NOW i zwraca jego status if (esp_now_init()) { Serial.println("Błąd podczas inicjalizacji ESP-NOW"); powrót; } esp_now_register_send_cb(OnDataSent); //wywołaj funkcję OnDataSent po wysłaniu danych ESPNOW //Dodaj urządzenie do listy sparowanych urządzeń if (esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_CONTROLLER, 1, NULL, 0)){ Serial.println("Nie udało się dodać peera"); powrót; } } void loop() { // Ustaw wartości do wysłania strcpy(myData.a, "TO JEST ZNAK"); //zapisz "THIS IS A CHAR" do zmiennej a moich "danych" zdefiniowanych wcześniej myData.b = random(1, 20); //zapisz losową wartość myData.c = 1.2; //zapisz element zmiennoprzecinkowy myData.d = "SP8266"; //zapisz ciąg myData.e = false; //zapisz wartość logiczną //Wyślij dane mniejsze lub równe 250 bajtom przez ESP-NOW i zwracaj ich status int result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData)); if (esp_now_init() != 0) { Serial.println("Wysłano z powodzeniem"); } else { Serial.println("Błąd wysyłania danych"); } opóźnienie(2000); }

ESP32 odbiera dane z ESP8266. z tym kodem. Inne funkcje znajdziesz tutaj

//Dodaj potrzebne biblioteki

#include //Aby uzyskać dostęp do esp teraz działa #include //Aby dodać możliwości Wi-Fi w ESP32 /*zdefiniuj typy danych wielu zmiennych ustrukturyzowanych i przemianuj je na struct_message*/ typedef struct struct_message { char a[32]; intb; pływak c; ciąg d; bool e; } struct_message; // Utwórz zmienną struct_message o nazwie myData struct_message myData; // funkcja wywoływana, gdy dane są odbierane i drukuje je void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) { memcpy(&myData, initialData, sizeof(myData)); Serial.print("Odebrano bajty: "); Serial.println(dł); Serial.print("Znak: "); Serial.println(mojeDane.a); Serial.print("Int: "); Serial.println(mojeDane.b); Serial.print("Liczba zmiennoprzecinkowa: "); Serial.println(mojeDane.c); Serial.print("Ciąg: "); Serial.println(mojeDane.d); Serial.print("Bool: "); Serial.println(mojeDane.e); Serial.println(); } void setup() { //Ustaw szybkość transmisji dla komunikacji szeregowej z ESP Serial.begin(115200); // Ustaw urządzenie jako stację Wi-Fi WiFi.mode(WIFI_STA); //Uruchamia Wi-Fi // Init ESP-NOW i zwraca jego status if (esp_now_init() != 0) { Serial.println("Błąd podczas inicjowania ESP-NOW"); powrót; } esp_now_register_recv_cb(OnDataRecv); //wywołanie funkcji OnDataRecv po otrzymaniu danych ESPNOW } void loop() {}

Krok 7: DWUSTRONNA KOMUNIKACJA

DWUKIERUNKOWA KOMUNIKACJA
DWUKIERUNKOWA KOMUNIKACJA
DWUKIERUNKOWA KOMUNIKACJA
DWUKIERUNKOWA KOMUNIKACJA

ESP32 wysyła dane przy starcie do ESP8266. ESP8266 drukuje odebraną wiadomość, a następnie odpowiedzi, na które ESP32 drukuje na swoim monitorze szeregowym.

KOD ESP32

//Dodaj potrzebne biblioteki

#include //Aby uzyskać dostęp do esp teraz działa #include //Aby dodać możliwości Wi-Fi w ESP32 //zapisz adres MAC w tablicy o nazwie broadcastAddress; uint8_t adres rozgłoszeniowy = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; //Adres MAC mojego odbiornika /*zdefiniuj typy danych wielu zmiennych ustrukturyzowanych i zmień ich nazwy na struct_message*/ typedef struct struct_message { char a[32]; intb; pływak c; ciąg d; bool e; } struct_message; // Utwórz struct_message o nazwie myData struct_message myData; // funkcja wywoływana, gdy dane są wysyłane w celu wydrukowania ich statusu void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { Serial.print("\r\nStatus ostatniego wysyłania pakietu:\t"); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Powodzenie dostawy": "Niepowodzenie dostawy"); if(status!=ESP_NOW_SEND_SUCCESS){send_data();} } void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) { memcpy(&myData, initialData, sizeof(myData)); Serial.print("Odebrano bajty: "); Serial.println(dł); Serial.print("Znak: "); Serial.println(mojeDane.a); Serial.print("Int: "); Serial.println(mojeDane.b); Serial.print("Liczba zmiennoprzecinkowa: "); Serial.println(mojeDane.c); Serial.print("Ciąg: "); Serial.println(mojeDane.d); Serial.print("Bool: "); Serial.println(mojeDane.e); Serial.println(); } void setup() { //Ustaw szybkość transmisji dla komunikacji szeregowej z ESP Serial.begin(115200); // Ustaw urządzenie jako stację Wi-Fi WiFi.mode(WIFI_STA);//Uruchamia Wi-Fi // Init ESP-NOW i zwraca jego status if (esp_now_init() != ESP_OK) { Serial.println("Błąd podczas inicjalizacji ESP -TERAZ"); powrót; } //wywołanie funkcji OnDataSent po przesłaniu danych ESPNOW esp_now_register_send_cb(OnDataSent); // Zarejestruj peera esp_now_peer_info_t peerInfo; //zainicjuj i przypisz informacje o peerach jako wskaźnik do adresu memcpy(peerInfo.peer_addr, broadcastAddress, 6); //skopiuj wartość broadcastAddress z 6 bajtami do peerInfo.peer_addr peerInfo.channel = 0; //kanał, na którym rozmawiają esp. 0 oznacza niezdefiniowany i dane będą wysyłane na bieżącym kanale.1-14 to prawidłowe kanały, które są takie same jak w przypadku lokalnego urządzenia peerInfo.encrypt = false; //niezaszyfrowane //Dodaj urządzenie do listy sparowanych urządzeń if (esp_now_add_peer(&peerInfo) != ESP_OK){ Serial.println("Nie udało się dodać peera"); powrót; } esp_now_register_recv_cb(OnDataRecv); //wywołanie funkcji OnDataRecv po odebraniu danych ESPNOW send_data(); } void loop() {} void send_data(){ Serial.println("Wysyłanie"); // Ustaw wartości do wysłania strcpy(myData.a, "TO JEST ZNAK"); //zapisz "THIS IS A CHAR" do zmiennej a moich "danych" zdefiniowanych wcześniej myData.b = random(1, 20); //zapisz losową wartość myData.c = 1.2; //zapisz pływak myData.d = "ESP32"; //zapisz ciąg myData.e = false; //zapisz wartość bool //Wyślij dane mniejsze lub równe 250 bajtom przez ESP-NOW i zwracaj ich status esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData)); if (result == ESP_OK) { Serial.println("Wysłano z powodzeniem");} else { Serial.println("Błąd wysyłania danych"); } }

ESP8266 KOD

//Dodaj potrzebne biblioteki

#include //Aby dodać możliwości Wi-Fi na ESP32 #include //Aby uzyskać dostęp do esp teraz funkcje //zapisz adres MAC w tablicy o nazwie broadcastAddress; uint8_t adres rozgłoszeniowy = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; /*zdefiniuj typy danych wielu zmiennych ustrukturyzowanych i przemianuj je wszystkie na struct_message*/ typedef struct struct_message { char a[32]; intb; pływak c; ciąg d; bool e; } struct_message; // Utwórz zmienną struct_message o nazwie myData struct_message myData; // funkcja wywoływana po otrzymaniu danych i wydrukowaniu ich void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) { memcpy(&myData, initialData, sizeof(myData)); Serial.print("Odebrano bajty: "); Serial.println(dł); Serial.print("Znak: "); Serial.println(mojeDane.a); Serial.print("Int: "); Serial.println(mojeDane.b); Serial.print("Liczba zmiennoprzecinkowa: "); Serial.println(mojeDane.c); Serial.print("Ciąg: "); Serial.println(mojeDane.d); Serial.print("Bool: "); Serial.println(mojeDane.e); Serial.println(); Wyślij dane(); } void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) { Serial.print("\r\nStatus ostatniego wysłania pakietu:\t"); Serial.println(sendStatus == 1 ? "Dostawa powiodła się": "Dostawa nie powiodła się"); if(sendStatus !=1){ send_data(); } } void send_data(){ // Ustaw wartości do wysłania strcpy(myData.a, "TO JEST ZNAK"); //zapisz "THIS IS A CHAR" do zmiennej a moich "danych" zdefiniowanych wcześniej myData.b = random(1, 20); //zapisz losową wartość myData.c = 1.2; //zapisz element zmiennoprzecinkowy myData.d = "ESP8266"; //zapisz ciąg myData.e = false; //zapisz wartość logiczną esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData)); } void setup() { //Ustaw szybkość transmisji dla komunikacji szeregowej z ESP Serial.begin(115200); // Ustaw urządzenie jako stację Wi-Fi WiFi.mode(WIFI_STA); //Uruchamia Wi-Fi // Init ESP-NOW i zwraca jego status if (esp_now_init() != 0) { Serial.println("Błąd podczas inicjowania ESP-NOW"); powrót; } if (esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0)){ Serial.println("Nie udało się dodać peera"); powrót; } esp_now_set_self_role(ESP_NOW_ROLE_COMBO); esp_now_register_send_cb (OnDataSent); esp_now_set_self_role (ESP_NOW_ROLE_COMBO); //Określa rolę tego esp esp_now_register_recv_cb(OnDataRecv); //wywołanie funkcji OnDataRecv po otrzymaniu danych ESPNOW } void loop() {}

Krok 8: REFERENCJE

ESPNOW_32_Przykład

ESPNOW_8266 Przykład

WIFI.h

ESP8266WiFi.h

esp_now.h dla ESP8266

esp_now.h dla ESP32

esp_now oficjalny dokument (lepsze wyjaśnienie funkcji)

Oficjalny przewodnik ESP-NOW

Zalecana: