Начало работы с ESP-NOW (ESP8266 NodeMCU) в Arduino IDE


В этой статье мы покажем вам, как можно использовать протокол ESP-NOW для обмена данными между платами ESP8266 NodeMCU, запрограммированными с помощью Arduino IDE. ESP-NOW — это протокол связи без установления соединения, разработанный компанией Espressif, который обеспечивает передачу коротких пакетов и может использоваться с платами ESP8266 и ESP32.

Начало работы с ESP-NOW (ESP8266 NodeMCU) в Arduino IDE

Мы будем программировать плату ESP8266 NodeMCU с помощью Arduino IDE, поэтому перед тем, как продолжить этот урок, у вас должно быть установлено дополнение ESP8266 в Arduino IDE.

Представляем ESP-NOW

В следующем видео показано введение в ESP-NOW. Это видео было записано для ESP32, но большинство концепций применимы и к плате ESP8266 NodeMCU.

Как указано на сайте компании Espressif, ESP-NOW — это «протокол, разработанный Espressif, который позволяет нескольким устройствам взаимодействовать друг с другом без использования Wi-Fi. Протокол похож на беспроводное соединение с низким энергопотреблением 2,4 ГГц (…). Сопряжение между устройствами необходимо до их связи. После сопряжения соединение становится безопасным и одноранговым, без необходимости в подтверждении связи».

Логотип ESP-NOW

Это означает, что после сопряжения устройств друг с другом соединение сохраняется. Другими словами, если вдруг одна из ваших плат потеряет питание или перезагрузится, при перезапуске она автоматически подключится к своему партнеру для продолжения связи.

ESP-NOW поддерживает следующие функции:

  • Зашифрованная и незашифрованная одноадресная связь;
  • Смешанные зашифрованные и незашифрованные одноранговые устройства;
  • Возможна передача полезной нагрузки объемом до 250 байт;
  • Отправка функции обратного вызова, которую можно настроить для информирования прикладного уровня об
    успешной или неудачной передаче.

Технология ESP-NOW также имеет следующие ограничения:

  • Ограниченное количество зашифрованных пиров. В режиме Station (станция) поддерживается не более 10 зашифрованных пиров; в режиме SoftAP (программная точка доступа) или SoftAP + Station — не более 6;
  • Поддерживается несколько незашифрованных пиров, однако их общее количество должно быть менее 20, включая зашифрованные пиры;
  • Полезная нагрузка ограничена 250 байтами.

Проще говоря, ESP-NOW — это быстрый протокол связи, который можно использовать для обмена небольшими сообщениями (до 250 байт) между платами ESP8266.

ESP-NOW очень универсален, и вы можете организовать одностороннюю или двустороннюю связь в различных настройках.

Односторонняя связь ESP-NOW

Например, при односторонней коммуникации возможны такие сценарии:

  • Одна плата ESP8266 отправляет данные на другую плату ESP8266

Одна плата ESP8266 отправляет данные на другую плату ESP8266 с помощью ESP-NOW

Эту конфигурацию очень легко реализовать, и она отлично подходит для передачи данных с одной платы на другую, например, показаний датчиков или команд включения и выключения для управления GPIO.

  • «Ведущий» (master) ESP8266 отправляет данные нескольким «ведомым» (slaves) ESP8266

Одна плата ESP8266 отправляет одинаковые или разные команды на разные платы ESP8266. Такая конфигурация идеальна для создания чего-то вроде пульта дистанционного управления. Вы можете иметь несколько плат ESP8266 по всему дому, которые будут управляться одной главной платой ESP8266.

«Ведущий» ESP8266 отправляет данные нескольким «ведомым» ESP8266 с помощью ESP-NOW

  • Один «ведомый» ESP8266, получающий данные от нескольких «ведущих»

Эта конфигурация идеальна, если вы хотите собирать данные с нескольких узлов датчиков на одну плату ESP8266. Например, ее можно настроить как веб-сервер для отображения данных со всех других плат.

Один «ведомый» ESP8266, получающий данные от нескольких «ведущих» с помощью ESP-NOW

Примечание: в документации ESP-NOW нет таких понятий, как «отправитель/главный» и «получатель/ведомый». Каждая плата может быть отправителем или получателем. Однако, чтобы все было понятно, мы будем использовать термины «отправитель» и «получатель» или «главный» (ведущий) и «ведомый».

Двусторонняя связь ESP-NOW

С ESP-NOW каждая плата может быть отправителем и получателем одновременно. Таким образом, вы можете установить двустороннюю связь между платами.

Например, у вас могут быть две платы, взаимодействующие друг с другом.

Двусторонняя связь ESP-NOW

Вы можете добавить больше плат к этой конфигурации и получить что-то вроде сети (все платы ESP8266 взаимодействуют друг с другом).

Сеть связи на основе протокола ESP-NOW

Подводя итог, можно сказать, что ESP-NOW идеально подходит для создания сети, в которой несколько плат ESP8266 могут обмениваться данными друг с другом.

ESP8266: Получение MAC-адреса платы

Для связи через ESP-NOW вам необходимо знать MAC-адрес приемника ESP8266. Так вы узнаете, на какое устройство вы будете отправлять информацию.

Каждый ESP8266 имеет уникальный MAC-адрес , и именно по нему мы идентифицируем каждую плату для отправки на нее данных с помощью ESP-NOW (узнайте, как получить и изменить MAC-адрес ESP8266 и ESP32).

Чтобы получить MAC-адрес вашей платы, загрузите следующий код.

После загрузки кода откройте Serial Monitor на скорости 115200 бод и нажмите кнопку RESET ESP8266. MAC-адрес должен быть напечатан следующим образом:

MAC-адрес платы ESP8266 в окне монитора последовательной связи

Сохраните MAC-адрес вашей платы, так как он вам понадобится для отправки данных на нужную плату через ESP-NOW.

ESP-NOW: Односторонняя связь точка-точка с ESP8266

Чтобы начать работу с беспроводной связью ESP-NOW, мы создадим простой проект, который покажет, как отправить сообщение с одного ESP8266 на другой. Один ESP8266 будет выступать в качестве «отправителя», а другой ESP8266 будет «получателем».

Одна плата ESP8266 отправляет данные на другую плату ESP8266 с помощью ESP-NOW

Мы отправим структуру, содержащую переменные типа charintfloatString и boolean. Затем вы можете изменить структуру, чтобы отправлять любые типы переменных, подходящие для вашего проекта (например, показания датчиков или логические переменные для включения или выключения чего-либо).

Для лучшего понимания будем называть ESP8266 №1 «отправителем», а ESP8266 №2 — «получателем».

Вот что мы должны включить в скетч отправителя :

  1. Инициализировать ESP-NOW;
  2. Зарегистрируйте функцию обратного вызова при отправке данных – функция OnDataSent будет выполнена при отправке сообщения. Это может сказать нам, было ли сообщение успешно доставлено или нет;
  3. Добавьте одноранговое устройство (приемник). Для этого необходимо знать MAC-адрес приемника;
  4. Отправьте сообщение на одноранговое устройство.

Со стороны получателя скетч должен включать:

  1. Инициализировать ESP-NOW;
  2. Зарегистрируйтесь для получения функции обратного вызова (OnDataRecv). Это функция, которая будет выполнена при получении сообщения.
  3. Внутри этой функции обратного вызова сохраните сообщение в переменной для выполнения любой задачи с этой информацией.

ESP-NOW работает с функциями обратного вызова, которые вызываются, когда устройство получает сообщение или когда сообщение отправляется (вы получаете информацию об успешной доставке сообщения или об ошибке).

Полезные функции ESP-NOW

Вот краткий обзор наиболее важных функций ESP-NOW:

Название и описание функции
esp_now_init() - инициализирует ESP-NOW. Перед инициализацией ESP-NOW необходимо инициализировать Wi-Fi. Возвращает 0 в случае успеха.
esp_now_set_self_role(role) - роль может быть: ESP_NOW_ROLE_IDLE = 0,
ESP_NOW_ROLE_CONTROLLER, ESP_NOW_ROLE_SLAVE, ESP_NOW_ROLE_COMBO, ESP_NOW_ROLE_MAX
esp_now_add_peer(uint8 mac_addr, uint8 role, uint8 channel, uint8 key, uint8 key_len) - вызовите эту функцию для сопряжения устройства.
esp_now_send(uint8 mac_address, uint8 data, int len) - отправляйте данные с помощью ESP-NOW.
esp_now_register_send_cb() - зарегистрируйте функцию обратного вызова, которая срабатывает при отправке данных. При отправке сообщения вызывается эта функция – она возвращает, была ли доставка успешной или нет.
esp_now_register_recv_cb() - зарегистрируйте функцию обратного вызова, которая срабатывает при получении данных. Когда данные поступают через ESP-NOW, вызывается эта функция.

Более подробную информацию об этих функциях можно найти здесь:

Скетч отправителя ESP8266 NodeMCU (ESP-NOW)

Вот код для платы отправителя ESP8266 NodeMCU. Скопируйте код в Arduino IDE, но пока не загружайте его. Вам нужно сделать несколько изменений, чтобы он заработал у вас.

Как работает код

Во-первых, подключите библиотеки ESP8266WiFi.h и espnow.h.

В следующей строке необходимо вставить MAC-адрес приемника ESP8266.

В нашем случае MAC-адрес приемника: 5C:CF:7F:99:9A:EA, но вам необходимо заменить эту переменную на ваш собственный MAC-адрес.

Затем создаем структуру, содержащую тип данных, которые мы хотим отправить. Мы назвали эту структуру struct_message и она содержит 5 различных типов переменных. Вы можете изменить это, чтобы отправлять любые типы переменных, которые вы хотите.

Создайте новую переменную типа struct_message - у нас это переменная myData, которая будет хранить значения переменных.

Далее запрограммируйте функцию OnDataSent(). Это функция обратного вызова, которая будет выполнена при отправке сообщения. В нашем случае эта функция просто выводит, было ли сообщение успешно отправлено или нет.

В функции setup() инициализируйте последовательный порт для целей отладки:

Настройте устройство как станцию ​​Wi-Fi:

Инициализируйте ESP-NOW:

Установите роль ESP8266:

Он может принимать следующие роли: ESP_NOW_ROLE_CONTROLLER, ESP_NOW_ROLE_SLAVE, ESP_NOW_ROLE_COMBO, ESP_NOW_ROLE_MAX.

После успешной инициализации ESP-NOW зарегистрируйте функцию обратного вызова, которая будет вызвана при отправке сообщения. В этом случае мы регистрируем функцию OnDataSent(), запрограммированную нами ранее.

Затем выполните сопряжение с другим устройством ESP-NOW для отправки данных:

Функция esp_now_add_peer принимает следующие аргументы в следующем порядке: MAC-адрес, роль, канал Wi-Fi, ключ и длина ключа.

В функции loop() мы будем отправлять сообщение через протокол ESP-NOW каждые 2 секунды (вы можете изменить это время задержки в переменной timerDelay).

Сначала мы устанавливаем значения переменных следующим образом:

Помните, что myData — это структура. Здесь мы назначаем значения, которые хотим отправить внутри структуры. Например, первая строка назначает char, вторая строка назначает случайное число Int, Float, String и Boolean переменную.

Мы создаем такую ​​структуру, чтобы показать вам, как отправлять наиболее распространенные типы переменных. Вы можете изменить структуру, чтобы отправлять любые другие типы данных.

Наконец, отправьте сообщение следующего содержания:

Функция loop() выполняется каждые 2000 миллисекунд (2 секунды).

Скетч приемника ESP8266 NodeMCU (ESP-NOW)

Загрузите следующий код на плату приемника ESP8266 NodeMCU.

Как работает код

Аналогично отправителю, начните с подключения библиотек:

Создайте структуру для получения данных. Эта структура должна быть такой же, как определена в скетче отправителя.

Создайте новую переменную типа struct_message - у нас это переменная myData.

Создайте функцию обратного вызова, которая будет вызываться, когда ESP8266 получает данные через ESP-NOW. Эта функция называется onDataRecv() и должна принимать несколько параметров, как указано ниже:

Мы копируем содержимое переменной incomingData (входящие данные) в переменную myData.

Теперь, структура myData содержит несколько переменных внутри со значениями, отправленными отправителем ESP8266. Для доступа к переменной a внутри этой структуры, например, нам просто нужно вызвать myData.a.

В этом примере мы просто распечатываем полученные данные, но в практическом применении вы можете вывести данные, например, на дисплей.

В функции setup() инициализируйте последовательную связь для целей отладки.

Настройте устройство как станцию ​​Wi-Fi.

Инициализируйте ESP-NOW:

Установите роль ESP8266:

Зарегистрируйте функцию обратного вызова, которая будет вызвана при получении данных. В этом случае мы регистрируем функцию OnDataRecv(), которую мы запрограммировали ранее.

Тестирование связи ESP-NOW

Загрузите скетч отправителя на одну плату, а скетч получателя на другую плату. Не забудьте вставить MAC-адрес получателя в скетче отправителя.

Теперь откройте два окна Arduino IDE. Одно для приемника, другое для отправителя. Откройте Serial Monitor для каждой платы. Это должен быть отдельный COM-порт для каждой платы.

Вот что вы должны получить на стороне отправителя.

Тестирование связи ESP-NOW на стороне отправителя

А вот то, что вы должны получить на стороне получателя (приемника). Обратите внимание, что переменная Int изменяется между каждым полученным чтением (потому что мы устанавливаем ее на случайное число на стороне отправителя).

Тестирование связи ESP-NOW на стороне приемника (получателя)

Мы протестировали дальность связи между двумя платами, и нам удалось получить стабильную связь на расстоянии до 140 метров (примерно 459 футов) на открытом пространстве. В этом эксперименте обе встроенные антенны плат ESP8266 были направлены друг на друга.

Протестированная дальность связи по протоколу ESP-NOW

Подведение итогов

В этом уроке вы узнали, как использовать протокол ESP-NOW с платой ESP8266 NodeMCU. Теперь вы можете объединить скетч отправителя и получателя, чтобы получить двустороннюю связь (каждая плата одновременно выступает в качестве сервера и отправителя). Вы также можете использовать больше плат, чтобы обеспечить связь между несколькими платами.

Платы ESP8266 и ESP32 также могут взаимодействовать друг с другом с помощью протокола связи ESP-NOW. Вам просто нужно загрузить соответствующие скетчи на каждую плату.

(Проголосуй первым!)
Загрузка...
69 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *