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

Помогите с ESPNOW

gzp13

New member
Ребят, есть три платы ESP8266, соединенные между собой протоколом espnow. Одна плата-передатчик, две другие приемники. Передатчик отправляет данные в приемники и выдает сообщение доставлены или не доставлены данные и в какую плату. Мне надо выделить для каждой платы была ли успешная доставка или не успешная.

Код:
#include <ESP8266WiFi.h>
#include <espnow.h>


// ЗАМЕНИТЕ МАС-АДРЕСОМ ПОЛУЧАТЕЛЯ
uint8_t broadcastAddress1[] = {0x2C, 0x3A, 0xE8, 0x12, 0x7C, 0xA4};// ESP-01 розетка R2
uint8_t broadcastAddress2[] = {0x84, 0xF3, 0xEB, 0xCB, 0xE7, 0x35};// ESP-01 розетка R3
int priem;

typedef struct struct_message {
    int x;
  } struct_message;

// Создаем сообщение с заданной структурой
struct_message R2Data;
struct_message R3Data;


void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("\r\nLast Packet Send Status: ");
  if (sendStatus == 0){
    Serial.println("Delivery success");
  }
  else{
    Serial.println("Delivery fail");
  }
}
void setup()
{
  Serial.begin(57600);
  // Выставляем режим работы Wi-Fi
  WiFi.setOutputPower(20.5);  // выставляем макс.мощность
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  // Инициализируем ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  while (Serial.available() <0)
  {
    priem=50;
  }
   esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  // После запуска протокола получаем обратную связь о состоянии отправки
  esp_now_register_send_cb(OnDataSent);
  // Регистрируем пиры
  esp_now_add_peer(broadcastAddress1, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
esp_now_add_peer(broadcastAddress2, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}
void loop() {

  while (Serial.available() >0) {  
   priem=Serial.read();
   if (priem== 50)
  {
    R2Data.x=priem;
    esp_now_send(broadcastAddress1, (uint8_t *) &R2Data, sizeof(R2Data)); //отправляем сигнал OFF на розетку R2
  }
  if (priem==51 )
  {
    R2Data.x=priem;
    esp_now_send(broadcastAddress1, (uint8_t *) &R2Data, sizeof(R2Data));  //отправляем сигнал ON на розетку R2
  }
  if (priem==52 )
  {
    R3Data.x=priem;
    esp_now_send(broadcastAddress2, (uint8_t *) &R3Data, sizeof(R3Data));  //отправляем сигнал OFF на розетку R3
  }
  if (priem==53 )
  {
    R3Data.x=priem;
    esp_now_send(broadcastAddress2, (uint8_t *) &R3Data, sizeof(R3Data));  //отправляем сигнал ON на розетку R3
  }
   break;
     }

     }
Не получается получить данные об отправке в каждую плату. В этом разделе выдаются сразу сообщения что отправлено или не отправлено, не пойму как мне здесь конкретно получить что сообщение доставлено на конкретную плату или наоборот не доставлено.

void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print("\r\nLast Packet Send Status: ");
if (sendStatus == 0){
Serial.println("Delivery success");
}
else{
Serial.println("Delivery fail");
}
}
Пробовал так
int result=esp_now_send(broadcastAddress2, (uint8_t *) &R3Data, sizeof(R3Data));
Serial.print(result);
тоже не правильно, в сериал порту всегда ноль, хотя отключаю плату, пишется что сообщение не доставлено.
Посоветуйте что делать.
 

aZholtikov

Active member
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus)

У этой функции 2 параметра. Адрес и статус.
Сверяйте и адрес тоже. Например для broadcastAddress1:
if(memcmp(mac_addr, broadcastAddress1 ,6)==0) // Если сравнение равно 0 - адреса совпадают и соответственно на этот адрес и указывает статус (отправлено или нет).
 

aZholtikov

Active member
Код:
#include < string.h > 
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus)
{
    Serial.print("\r\nLast Packet Send Status: ");
    if (memcmp(mac_addr, broadcastAddress1, 6) == 0)
    {
        Serial.print(" to R2 ")
    }
    if (memcmp(mac_addr, broadcastAddress2, 6) == 0)
    {
        Serial.print(" to R3 ")
    }
    if (sendStatus == 0)
    {
        Serial.println("Delivery success");
    }
    else
    {
        Serial.println("Delivery fail");
    }
}
Примерно так можно.
 
Сверху Снизу