Esp 12f refuses to work with esp-now

hello, i have 3 esp RELAYS based boards that i want to communicate each with a nodemcu as the transmitter , my code works for 2 of them but the third one doesn't want to work i guess it is a mac adress or frequency band issues ? what can be the problem, i can't find out anything and i send it back in return to another one that still doesn't work, i changed the mac addresses


/*
   RECEIVER
*/

//libraries
#include <ESP8266WiFi.h>
#include <espnow.h>

//esp data to receive
typedef struct struct_message {
  char letter;
} struct_message;

struct_message espData;
boolean ReceivedData = false;

//relays variables
//pins; D1-GPIO5,D2-GPIO4,D6-GPIO12,D7-GPIO13
const int relayA = 13; // GPIO 13 = D7
const int relayB = 12; // GPIO 12 = D6
const int relayC = 14; // GPIO 14 = D5
const int relayD = 5; // GPIO 5 = D1
boolean RelayStateA = LOW;
boolean RelayStateB = LOW;
boolean RelayStateC = LOW;
boolean RelayStateD = LOW;

//function for receiving
void OnDataRecv(uint8_t * mac_addr, uint8_t *incomingData, uint8_t len) {
  memcpy(&espData, incomingData, sizeof(espData));
  ReceivedData = true;
  //  Serial.printf("Board ID %d \n", espData.id);
  //  Serial.printf("letter value: %d \n", espData.letter);
  //  Serial.println();
}

void delayFct () {
  ESP.wdtFeed();
  delay(500);
}

void setup() {

  // Initialize Serial Monitor
  //Serial.begin(115200);

  //relays initialization
  digitalWrite(relayA, LOW);
  digitalWrite(relayB, LOW);
  digitalWrite(relayC, LOW);
  digitalWrite(relayD, LOW);

  pinMode(relayA, OUTPUT); // OUTPUT 5V
  pinMode(relayB, OUTPUT);
  pinMode(relayC, OUTPUT);
  pinMode(relayD, OUTPUT);

  espData.letter = 'O';

  //Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();

  // Init ESP-NOW
  if (esp_now_init() != 0) {
    //    Serial.println("Error initializing ESP-NOW");
    //    Serial.flush();
    ESP.restart();
    return;
  }

  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  esp_now_register_recv_cb(OnDataRecv);
  ESP.wdtDisable();
}

void loop() {

  //feed watchdog
  ESP.wdtFeed();

  //if we got new data, activate the relays
  if (ReceivedData == true) {

    switch (espData.letter) {

      case 'A': //ON

        if (RelayStateA == LOW) {

          digitalWrite(relayA, HIGH);
          RelayStateA = HIGH;

        }

        delayFct();
        break;

      case 'B': //ON

        if (RelayStateB == LOW) {

          digitalWrite(relayB, HIGH);
          RelayStateB = HIGH;

        }
        
        delayFct();
        break;

      case 'C': //ON

        if (RelayStateC == LOW) {

          digitalWrite(relayC, HIGH);
          RelayStateC = HIGH;

        }

        delayFct();
        break;

      case 'D': //ON

        if (RelayStateD == LOW) {

          digitalWrite(relayD, HIGH);
          RelayStateD = HIGH;

        }
        
        delayFct();
        break;

      case 'E': //OFF

        if (RelayStateA == HIGH) {

          digitalWrite(relayA, LOW);
          RelayStateA = LOW;

        }

        delayFct();
        break;

      case 'F': //OFF

        if (RelayStateB == HIGH) {

          digitalWrite(relayB, LOW);
          RelayStateB = LOW;

        }
        
        delayFct();
        break;

      case 'G': //OFF

        if (RelayStateC == HIGH) {

          digitalWrite(relayC, LOW);
          RelayStateC = LOW;

        }

        delayFct();
        break;

      case 'H': //OFF

        if (RelayStateD == HIGH) {

          digitalWrite(relayD, LOW);
          RelayStateD = LOW;

        }
        
        delayFct();
        break; 
        
      case 'N': // OPRESTE TOATE RELEELE

        digitalWrite(relayA, LOW);
        RelayStateA = LOW;
        
        digitalWrite(relayB, LOW);
        RelayStateB = LOW;
        
        digitalWrite(relayC, LOW);
        RelayStateC = LOW;
        
        digitalWrite(relayD, LOW);
        RelayStateD = LOW;
        
        delayFct();
        break;


      case 'P': // PORNESTE TOATE RELEELE
      
        digitalWrite(relayA, HIGH);
        RelayStateA = HIGH;
        
        digitalWrite(relayB, HIGH);
        RelayStateB = HIGH;
    
        digitalWrite(relayC, HIGH);
        RelayStateC = HIGH;
        
        digitalWrite(relayD, HIGH);
        RelayStateD = HIGH;
        
        delayFct();
        break;


      default:
        espData.letter = 'O';
        break;
    }

    ReceivedData = false;
  }

}
/*
   TRANSMITTER
*/

//libraries
#include <ESP8266WiFi.h>
#include <espnow.h>

//esp8266 transmitter object
// A; e8:68:e7:d1:e7:25
// B; c4:5b:be:65:1e:8d
// C; 44:17:93:0f:e4:64
uint8_t broadcastAddressA[] = {0xE8, 0x68, 0xE7, 0xD1, 0xE7, 0x25}; //adress for SLAVE receiver board1
uint8_t broadcastAddressB[] = {0xC4, 0x5B, 0xBE, 0x65, 0x1E, 0x8D}; //adress for SLAVE receiver board2
uint8_t broadcastAddressC[] = {0x44, 0x17, 0x93, 0x0F, 0xE4, 0x64}; //adress for SLAVE receiver board3


//esp data to send
typedef struct struct_message {
  char letter;
} struct_message;

struct_message espData;

//esp send data function
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
    if (sendStatus == 0) {
      Serial.println("Delivery success");
    }
    else {
      Serial.println("Delivery fail");
    }
}
char receiver_board_indicative = 'X';

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

  //data to send
  espData.letter = 'O';

  //Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();

  // Init ESP-NOW
  if (esp_now_init() != 0) {
        Serial.println("Error initializing ESP-NOW");
        Serial.flush();
    ESP.restart();
    return;
  } else {
    Serial.println();
    Serial.println("ESP-NOW initialized successfully");
    Serial.print("MAC-ADDRESS ");
    Serial.println(WiFi.macAddress());
   }
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_register_send_cb(OnDataSent);
  esp_now_add_peer(broadcastAddressA, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
  esp_now_add_peer(broadcastAddressB, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
  esp_now_add_peer(broadcastAddressC, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
  ESP.wdtDisable();

}

void loop() {

  //feed watchdog
  ESP.wdtFeed();

  if (Serial.available() == 2) {
  
    espData.letter = Serial.read();
    receiver_board_indicative = Serial.read();
    
    Serial.println(espData.letter);
    Serial.println(receiver_board_indicative);
    } 

  if (espData.letter != 'O') {
    switch (receiver_board_indicative) {
      
      case 'A':
        esp_now_send(broadcastAddressA, (uint8_t *) &espData, sizeof(espData));
        break;

      case 'B':
        esp_now_send(broadcastAddressB, (uint8_t *) &espData, sizeof(espData));
        break;
        
      case 'C':
        esp_now_send(broadcastAddressC, (uint8_t *) &espData, sizeof(espData));
        break;

    }
    receiver_board_indicative = 'X';
    espData.letter = 'O';
  }
  
}


in the first delivery fail messages, the board C was not powered but the board A is the one that doesn't want to work . each board has 4 relays A,B,C,D and the board are labeled A,B,C so AB is relay A from board B..

I was having it set to node mcu but it had to be set to generic esp8266 now it works !

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.