How to control 8 relays with EspNow & remote control using Esp8266 || Esp32

How to control 8 relays with EspNow & remote control using Esp8266 || Esp32

 This video demonstrates how to control a 8-channel relay via remote control using an ESP8266 board. The presenter explains the pin configuration of the ESP8266 and the relay, and then walks through the process of connecting the components and writing a simple code to control the relay. The video is a good introduction for beginners who want to learn how to use relays with ESP8266 boards.
ESP8266 with 8ch relay board - Home Automation



Code :

ESPNow_Esp32_Receiver

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

#include <Arduino.h>
#undef LED_BUILTIN
#define LED_BUILTIN         2
#define IR_RECEIVE_PIN      13
#define DECODE_NEC

#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;

// 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();
  }
}

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

void SetCommand(uint8_t Comd) {
  if ((millis() - last < 250) && Comd == Comd0)
    return;
  Comd0 = Comd;
  last = millis();
  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;
  }

}
void IRDataRecv() {
  uint16_t received = IrReceiver.decodedIRData.command;
  if (received) {
    Serial.print("Command: 0x");
    Serial.println(received, HEX);
    SetCommand(received);
  }
  IrReceiver.resume();
}

// 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 < 500) && Comd0 == myData.valCommand)
    return;
  SetCommand(myData.valCommand);
}

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);
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // data pin 13
 
  Serial.println();
  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/sbsOTf75hTk
// Arduino-IRremote: https://github.com/Arduino-IRremote/Arduino-IRremote.

#define IR_RECEIVE_PIN      2     // D4
#define DECODE_NEC

#include <Arduino.h>
#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

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;
  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;
  }
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
}

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

void SetCommand(uint8_t Comd) {
  if ((millis() - last < 250) && Comd == Comd0)
    return;
  Comd0 = Comd;
  last = millis();
  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;
  }
}
// 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 < 500) && Comd0 == myData.valCommand)
    return;
  SetCommand(myData.valCommand);
}

void OnIRDataRecv() {
  if (IrReceiver.decode()) {
    uint16_t received = IrReceiver.decodedIRData.command;
    if (received) {
      Serial.print("Command: 0x");
      Serial.println(received, HEX);
      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);
  // 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 recv CB to
  // get recv packer info
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  esp_now_register_recv_cb(OnDataRecv);
  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() {
  // Chill
}

 

ESPNow_Esp8266_Esp-01_Transmitter

// - Lien vidéo: https://youtu.be/sbsOTf75hTk
// 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 RxMACaddress[] = {0xE3, 0xA1, 0xFC, 0x23, 0x49, 0xEB};

// 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;

 
void OnIRDataRecv() {
  if (IrReceiver.decode()) {
    uint16_t received = IrReceiver.decodedIRData.command;
    if (received) {
      Serial.print("Command: 0x");
      Serial.println(received, HEX);
      myData.valCommand = received;
      esp_now_send(RxMACaddress, (uint8_t *) &myData, sizeof(myData));
      delay(250);
    }
    IrReceiver.resume();
  }
}
// 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(RxMACaddress, 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/sbsOTf75hTk
// 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 RxMACaddress[] = {0xE3, 0xA1, 0xFC, 0x23, 0x49, 0xEB};

// 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
esp_now_peer_info_t peerInfo;

// 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();
  }
  esp_now_register_send_cb(OnDataSent);
 
  // Add peer  
  memcpy(peerInfo.peer_addr, RxMACaddress, 6);
  peerInfo.channel = 1;  
  peerInfo.encrypt = 0;    
  esp_err_t addStatus = esp_now_add_peer(&peerInfo);
  if (addStatus == ESP_OK) {
    Serial.println("Pair success"); // Pair success
  } else {
    Serial.println("ESPNOW Not Init");  // How did we get so far!!
  }
}
// send data
void sendData() {
  const uint8_t *peer_addr = peerInfo.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) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void IRDataRecv() {
  uint16_t received = IrReceiver.decodedIRData.command;
  if (received) {
    Serial.print("Command: 0x");
    Serial.println(received, HEX);
    myData.valCommand = received;
    sendData();
    delay(250);
  }
  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();
  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/sbsOTf75hTk
// Arduino-IRremote: https://github.com/Arduino-IRremote/Arduino-IRremote.

#define DECODE_NEC
#define IR_RECEIVE_PIN      8

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

// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t RxMACaddress[] = {0xE3, 0xA1, 0xFC, 0x23, 0x49, 0xEB};

// 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
esp_now_peer_info_t peerInfo;

// 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();
  }
  esp_now_register_send_cb(OnDataSent);
 
  // Add peer  
  memcpy(peerInfo.peer_addr, RxMACaddress, 6);
  peerInfo.channel = 1;  
  peerInfo.encrypt = 0;    
  esp_err_t addStatus = esp_now_add_peer(&peerInfo);
  if (addStatus == ESP_OK) {
    Serial.println("Pair success"); // Pair success
  } else {
    Serial.println("ESPNOW Not Init");  // How did we get so far!!
  }
}
// send data
void sendData() {
  const uint8_t *peer_addr = peerInfo.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) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void IRDataRecv() {
  uint16_t received = IrReceiver.decodedIRData.command;
  if (received) {
    Serial.print("Command: 0x");
    Serial.println(received, HEX);
    myData.valCommand = received;
    sendData();
    delay(250);
  }
  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();
  IrReceiver.begin(IR_RECEIVE_PIN);
}
 
void loop() {
  if (IrReceiver.decode()) IRDataRecv();
}

Arduino libraries:

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

No comments:

Post a Comment