Სარჩევი:

როგორ გააკეთოთ მრავალჯერადი ESP საუბარი ESP-NOW– ით ESP32 და ESP8266 გამოყენებით: 8 ნაბიჯი
როგორ გააკეთოთ მრავალჯერადი ESP საუბარი ESP-NOW– ით ESP32 და ESP8266 გამოყენებით: 8 ნაბიჯი

ვიდეო: როგორ გააკეთოთ მრავალჯერადი ESP საუბარი ESP-NOW– ით ESP32 და ESP8266 გამოყენებით: 8 ნაბიჯი

ვიდეო: როგორ გააკეთოთ მრავალჯერადი ESP საუბარი ESP-NOW– ით ESP32 და ESP8266 გამოყენებით: 8 ნაბიჯი
ვიდეო: Diabetic Autonomic Neuropathies 2024, ივლისი
Anonim
როგორ გააკეთოთ მრავალჯერადი ESP საუბარი ESP-NOW– ით ESP32 და ESP8266 გამოყენებით
როგორ გააკეთოთ მრავალჯერადი ESP საუბარი ESP-NOW– ით ESP32 და ESP8266 გამოყენებით

ჩემს მიმდინარე პროექტზე, მე მჭირდება მრავალი ESP, რომ ვისაუბროთ ერთმანეთთან როუტერის გარეშე. ამისათვის მე ვიყენებ ESP-NOW– ს, რათა უკაბელო კომუნიკაცია მოხდეს ერთმანეთთან როუტერის გარეშე ESP– ზე.

მარაგები

ნივთები, რომლებიც მე გამოვიყენე:

ESP32 DEV მოდული

NODEMCU 1.0 (ESP12E მოდული)

ნაბიჯი 1: მიიღეთ დაფის Mac მისამართი

მიიღეთ დაფის Mac მისამართი
მიიღეთ დაფის Mac მისამართი
მიიღეთ დაფის Mac მისამართი
მიიღეთ დაფის Mac მისამართი

ESP– ახლა, ESP მოწყობილობები ესაუბრებიან ერთმანეთს მონაცემების გაგზავნით მათ უნიკალურ მისამართზე, ხოლო დაკავშირებულია შიდა წვდომის წერტილების ქსელთან, რომელიც შექმნილია esp– ს ინტილაციის დროს. რა ამრიგად, განსაზღვრეთ თითოეული მოწყობილობის MAC მისამართი. მიმაგრებულია ჩემი ESP32 და ESP8266 დაფის პარამეტრები

ESP32- ისთვის

#მოიცავს "WiFi.h" // ESP32 WIFI შესაძლებლობებზე წვდომისათვის

void setup () {Serial.begin (115200); Serial.print ("ESP32 Board MAC მისამართი:"); Serial.println (WiFi.macAddress ()); // ბეჭდავს თავის MAC მისამართს} void loop () {}

ESP8266- ისთვის

#მოიცავს // ბიბლიოთეკა გამოიყენება ESP8266 WIFI შესაძლებლობებზე წვდომისათვის

void setup () {Serial.begin (115200); Serial.println (); Serial.print ("ESP8266 Board MAC მისამართი:"); Serial.println (WiFi.macAddress ()); // ბეჭდავს თავის MAC მისამართს} void loop () {}

ჩემი MAC მისამართია:

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

ნაბიჯი 2: როგორ გახადოთ ESP-NOW მუშაობა

აქ არის მიმოხილვა, თუ როგორ უნდა იმუშაოს იგი:

  1. ჩართეთ esp ახლა და wifi ბიბლიოთეკები
  2. შეინახეთ მიმღების ESP Mac მისამართი
  3. განსაზღვრეთ გაგზავნილი/მიღებული შეტყობინების მონაცემთა სტრუქტურა
  4. დაყენებისას, დააყენეთ wifi სადგურის რეჟიმში
  5. ინიციალიზაცია esp_now
  6. გააკეთეთ და დაარეგისტრირეთ ზარის დაბრუნების ფუნქცია, რომელსაც უწოდებენ მონაცემების გაგზავნისა და მიღების შემდეგ
  7. Esp8266– ისთვის განსაზღვრეთ მისი როლი
  8. დაარეგისტრირეთ თანატოლი ან მიმღები esp
  9. მონაცემების გაგზავნა

ნაბიჯი 3: ESP-NOW FUNCTIONS (ESP32)

esp_now_init (ბათილია)

Დაბრუნების:

  • ESP_OK: წარმატებას მიაღწევ
  • ESP_ERR_ESPNOW_INTERNAL: შიდა შეცდომა

აღწერა:

ESPNOW ფუნქციის ინიციალიზაცია

esp_now_register_send_cb (cb)

აბრუნებს:

  • ESP_OK: წარმატებას მიაღწევ
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW არ არის ინიციალიზებული
  • ESP_ERR_ESPNOW_INTERNAL: შიდა შეცდომა

Პარამეტრები:

  • cb: გამოძახების ფუნქციის სახელი ESPNOW მონაცემების გაგზავნის შემდეგ ამ პარამეტრებით:

    • ბათილი cb (const uint8_t *mac_addr, esp_now_send_status_t სტატუსი)

      • mac_addr: მიმღების mac მისამართი
      • სტატუსი:

        • 1 = წარმატება
        • 0 = მარცხი

აღწერა:

დარეკეთ ფუნქცია OnDataSent ESPNOW მონაცემების გაგზავნის შემდეგ

esp_now_add_peerconst esp_now_peer_info_t *თანატოლი)

აბრუნებს:

  • ESP_OK: წარმატებას მიაღწევ
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW არ არის ინიციალიზებული
  • ESP_ERR_ESPNOW_ARG: არასწორი არგუმენტი
  • ESP_ERR_ESPNOW_FULL: თანატოლების სია სავსეა
  • ESP_ERR_ESPNOW_NO_MEM: მეხსიერება ამოწურულია
  • ESP_ERR_ESPNOW_EXIST: თანატოლი არსებობს

Პარამეტრები:

  • თანატოლები: თანატოლების ინფორმაცია შემდეგი მონაცემებით:

    • uint8_t

      peer_addr [ESP_NOW_ETH_ALEN]; ESPNOW თანხმობა MAC მისამართი, რომელიც ასევე არის სადგურის ან პროგრამის MAC მისამართი

    • uint8_t lmk [ESP_NOW_KEY_LEN]

      ESPNOW თანხმობა ადგილობრივი სამაგისტრო გასაღები, რომელიც გამოიყენება მონაცემთა დასაშიფრად

    • uint8_t არხი

      Wi-Fi არხი, რომელსაც თანატოლი იყენებს ESPNOW მონაცემების გასაგზავნად/მისაღებად. თუ მნიშვნელობა არის 0, გამოიყენეთ მიმდინარე არხი, რომელ სადგურზე ან პროგრამულ უზრუნველყოფაზეა ჩართული. წინააღმდეგ შემთხვევაში, ის უნდა იყოს მითითებული, როგორც არხი, რომელზეც არის სადგური ან პროგრამული უზრუნველყოფა

    • wifi_interface_t ifidx

      Wi-Fi ინტერფეისი, რომელსაც თანატოლი იყენებს ESPNOW მონაცემების გასაგზავნად/მისაღებად

    • ბულის დაშიფვრა

      ESPNOW მონაცემები, რომელსაც ეს თანატოლი აგზავნის/იღებს არის დაშიფრული თუ არა

    • ბათილია *კერძო

      ESPNOW თანხმობის პირადი მონაცემები

აღწერა:

დაამატეთ თანატოლები თანატოლების სიაში

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

აბრუნებს:

  • ESP_OK: წარმატებას მიაღწევ
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW არ არის ინიციალიზებული
  • ESP_ERR_ESPNOW_ARG: არასწორი არგუმენტი
  • ESP_ERR_ESPNOW_INTERNAL: შიდა შეცდომა
  • ESP_ERR_ESPNOW_NO_MEM: მეხსიერება ამოწურულია
  • ESP_ERR_ESPNOW_NOT_FOUND: თანატოლი ვერ მოიძებნა
  • ESP_ERR_ESPNOW_IF: მიმდინარე WiFi ინტერფეისი არ ემთხვევა თანატოლების ინტერფეისს

Პარამეტრები:

  • peer_addr: თანხმობა MAC მისამართი
  • მონაცემები: მონაცემები გასაგზავნად
  • len: მონაცემების სიგრძე

აღწერა:

გაგზავნეთ ESPNOW მონაცემები. ზოგიერთ შემთხვევაში, ეს ხდება:

  • თუ peer_addr არ არის NULL, გაუგზავნეთ მონაცემები თანატოლს, რომლის MAC მისამართი ემთხვევა peer_addr
  • თუ peer_addr არის NULL, გაგზავნეთ მონაცემები ყველა თანატოლთან, რომლებიც დაემატება თანატოლთა სიას
  • მონაცემთა მაქსიმალური სიგრძე უნდა იყოს ESP_NOW_MAX_DATA_LEN- ზე ნაკლები
  • მონაცემთა არგუმენტით მითითებული ბუფერი არ უნდა იყოს ძალაში esp_now_send დაბრუნების შემდეგ

esp_now_register_recv_cb (cb)

აბრუნებს:

  • ESP_OK: წარმატებას მიაღწევ
  • ESP_ERR_ESPNOW_NOT_INIT: ESPNOW არ არის ინიციალიზებული
  • ESP_ERR_ESPNOW_INTERNAL: შიდა შეცდომა

Პარამეტრები:

  • cb: გამოძახების ფუნქცია ESPNOW მონაცემების მისაღებად

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

      • mac_addr:

        მიმღების mac მისამართი

      • *მონაცემები:

        მონაცემების მიღება

      • data_len

        მონაცემთა ბაიტის სიგრძე

აღწერა:

დარეკეთ ფუნქცია cb ESPNOW მონაცემების მიღების შემდეგ

ნაბიჯი 4: ESP-NOW FUNCTIONS (ESP8266)

ფუნქციები აღწერილობა ESP32 ESP8266

int esp_now_init (ბათილია)

აბრუნებს:

  • 1 = წარმატება
  • 0 = მარცხი

აღწერა

ESPNOW ფუნქციის ინიციალიზაცია

int esp_now_set_self_role (u8 როლი)

Პარამეტრები:

  • ESP_NOW_ROLE_IDLE: მონაცემთა გადაცემა დაუშვებელია.
  • ESP_NOW_ROLE_CONTROLLER: პრიორიტეტი ენიჭება Sation ინტერფეისს
  • ESP_NOW_ROLE_SLAVE: პრიორიტეტი ენიჭება SoftAP ინტერფეისს
  • ESP_NOW_ROLE_COMBO: პრიორიტეტი ენიჭება SoftAPinterface

აღწერა

ადგენს მოწყობილობის როლს

int esp_now_register_send_cb (cb)

აბრუნებს:

  • 1 = წარმატება
  • 0 = მარცხი

Პარამეტრები:

  • cb: გამოძახების ფუნქციის სახელი ESPNOW მონაცემების გაგზავნის შემდეგ ამ პარამეტრებით:

    • ბათილი cb (const uint8_t *mac_addr, esp_now_send_status_t სტატუსი)

      • mac_addr: მიმღების mac მისამართი
      • სტატუსი:

        • 1 = წარმატება
        • 0 = მარცხი

აღწერა

დარეკეთ ფუნქცია OnDataSent ESPNOW მონაცემების გაგზავნის შემდეგ

int esp_now_add_peer (u8 *mac_addr, u8 როლი, u8 არხი, u8 *გასაღები, u8 key_len)

აბრუნებს:

  • 1 = წარმატება
  • 0 = მარცხი

Პარამეტრები:

  • mac_addr

    თანატოლის მაკ მისამართი

  • როლი
  • არხი

    თუ მნიშვნელობა არის 0, გამოიყენეთ მიმდინარე არხი, რომელ სადგურზე ან პროგრამულ უზრუნველყოფაზეა ჩართული. წინააღმდეგ შემთხვევაში, ის უნდა იყოს მითითებული, როგორც არხი, რომელზეც არის სადგური ან პროგრამული უზრუნველყოფა

  • *გასაღები

    გასაღები დაშიფვრისთვის

  • გასაღები_ლენ

    გასაღების სიგრძე

აღწერა:

დაამატეთ თანატოლები თანატოლების სიაში

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

აბრუნებს:

  • 1 = წარმატება
  • 0 = მარცხი

Პარამეტრები:

  • peer_addr: თანხმობა MAC მისამართი
  • მონაცემები: მონაცემები გასაგზავნად
  • len: მონაცემების სიგრძე

აღწერა:

გაგზავნეთ ESPNOW მონაცემები. ზოგიერთ შემთხვევაში, ეს ხდება:

  • თუ peer_addr არ არის NULL, გაუგზავნეთ მონაცემები თანატოლს, რომლის MAC მისამართი ემთხვევა peer_addr
  • თუ peer_addr არის NULL, გაგზავნეთ მონაცემები ყველა თანატოლთან, რომლებიც დაემატება თანატოლთა სიას
  • მონაცემთა მაქსიმალური სიგრძე უნდა იყოს ESP_NOW_MAX_DATA_LEN- ზე ნაკლები
  • მონაცემთა არგუმენტით მითითებული ბუფერი არ უნდა იყოს ძალაში esp_now_send დაბრუნების შემდეგ

int esp_now_register_recv_cb (cb)

აბრუნებს:

  • 1 = წარმატება
  • 0 = მარცხი

Პარამეტრები:

  • cb: გამოძახების ფუნქცია ESPNOW მონაცემების მისაღებად

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

      • mac_addr:

        მიმღების mac მისამართი

      • *მონაცემები:

        მონაცემების მიღება

      • data_len

        მონაცემთა ბაიტის სიგრძე

აღწერა:

დარეკეთ ფუნქცია cb ESPNOW მონაცემების მიღების შემდეგ

ნაბიჯი 5: ცალმხრივი კომუნიკაცია (ESP32 როგორც გამგზავნი)

ESP32 აგზავნის მონაცემებს ESP8266– ზე. ამ კოდით. შეცვალეთ broadcastAddress თქვენი მიმღების მიმღების mac მისამართით. ჩემი იყო A4: CF: 12: C7: 9C: 77

// საჭირო ბიბლიოთეკების დამატება

#მოიცავს // esp– ს წვდომისათვის ახლა შედის ფუნქციები #მოიცავს // დაამატეთ WIFI შესაძლებლობები ESP32– ზე // შეინახეთ MAC მისამართი მასივში სახელად broadcastAddress; uint8_t მაუწყებლობის მისამართი = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; // ჩემი მიმღების MAC მისამართი/*განსაზღვრავს მრავალი ცვლადის მონაცემთა ტიპს, რომელიც სტრუქტურირებულია და დაერქვა ყველა მას, როგორც struct_message*/typedef struct struct_message {char a [32]; int ბ; float c; სიმებიანი დ; bool e; } struct_message; // შექმნა სტრუქტური_მოწერა, სახელწოდებით myData struct_message myData; // ფუნქცია იძახება, როდესაც მონაცემები იგზავნება დასაბეჭდად მისი სტატუსი void OnDataSent (const uint8_t *mac_addr, esp_now_send_status_t სტატუსი) {Serial.print ("\ r / n ბოლო პაკეტის გაგზავნის სტატუსი: / t"); Serial.println (სტატუსი == ESP_NOW_SEND_SUCCESS? "მიწოდება წარმატებულია": "მიწოდება ვერ მოხერხდა"); } void setup () {// დააყენეთ baud განაკვეთი სერიული კომუნიკაციისთვის ESP Serial.begin (115200); // მოწყობილობის დაყენება Wi-Fi სადგურის WiFi.mode (WIFI_STA); // იწყებს wifi // იწყებს ESP-NOW და უბრუნებს თავის სტატუსს თუ (esp_now_init ()! = ESP_OK) {Serial.println ("ESP ინიციალიზაციის შეცდომა -ახლა "); დაბრუნების; } // დარეკეთ ფუნქცია OnDataSent ESPNOW მონაცემების გაგზავნის შემდეგ esp_now_register_send_cb (OnDataSent); // რეგისტრაცია peer esp_now_peer_info_t peerInfo; // ინიციალიზაცია და თანატოლების ინფორმაციის მიმანიშნებლის მინიჭება ადრესატების მემკვიდრეობისათვის (peerInfo.peer_addr, broadcastAddress, 6); // დააკოპირეთ broadcastAddress- ის მნიშვნელობა 6 ბაიტით peerInfo.peer_addr peerInfo.channel = 0; // არხი, რომელზეც ესპ ლაპარაკია. 0 ნიშნავს განუსაზღვრელს და მონაცემები გაიგზავნება მიმდინარე არხზე. 1-14 არის მოქმედი არხები, რაც იგივეა რაც ადგილობრივ მოწყობილობასთან peerInfo.encrypt = false; // დაშიფრული არ არის // დაამატეთ მოწყობილობა დაწყვილებული მოწყობილობების სიაში, თუ (esp_now_add_peer (& peerInfo)! = ESP_OK) {Serial.println ("თანატოლის დამატება ვერ მოხერხდა"); დაბრუნების; }} void loop () {// დააყენეთ მნიშვნელობები strcpy– ის გასაგზავნად (myData.a, "THIS IS A CHAR"); // შეინახეთ "THAR IS CHAR" ჩემი myData.b = ადრე განსაზღვრული ჩემი "მონაცემების" ცვლადში. b = შემთხვევითი (1, 20); // შეინახეთ შემთხვევითი მნიშვნელობა myData.c = 1.2; // float myData.d = "გამარჯობა" შენახვა; // შეინახეთ სტრიქონი myData.e = false; // შეინახეთ bool // გაგზავნეთ მონაცემები ნაკლები ან ტოლი 250 ბაიტი ESP-NOW– ით და უბრუნებს მის სტატუსს esp_err_t result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (შედეგი == ESP_OK) {Serial.println ("გაიგზავნა წარმატებით"); } else {Serial.println ("მონაცემთა გაგზავნის შეცდომა"); } დაყოვნება (2000); }

ESP8266 იღებს მონაცემებს ESP32– დან ამ კოდის გამოყენებით.

// საჭირო ბიბლიოთეკების დამატება

#მოიცავს // ESP32– ზე Wifi შესაძლებლობების დასამატებლად #ჩართეთ // esp– ს წვდომისთვის ფუნქციები /*განსაზღვრავს მრავალი ცვლადის მონაცემთა ტიპს სტრუქტურირებული და გადაარქვეს ამ ყველაფერში, როგორც სტრუქტური_მესიჯი* /typedef struct სტრუქტურული_მოწერა {char a [32]; int ბ; float c; სიმებიანი დ; bool e; } struct_message; // შექმენით ცვლადი struct_message სახელწოდებით myData struct_message myData; // ფუნქცია იძახება მონაცემების მიღებისას და ბეჭდავს მას ბათილად OnDataRecv (uint8_t * mac, uint8_t * incomingData, uint8_t len) {memcpy (& myData, incomingData, sizeof (myData)); Serial.print ("მიღებული ბიტი:"); სერიული. ბეჭდვა (ლენ); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("სიმებიანი:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); } void setup () {// დააყენეთ baud განაკვეთი სერიული კომუნიკაციისთვის ESP Serial.begin (115200); // მოწყობილობის დაყენება Wi-Fi სადგურის WiFi.mode (WIFI_STA); // იწყებს wifi- ს // იწყებს ESP-NOW და უბრუნებს თავის სტატუსს if (esp_now_init ()! = 0) {Serial.println ("ESP-NOW inicialization error"); დაბრუნების; } esp_now_set_self_role (ESP_NOW_ROLE_SLAVE); // განსაზღვრავს ამ esp- ის როლს esp_now_register_recv_cb (OnDataRecv); // დარეკეთ ფუნქცია OnDataRecv ESPNOW მონაცემების მიღების შემდეგ} void loop () {}

ნაბიჯი 6: ცალმხრივი კომუნიკაცია (ESP8266 როგორც გამგზავნი)

ESP8266 აგზავნის მონაცემებს ESP32– ზე. ამ კოდით. შეცვალეთ broadcastAddress თქვენი მიმღების მიმღების mac მისამართით. ჩემი esp32 მისამართი არის 30: AE: A4: F5: 03: A4. Esp8266– ის სხვა ფუნქციებისთვის გადადით აქ

// საჭირო ბიბლიოთეკების დამატება

#მოიცავს // რომ დაამატოთ Wifi შესაძლებლობები ESP32 #include // წვდომა esp- ის ფუნქციებზე // შეინახეთ MAC მისამართი მასივში, სახელად broadcastAddress; uint8_t მაუწყებლობის მისამართი = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; /*განსაზღვრავს მრავალი ცვლადის მონაცემთა ტიპს, რომელიც სტრუქტურირებულია და დაარქვეს ყველა მათგანს სტრუქტური_მომხსენებლად*/ typedef struct სტრუქტურირებული შეტყობინება {char a [32]; int ბ; float c; სიმებიანი დ; bool e; } struct_message; // სტრუქტურირებული ცვლადის შექმნა myData struct_message myData; // ფუნქცია იძახება მონაცემების გაგზავნისას და დაბეჭდეთ მისი სტატუსი void OnDataSent (uint8_t *mac_addr, uint8_t sendStatus) {Serial.print ("\ r / n ბოლო პაკეტის გაგზავნის სტატუსი: / t"); Serial.println (sendStatus == 1? "მიწოდება წარმატებულია": "მიწოდება ვერ ხერხდება"); } void setup () {// დააყენეთ baud განაკვეთი სერიული კომუნიკაციისთვის ESP Serial.begin (115200); // მოწყობილობის დაყენება Wi-Fi სადგურის WiFi.mode (WIFI_STA); // იწყებს wifi // იწყებს ESP-NOW და უბრუნებს თავის სტატუსს, თუ (esp_now_init ()) {Serial.println ("ESP-NOW ინიციალიზაციის შეცდომა"); დაბრუნების; } esp_now_register_send_cb (OnDataSent); // დარეკეთ ფუნქცია OnDataSent ESPNOW მონაცემების გაგზავნის შემდეგ // დაამატეთ მოწყობილობა დაწყვილებული მოწყობილობების სიაში, თუ (esp_now_add_peer (broadcastAddress, ESP_NOW_ROLE_CONTROLLER, 1, NULL, 0)) {Serial.println ("თანატოლის დამატება ვერ მოხერხდა"); დაბრუნების; }} void loop () {// დააყენეთ მნიშვნელობები strcpy– ს გასაგზავნად (myData.a, "THIS IS A CHAR"); // შეინახეთ "THAR IS CHAR" ჩემი myData.b = ადრე განსაზღვრული ჩემი "მონაცემების" ცვლადში. b = შემთხვევითი (1, 20); // შეინახეთ შემთხვევითი მნიშვნელობა myData.c = 1.2; // შეინახეთ float myData.d = "SP8266"; // შეინახეთ სტრიქონი myData.e = false; // შენახვა bool // მონაცემების გაგზავნა 250 ბაიტზე ნაკლები ან ტოლი ESP-NOW– ით და აბრუნებს მის სტატუსს int result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (esp_now_init ()! = 0) {Serial.println ("წარმატებით გაიგზავნა"); } else {Serial.println ("მონაცემთა გაგზავნის შეცდომა"); } დაყოვნება (2000); }

ESP32 იღებს მონაცემებს ESP8266– დან. ამ კოდით. სხვა ფუნქციებისათვის მიმართეთ აქ

// საჭირო ბიბლიოთეკების დამატება

#ჩართვა // წვდომა esp- ის ფუნქციებზე #include // რომ დაამატოთ Wifi შესაძლებლობები ESP32- ზე /*განსაზღვრეთ მრავალი ცვლადის მონაცემთა ტიპები სტრუქტურირებული და გადაარქვათ ყველა მათგან struct_message* /typedef struct struct_message {char a [32]; int ბ; float c; სიმებიანი დ; bool e; } struct_message; // შექმენით ცვლადი struct_message სახელწოდებით myData struct_message myData; // ფუნქცია იძახება მონაცემების მიღებისას და ბეჭდავს მას ბათილად OnDataRecv (const uint8_t * mac, const uint8_t * incomingData, int len) {memcpy (& myData, incomingData, sizeof (myData)); Serial.print ("მიღებული ბიტი:"); სერიული. ბეჭდვა (ლენ); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("სიმებიანი:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); } void setup () {// დააყენეთ baud განაკვეთი სერიული კომუნიკაციისთვის ESP Serial.begin (115200); // მოწყობილობის დაყენება Wi-Fi სადგურის WiFi.mode (WIFI_STA); // იწყებს wifi- ს // იწყებს ESP-NOW და უბრუნებს თავის სტატუსს if (esp_now_init ()! = 0) {Serial.println ("ESP-NOW inicialization error"); დაბრუნების; } esp_now_register_recv_cb (OnDataRecv); // დარეკეთ ფუნქცია OnDataRecv ESPNOW მონაცემების მიღების შემდეგ} void loop () {}

ნაბიჯი 7: ორმხრივი კომუნიკაცია

ორმხრივი კომუნიკაცია
ორმხრივი კომუნიკაცია
ორმხრივი კომუნიკაცია
ორმხრივი კომუნიკაცია

ESP32 აგზავნის მონაცემებს გაშვების შესახებ ESP8266- ში. ESP8266 ბეჭდავს მიღებულ შეტყობინებას და შემდეგ პასუხობს ESP32 ბეჭდავს თავის სერიულ მონიტორზე.

ESP32 კოდი

// საჭირო ბიბლიოთეკების დამატება

#მოიცავს // esp– ს წვდომისათვის ახლა შედის ფუნქციები #მოიცავს // დაამატეთ WIFI შესაძლებლობები ESP32– ზე // შეინახეთ MAC მისამართი მასივში სახელად broadcastAddress; uint8_t მაუწყებლობის მისამართი = {0xA4, 0xCF, 0x12, 0xC7, 0x9C, 0x77}; // ჩემი მიმღების MAC მისამართი/*განსაზღვრავს მრავალი ცვლადის მონაცემთა ტიპს, რომელიც სტრუქტურირებულია და დაარქვეს ყველა მას, როგორც struct_message*/typedef struct struct_message {char a [32]; int ბ; float c; სიმებიანი დ; bool e; } struct_message; // შექმნა სტრუქტური_მოწერა, სახელწოდებით myData struct_message myData; // ფუნქცია იძახება, როდესაც მონაცემები იგზავნება დასაბეჭდად მისი სტატუსი void OnDataSent (const uint8_t *mac_addr, esp_now_send_status_t სტატუსი) {Serial.print ("\ r / n ბოლო პაკეტის გაგზავნის სტატუსი: / t"); Serial.println (სტატუსი == ESP_NOW_SEND_SUCCESS? "მიწოდების წარმატება": "მიწოდება ჩაიშალა"); if (სტატუსი! = ESP_NOW_SEND_SUCCESS) {send_data ();}} ბათილია OnDataRecv (const uint8_t * mac, const uint8_t * incomingData, int len) {memcpy (& myData, incomingData, sizeof (myData))); Serial.print ("მიღებული ბიტი:"); სერიული. ბეჭდვა (ლენ); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("სიმებიანი:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); } void setup () {// დააყენეთ baud განაკვეთი სერიული კომუნიკაციისთვის ESP Serial.begin (115200); // მოწყობილობის დაყენება Wi-Fi სადგურის WiFi.mode (WIFI_STA); // იწყებს wifi // იწყებს ESP-NOW და უბრუნებს თავის სტატუსს, თუ (esp_now_init ()! = ESP_OK) {Serial.println ("ESP ინიციალიზაციის შეცდომა -ახლა "); დაბრუნების; } // დარეკეთ ფუნქცია OnDataSent ESPNOW მონაცემების გაგზავნის შემდეგ esp_now_register_send_cb (OnDataSent); // რეგისტრაცია peer esp_now_peer_info_t peerInfo; // ინიციალიზაცია და თანატოლების ინფორმაციის მიმწოდებლის მიცემა მიმდევართათვის (peerInfo.peer_addr, broadcastAddress, 6); // დააკოპირეთ broadcastAddress- ის მნიშვნელობა 6 ბაიტით peerInfo.peer_addr peerInfo.channel = 0; // არხი, რომელზეც ესპ ლაპარაკია. 0 ნიშნავს განუსაზღვრელს და მონაცემები გაიგზავნება მიმდინარე არხზე.1-14 არის მოქმედი არხები, რაც იგივეა რაც ადგილობრივ მოწყობილობასთან peerInfo.encrypt = false; // დაშიფრული არ არის // დაამატეთ მოწყობილობა დაწყვილებული მოწყობილობების სიაში, თუ (esp_now_add_peer (& peerInfo)! = ESP_OK) {Serial.println ("თანატოლის დამატება ვერ მოხერხდა"); დაბრუნების; } esp_now_register_recv_cb (OnDataRecv); // დარეკეთ ფუნქცია OnDataRecv ESPNOW მონაცემების მიღების შემდეგ send_data (); } void loop () {} void send_data () {Serial.println ("გაგზავნა"); // მნიშვნელობების დაყენება strcpy- ის გასაგზავნად (myData.a, "THIS IS A CHAR"); // შეინახეთ "THAR IS CHAR" ჩემი myData.b = ადრე განსაზღვრული ჩემი "მონაცემების" ცვლადში. b = შემთხვევითი (1, 20); // შეინახეთ შემთხვევითი მნიშვნელობა myData.c = 1.2; // შეინახეთ float myData.d = "ESP32"; // შეინახეთ სტრიქონი myData.e = false; // შეინახეთ bool // გაგზავნეთ მონაცემები ნაკლები ან ტოლი 250 ბაიტი ESP-NOW– ით და უბრუნებს მის სტატუსს esp_err_t result = esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); if (შედეგი == ESP_OK) {Serial.println ("წარმატებით გაიგზავნა");} სხვა {Serial.println ("მონაცემთა გაგზავნის შეცდომა"); }}

ESP8266 კოდი

// საჭირო ბიბლიოთეკების დამატება

#მოიცავს // რომ დაამატოთ Wifi შესაძლებლობები ESP32 #include // წვდომა esp- ის ფუნქციებზე // შეინახეთ MAC მისამართი მასივში, სახელად broadcastAddress; uint8_t მაუწყებლობის მისამართი = {0x30, 0xAE, 0xA4, 0xF5, 0x03, 0xA4}; /*განსაზღვრავს მრავალი ცვლადის მონაცემთა ტიპს, რომელიც სტრუქტურირებულია და დაარქვეს ყველა მათგანს სტრუქტური_მომხსენებლად*/ typedef struct სტრუქტურირებული შეტყობინება {char a [32]; int ბ; float c; სიმებიანი დ; bool e; } struct_message; // შექმენით ცვლადი struct_message სახელწოდებით myData struct_message myData; // ფუნქცია იძახება მონაცემების მიღებისას და ბეჭდავს მას ბათილად OnDataRecv (uint8_t * mac, uint8_t * incomingData, uint8_t len) {memcpy (& myData, incomingData, sizeof (myData)); Serial.print ("მიღებული ბიტი:"); სერიული. ბეჭდვა (ლენ); Serial.print ("Char:"); Serial.println (myData.a); Serial.print ("Int:"); Serial.println (myData.b); Serial.print ("Float:"); Serial.println (myData.c); Serial.print ("სიმებიანი:"); Serial.println (myData.d); Serial.print ("Bool:"); Serial.println (myData.e); Serial.println (); send_data (); } void OnDataSent (uint8_t *mac_addr, uint8_t sendStatus) {Serial.print ("\ r / n ბოლო პაკეტის გაგზავნის სტატუსი: / t"); Serial.println (sendStatus == 1? "მიწოდება წარმატებულია": "მიწოდება ვერ ხერხდება"); if (sendStatus! = 1) {send_data (); }} void send_data () {// დააყენეთ მნიშვნელობები strcpy– ის გასაგზავნად (myData.a, "THIS IS CHAR"); // შეინახეთ "THAR IS CHAR" ჩემი myData.b = ადრე განსაზღვრული ჩემი "მონაცემების" ცვლადში. b = შემთხვევითი (1, 20); // შეინახეთ შემთხვევითი მნიშვნელობა myData.c = 1.2; // შეინახეთ float myData.d = "ESP8266"; // შეინახეთ სტრიქონი myData.e = false; // შეინახეთ bool esp_now_send (broadcastAddress, (uint8_t *) & myData, sizeof (myData)); } void setup () {// დააყენეთ baud განაკვეთი სერიული კომუნიკაციისთვის ESP Serial.begin (115200); // მოწყობილობის დაყენება Wi-Fi სადგურის WiFi.mode (WIFI_STA); // იწყებს wifi- ს // იწყებს ESP-NOW და უბრუნებს თავის სტატუსს if (esp_now_init ()! = 0) {Serial.println ("ESP-NOW inicialization error"); დაბრუნების; } if (esp_now_add_peer (broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0)) {Serial.println ("თანატოლის დამატება ვერ მოხერხდა"); დაბრუნების; } esp_now_set_self_role (ESP_NOW_ROLE_COMBO); esp_now_register_send_cb (OnDataSent); esp_now_set_self_role (ESP_NOW_ROLE_COMBO); // განსაზღვრავს ამ esp- ის როლს esp_now_register_recv_cb (OnDataRecv); // დარეკეთ ფუნქცია OnDataRecv ESPNOW მონაცემების მიღების შემდეგ} void loop () {}

ნაბიჯი 8: მითითებები

ESPNOW_32_ მაგალითი

ESPNOW_8266 მაგალითი

WIFI. თ

ESP8266WiFi.h

esp_now.h ESP8266– ისთვის

esp_now.h ESP32– ისთვის

esp_now ოფიციალური დოკუმენტი (ფუნქციების უკეთესი ახსნა)

ESP-NOW ოფიციალური სახელმძღვანელო

გირჩევთ: