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..