• Система автоматизации с открытым исходным кодом на базе 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");
    }
}
Примерно так можно.
 
Сверху Снизу