• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

esp (кнопка) - wifi роутер - esp (светодиод)

mk2

New member
Интересует пример реализации для передачи управляющего сигнала с одной esp на другую находящиеся в одной сети wifi.
Нужен только пример. Умные советы и рекомендации не пишите.
 

pvvx

Активный участник сообщества
Вопрос к DeepSeek: Пример соединения двух ESP32 через WiFi роутер для обмена данными.

🔌 Способ 1: TCP-клиент/сервер
В этом методе одна плата (сервер) создаёт сокет и ожидает подключений от другой (клиента). Это полезно для организации передачи команд или данных по запросу, например, для удалённого включения светодиода или опроса датчика.
Важно: Убедитесь, что оба ESP32 подключены к одной сети роутера, и их IP-адреса известны. В режиме точки доступа роутер автоматически назначает IP-адреса. На платах есть встроенный светодиод, который мы и будем управлять.
  • Код для платы 1 (Сервер)
    Этот код создаёт сервер на 80-м порту, который в ответ на любой GET-запрос возвращает состояние вымышленного переключателя (в данном случае — включённое состояние для примера).
cpp
#include <WiFi.h>

// Данные вашей Wi-Fi сети
const char* ssid = "имя_вашего_роутера";
const char* password = "пароль_роутера";

// Создаём сервер на порту 80
WiFiServer server(80);

void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);

// Подключаемся к Wi-Fi роутеру
Serial.print("Подключение к Wi-Fi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nПодключено!");

// Запускаем сервер и выводим его IP в монитор порта
server.begin();
Serial.print("Сервер запущен. IP: ");
Serial.println(WiFi.localIP());
}

void loop() {
WiFiClient client = server.available(); // Проверяем, есть ли новый клиент

if (client) {
Serial.println("Новый клиент подключен.");
String request = client.readStringUntil('\r');
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/plain");
client.println("Connection: close");
client.println();

// Отправляем состояние "ON" или "OFF". Здесь для примера всегда "ON".
client.println("ON");
delay(10);
client.stop();
Serial.println("Клиент отключен.");
}
}
  • Код для платы 2 (Клиент)
    Этот код периодически отправляет GET-запрос на сервер (плату 1), получает строку "ON" или "OFF" и включает или выключает встроенный светодиод.
cpp
#include <WiFi.h>

// Данные вашей Wi-Fi сети (та же, что и для сервера)
const char* ssid = "имя_вашего_роутера";
const char* password = "пароль_роутера";

// IP-адрес платы-сервера (вы узнаете его из монитора порта)
const char* serverIP = "192.168.1.xxx"; // <-- ЗАМЕНИТЕ НА IP СЕРВЕРА!
const uint16_t serverPort = 80;

void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);

// Подключаемся к Wi-Fi роутеру
Serial.print("Подключение к Wi-Fi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Подключено!");
Serial.print("IP клиента: ");
Serial.println(WiFi.localIP());
}

void loop() {
WiFiClient client;
if (client.connect(serverIP, serverPort)) {
// Отправляем HTTP GET-запрос
client.print(String("GET / HTTP/1.1\r\n") +
"Host: " + serverIP + "\r\n" +
"Connection: close\r\n\r\n");

// Ждём ответ от сервера
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 2000) {
client.stop();
return;
}
}

// Читаем ответ
String response;
while (client.available()) {
response += client.readStringUntil('\r');
}
client.stop();

// Анализируем ответ и управляем светодиодом
if (response.indexOf("ON") >= 0) {
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("Светодиод ВКЛЮЧЁН");
} else if (response.indexOf("OFF") >= 0) {
digitalWrite(LED_BUILTIN, LOW);
Serial.println("Светодиод ВЫКЛЮЧЁН");
}
} else {
Serial.println("Не удалось подключиться к серверу");
}
delay(2000); // Период опроса — 2 секунды
}
🎯 Способ 2: MQTT (клиент-брокер)
MQTT идеально подходит, когда нужно создать более гибкую систему, где данные от многих устройств могут приходить в одну точку, а потом перенаправляться подписчикам. Это решение для умного дома и сценариев «многие-ко-многим».
  • Брокер: Вы также можете использовать публичный брокер, например broker.hivemq.com, как показано в примере. Или поднять свой Mosquitto, например, на Raspberry Pi.
  • Принцип: Платы подключаются к Wi-Fi роутеру и общаются через MQTT-брокер. Одно устройство публикует сообщение в топик esp/test, а другое — подписывается на него. По сути, код для обеих плат будет почти одинаковым.
Код (для обеих плат, он одинаковый, IP брокера один и тот же):
cpp
#include <WiFi.h>
#include <PubSubClient.h>

// Данные вашей Wi-Fi сети
const char* ssid = "имя_вашего_роутера";
const char* password = "пароль_роутера";

// Данные MQTT брокера (например, публичный HiveMQ)
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void callback(char* topic, byte* message, unsigned int length) {
// Эта функция вызывается, когда приходит новое сообщение в подписанный топик
Serial.print("Сообщение в топике ");
Serial.print(topic);
Serial.print(": ");
for (int i = 0; i < length; i++) {
Serial.print((char)message);
}
Serial.println();

// Здесь можно добавить логику на полученное сообщение
// Например, сравнить строку и включить светодиод
// if (strcmp((char*)message, "ON") == 0) {
// digitalWrite(LED_BUILTIN, HIGH);
// }
}

void reconnect() {
// Цикл попыток подключения к MQTT брокеру
while (!client.connected()) {
if (client.connect("ESP32Client")) {
client.subscribe("esp/test");
} else {
delay(5000);
}
}
}

void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);

// Подключение к Wi-Fi роутеру
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}

client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}

void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();

// Публикуем сообщение для другого ESP32
client.publish("esp/test", "Привет от ESP32!");

delay(2000);
}
💡 Совет: Для работы с этой схемой вам потребуется установить библиотеку PubSubClient в Arduino IDE. Сделать это можно через менеджер библиотек.
💬 Способ 3: UDP (двусторонний обмен)
UDP — отличный выбор, когда каждого такта связи критична скорость, и вы готовы мириться с редкой потерей пакетов. Идеально подходит для потоковых данных: видео, звука или частых обновлений показаний датчиков.
  • Особенность: Это протокол без установки соединения, поэтому оба экземпляра кода идентичны — они просто слушают определённый порт и отправляют данные на известный IP и порт другого устройства.
  • Как это работает:
    1. Обе платы подключаются к одному Wi-Fi роутеру.
    2. Вы указываете в коде IP-адрес и порт соседней платы.
    3. Плата создаёт UDP-пакет и отправляет его на указанный адрес.
    4. Вторая плата слушает свой порт и, получив пакет, может тут же отправить ответ.
Главное отличие от TCP: передача датаграмм не требует постоянного соединения, что ускоряет обмен, но не гарантирует доставку. Для большинства DIY-проектов на ESP32 этого более чем достаточно.
⚖ Сравнение методов
Чтобы вам было проще выбрать, вот краткое сравнение:


ХарактеристикаTCP (Сервер/Клиент)MQTTUDP (Датаграммы)
Сложность реализацииНизкаяСредняяНизкая
Надёжность доставкиВысокая (с подтверждением)Высокая (благодаря TCP)Низкая (без подтверждения)
Скорость работыСредняяСредняя/Низкая (из-за брокера)Высокая
Гибкость системыНизкая (связь «точка-точка»)Высокая (связь «многие-ко-многим»)Средняя
Лучше всего подходит дляУправление по команде (вкл/выкл LED, опрос датчика)Сложных систем с множеством датчиков и исполнителей (умный дом)Потоковых данных (видео, звук, частые обновления датчиков)
💎 Заключение
Какой бы метод вы ни выбрали, все они начинаются с подключения обоих ESP32 к вашему Wi-Fi роутеру.
Надеюсь, эти примеры помогут вам в вашем проекте. Если возникнут вопросы — обращайтесь!
 

mk2

New member
Начните с примеров в ардуино.
нп. Веб сервер и httpclient
Спасибо за совет. Ваша рекомендация уже пройденный этап. По отдельности всё работает, в связке нее хочет. Именно по этому интересует рабочий вариант реализации, чтобы найти что не работает у меня.
Если интересует код, то pvvx уже написал все варианты испробованные мной. Привык учиться на примерах. Поэтому - если есть код работающей связки esp-роутер_wifi-esp, то прошу опубликовать в этой ветке или в личным сообщением.
 

mk2

New member
Используйте ESP-NOW это проще всего и работает быстро. Пример есть в документации. И в интернете их не мало.
Спасибо за совет. С ESP-NOW у меня вопросов нет. Интересует только связка esp-роутер_wifi-esp. Причины изложены выше.
 

mk2

New member
Вопрос к DeepSeek: Пример соединения двух ESP32 через WiFi роутер для обмена данными.

🔌 Способ 1: TCP-клиент/сервер
В этом методе одна плата (сервер) создаёт сокет и ожидает подключений от другой (клиента). Это полезно для организации передачи команд или данных по запросу, например, для удалённого включения светодиода или опроса датчика.

  • Код для платы 1 (Сервер)
    Этот код создаёт сервер на 80-м порту, который в ответ на любой GET-запрос возвращает состояние вымышленного переключателя (в данном случае — включённое состояние для примера).
cpp
#include <WiFi.h>

// Данные вашей Wi-Fi сети
const char* ssid = "имя_вашего_роутера";
const char* password = "пароль_роутера";

// Создаём сервер на порту 80
WiFiServer server(80);

void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);

// Подключаемся к Wi-Fi роутеру
Serial.print("Подключение к Wi-Fi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nПодключено!");

// Запускаем сервер и выводим его IP в монитор порта
server.begin();
Serial.print("Сервер запущен. IP: ");
Serial.println(WiFi.localIP());
}

void loop() {
WiFiClient client = server.available(); // Проверяем, есть ли новый клиент

if (client) {
Serial.println("Новый клиент подключен.");
String request = client.readStringUntil('\r');
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/plain");
client.println("Connection: close");
client.println();

// Отправляем состояние "ON" или "OFF". Здесь для примера всегда "ON".
client.println("ON");
delay(10);
client.stop();
Serial.println("Клиент отключен.");
}
}
  • Код для платы 2 (Клиент)
    Этот код периодически отправляет GET-запрос на сервер (плату 1), получает строку "ON" или "OFF" и включает или выключает встроенный светодиод.
cpp
#include <WiFi.h>

// Данные вашей Wi-Fi сети (та же, что и для сервера)
const char* ssid = "имя_вашего_роутера";
const char* password = "пароль_роутера";

// IP-адрес платы-сервера (вы узнаете его из монитора порта)
const char* serverIP = "192.168.1.xxx"; // <-- ЗАМЕНИТЕ НА IP СЕРВЕРА!
const uint16_t serverPort = 80;

void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);

// Подключаемся к Wi-Fi роутеру
Serial.print("Подключение к Wi-Fi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Подключено!");
Serial.print("IP клиента: ");
Serial.println(WiFi.localIP());
}

void loop() {
WiFiClient client;
if (client.connect(serverIP, serverPort)) {
// Отправляем HTTP GET-запрос
client.print(String("GET / HTTP/1.1\r\n") +
"Host: " + serverIP + "\r\n" +
"Connection: close\r\n\r\n");

// Ждём ответ от сервера
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 2000) {
client.stop();
return;
}
}

// Читаем ответ
String response;
while (client.available()) {
response += client.readStringUntil('\r');
}
client.stop();

// Анализируем ответ и управляем светодиодом
if (response.indexOf("ON") >= 0) {
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("Светодиод ВКЛЮЧЁН");
} else if (response.indexOf("OFF") >= 0) {
digitalWrite(LED_BUILTIN, LOW);
Serial.println("Светодиод ВЫКЛЮЧЁН");
}
} else {
Serial.println("Не удалось подключиться к серверу");
}
delay(2000); // Период опроса — 2 секунды
}
🎯 Способ 2: MQTT (клиент-брокер)
MQTT идеально подходит, когда нужно создать более гибкую систему, где данные от многих устройств могут приходить в одну точку, а потом перенаправляться подписчикам. Это решение для умного дома и сценариев «многие-ко-многим».
  • Брокер: Вы также можете использовать публичный брокер, например broker.hivemq.com, как показано в примере. Или поднять свой Mosquitto, например, на Raspberry Pi.
  • Принцип: Платы подключаются к Wi-Fi роутеру и общаются через MQTT-брокер. Одно устройство публикует сообщение в топик esp/test, а другое — подписывается на него. По сути, код для обеих плат будет почти одинаковым.
Код (для обеих плат, он одинаковый, IP брокера один и тот же):
cpp
#include <WiFi.h>
#include <PubSubClient.h>

// Данные вашей Wi-Fi сети
const char* ssid = "имя_вашего_роутера";
const char* password = "пароль_роутера";

// Данные MQTT брокера (например, публичный HiveMQ)
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void callback(char* topic, byte* message, unsigned int length) {
// Эта функция вызывается, когда приходит новое сообщение в подписанный топик
Serial.print("Сообщение в топике ");
Serial.print(topic);
Serial.print(": ");
for (int i = 0; i < length; i++) {
Serial.print((char)message);
}
Serial.println();

// Здесь можно добавить логику на полученное сообщение
// Например, сравнить строку и включить светодиод
// if (strcmp((char*)message, "ON") == 0) {
// digitalWrite(LED_BUILTIN, HIGH);
// }
}

void reconnect() {
// Цикл попыток подключения к MQTT брокеру
while (!client.connected()) {
if (client.connect("ESP32Client")) {
client.subscribe("esp/test");
} else {
delay(5000);
}
}
}

void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);

// Подключение к Wi-Fi роутеру
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}

client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}

void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();

// Публикуем сообщение для другого ESP32
client.publish("esp/test", "Привет от ESP32!");

delay(2000);
}

💬 Способ 3: UDP (двусторонний обмен)
UDP — отличный выбор, когда каждого такта связи критична скорость, и вы готовы мириться с редкой потерей пакетов. Идеально подходит для потоковых данных: видео, звука или частых обновлений показаний датчиков.

  • Особенность: Это протокол без установки соединения, поэтому оба экземпляра кода идентичны — они просто слушают определённый порт и отправляют данные на известный IP и порт другого устройства.
  • Как это работает:
    1. Обе платы подключаются к одному Wi-Fi роутеру.
    2. Вы указываете в коде IP-адрес и порт соседней платы.
    3. Плата создаёт UDP-пакет и отправляет его на указанный адрес.
    4. Вторая плата слушает свой порт и, получив пакет, может тут же отправить ответ.

⚖ Сравнение методов
Чтобы вам было проще выбрать, вот краткое сравнение:



ХарактеристикаTCP (Сервер/Клиент)MQTTUDP (Датаграммы)
Сложность реализацииНизкаяСредняяНизкая
Надёжность доставкиВысокая (с подтверждением)Высокая (благодаря TCP)Низкая (без подтверждения)
Скорость работыСредняяСредняя/Низкая (из-за брокера)Высокая
Гибкость системыНизкая (связь «точка-точка»)Высокая (связь «многие-ко-многим»)Средняя
Лучше всего подходит дляУправление по команде (вкл/выкл LED, опрос датчика)Сложных систем с множеством датчиков и исполнителей (умный дом)Потоковых данных (видео, звук, частые обновления датчиков)
💎 Заключение
Какой бы метод вы ни выбрали, все они начинаются с подключения обоих ESP32 к вашему Wi-Fi роутеру.
Надеюсь, эти примеры помогут вам в вашем проекте. Если возникнут вопросы — обращайтесь!
Спасибо за совет. Жаль что Вы не упаковали примеры кода в "спойлер" - много приходится проматывать.
 

nikolz

Well-known member
Я подумал , а DeepSeek ответил:
Привет! Ты абсолютно прав — ESP-NOW действительно будет самым простым и эффективным решением для твоей задачи.
В отличие от обычного Wi-Fi (MQTT или HTTP), ESP-NOW не требует наличия роутера в сети, работает по принципу "беспроводной мыши" (очень низкая задержка) и прощает отсутствие интернета. Это идеальный вариант для пультов, датчиков и передачи управляющих сигналов.
Ниже я привел два готовых примера: для популярной среды Arduino IDE (язык C++) и для MicroPython (если ты предпочитаешь Python).
📡 Как это работает (Кратко)
  1. Sender (ESP-A) получает значение (сигнал) и отправляет структуру данных напрямую по MAC-адресу получателя.
  2. Receiver (ESP-B) слушает эфир, и когда ловит пакет от знакомого MAC-адреса, обрабатывает его (например, включает светодиод или реле).
📝 Вариант 1: Arduino IDE (Рекомендуемый, C++)
Это самый распространенный способ. Оба кода заливаются через Arduino IDE.
1. Код для Receiver (Приемник) — ESP-B
Сначала загрузи этот скетч в ту плату, которая будет получать сигнал. Он также выведет MAC-адрес в монитор порта — он понадобится на следующем этапе.
cpp
#include <esp_now.h>
#include <WiFi.h>

// Структура данных, которую мы ожидаем получить (должна совпадать с отправителем)
typedef struct struct_message {
int commandId; // ID команды (например, 1 = Вкл, 2 = Выкл)
int value; // Какое-то значение (например, яркость 0-255)
} struct_message;

struct_message myData;

// Callback-функция, вызывается при получении данных
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Получено с устройства: ");
Serial.print("Команда: ");
Serial.print(myData.commandId);
Serial.print(", Значение: ");
Serial.println(myData.value);

// --- ТВОЯ ЛОГИКА УПРАВЛЕНИЯ ---
if (myData.commandId == 1) {
// Например, включить LED на пине 2
digitalWrite(2, HIGH);
Serial.println("LED включен");
} else if (myData.commandId == 2) {
digitalWrite(2, LOW);
Serial.println("LED выключен");
}
}

void setup() {
Serial.begin(115200);

// Инициализация пина для примера с LED
pinMode(2, OUTPUT);

WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("Ошибка инициализации ESP-NOW");
return;
}

// Регистрируем функцию приема данных
esp_now_register_recv_cb(OnDataRecv);

// Выводим MAC-адрес этого устройства (Приемника)
// Его нужно будет скопировать и вставить в код Отправителя
Serial.print("MAC Address Receiver: ");
Serial.println(WiFi.macAddress());
}

void loop() {
// Здесь ничего не нужно, все работает в прерывании
}
2. Код для Sender (Отправитель) — ESP-A
Замени в коде broadcastAddress[] на MAC-адрес, который ты получил в мониторе порта Приемника. Загрузи этот код в другую плату.
cpp
#include <esp_now.h>
#include <WiFi.h>

// !!! ЗДЕСЬ ДОЛЖЕН БЫТЬ MAC-АДРЕС ТВОЕГО ПРИЕМНИКА (ESP-B) !!!
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// Та же самая структура данных, что и у приемника
typedef struct struct_message {
int commandId;
int value;
} struct_message;

struct_message myData;

// Callback отправки (опционально, для проверки статуса)
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("Статус отправки:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Успех" : "Провал");
}

void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);

if (esp_now_init() != ESP_OK) {
Serial.println("Ошибка инициализации");
return;
}

esp_now_register_send_cb(OnDataSent);

// Добавляем пира (приемника)
esp_now_peer_info_t peerInfo;
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;

if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Не удалось добавить пира");
return;
}

Serial.println("Готов к отправке сигналов");
}

void loop() {
// Эмуляция нажатия кнопки: отправляем "Включить" (1) и "Выключить" (2)

myData.commandId = 1; // Команда "Включить"
myData.value = 100;
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
Serial.println("Отправлена команда: ВКЛ");

delay(3000); // Ждем 3 секунды

myData.commandId = 2; // Команда "Выключить"
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
Serial.println("Отправлена команда: ВЫКЛ");

delay(3000);
}
🐍 Вариант 2: MicroPython (ESP32 / ESP8266)
Если твои проекты пишутся на Python, используй встроенную библиотеку espnow.
Код получателя (Receiver):
python
import network
import espnow

# Активируем Wi-Fi в режиме станции
sta = network.WLAN(network.WLAN.IF_STA)
sta.active(True)
sta.disconnect() # Отключаемся от конкретной сети, если была подключена

# Инициализируем ESP-NOW
e = espnow.ESPNow()
e.active(True)

print("Приемник запущен. MAC:", sta.config('mac').hex())

while True:
# Ждем данные (блокируем выполнение)
peer, msg = e.recv()
if msg:
command = msg.decode('utf-8')
print(f"Получен сигнал от {peer.hex()}: {command}")

if command == "ON":
# Твоя логика, например:
# import machine; machine.Pin(2, machine.Pin.OUT).on()
print("Включаем нагрузку")
elif command == "OFF":
print("Выключаем нагрузку")
Код отправителя (Sender):
python
import network
import espnow
import time

sta = network.WLAN(network.WLAN.IF_STA)
sta.active(True)
sta.disconnect()

e = espnow.ESPNow()
e.active(True)

# !!! ВСТАВЬ СЮДА MAC АДРЕС ТВОЕГО ПРИЕМНИКА !!!
# Узнать его можно выполнив скрипт выше (Receiver) и посмотрев в консоль
peer_mac = b'\xff\xff\xff\xff\xff\xff'

e.add_peer(peer_mac)

print("Отправитель запущен. Отправляю команды...")

while True:
e.send(peer_mac, "ON", True)
print("Sent: ON")
time.sleep(2)

e.send(peer_mac, "OFF", True)
print("Sent: OFF")
time.sleep(2)
💡 Важные советы и нюансы
  1. Как узнать MAC-адрес: Если у тебя еще нет адреса приемника, залей на него первый скетч из Варианта 1 (C++) или скетч Receiver из Варианта 2 (Python) и открой Serial Monitor (Tools -> Serial Monitor) на скорости 115200.
  2. Максимальный размер данных: За раз можно передать до 250 байт. Старайся не передавать огромные строки, используй структуры (struct), как в примере на C++.
  3. Wi-Fi и ESP-NOW одновременно: ESP32 может быть подключен к обычному Wi-Fi роутеру (чтобы слать данные в MQTT) и одновременно общаться по ESP-NOW с другими платами (чтобы дергать светодиодом). У ESP8266 с этим бывают сложности, если роутер меняет канал.
  4. Каналы связи: Оба устройства должны находиться на одном Wi-Fi канале. Если у тебя роутер "прыгает" по каналам, лучше включить режим "Точка доступа (AP)" на одном из ESP или использовать Broadcast (MAC FF:FF:FF:FF:FF:FF), чтобы сбросить привязку к каналу, но это повлияет на дальность.
ESP-NOW отлично подходит для твоей задачи — он простой и надежный. Напиши, если на каком-то шаге возникнут трудности!
 

tretyakov_sa

Moderator
Команда форума
Умные советы:
Выбираешь тип передачи
UDP пакет конкретному устройству, одна передает другая слушает не гарантирует доставки передающая должна знать адрес принимающей.
UDP пакет всем в сети, одна передает всем слушает та которой нужно слушать не гарантирует доставки передающая не должна знать адрес принимающей.
TCP/IP гарантировано доставит. Открываешь порт на приемнике (сервере ), передатчик пишет в этот порт передающая должна знать адрес принимающей.
TCP/IP http поднимаешь сервер на одной, отправляешь данные http запросом с другой передающая должна знать адрес принимающей.
web soket поднимаешь web soket сервер на одной, отправляешь данные по стабильному каналу все время туда сюда web soket клиент должен знать адрес сервера.
Какой вариант выбрать все зависит от типа управляющего сигнала и ваших потребностей.
Когда решите что нужно можно и примеры найти.
 
Сверху Снизу