როგორ გააკეთოთ მრავალჯერადი ESP საუბარი ESP-NOW– ით ESP32 და ESP8266 გამოყენებით: 8 ნაბიჯი
როგორ გააკეთოთ მრავალჯერადი ESP საუბარი ESP-NOW– ით ESP32 და ESP8266 გამოყენებით: 8 ნაბიჯი
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 ოფიციალური სახელმძღვანელო

გირჩევთ: