How to control relay with ESP NOW Device to Device Communication with ESP NOW

How to control relay with ESP NOW

Device to Device Communication with ESP NOW

 How to control relay with ESP NOW. This tutorial shows how to send data from one "ESP32 ESP32-C3 ESP8266 ESP32-01" to multiple ESP32 or ESP8266 boards using ESP-NOW (many-to-many configuration).
ESP8266 with 8ch relay board - Home Automation



Code :

ESPNow_Esp32_Receiver

// - Lien vidéo: https://youtu.be/y-pKhpYCaJo
// Arduino-IRremote: https://github.com/Arduino-IRremote/Arduino-IRremote.

#undef LED_BUILTIN
#define LED_BUILTIN         2
#define IR_RECEIVE_PIN      13
#define DECODE_NEC

#include <Arduino.h>
#include <IRremote.hpp>
#include <esp_now.h>
#include <WiFi.h>

#define relay_1 0x54
#define relay_2 0x16
#define relay_3 0x15
#define relay_4 0x50
#define relay_5 0x12
#define relay_6 0x11
#define relay_7 0x4C
#define relay_8 0xE

int relay_pin[8] = {23, 22, 21, 19, 25, 26, 27, 14};
bool relay_state[8];

typedef struct struct_message {
  uint8_t DataCommand = 0xF9;
  uint8_t valCommand;
  uint8_t EndCommand = 0x9F;
} struct_message;

// Create a struct_message called myData
struct_message myData;
 
// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t RxMACaddress[] = {0xE3, 0xA1, 0xFC, 0x23, 0x49, 0xEB}; //Esp8266

esp_now_peer_info_t peeresp8266;

// Init ESP Now with fallback
void InitESPNow() {
  WiFi.disconnect();
  if (esp_now_init() == ESP_OK) {
    Serial.println("ESPNow Init Success");
  }
  else {
    Serial.println("ESPNow Init Failed");
    // Retry InitESPNow, add a counte and then restart?
    // InitESPNow();
    // or Simply Restart
    ESP.restart();
  }
}
void manageSlave() {
  memcpy(peeresp8266.peer_addr, RxMACaddress, 6);
  peeresp8266.channel = 1;  
  peeresp8266.encrypt = 0;  
  esp_err_t addStatus = esp_now_add_peer(&peeresp8266);
  if (addStatus == ESP_OK) {
    // Pair success
    Serial.println("Pair success");
  } else if (addStatus == ESP_ERR_ESPNOW_NOT_INIT) {
    // How did we get so far!!
    Serial.println("ESPNOW Not Init");
  } else if (addStatus == ESP_ERR_ESPNOW_ARG) {
    Serial.println("Add Peer - Invalid Argument");
  } else if (addStatus == ESP_ERR_ESPNOW_FULL) {
    Serial.println("Peer list full");
  } else if (addStatus == ESP_ERR_ESPNOW_NO_MEM) {
    Serial.println("Out of memory");
  } else if (addStatus == ESP_ERR_ESPNOW_EXIST) {
    Serial.println("Peer Exists");
  } else {
    Serial.println("Not sure what happened");
  }
  delay(100);
}

uint8_t Comd0 = 0;
unsigned long last = millis();

void SetCommand(uint8_t Comd) {
  switch(Comd) {
    case relay_1:
      relay_state[0] = !relay_state[0];
      digitalWrite(relay_pin[0], relay_state[0]);
      (relay_state[0]) ? Serial.println("Relay 1 Off") : Serial.println("Relay 1 On");
      break;
    case relay_2:
      relay_state[1] = !relay_state[1];
      digitalWrite(relay_pin[1], relay_state[1]);
      (relay_state[1]) ? Serial.println("Relay 2 Off") : Serial.println("Relay 2 On");
      break;
    case relay_3:
      relay_state[2] = !relay_state[2];
      digitalWrite(relay_pin[2], relay_state[2]);
      (relay_state[2]) ? Serial.println("Relay 3 Off") : Serial.println("Relay 3 On");
      break;
    case relay_4:
      relay_state[3] = !relay_state[3];
      digitalWrite(relay_pin[3], relay_state[3]);
      (relay_state[3]) ? Serial.println("Relay 4 Off") : Serial.println("Relay 4 On");
      break;
    case relay_5:
      relay_state[4] = !relay_state[4];
      digitalWrite(relay_pin[4], relay_state[4]);
      (relay_state[4]) ? Serial.println("Relay 5 Off") : Serial.println("Relay 5 On");
      break;
    case relay_6:
      relay_state[5] = !relay_state[5];
      digitalWrite(relay_pin[5], relay_state[5]);
      (relay_state[5]) ? Serial.println("Relay 6 Off") : Serial.println("Relay 6 On");
      break;
    case relay_7:
      relay_state[6] = !relay_state[6];
      digitalWrite(relay_pin[6], relay_state[6]);
      (relay_state[6]) ? Serial.println("Relay 7 Off") : Serial.println("Relay 7 On");
      break;
    case relay_8:
      relay_state[7] = !relay_state[7];
      digitalWrite(relay_pin[7], relay_state[7]);
      (relay_state[7]) ? Serial.println("Relay 8 Off") : Serial.println("Relay 8 On");
      break;
    default:
      break;
  }
  Comd0 = Comd;
  last = millis();
}
// send data
void sendData() {
  const uint8_t *peer_addr = peeresp8266.peer_addr;
  esp_err_t result = esp_now_send(peer_addr, (uint8_t *) &myData, sizeof(myData));
  Serial.print("Send Status: ");
  if (result == ESP_OK) {
    Serial.println("Success");
  } else if (result == ESP_ERR_ESPNOW_NOT_INIT) {
    // How did we get so far!!
    Serial.println("ESPNOW not Init.");
  } else if (result == ESP_ERR_ESPNOW_ARG) {
    Serial.println("Invalid Argument");
  } else if (result == ESP_ERR_ESPNOW_INTERNAL) {
    Serial.println("Internal Error");
  } else if (result == ESP_ERR_ESPNOW_NO_MEM) {
    Serial.println("ESP_ERR_ESPNOW_NO_MEM");
  } else if (result == ESP_ERR_ESPNOW_NOT_FOUND) {
    Serial.println("Peer not found.");
  } else {
    Serial.println("Not sure what happened");
  }
}
// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  char macStr[18];
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.print("Last Packet Sent to: "); Serial.println(macStr);
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}

// callback when data is recv from Master
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len) {  
  memcpy(&myData, data, sizeof(myData));
  if(myData.DataCommand != 0xF9 || myData.EndCommand != 0x9F)
    return;
  if ((millis() - last < 300) && Comd0 == myData.valCommand)
    return;
  SetCommand(myData.valCommand);
}

void IRDataRecv() {
  uint16_t received = IrReceiver.decodedIRData.command;
  if (received) {
    if ((millis() - last < 200) && myData.valCommand == received) {
      delay(50);
      IrReceiver.resume();
      return;
    }
    Serial.print("Command: 0x");
    Serial.println(received, HEX);
    myData.valCommand = received;
    sendData();
    SetCommand(received);
  }
  IrReceiver.resume();
}
 
void setup() {
  Serial.begin(115200);
  delay(2500);
  for ( int j=0; j<8;j++) {
    pinMode(relay_pin[j], OUTPUT);
    relay_state[j] = true;
    digitalWrite(relay_pin[j], HIGH);
  }
  WiFi.mode(WIFI_STA);
  InitESPNow();
  esp_now_register_recv_cb(OnDataRecv);
  esp_now_register_send_cb(OnDataSent);
  manageSlave();
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // data pin 13
  Serial.print("STA MAC: "); Serial.println(WiFi.macAddress());
  Serial.print("STA CHANNEL "); Serial.println(WiFi.channel());
}

void loop() {
  if (IrReceiver.decode()) IRDataRecv();
}
 

ESPNow_Esp8266_Receiver

// - Lien vidéo: https://youtu.be/y-pKhpYCaJo
// Arduino-IRremote: https://github.com/Arduino-IRremote/Arduino-IRremote.
 
#define IR_RECEIVE_PIN      2     // D4
#define DECODE_NEC

#include <IRremote.hpp>
#include <ESP8266WiFi.h>
#include <espnow.h>


#define relay_1 0x8E
#define relay_2 0x86
#define relay_3 0x8F
#define relay_4 0x92
#define relay_5 0x87
#define relay_6 0x93
#define relay_7 0x96
#define relay_8 0x82


// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t RxMACaddress[] = {0xE3, 0xF9, 0xDE, 0x14, 0x86, 0xFC}; //ESP32
 
int relay_pin[8] = {5, 4, 0, 15, 13, 12, 14, 16};
bool relay_state[8];

typedef struct struct_message {
  uint8_t DataCommand = 0xF9;
  uint8_t valCommand  = 0x0;
  uint8_t EndCommand  = 0x9F;
} struct_message;

// Create a struct_message called myData
struct_message myData;

// Init ESP Now with fallback
void InitESPNow() {
  // WiFi.disconnect();
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
}

uint8_t Comd0 = 0;
unsigned long last = millis();

void SetCommand(uint8_t Comd) {
  switch(Comd) {
    case relay_1:
      relay_state[0] = !relay_state[0];
      digitalWrite(relay_pin[0], relay_state[0]);
      (relay_state[0]) ? Serial.println("Relay 1 On") : Serial.println("Relay 1 Off");
      break;
    case relay_2:
      relay_state[1] = !relay_state[1];
      digitalWrite(relay_pin[1], relay_state[1]);
      (relay_state[1]) ? Serial.println("Relay 2 On") : Serial.println("Relay 2 Off");
      break;
    case relay_3:
      relay_state[2] = !relay_state[2];
      digitalWrite(relay_pin[2], relay_state[2]);
      (relay_state[2]) ? Serial.println("Relay 3 On") : Serial.println("Relay 3 Off");
      break;
    case relay_4:
      relay_state[3] = !relay_state[3];
      digitalWrite(relay_pin[3], relay_state[3]);
      (relay_state[3]) ? Serial.println("Relay 4 On") : Serial.println("Relay 4 Off");
      break;
    case relay_5:
      relay_state[4] = !relay_state[4];
      digitalWrite(relay_pin[4], relay_state[4]);
      (relay_state[4]) ? Serial.println("Relay 5 On") : Serial.println("Relay 5 Off");
      break;
    case relay_6:
      relay_state[5] = !relay_state[5];
      digitalWrite(relay_pin[5], relay_state[5]);
      (relay_state[5]) ? Serial.println("Relay 6 On") : Serial.println("Relay 6 Off");
      break;
    case relay_7:
      relay_state[6] = !relay_state[6];
      digitalWrite(relay_pin[6], relay_state[6]);
      (relay_state[6]) ? Serial.println("Relay 7 On") : Serial.println("Relay 7 Off");
      break;
    case relay_8:
      relay_state[7] = !relay_state[7];
      digitalWrite(relay_pin[7], relay_state[7]);
      (relay_state[7]) ? Serial.println("Relay 8 On") : Serial.println("Relay 8 Off");
      break;
    default:
      break;
  }
  Comd0 = Comd;
  last = millis();
}
// callback when data is recv from Master
void OnDataRecv(uint8_t *mac, uint8_t *data, uint8_t data_len) {  
  memcpy(&myData, data, sizeof(myData));
  if(myData.DataCommand != 0xF9 || myData.EndCommand != 0x9F)
    return;
  if ((millis() - last < 300) && Comd0 == myData.valCommand)
    return;
  SetCommand(myData.valCommand);
}
// callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t status) {
  char macStr[18];
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.print("Last Packet Sent to: "); Serial.println(macStr);
  Serial.println(status == 0 ? "Delivery Success" : "Delivery Fail");
}

void OnIRDataRecv() {
  if (IrReceiver.decode()) {
    uint16_t received = IrReceiver.decodedIRData.command;
    if (received) {
      if ((millis() - last < 200) && myData.valCommand == received) {
        delay(50);
        IrReceiver.resume();
        return;
      }
      Serial.print("Command: 0x");
      Serial.println(received, HEX);
      myData.valCommand = received;
      esp_now_send(RxMACaddress, (uint8_t *) &myData, sizeof(myData));
      SetCommand(received);
    }
    IrReceiver.resume();
  }
}

void setup() {
  Serial.begin(74880);
  for ( int j=0; j<8;j++) {
    pinMode(relay_pin[j], OUTPUT);
    relay_state[j] = false;
    digitalWrite(relay_pin[j], LOW);
  }

  WiFi.mode(WIFI_STA);
  Serial.println(" ");
  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  Serial.println("ESP-NOW Init Success");

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
  esp_now_register_recv_cb(OnDataRecv);
  esp_now_register_send_cb(OnDataSent);
  // Register peer
  esp_now_add_peer(RxMACaddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
   
  IrReceiver.begin(IR_RECEIVE_PIN);
  IrReceiver.registerReceiveCompleteCallback(OnIRDataRecv);
 
  Serial.println();
  Serial.print("STA MAC: "); Serial.println(WiFi.macAddress());
  Serial.print("STA CHANNEL "); Serial.println(WiFi.channel());
}


void loop() {
  // noting
}

 

ESPNow_Esp8266_Esp-01_Transmitter

// - Lien vidéo: https://youtu.be/y-pKhpYCaJo
// Arduino-IRremote: https://github.com/Arduino-IRremote/Arduino-IRremote.
 
#define IR_RECEIVE_PIN      2     // D4
#define DECODE_NEC

#include <IRremote.hpp>
#include <ESP8266WiFi.h>
#include <espnow.h>

// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t RxMACaddress0[] = {0xE3, 0xA1, 0xFC, 0x23, 0x49, 0xEB}; //Esp8266
uint8_t RxMACaddress1[] = {0xE3, 0xF9, 0xDE, 0x14, 0x86, 0xFC}; //ESP32
 
// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
  uint8_t DataCommand = 0xF9;
  uint8_t valCommand;
  uint8_t EndCommand = 0x9F;
} struct_message;

// Create a struct_message called myData
struct_message myData;

unsigned long last = millis();
 
void OnIRDataRecv() {
  if (IrReceiver.decode()) {
    uint16_t received = IrReceiver.decodedIRData.command;
    if (received) {
      if ((millis() - last < 200) && myData.valCommand == received) {
        delay(50);
        IrReceiver.resume();
        return;
      }
      Serial.print("Command: 0x");
      Serial.println(received, HEX);
      myData.valCommand = received;
      esp_now_send(RxMACaddress0, (uint8_t *) &myData, sizeof(myData));
      esp_now_send(RxMACaddress1, (uint8_t *) &myData, sizeof(myData));
    }
    IrReceiver.resume();
    last = millis();
  }
}
// callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t status) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == 0 ? "Delivery Success" : "Delivery Fail");
}

void setup() {
  // Init Serial Monitor
  Serial.begin(74880);
  delay(2500);
 
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

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

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_register_send_cb(OnDataSent);
   
  // Register peer
  esp_now_add_peer(RxMACaddress0, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
  esp_now_add_peer(RxMACaddress1, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
  IrReceiver.begin(IR_RECEIVE_PIN); // data pin D5
  IrReceiver.registerReceiveCompleteCallback(OnIRDataRecv);
}
 
void loop() {
  // Chill
}


ESPNow_Esp32_Transmitter

// - Lien vidéo: https://youtu.be/y-pKhpYCaJo
// Arduino-IRremote: https://github.com/Arduino-IRremote/Arduino-IRremote.

#undef LED_BUILTIN
#define LED_BUILTIN         2
#define IR_RECEIVE_PIN      13
#define DECODE_NEC

#include <Arduino.h>
#include <IRremote.hpp>
#include <esp_now.h>
#include <WiFi.h>

// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t RxMACaddress0[] = {0xE3, 0xA1, 0xFC, 0x23, 0x49, 0xEB}; //Esp8266
uint8_t RxMACaddress1[] = {0xE3, 0xF9, 0xDE, 0x14, 0x86, 0xFC}; //ESP32

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
  uint8_t DataCommand = 0xF9;
  uint8_t valCommand;
  uint8_t EndCommand = 0x9F;
} struct_message;
// Create a struct_message called myData
struct_message myData;
  // Register peer
#define NUMSLAVES 2
esp_now_peer_info_t slaves[NUMSLAVES] = {};

// Init ESP Now with fallback
void InitESPNow() {
  WiFi.disconnect();
  if (esp_now_init() == ESP_OK) {
    Serial.println("ESPNow Init Success");
  }
  else {
    Serial.println("ESPNow Init Failed");
    // Retry InitESPNow, add a counte and then restart?
    // InitESPNow();
    // or Simply Restart
    ESP.restart();
  }
}
void manageSlave() {
  memcpy(slaves[0].peer_addr, RxMACaddress0, 6);
  memcpy(slaves[1].peer_addr, RxMACaddress1, 6);
  for (int i = 0; i < 2; i++) {
    slaves[i].channel = 1;  
    slaves[i].encrypt = 0;  
    esp_err_t addStatus = esp_now_add_peer(&slaves[i]);
    if (addStatus == ESP_OK) {
      // Pair success
      Serial.println("Pair success");
    } else if (addStatus == ESP_ERR_ESPNOW_NOT_INIT) {
      // How did we get so far!!
      Serial.println("ESPNOW Not Init");
    } else if (addStatus == ESP_ERR_ESPNOW_ARG) {
      Serial.println("Add Peer - Invalid Argument");
    } else if (addStatus == ESP_ERR_ESPNOW_FULL) {
      Serial.println("Peer list full");
    } else if (addStatus == ESP_ERR_ESPNOW_NO_MEM) {
      Serial.println("Out of memory");
    } else if (addStatus == ESP_ERR_ESPNOW_EXIST) {
      Serial.println("Peer Exists");
    } else {
      Serial.println("Not sure what happened");
    }
    delay(100);
  }
}
// send data
void sendData() {
  for (int i = 0; i < 2; i++) {
    const uint8_t *peer_addr = slaves[i].peer_addr;
    esp_err_t result = esp_now_send(peer_addr, (uint8_t *) &myData, sizeof(myData));
    Serial.print("Send Status: ");
    if (result == ESP_OK) {
      Serial.println("Success");
    } else if (result == ESP_ERR_ESPNOW_NOT_INIT) {
      // How did we get so far!!
      Serial.println("ESPNOW not Init.");
    } else if (result == ESP_ERR_ESPNOW_ARG) {
      Serial.println("Invalid Argument");
    } else if (result == ESP_ERR_ESPNOW_INTERNAL) {
      Serial.println("Internal Error");
    } else if (result == ESP_ERR_ESPNOW_NO_MEM) {
      Serial.println("ESP_ERR_ESPNOW_NO_MEM");
    } else if (result == ESP_ERR_ESPNOW_NOT_FOUND) {
      Serial.println("Peer not found.");
    } else {
      Serial.println("Not sure what happened");
    }
    delay(100);
  }
}
// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  char macStr[18];
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.print("Last Packet Sent to: "); Serial.println(macStr);
  Serial.print("Last Packet Send Status: "); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
unsigned long last = millis();
void IRDataRecv() {
  uint16_t received = IrReceiver.decodedIRData.command;
  if (received) {
    if ((millis() - last < 200) && myData.valCommand == received) {
      delay(50);
      IrReceiver.resume();
      return;
    }
    Serial.print("Command: 0x");
    Serial.println(received, HEX);
    myData.valCommand = received;
    sendData();
  }
  IrReceiver.resume();
}
 
void setup() {
  // Init Serial Monitor
  Serial.begin(115200);
  delay(2500);
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  // Init ESP-NOW
  InitESPNow();
  esp_now_register_send_cb(OnDataSent);
  manageSlave();
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // data pin 13
}
 
void loop() {
  if (IrReceiver.decode()) IRDataRecv();
}
 

ESPNow_Esp32-C3_Transmitter

// - Lien vidéo: https://youtu.be/y-pKhpYCaJo
// Arduino-IRremote: https://github.com/Arduino-IRremote/Arduino-IRremote.

#define IR_RECEIVE_PIN      8
#define DECODE_NEC

#include <Arduino.h>
#include <IRremote.hpp>
#include <esp_now.h>
#include <WiFi.h>

// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t RxMACaddress0[] = {0xE3, 0xA1, 0xFC, 0x23, 0x49, 0xEB}; //Esp8266
uint8_t RxMACaddress1[] = {0xE3, 0xF9, 0xDE, 0x14, 0x86, 0xFC}; //ESP32
 
// Must match the receiver structure
typedef struct struct_message {
  uint8_t DataCommand = 0xF9;
  uint8_t valCommand;
  uint8_t EndCommand = 0x9F;
} struct_message;
// Create a struct_message called myData
struct_message myData;
  // Register peer
#define NUMSLAVES 2
esp_now_peer_info_t slaves[NUMSLAVES] = {};

// Init ESP Now with fallback
void InitESPNow() {
  WiFi.disconnect();
  if (esp_now_init() == ESP_OK) {
    Serial.println("ESPNow Init Success");
  }
  else {
    Serial.println("ESPNow Init Failed");
    // Retry InitESPNow, add a counte and then restart?
    // InitESPNow();
    // or Simply Restart
    ESP.restart();
  }
}
void manageSlave() {
  memcpy(slaves[0].peer_addr, RxMACaddress0, 6);
  memcpy(slaves[1].peer_addr, RxMACaddress1, 6);
  for (int i = 0; i < 2; i++) {
    slaves[i].channel = 1;  
    slaves[i].encrypt = 0;  
    esp_err_t addStatus = esp_now_add_peer(&slaves[i]);
    if (addStatus == ESP_OK) {
      // Pair success
      Serial.println("Pair success");
    } else if (addStatus == ESP_ERR_ESPNOW_NOT_INIT) {
      // How did we get so far!!
      Serial.println("ESPNOW Not Init");
    } else if (addStatus == ESP_ERR_ESPNOW_ARG) {
      Serial.println("Add Peer - Invalid Argument");
    } else if (addStatus == ESP_ERR_ESPNOW_FULL) {
      Serial.println("Peer list full");
    } else if (addStatus == ESP_ERR_ESPNOW_NO_MEM) {
      Serial.println("Out of memory");
    } else if (addStatus == ESP_ERR_ESPNOW_EXIST) {
      Serial.println("Peer Exists");
    } else {
      Serial.println("Not sure what happened");
    }
    delay(100);
  }
}
// send data
void sendData() {
  for (int i = 0; i < 2; i++) {
    const uint8_t *peer_addr = slaves[i].peer_addr;
    esp_err_t result = esp_now_send(peer_addr, (uint8_t *) &myData, sizeof(myData));
    Serial.print("Send Status: ");
    if (result == ESP_OK) {
      Serial.println("Success");
    } else if (result == ESP_ERR_ESPNOW_NOT_INIT) {
      // How did we get so far!!
      Serial.println("ESPNOW not Init.");
    } else if (result == ESP_ERR_ESPNOW_ARG) {
      Serial.println("Invalid Argument");
    } else if (result == ESP_ERR_ESPNOW_INTERNAL) {
      Serial.println("Internal Error");
    } else if (result == ESP_ERR_ESPNOW_NO_MEM) {
      Serial.println("ESP_ERR_ESPNOW_NO_MEM");
    } else if (result == ESP_ERR_ESPNOW_NOT_FOUND) {
      Serial.println("Peer not found.");
    } else {
      Serial.println("Not sure what happened");
    }
    delay(100);
  }
}
// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  char macStr[18];
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.print("Last Packet Sent to: "); Serial.println(macStr);
  Serial.print("Last Packet Send Status: "); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
unsigned long last = millis();
void IRDataRecv() {
  uint16_t received = IrReceiver.decodedIRData.command;
  if (received) {
    if ((millis() - last < 200) && myData.valCommand == received) {
      delay(50);
      IrReceiver.resume();
      return;
    }
    Serial.print("Command: 0x");
    Serial.println(received, HEX);
    myData.valCommand = received;
    sendData();
  }
  IrReceiver.resume();
}
 
void setup() {
  // Init Serial Monitor
  Serial.begin(115200);
  delay(2500);
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  // Init ESP-NOW
  InitESPNow();
  esp_now_register_send_cb(OnDataSent);
  manageSlave();
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // data pin 13
}
 
void loop() {
  if (IrReceiver.decode()) IRDataRecv();
}
 


Arduino libraries:

       https://github.com/Arduino-IRremote/Arduino-IRremote

No comments:

Post a Comment