
Если вы хотите получить для своих самоделок достаточно быстродействующий (до 1,5 Мбит/с), дальнобойный (300+ метров), и, в то же время, энергосберегающий (до 50 мА во время передачи) протокол, то «ESP‑Now» — ваш выбор!
В этой статье мы не будем разбирать подробно все технические особенности протокола, так как для этого есть соответствующие спецификации, — вместо этого мы остановимся на более интересном: его практическом применении и, в общем, ознакомимся с некоторыми особенностями протокола.
Что такое ESP-Now, кратко
ESP-Now представляет собой протокол, разработанной компанией Espressif, для соединения между собой устройств на чипах компании, позволяющий осуществлять быструю связь между устройствами, импульсно, по возникновению потребности, без необходимости поддержания постоянной связи между ними, используя handshaking-процедуры.
Что это означает в практическом плане:
очень малая задержка — меньше 1 мс на передачу пакета данных. Для сравнения, эта задержка при передаче с использованием протокола wi‑fi составила бы порядка 10–100 мс, а bluetooth — 5–10 мс;
связь между устройствами осуществляется напрямую, peer‑to‑peer, используя mac‑адрес;
-
в самом простом варианте сети, участвуют два устройства:
приёмник: постоянно находится во включенном состоянии, и ожидает данных — для обработки локально, на борту, или пересылки их дальше;
отправитель: является инициатором передачи данных, включается импульсно, по потребности, когда есть данные для передачи; при появлении данных для передачи — начинает транслировать их в эфир немедленно, без прохождения каких‑либо процедур первичной инициации связи с приёмником (то есть, по сути, нам вообще без разницы, слушает ли нас кто‑либо: «если нам есть что сказать — мне сразу начинаем говорить»);
при потребности, передаваемые данные могут быть зашифрованы по алгоритму AES-128 — для этого в чип esp32 встроен специальный акселератор (AES IP‑блок шифратор), который позволяет осуществлять такое шифрование без нагрузки на CPU, так как работает с задействованием модуля прямого доступа к памяти (Direct Memory Access (DMA));
-
дальность связи составляет 300–500 метров (в идеальных условиях, при прямой видимости). В городских условиях, учитывая плотную настройку, дальность падает до 100–150 метров.
К слову, о дальности: такая дальность обеспечивается с помощью физического способа передачи сигнала, носящего название DSSS (прямое расширение спектра), при задействовании которого, данные разбиваются на части и передаются сразу на многих частотах, так что, в результате, даже если какие‑то из частот затухнут при прохождении сквозь препятствия до приёмника — какие‑то частоты всё равно дойдут и позволят донести информацию.Говоря о дальности, первой приходит мысль, а зачем вообще задействовать этот протокол ESP‑Now, если можно было бы использовать Bluetooth 5.x?
Дело здесь в том, что чип платы esp32 wroom32 (одна из наиболее распространённых и широко известных плат — для которой и предназначены решения ниже) не поддерживает Bluetooth 5.x, а только 4.2, дальность передачи которого составляет до 100 м максимум, где, при этом, энергопотребление составит 80–120 мА (из‑за необходимости постоянного поддержания связи между точками), в то же время как, в противовес, ESP‑Now обеспечит энергопотребление порядка 50 мА (из‑за импульсной передачи), с гораздо большей дальностью (как мы узнали выше).
пропускная способность передачи, с использованием протокола ESP Now составляет вплоть до 1,5 Мбит/сек (медленнее чем wi‑fi, но зато большая дальность);
-
в описании выше вы видели (и в коде ниже увидите ещё), что здесь постоянно используется концепция mac‑адреса. Казалось бы, зачем он нужен, если передатчик просто «пуляет» в эфир данные, не заботясь* о том, кто их примет и примет ли вообще?
Дело здесь в том, что этот mac-адрес используется чтобы помечать каждый пакет данных, исходящий от передатчика.
В свою очередь, радиомодуль приёмника, на аппаратном уровне, постоянно мониторит эфир, на предмет данных, помеченных mac-адресом приёмника (т.е. своим mac-адресом).
Если такой пакет получен, радиомодуль принимает его в буфер, пробуждает CPU приёмника, и дальше начинается обработка этого пакета, где после обработки, CPU приёмника снова засыпает**.
*в вариантах кода ниже, отправка этого подтверждения (acknowledge (ACK)‑сигнал) передатчику — не предусмотрена (в целях ускорения работы).
Таким образом, варианты кода ниже больше предназначены для быстрой работы, чем для гарантии доставки данных.
Однако, такое подтверждение может быть отдельно включено, при желании, если гарантия доставки данных является важной.
**варианты кода ниже не предусматривают засыпание CPU приёмника — он постоянно остаётся включенным, так как код тестовый и я не оптимизировал работу приёмника под питание от батареечных источников эл.энергии. Тем не менее, при желании, это опция может быть доделана.
Несмотря на это, такое решение всё равно остаётся энергоэффективным, так как радиомодуль приёмника всё равно осуществляет фильтрацию пакетов на «железном» уровне, не задействуя CPU, поэтому энергопотребление приёмника остаётся на уровне примерно 25 мА.
Но всё обстоит с точностью до наоборот с передатчиком: для двух первых кейсов ниже реализован сон передатчика, так как это очень важная опция для энергоэффективности.
Кстати, про сон: в вариантах кода ниже будет использовано задействование режима deep sleep (это один из режимов работы esp32, обеспечивающий энергоэффективность) — в этом режиме, выключается CPU, а также весь радиотракт; активными остаются только таймер для пробуждения и GPIO (это может быть использование для пробуждения от нажатия на физическую кнопку или от при касании touch-пинов).
Таким образом, в этом режиме энергопотребление составит уже 10 нА (что может быть весьма важным для, например, датчиков, работающих от батареечных источников питания, долгое время).
А теперь, когда мы немного изучили всю ситуацию в целом, посмотрим на конкретные применения этого протокола ниже...
Сразу хочу сказать по поводу перечисленных вариантов использования ниже: они далеко не исчерпывающие, и я рассмотрел только некоторые из них.
В реальных же проектах, просыпание передатчика может быть реализовано, например, по таймеру, после чего осуществляется чтение датчика, и отправка его данных приёмнику.
Таким образом, при желании, вы можете взять код ниже как основу, и переделать его, под свои сценарии использования.
Все варианты кода ниже — отлажены и протестированы, поэтому у меня они работали чётко и хорошо.
Также, — картинки ниже являются кликабельными.
Вариант использования 1: запуск передачи от физической кнопки
Код передатчика
/*Создано с использованием ИИ DeepSeek.
Код выкладывается без любых гарантий его работы.*/
#include <WiFi.h>
#include <esp_now.h>
#include <esp_sleep.h>
// ========== НАСТРОЙКИ ========== //
#define BUTTON_PIN 4 // Кнопка на GPIO4 (подтяжка к GND)
const bool USE_BUTTON = true; // true - пробуждение по кнопке, false - по таймеру
const uint32_t SLEEP_DURATION = 10; // В секундах (если режим по таймеру)
// ============================== //
typedef struct {
int sensorReading;
bool isAlert;
char deviceName[16];
} TransmitData;
TransmitData txData;
uint8_t receiverMac[] = {0x94, 0x3C, 0xC6, 0x33, 0x71, 0x68};
void sendData() {
// Подготовка данных
txData.sensorReading = analogRead(34);
txData.isAlert = (txData.sensorReading > 2000);
strcpy(txData.deviceName, USE_BUTTON ? "ESP32-Button" : "ESP32-Timer");
// Отправка
esp_err_t result = esp_now_send(receiverMac, (uint8_t *)&txData, sizeof(txData));
Serial.print(millis());
Serial.print(" Отправка: ");
Serial.println(result == ESP_OK ? "Успешно" : "Ошибка");
}
void setup() {
Serial.begin(115200);
delay(1000); // Для Serial Monitor
// Настройка кнопки
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Инициализация WiFi
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
if (esp_now_init() != ESP_OK) {
Serial.println("Ошибка ESP-NOW");
ESP.restart();
}
// Настройка получателя
esp_now_peer_info_t peerInfo;
memset(&peerInfo, 0, sizeof(peerInfo));
memcpy(peerInfo.peer_addr, receiverMac, 6);
peerInfo.channel = 1;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Ошибка добавления получателя");
delay(1000);
ESP.restart();
}
// Отправка данных при любом пробуждении
sendData();
// Настройка следующего пробуждения
if (USE_BUTTON) {
Serial.println("Режим: пробуждение по кнопке");
esp_sleep_enable_ext0_wakeup((gpio_num_t)BUTTON_PIN, LOW);
} else {
Serial.print("Режим: пробуждение по таймеру (");
Serial.print(SLEEP_DURATION);
Serial.println(" сек)");
esp_sleep_enable_timer_wakeup(SLEEP_DURATION * 1000000);
}
Serial.println("Переход в сон...");
delay(200); // Даем время для вывода сообщений
esp_deep_sleep_start();
}
void loop() {}
Код приёмника
/*Создано с использованием ИИ DeepSeek.
Код выкладывается без любых гарантий его работы.*/
#include <WiFi.h>
#include <esp_now.h>
// Структура для принимаемых данных
typedef struct {
int sensorReading;
bool isAlert;
char deviceName[16];
} TransmitData;
TransmitData rxData;
void printFormattedMacAddress() {
String mac = WiFi.macAddress();
mac.replace(":", ", 0x");
Serial.print("MAC-адрес приёмника, для вставки в передатчик: {0x");
Serial.print(mac);
Serial.println("}");
}
void OnDataReceived(const uint8_t *macAddr, const uint8_t *incomingData, int len) {
memcpy(&rxData, incomingData, sizeof(rxData));
Serial.println("\n--- Получены новые данные ---");
Serial.print("От: ");
char macStr[18];
snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X",
macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
Serial.println(macStr);
Serial.print("Устройство: ");
Serial.println(rxData.deviceName);
Serial.print("Значение датчика: ");
Serial.println(rxData.sensorReading);
Serial.print("Тревога: ");
Serial.println(rxData.isAlert ? "ДА" : "НЕТ");
}
void setup() {
Serial.begin(115200);
delay(1000); // Даём время для открытия Serial Monitor
// Инициализация WiFi для получения MAC
WiFi.mode(WIFI_STA);
printFormattedMacAddress();
// Отключаем WiFi перед инициализацией ESP-NOW
WiFi.disconnect();
delay(100);
// Инициализация ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Ошибка инициализации ESP-NOW");
ESP.restart();
return;
}
esp_now_register_recv_cb(OnDataReceived);
Serial.println("Режим приёмника активирован. Ожидание данных...");
}
void loop() {
// Пустой цикл
}
Первичное действие: надо сначала запустить приёмник, который в мониторе порта выведет свой mac-адрес (на картинке ниже он показан справа), который нужно будет затем вставить в код передатчика (на картинке ниже он показан слева), и прошить этим кодом передатчик:

После прошивки и перезагрузки, передатчик отправит текущие данные на приёмник, после чего плата уйдёт в глубокий сон.
При нажатии на физическую кнопку, подключенную к пину D4, — передатчик проснётся, отправит партию данных, после чего снова уйдёт в глубокий сон (на картинке ниже эти данные, отправленные после нажатия на кнопку — выделены; до них, не выделенные, это то — что было отправлено сразу после первой загрузки кода:

Кстати, как можно видеть, в самом начале кода передатчика, есть переменная USE_BUTTON
, с помощью которой, можно выставить, от какого события проснётся передатчик — от таймера, или от нажатия на физическую кнопку.
Это означает, что вы можете выставить эту переменную на пробуждение от таймера, после чего, считать значение с вашего датчика, и отослать его.
Как можно видеть, для этого почти всё готово — мы в этом коде считываем аналоговое значение с пина 34 и отправляем его.
Это сделано просто для теста, своего рода «заглушка», которую вы можете изменить под считывание данных с вашего датчика, в вашем реальном проекте.
Обратите внимание ещё на такой важный момент: переменной
BUTTON_PIN
мы назначаем 4, то есть пробуждение от нажатия на физическую кнопку, подключенную к 4 пину — это сделано не случайно, так как не все пины esp32 позволяют ей проснуться из состояния deep sleep.Вот какие пины инициируют выход из deep sleep: 0, 2, 4, 15, 25...27, 32...39.
При этом, нужно иметь в виду ещё один момент: из перечисленных выше пинов, некоторые имеют свои нюансы, поэтому, это нужно учитывать, при подключении периферии — все эти нюансы показаны в распиновке вот тут.
Вариант использования 2: запуск передачи от сенсорной панели*, подключенной к пину, "чувствующему" касания
*в качестве такой сенсорной панели может выступать даже кусочек фольги, или монетка, к которой припаян/прикручен провод, подключенный к соответствующему пину esp32.
Было бы странно, используя esp32, не попытаться применить одну из интересных её возможностей, — пины, «чувствующие» касания.
Поэтому, мы проделаем следующие манипуляции:
передатчик, с его загруженным кодом оставим из предыдущего варианта, пускай он остаётся включенным;
в то время как на приёмник, загрузим другой код (показан ниже);
Код передатчика (код приёмника надо взять из варианта выше)
/*Создано с использованием ИИ DeepSeek.
Код выкладывается без любых гарантий его работы.*/
#include <WiFi.h>
#include <esp_now.h>
#include <esp_sleep.h>
// ========== НАСТРОЙКИ ========== //
#define TOUCH_PIN T0 // D4 = T0 (GPIO4)
const uint16_t TOUCH_THRESHOLD = 40; // Порог (у вас 78 в покое → 40 нормально)
const uint32_t SLEEP_TIMEOUT_MS = 30000; // 30 сек - резервный таймер
// ============================== //
typedef struct {
int sensorReading;
bool isAlert;
char deviceName[16];
} TransmitData;
TransmitData txData;
uint8_t receiverMac[] = {0x94, 0x3C, 0xC6, 0x33, 0x71, 0x68};
void sendData() {
txData.sensorReading = analogRead(34);
txData.isAlert = (txData.sensorReading > 2000);
strcpy(txData.deviceName, "ESP32-Touch");
esp_err_t result = esp_now_send(receiverMac, (uint8_t *)&txData, sizeof(txData));
Serial.print("["); Serial.print(millis()); Serial.print("] ");
Serial.print("Отправка: "); Serial.println(result == ESP_OK ? "Успешно" : "Ошибка");
}
void setup() {
Serial.begin(115200);
delay(1000); // Для Serial Monitor
// Инициализация WiFi
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
if (esp_now_init() != ESP_OK) {
Serial.println("Ошибка ESP-NOW");
ESP.restart();
}
// Настройка получателя
esp_now_peer_info_t peerInfo;
memset(&peerInfo, 0, sizeof(peerInfo));
memcpy(peerInfo.peer_addr, receiverMac, 6);
peerInfo.channel = 1;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Ошибка добавления получателя");
ESP.restart();
}
// Проверка причины пробуждения
esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
if (wakeup_reason == ESP_SLEEP_WAKEUP_TOUCHPAD) {
Serial.println("Пробуждение по касанию!");
delay(500); // Антидребезг
sendData();
}
// Настройка touch-сенсора (D4 = T0)
touchAttachInterrupt(TOUCH_PIN, []{}, TOUCH_THRESHOLD);
esp_sleep_enable_touchpad_wakeup();
// Резервный таймер (на случай если touch не сработает)
esp_sleep_enable_timer_wakeup(SLEEP_TIMEOUT_MS * 1000);
// Диагностика
Serial.print("Текущее значение Touch (D4): ");
Serial.println(touchRead(TOUCH_PIN));
Serial.print("Порог: ");
Serial.println(TOUCH_THRESHOLD);
Serial.println("Коснитесь сенсора на D4...");
Serial.println("Переход в сон...");
delay(200);
esp_deep_sleep_start();
}
void loop() {}
После загрузки кода, передатчик выведет серию сообщений, где можно видеть, какое значение он «чувствует» на данный момент на пине (как можно видеть, оно составляет 78), и значение, при достижении которого, будет зарегистрирован факт касания — здесь этим порогом значения является 40*.
*это значение я вывел опытным путём, загружая тестовый код, чтобы выявить, какое значение будет показывать пин, при касании.

Не хочу вас утомлять этими подробностями, просто можете для себя отметить, что если подключить к пину D4 кусок цветной «перемычки» (цветные провода типа DuPont, обычно используемые для сборки временных самодельных конструкций с использованием breadboard‑ов) длиной, примерно 15 см, то при касании конца провода, на пине будет значение примерно от 0 до 40, от которого передатчик проснётся, отправит данные и заснёт снова.
При касании этого пина, картина на передатчике и приёмнике будет выглядеть так:

Кстати, обратите внимание на код: там используемый нами тач-пин D4 называется как какой‑то «Т0»!
Это не случайно, так как тач‑пины esp32 имеют свои названия (если эти названия вставить в код, то Arduino IDE, распознает их), отличающиеся от нумерации пинов, к которой мы привыкли: то есть, мы могли бы ожидать, что D4 будет обозначаться как «тач‑пин D4». Но нет — «никто и не говорил, что будет легко» :-))
Таким образом, соответствие нумерации пинов и тач-пинов, как они должны обозначаться в коде, будет выглядеть следующим образом:
D4 — T0
D0 — T1
D2 — T2
D15 — T3
D13 — T4
D12 — T5
D14 — T6
D27 — T7
D33 — T8
D32 — T9
И, опять же, нужно помнить, что у каждого пина есть свои нюансы, поэтому, чтобы понимать, стоит этот пин использовать или нет, опять смотрим на распиновку сюда и уже потом принимаем решение об использовании этого пина или не использовании.
Вариант использования 3: джойстик
Казалось бы, мы рассмотрели все возможные варианты? Ан нет! ;-)
Есть ещё один весьма любопытный: джойстик. Дело в том, что на базе протокола ESP-Now можно реализовать достаточно эффективный джойстик, позволяющий передавать данные быстро, с энергоэффективностью в два-три раза выше, чем у wi-fi.
Для этого, реализуем код приёмника и передатчика, где:
приёмник постоянно будет слать данные, с частотой в 50 раз в секунду;
приёмник их принимать и отображать в мониторе порта.
Для работы, этой пары также нужен mac-адрес. Сделаем так, чтобы его раздобыть можно было самым простым способом: нужно будет включить только приёмник, который, при отсутствии сигнала от передатчика, подождёт пару секунд и выведет mac-адрес в мониторе порта:

Далее, останется только этот mac-адрес, как и в вариантах выше, вставить в код передатчика, и прошить этим кодом его.
Код передатчика
/*Создано с использованием ИИ DeepSeek.
Код выкладывается без любых гарантий его работы.*/
#include <WiFi.h>
#include <esp_now.h>
// ========== НАСТРОЙКИ ========== //
#define BUTTON1_PIN 12 // Кнопка 1 на D12
#define BUTTON2_PIN 14 // Кнопка 2 на D14
const uint32_t SEND_DELAY = 20; // Задержка между отправками (мс)
// ============================== //
typedef struct {
bool button1State;
bool button2State;
uint8_t batteryLevel; // Для примера
} JoystickData;
JoystickData txData;
uint8_t receiverMac[] = {0x94, 0x3C, 0xC6, 0x33, 0x71, 0x68};
void setup() {
Serial.begin(115200);
delay(100);
// Настройка кнопок
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(BUTTON2_PIN, INPUT_PULLUP);
// Инициализация WiFi
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
if (esp_now_init() != ESP_OK) {
Serial.println("Ошибка инициализации ESP-NOW");
ESP.restart();
}
// Настройка получателя
esp_now_peer_info_t peerInfo;
memset(&peerInfo, 0, sizeof(peerInfo));
memcpy(peerInfo.peer_addr, receiverMac, 6);
peerInfo.channel = 1;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Ошибка добавления получателя");
ESP.restart();
}
Serial.println("Джойстик готов. Отправка данных...");
}
void sendData() {
// Чтение состояния кнопок (инвертируем, так как PULLUP)
txData.button1State = !digitalRead(BUTTON1_PIN);
txData.button2State = !digitalRead(BUTTON2_PIN);
txData.batteryLevel = map(analogRead(35), 0, 4095, 0, 100); // Пример для VBAT
// Отправка
esp_err_t result = esp_now_send(receiverMac, (uint8_t *)&txData, sizeof(txData));
// Вывод в Serial только при изменении
static bool lastB1 = false, lastB2 = false;
if(txData.button1State != lastB1 || txData.button2State != lastB2) {
Serial.print("Кнопки: ");
Serial.print(txData.button1State ? "1" : "0");
Serial.print(txData.button2State ? "1" : "0");
Serial.print(" | Статус: ");
Serial.println(result == ESP_OK ? "OK" : "FAIL");
lastB1 = txData.button1State;
lastB2 = txData.button2State;
}
}
void loop() {
sendData();
delay(SEND_DELAY); // Контроль частоты опроса
}
Код приёмника
/*Создано с использованием ИИ DeepSeek.
Код выкладывается без любых гарантий его работы.*/
#include <WiFi.h>
#include <esp_now.h>
typedef struct {
bool button1State;
bool button2State;
} JoystickData;
JoystickData rxData;
uint32_t lastReceiveTime = 0;
bool macDisplayed = false;
void printMacAddress() {
String mac = WiFi.macAddress();
mac.replace(":", ", 0x");
Serial.print("{0x");
Serial.print(mac);
Serial.println("}");
}
void OnDataReceived(const uint8_t *mac, const uint8_t *data, int len) {
memcpy(&rxData, data, sizeof(rxData));
lastReceiveTime = millis();
Serial.print("Кнопки: ");
Serial.print(rxData.button1State ? "1" : "0");
Serial.println(rxData.button2State ? "1" : "0");
macDisplayed = false;
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.disconnect();
if(esp_now_init() != ESP_OK) {
Serial.println("Ошибка ESP-NOW");
ESP.restart();
}
esp_now_register_recv_cb(OnDataReceived);
Serial.println("Ожидание данных...");
}
void loop() {
if(!macDisplayed && (millis() - lastReceiveTime > 2000)) {
printMacAddress();
macDisplayed = true;
}
delay(100);
}
После чего, мы увидим следующую картину, если ни одна кнопка не нажата (для теста были использованы две кнопки):

И вот такую, если нажата одна или другая кнопка:


Легко заметить, что этот код не является самым оптимальным, так как передатчик постоянно шлёт данные, даже если кнопки не нажаты.
Было бы более оптимальным:
отсылать только изменения;
между нажатиями на кнопки, переводить передатчик в режим light sleep (это ещё один энергосберегающий режим esp32, который, однако, не требует, для выхода из него, перезагрузки системы — можно просто продолжить выполнение текущего кода).
С учётом этих улучшений, энергоэффективность передатчика может подпрыгнуть даже вплоть до 100 раз, так что, есть потенциал для улучшений кода...
В любом случае, в завершение, можно отметить, что наверняка каждый из вас, даже навскидку сможет назвать множество применений для этого протокола, учитывая его несомненные достоинства!
P.S. Для тех, кому захочется вникнуть более подробно в детали протокола ESP-Now, можно прочитать вот эту статью или же обратиться к официальной документации от Espressif.
Комментарии (8)
nikolz
24.07.2025 19:18ESP‑Now обеспечит энергопотребление порядка 50 мА (из‑за импульсной передачи), с гораздо большей дальностью (как мы узнали выше).
Вы ошибаетесь.
Протокол ESP-Now реализуется на основе режима WiFi.
Дальность обеспечивается большой мощностью передатчика ESP32. Эта же мощность доступна и в режиме BLE. Более того, ESP-Now это обрезанный протокол BLE, который может быть принят приемником BLE.
Что же касается потребления, то оно такое же как в режиме WiFi.
Ток потребления передатчика не 50 мА, а 240 мА (см документацию)
У всех чипов ESP при включенном приемнике ток потребления не менее 70 мА, а при включении передатчика в импульсе составляет до 300 мА и более.
----------------
Более того, если ESP уходит в сон, то выход его из сна составляет не менее 100 ms.
DAN_SEA
24.07.2025 19:18Могу ошибаться, но, думаю, вы ошиблись ;-)
В таблице указана передача с помощью wifi и на довольно большой мощности. Опять же повторю - wifi требует постоянного соединения (насколько мне известно). А мы же - "пульнули" кратенько данные и выключили передачу. Отсюда и потребление низкое. А тут характеристики для wifi даны;-)....nikolz
24.07.2025 19:18Попробую объяснить.
В документации указаны табл 5-4 все режимы работы радио модуля чипа.
Есть два режима WiFi и BT и третий - совмещенная работа т е переключение между режимами.
Там нет режима ESP-NOW, потому что это не режим работы приемника и передатчика, а протокол кодирования передаваемого пакета.
Поэтому модуляция и мощность одна и та же при WiFi и ESP-NOW.
Разница лишь в том, что ESP-NOW - это протокол без установки соединения и для него не нужен координатор, если это не mesh.
Поэтому все ваши рассуждение по току потребления и по особенностям спектра в режиме ESP-NOW ошибочны.
После того, как Вы подключились к роутеру в режиме WiFi Вы можете также быстро передавать данные по протоколу UDP так как это тоже протокол без установки соединения.
----------------------
ESP-NOW был придуман для ESP8266, как альтернатива BLE, которого тогда еще не было для реализации обмена точка-точка.
---------------------------
Я экспериментировал с этими протоколами на ESP8266 лет деять назад. Измерял и токи потребления и скорость передачи.
На хабре есть статья. Минимальное время выхода из сна и передачи данных по WiFi (UDP) и по ESP-NOW - 120 ms.
А вот модули(не ESP) с BLE делают это примерно не более, чем за 1-3 ms. И ток потребления у них при мощности 0дБ не 130 мА, а примерно раз в 5 меньше.
jaha33
24.07.2025 19:18У ESP Now мощность передачи по умолчанию 20 dbm, поэтому да, в пике потребление будет в районе 300 мА. В даташитах на разные ESP вообще написано закладываться на то, что потребление может достигать до 500 мА
Вообще EPS не про энерго сбережение, у этих микросхем только в режиме глубокого сна очень маленькое потребление, в остальных случаях микросхема потребляет достаточно много.
nikolz
24.07.2025 19:18В реальности и в режиме глубокого сна потребление большое 20 мкА минимум 10.
И это потребление будет от батарейки непрерывно.
В современных чипах BLE(не ESP), или на 433МГц потребление в режиме сна порядка 1 мкА.
-------------------
Klochko
24.07.2025 19:18А может ли ESP32 поддерживать соединение с удаленным сокетом и ретранслировать пакеты в ESP Now?
fivlabor
Стоит ли ждать измерение скорости/дальности/отлика/энергопотребления в следующей статье?
cnet Автор
Если есть сильная потребность, можно попробовать допилить.