Найти тему
Mega.Animeshnik

ESP-NOW работа с esp8266 и esp32

Оглавление

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

Суть проблемы

ESP Now, по сути, работает на чипе Wi-Fi, но с изменённым протоколом для ускорения. Однако некоторые аспекты остались прежними, например, разделение частоты 2.4 ГГц и 5 ГГц на каналы.

Если вы просто инициализируете ESP-NOW без подключения платы к Wi-Fi роутеру, проблем не возникнет. Однако, если вы подключаете одну из плат к роутеру, она автоматически настраивается на его канал. В результате другая ESP не сможет с ней взаимодействовать, если также не переключится на нужный канал.

Решение 1

Подключить вторую плату к тому же роутеру, тогда платы будут настроены на один канал. Две ESP8266 прекрасно общаются друг с другом в режиме WIFI_STA, будучи одновременно подключенными к одной точки доступа. У меня так работает управление подсветкой. Однако, ESP32 и ESP8266 в таком режиме, не хотят общаться, сколько бы я не пытался.

Плюсы: простота.

Минусы: не работает если требуется передавать от ESP8266 к ESP32.

Решение 2

В первом решении я написал, что ESP32 не хочет дружить с ESP8266 по ESP Now в режиме WIFI_STA, если подключена к роутеру. На самом деле я не проверял отправку, меня интересовало именно получение данных ESP32 от ESP8266. Я находил теорию, что якобы отключение спящего режима (WiFi.setSleep(false);) для модема решает эту проблему, но на практике это мне никак не помогло. Пока ESP32 не подключена к роутеру, всё работает, как только подключается, она перестаёт принимать данные по ESP-NOW. Решение — использовать режим WIFI_AP_STA и создать точку доступа. Смысл такой: при запуске сканируете сеть, находите вашу ESP32, которой хотите передать данные, узнаете её канал и настраиваетесь на него.

wifi_promiscuous_enable(1);
wifi_set_channel(канал);
wifi_promiscuous_enable(0);

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

Используете глубокий сон и не хотите сканировать каждый раз сеть? Нет проблем, узнайте канал один раз и сохраните его командой ESP.rtcUserMemoryWrite и читайте память при каждом просыпание ESP.rtcUserMemoryRead. Это не изнашивает flash память, а данные не теряются при перезапуске, которым сопровождается выход из глубокого сна.

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

Минусы: повышенное энергопотребление у принимающего esp из за режима WIFI_AP_STA. У меня к ESP32 ещё подключен приёмник на 433мГц и несмотря на его отдельное питание, наличие конденсаторов, приёмник 433мГц начинает работать ужасно, я перестал принимать сигналы от датчиков. Пришлось отказаться от этого решения.

Решение 3

Самое отбитое решение — это подключить к вашему ESP32 ещё один ESP. Я пробовал разные варианты, и, раз мне не помог вариант 2, то придумывал дальше. К ESP32 подключил ESP-01, где инициализируется ESP Now, но к роутеру не подключаемся, т. е. канал ESP8266 будет по умолчанию 1, и можно вообще не заморачиваться с его настройкой. Теперь нам не надо у передатчика узнавать канал, просто включаемся, передаём данные и засыпаем, максимальная экономия со стороны передатчика. Данные от ESP-01 к ESP32 передавал по Serial, можно ещё каким-либо способом.

Плюсы: максимальная энергоэффективность у передатчика.

Минусы: потребление ещё выше чем у ESP32 в режиме WIFI_AP_STA. Излишнее нагромождение.

Разное дополнение

ESP-NOW опознает платы по mac, если вдруг с вашим принимающим esp что то случится и вы решите его заменить, все передатчики придется перепрошивать. Во избежание этого можно программно изменять mac адрес и заставить новый контроллер притвориться старым.

uint8_t GatewayMac[] = { 0xb0, 0xb0, 0x1c, 0xa1, 0x00, 0x40 };
esp_wifi_set_mac(WIFI_IF_AP, &GatewayMac[0]);

для ESP32 и

uint8_t GatewayMac[] = { 0xb0, 0xb0, 0x1c, 0xa1, 0x00, 0x40 };
wifi_set_macaddr(SOFTAP_IF, &GatewayMac[0]);

для ESP8266.

Я построил графики энергопотребления для ESP32 в качестве приёмника для способа 2 и 3. Однако результаты тестов не совсем точны, скорее, даже, хаотичны. Возможно, аккумулятор ещё раскачивается или он не полностью заряжается.

Аккумулятор 18650 который я использовал, имеет ёмкость 3500 мАч. По оси X отложено время эксперимента, а по оси Y — условный заряд в процентах. То, что графики не доходят до нуля не ошибка. Скорее всего, это связано с неправильным расчётом оставшегося объёма заряда.

Все четыре эксперимента проводились до отключения ESP32. Запись данных шла на SD-карту, поэтому данные о продолжительности экспериментов верны.

Заключение

Скорее всего, вы мало что поняли из моего объяснения. Рисовать схемы и публиковать код ради нескольких просмотров я не вижу смысла. У меня была проблема, и я её решил, пути, по которым шёл, я описал. В основном мне помогли следующие источники, а раз помогли мне, помогут и вам. https://www.electrosoftcloud.com/en/esp32-wifi-and-esp-now-simultaneously/ https://github.com/jonasbystrom/ESP-Now-Sensor-system-with-WiFi/tree/main https://randomnerdtutorials.com/esp32-esp-now-wi-fi-web-server/ https://randomnerdtutorials.com/esp-now-auto-pairing-esp32-esp8266/

пикча с интернета для превью
пикча с интернета для превью