Spisu treści:
- Kieszonkowe dzieci
- Krok 1: Uzyskaj adres Mac tablicy
- Krok 2: Jak sprawić, by ESP-TERAZ działał?
- Krok 3: FUNKCJE ESP-NOW (ESP32)
- Krok 4: FUNKCJE ESP-NOW (ESP8266)
- Krok 5: Komunikacja w jedną stronę (ESP32 jako nadawca)
- Krok 6: Komunikacja w jedną stronę (ESP8266 jako nadawca)
- Krok 7: DWUSTRONNA KOMUNIKACJA
- Krok 8: REFERENCJE
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-23 15:02
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
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ć:
- Dołącz teraz esp i biblioteki Wi-Fi
- Zapisz adres mac odbiorcy ESP
- Zdefiniuj strukturę danych wysyłanej/odbieranej wiadomości
- W konfiguracji ustaw Wi-Fi w trybie stacji
- Zainicjuj esp_now
- wykonać i zarejestrować funkcję oddzwaniania wywoływaną po wysłaniu i odebraniu danych
- W przypadku Esp8266 określ jego rolę
- zarejestruj partnera lub odbiorcę, esp
- 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
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:
Kontrolowanie Led przez aplikację Blynk za pomocą Nodemcu przez Internet: 5 kroków
Sterowanie Led przez aplikację Blynk za pomocą Nodemcu przez Internet: Witam wszystkich Dzisiaj pokażemy Ci, jak sterować diodą LED za pomocą smartfona przez Internet
Zrób to sam -- Jak zrobić pająka, którym można sterować za pomocą smartfona za pomocą Arduino Uno: 6 kroków
Zrób to sam || Jak zrobić robota-pająka, którym można sterować za pomocą smartfona za pomocą Arduino Uno: Podczas tworzenia robota-pająka można nauczyć się wielu rzeczy o robotyce. Podobnie jak tworzenie robotów jest zarówno zabawne, jak i trudne. W tym filmie pokażemy, jak zrobić robota Spider, którym możemy sterować za pomocą naszego smartfona (Androi
Jak odczytać wiele wartości analogowych za pomocą jednego pinu analogowego: 6 kroków (ze zdjęciami)
Jak odczytać wiele wartości analogowych za pomocą jednego pinu analogowego: W tym samouczku pokażę, jak odczytać wiele wartości analogowych za pomocą tylko jednego analogowego pinu wejściowego
Wiele czujników BMP280 w Arduino Uno przez SPI: 6 kroków
Wiele czujników BMP280 w Arduino Uno przez SPI: W tym samouczku połączymy trzy BMP280 na Arduino Uno przez SPI, ale możesz podłączyć do ośmiu BMP280 na Uno za pomocą portów cyfrowych D3 do D10 jako nSS (Slave Select) dla każdego czujnika. próbek ciśnienia atmosferycznego mierzonych przez B
Pierwsze kroki z ESP32 CAM - Przesyłanie strumieniowe wideo za pomocą ESP CAM przez Wifi - Projekt kamery bezpieczeństwa ESP32: 8 kroków
Pierwsze kroki z ESP32 CAM | Przesyłanie strumieniowe wideo za pomocą ESP CAM przez Wifi | Projekt kamery bezpieczeństwa ESP32: Dzisiaj dowiemy się, jak korzystać z tej nowej płyty ESP32 CAM i jak możemy ją zakodować i użyć jako kamery bezpieczeństwa i uzyskać strumieniowe wideo przez Wi-Fi