Введение в ESP-NOW: Беспроводная связь на ESP8266.

ESP-NOW - это удобный протокол беспроводной связи, разработанный компанией Espressif Systems, который позволяет установить прямое соединение между устройствами на базе микроконтроллеров ESP8266, ESP32 и обмениваться данными без необходимости использования маршрутизатора или точки доступа Wi-Fi. В этой статье мы рассмотрим, что такое ESP-NOW, его преимущества и недостатки, а также основные функции для использования этого протокола.

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

Купить NodeMcu (ESP8266) можно на AliExpress.

Преимущества протокол беспроводной связи ESP-NOW:

  1. Низкое энергопотребление: ESP-NOW оптимизирован для экономии энергии, что делает его идеальным для батарейных устройств или устройств, работающих от аккумуляторов.
  2. Простота настройки: Установка связи между устройствами с помощью ESP-NOW происходит быстро и легко. Этот протокол работает на физическом уровне Wi-Fi, что упрощает процесс настройки и обмена данными.
  3. Высокая скорость передачи данных: ESP-NOW обеспечивает низкую задержку и высокую скорость передачи данных, что делает его отличным выбором для приложений с требованиями к скорости обмена информации.
  4. Прямое соединение: ESP-NOW позволяет устанавливать прямое соединение между устройствами, минуя маршрутизатор или точку доступа Wi-Fi, что уменьшает задержки и упрощает структуру сети.
  5. Создание собственной сети: Протокол ESP-NOW позволяет создавать собственные маленькие сети устройств без необходимости подключения к сторонней инфраструктуре.

Недостатки ESP-NOW:

  1. Ограниченное расстояние передачи: Как и другие протоколы на основе Wi-Fi, дальность передачи данных ограничивается физическими ограничениями стандарта Wi-Fi.
  2. Ограничение количества подключенных устройств: Протокол ESP-NOW оптимизирован для работы с небольшим количеством подключенных устройств (максимум 20 пар), что может быть недостаточно для некоторых сценариев.
  3. Безопасность: Хотя ESP-NOW обеспечивает базовую безопасность с помощью шифрования, он не обеспечивает такого же уровня защиты, как стандартные протоколы Wi-Fi с точками доступа и шифрованием данных на уровне сетевых слоев.

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

  1. Зашифрованная и незашифрованная связь между сопряженными парами устройств, предоставляет возможность передачи данных с использованием шифрования для повышения безопасности или без шифрования для упрощения коммуникации между сопряженными устройствами.
  2. Смешанные зашифрованная и незашифрованная связь между сопряженными устройствами, позволяет установить смешанный режим, в котором некоторые сопряженные устройства могут использовать шифрование, а другие - нет, в зависимости от требований приложения.
  3. Передача до 250 байт полезной информации, что позволяет передавать различные типы информации между устройствами.
  4. Настройка функции обратного вызова для информирования прикладного уровня, в частности, об успешности или сбое передачи: ESP-NOW предоставляет callback-функцию, которая сообщает прикладному уровню об успешности или сбое отправки данных, что позволяет реагировать на результаты передачи.

Внимание! В этой статье рассмотрим, как работать с протоколом ESP-NOW на платформе ESP8266. Однако, следует помнить, что ESP32 имеет свои собственные особенности и функции для работы с ESP-NOW, которые мы рассмотрим в следующей статье.

Основные функции ESP-NOW:

ESP-NOW предоставляет различные функции для настройки и использования протокола:

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

Пример кода для получения MAC-адреса устройства ESP8266 в Arduino IDE.

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

/*
   Сайт автора https://arduino-tex.ru/
   Проекты на Arduino https://portal-pk.ru/page-17/proekty-na-arduino.html
   Проекты на ESP https://arduino-tex.ru/menu/10/11/proekty-na-esp8266-esp32.html
   Страница урока https://arduino-tex.ru/news/173/vvedenie-v-esp-now-besprovodnaya-svyaz-na--esp8266.html
*/

#include <ESP8266WiFi.h>
void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("MAC-адрес устройства: ");
  Serial.println(WiFi.macAddress());
}
void loop() {
  // Ваш код основного цикла (если требуется)
}

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

Пример кода для получения MAC-адреса устройства ESP8266 в Arduino IDE.

Пример кода с пояснениями передачи данных по протоколу ESP-NOW.

Пример кода с пояснениями передачи данных по протоколу ESP-NOW.

Пример кода для отправителя (передачи данных):

/*
   Сайт автора https://arduino-tex.ru/
   Проекты на Arduino https://portal-pk.ru/page-17/proekty-na-arduino.html
   Проекты на ESP https://arduino-tex.ru/menu/10/11/proekty-na-esp8266-esp32.html
   Страница урока https://arduino-tex.ru/news/173/vvedenie-v-esp-now-besprovodnaya-svyaz-na--esp8266.html
*/

#include <ESP8266WiFi.h>
#include <espnow.h>
// Замените на MAC-адрес получателя (получателя)
uint8_t receiverMacAddress[] = {0x84, 0xF3, 0xEB, 0x25, 0xD8, 0x92};
// Структура для передачи данных
typedef struct struct_message {
  char a[42];
  int b;
  float c;
  String d;
  bool e;
} struct_message;
// Создаем экземпляр структуры struct_message с именем myData
struct_message myData;
unsigned long lastTime = 0;
unsigned long timerDelay = 2000; // Интервал между отправками данных
// Callback-функция, которая вызывается после отправки данных
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("Статус отправки пакета: ");
  if (sendStatus == 0) {
    Serial.println("Успешно");
  } else {
    Serial.println("Ошибка");
  }
}
void setup() {
  Serial.begin(115200);
  // Инициализируем Wi-Fi как режим Station
  WiFi.mode(WIFI_STA);
  // Инициализируем ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Ошибка инициализации ESP-NOW");
    return;
  }
  // Устанавливаем роль отправителя
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  // Регистрируем callback-функцию OnDataSent для отслеживания статуса отправки
  esp_now_register_send_cb(OnDataSent);
  // Добавляем получателя (партнера) по указанному MAC-адресу
  esp_now_add_peer(receiverMacAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}
void loop() {
  if ((millis() - lastTime) > timerDelay) {
    // Заполняем структуру myData данными, которые хотим передать
    strcpy(myData.a, "Это массив символов char");
    myData.b = random(1, 20);
    myData.c = 1.2;
    myData.d = "Hello";
    myData.e = false;
    // Отправляем структуру myData по протоколу ESP-NOW на указанный MAC-адрес получателя
    esp_now_send(receiverMacAddress, (uint8_t *)&myData, sizeof(myData));
    lastTime = millis();
  }
}

Пояснения кода отправителя:

  1. Мы используем библиотеку ESP8266WiFi.h для работы с Wi-Fi и espnow.h для работы с протоколом ESP-NOW. Убедитесь, что эти библиотеки установлены в вашем Arduino IDE.
  2. В этом примере мы определяем MAC-адрес получателя (receiverMacAddress), куда мы хотим отправлять данные. Замените этот адрес на MAC-адрес вашего получателя.

 Замените этот адрес на MAC-адрес вашего получателя.

  1. Создаем структуру struct_message, которая будет использоваться для передачи данных. В этом примере она содержит несколько разных типов данных (char[], int, float, String и bool), чтобы показать, как передавать различные данные.
  2. Инициализируем ESP-NOW с помощью функции esp_now_init(). Если инициализация прошла успешно, продолжаем выполнять программу, в противном случае выводим сообщение об ошибке.
  3. Устанавливаем роль отправителя с помощью функции esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER) и регистрируем callback-функцию OnDataSent, которая будет вызываться после отправки данных.
  4. Мы добавляем получателя (партнера) с помощью функции esp_now_add_peer(), указывая его MAC-адрес, роль (здесь устанавливаем роль ESP_NOW_ROLE_SLAVE для получателя), канал (в данном случае - 1), ключ (NULL) и длину ключа (0).
  5. В функции loop() мы проверяем, прошло ли достаточно времени для отправки следующего пакета данных. Затем мы заполняем структуру myData данными, которые хотим передать, и отправляем ее с помощью функции esp_now_send() на указанный MAC-адрес получателя.

Теперь рассмотрим пример кода для получателя (приема данных):

/*
   Сайт автора https://arduino-tex.ru/
   Проекты на Arduino https://portal-pk.ru/page-17/proekty-na-arduino.html
   Проекты на ESP https://arduino-tex.ru/menu/10/11/proekty-na-esp8266-esp32.html
   Страница урока https://arduino-tex.ru/news/173/vvedenie-v-esp-now-besprovodnaya-svyaz-na--esp8266.html
*/

#include <ESP8266WiFi.h>
#include <espnow.h>
// Структура для приема данных
typedef struct struct_message {
  char a[42];
  int b;
  float c;
  String d;
  bool e;
} struct_message;
// Создаем экземпляр структуры struct_message с именем receivedData
struct_message receivedData;
// Callback-функция, которая вызывается при приеме данных
void OnDataRecv(uint8_t *mac, uint8_t *data, uint8_t len) {
  memcpy(&receivedData, data, sizeof(receivedData));
  Serial.print("Получены данные: ");
  Serial.print("char = ");
  Serial.print(receivedData.a);
  Serial.print(", int = ");
  Serial.print(receivedData.b);
  Serial.print(", float = ");
  Serial.print(receivedData.c);
  Serial.print(", String = ");
  Serial.print(receivedData.d);
  Serial.print(", bool = ");
  Serial.println(receivedData.e);
}
void setup() {
  Serial.begin(115200);
  // Инициализируем Wi-Fi как режим Station
  WiFi.mode(WIFI_STA);
  // Инициализируем ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Ошибка инициализации ESP-NOW");
    return;
  }
  // Устанавливаем роль получателя
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  // Регистрируем callback-функцию OnDataRecv для обработки принятых данных
  esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
  // Ваш код основного цикла (если требуется)
}

Пояснения кода получателя:

  1. Используем библиотеку ESP8266WiFi.h для работы с Wi-Fi и espnow.h для работы с протоколом ESP-NOW.
  2. Определяем структуру struct_message, такую же, как у отправителя, чтобы правильно принять данные.
  3. Инициализируем ESP-NOW с помощью функции esp_now_init(). Если инициализация прошла успешно, мы продолжаем выполнять программу, в противном случае выводим сообщение об ошибке.
  4. Устанавливаем роль получателя с помощью функции esp_now_set_self_role(ESP_NOW_ROLE_SLAVE).
  5. Регистрируем callback-функцию OnDataRecv, которая будет вызываться при приеме данных. В этой функции копируем принятые данные в структуру receivedData и выводим их в монитор последовательного порта.

Регистрируем callback-функцию OnDataRecv, которая будет вызываться при приеме данных. В этой функции копируем принятые данные в структуру receivedData и выводим их в монитор последовательного порта.

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

При загрузке кода на передатчик и получатель их MAC-адреса должны быть различными.

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

После загрузки кода на оба устройства, откройте монитор последовательного порта на обоих, чтобы видеть данные, которые передаются и принимаются. Каждые 2 секунды (или согласно timerDelay в коде передатчика) вы должны видеть информацию о принятых данных на мониторе последовательного порта получателя.

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

Заключение:

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

В данной статье мы рассмотрели применение протокола ESP-NOW на платформе ESP8266

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

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

Мы надеемся, что данная статья помогла вам освоить протокол ESP-NOW на платформе ESP8266 и вдохновила на создание своих беспроводных проектов. Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей следующей статье, где мы рассмотрим работу с ESP-NOW на платформе ESP32 и подробно рассмотрим примеры кода для этой платформы.

Спасибо за внимание и удачи в ваших проектах с использованием ESP-NOW!

Поддержать.
Также, если вы хотите поддержать мою работу и помочь мне создавать ещё больше полезных материалов, вы можете сделать донат на моём канале на Boosty. Это поможет мне продолжать работать над новыми уроками и материалами для вас.
По QR-коду
Поддержать через Юмани
Спасибо за ваш интерес к моим проектам и урокам, я надеюсь, что они будут для вас полезными и интересными.


Понравилась статья Введение в ESP-NOW: Беспроводная связь на ESP8266? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!

Фотографии к статье

Файлы для скачивания

Пример кода для получения MAC-адреса Пример кода для получения MAC-адреса .ino1 Kb 541 Скачать
Пример кода для отправителя (передачи данных) Пример кода для отправителя (передачи данных).ino2 Kb 556 Скачать
Пример кода для получателя (приема данных) Пример кода для получателя (приема данных).ino3 Kb 516 Скачать

Комментарии

Ваше Имя*


Разработка проектов