ESP-NOW - это удобный протокол беспроводной связи, разработанный компанией Espressif Systems, который позволяет установить прямое соединение между устройствами на базе микроконтроллеров ESP8266, ESP32 и обмениваться данными без необходимости использования маршрутизатора или точки доступа Wi-Fi. В этой статье мы рассмотрим, что такое ESP-NOW, его преимущества и недостатки, а также основные функции для использования этого протокола.
Купить NodeMcu (ESP8266) можно на AliExpress.
Преимущества протокол беспроводной связи ESP-NOW:
- Низкое энергопотребление: ESP-NOW оптимизирован для экономии энергии, что делает его идеальным для батарейных устройств или устройств, работающих от аккумуляторов.
- Простота настройки: Установка связи между устройствами с помощью ESP-NOW происходит быстро и легко. Этот протокол работает на физическом уровне Wi-Fi, что упрощает процесс настройки и обмена данными.
- Высокая скорость передачи данных: ESP-NOW обеспечивает низкую задержку и высокую скорость передачи данных, что делает его отличным выбором для приложений с требованиями к скорости обмена информации.
- Прямое соединение: ESP-NOW позволяет устанавливать прямое соединение между устройствами, минуя маршрутизатор или точку доступа Wi-Fi, что уменьшает задержки и упрощает структуру сети.
- Создание собственной сети: Протокол ESP-NOW позволяет создавать собственные маленькие сети устройств без необходимости подключения к сторонней инфраструктуре.
Недостатки ESP-NOW:
- Ограниченное расстояние передачи: Как и другие протоколы на основе Wi-Fi, дальность передачи данных ограничивается физическими ограничениями стандарта Wi-Fi.
- Ограничение количества подключенных устройств: Протокол ESP-NOW оптимизирован для работы с небольшим количеством подключенных устройств (максимум 20 пар), что может быть недостаточно для некоторых сценариев.
- Безопасность: Хотя ESP-NOW обеспечивает базовую безопасность с помощью шифрования, он не обеспечивает такого же уровня защиты, как стандартные протоколы Wi-Fi с точками доступа и шифрованием данных на уровне сетевых слоев.
ESP-NOW поддерживает следующие функции:
- Зашифрованная и незашифрованная связь между сопряженными парами устройств, предоставляет возможность передачи данных с использованием шифрования для повышения безопасности или без шифрования для упрощения коммуникации между сопряженными устройствами.
- Смешанные зашифрованная и незашифрованная связь между сопряженными устройствами, позволяет установить смешанный режим, в котором некоторые сопряженные устройства могут использовать шифрование, а другие - нет, в зависимости от требований приложения.
- Передача до 250 байт полезной информации, что позволяет передавать различные типы информации между устройствами.
- Настройка функции обратного вызова для информирования прикладного уровня, в частности, об успешности или сбое передачи: ESP-NOW предоставляет callback-функцию, которая сообщает прикладному уровню об успешности или сбое отправки данных, что позволяет реагировать на результаты передачи.
Внимание!
В этой статье рассмотрим, как работать с протоколом ESP-NOW на платформе ESP8266. Однако, следует помнить, что ESP32 имеет свои собственные особенности и функции для работы с ESP-NOW, которые мы рассмотрим в следующей статье.
Основные функции 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. При получении данных можно обрабатывать информацию в соответствии с логикой приложения.
Пример кода для получения 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.
Пример кода с пояснениями передачи данных по протоколу 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();
}
}
Пояснения кода отправителя:
- Мы используем библиотеку
ESP8266WiFi.h
для работы с Wi-Fi и espnow.h
для работы с протоколом ESP-NOW. Убедитесь, что эти библиотеки установлены в вашем Arduino IDE.
- В этом примере мы определяем MAC-адрес получателя (
receiverMacAddress
), куда мы хотим отправлять данные. Замените этот адрес на MAC-адрес вашего получателя.
- Создаем структуру
struct_message
, которая будет использоваться для передачи данных. В этом примере она содержит несколько разных типов данных (char[], int, float, String и bool), чтобы показать, как передавать различные данные.
- Инициализируем ESP-NOW с помощью функции
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 с помощью функции
esp_now_init()
. Если инициализация прошла успешно, мы продолжаем выполнять программу, в противном случае выводим сообщение об ошибке.
- Устанавливаем роль получателя с помощью функции
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE)
.
- Регистрируем callback-функцию
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 | 541 |
Скачать
Вы можете скачать файл.
|
|
Пример кода для отправителя (передачи данных).ino | 2 Kb | 556 |
Скачать
Вы можете скачать файл.
|
|
Пример кода для получателя (приема данных).ino | 3 Kb | 516 |
Скачать
Вы можете скачать файл.
|
Комментарии