ESP-NOW - это удобный протокол беспроводной связи, разработанный компанией Espressif Systems, который позволяет установить прямое соединение между устройствами на базе микроконтроллеров ESP8266, ESP32 и обмениваться данными без необходимости использования маршрутизатора или точки доступа Wi-Fi. В этой статье мы рассмотрим, что такое ESP-NOW, его преимущества и недостатки, а также основные функции для использования этого протокола.
Купить NodeMcu (ESP8266) можно на AliExpress.
Внимание! В этой статье рассмотрим, как работать с протоколом ESP-NOW на платформе ESP8266. Однако, следует помнить, что ESP32 имеет свои собственные особенности и функции для работы с ESP-NOW, которые мы рассмотрим в следующей статье.
ESP-NOW предоставляет различные функции для настройки и использования протокола:
esp_now_init(): Функция инициализации ESP-NOW. Необходимо предварительно инициализировать Wi-Fi до инициализации ESP-NOW. Возвращает 0 в случае успешной инициализации.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.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(): Функция регистрации callback-функции, которая вызывается после отправки данных. Это позволяет прикладному уровню получить информацию о статусе доставки отправленного пакета.esp_now_register_rcv_cb(): Функция регистрации callback-функции, которая вызывается при приеме данных по протоколу ESP-NOW. При получении данных можно обрабатывать информацию в соответствии с логикой приложения.Для работы с протоколом 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.


Пример кода для отправителя (передачи данных):
/*
Сайт автора 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();
}
}
Пояснения кода отправителя:
ESP8266WiFi.h для работы с Wi-Fi и espnow.h для работы с протоколом ESP-NOW. Убедитесь, что эти библиотеки установлены в вашем Arduino IDE.receiverMacAddress), куда мы хотим отправлять данные. Замените этот адрес на MAC-адрес вашего получателя.
struct_message, которая будет использоваться для передачи данных. В этом примере она содержит несколько разных типов данных (char[], int, float, String и bool), чтобы показать, как передавать различные данные.esp_now_init(). Если инициализация прошла успешно, продолжаем выполнять программу, в противном случае выводим сообщение об ошибке.esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER) и регистрируем callback-функцию OnDataSent, которая будет вызываться после отправки данных.esp_now_add_peer(), указывая его MAC-адрес, роль (здесь устанавливаем роль ESP_NOW_ROLE_SLAVE для получателя), канал (в данном случае - 1), ключ (NULL) и длину ключа (0).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() {
// Ваш код основного цикла (если требуется)
}
Пояснения кода получателя:
ESP8266WiFi.h для работы с Wi-Fi и espnow.h для работы с протоколом ESP-NOW.struct_message, такую же, как у отправителя, чтобы правильно принять данные.esp_now_init(). Если инициализация прошла успешно, мы продолжаем выполнять программу, в противном случае выводим сообщение об ошибке.esp_now_set_self_role(ESP_NOW_ROLE_SLAVE).OnDataRecv, которая будет вызываться при приеме данных. В этой функции копируем принятые данные в структуру receivedData и выводим их в монитор последовательного порта.
Обратите внимание, что передача и прием данных осуществляются через структуру struct_message. Вы можете изменить поля этой структуры или добавить свои собственные поля, чтобы передавать различные типы данных между устройствами.

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

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

Важно отметить, что в данной статье мы сфокусировались исключительно на использовании 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-адреса .ino | 1 Kb | 750 | Скачать | |
| Пример кода для отправителя (передачи данных).ino | 2 Kb | 761 | Скачать | |
| Пример кода для получателя (приема данных).ino | 3 Kb | 728 | Скачать |
Статьи про ESP32, ESP8266
25 июля , 2023
Комментариев:0
Файлов для скачивания:3
Фото:2
Понравилась статья? Нажми
Читайте также
Мы в соц сетях
Комментарии