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 | 661 | Скачать |
![]() |
Пример кода для отправителя (передачи данных).ino | 2 Kb | 669 | Скачать |
![]() |
Пример кода для получателя (приема данных).ino | 3 Kb | 635 | Скачать |
Статьи про ESP32, ESP8266
25 июля , 2023
Комментариев:0
Файлов для скачивания:3
Фото:2
Понравилась статья? Нажми
Виджеты для Easy HMI
Читайте также
Мы в соц сетях
Комментарии