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.
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 0xEint 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 myDatastruct_message myData;// Init ESP Now with fallbackvoid 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 RestartESP.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 Mastervoid 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 13Serial.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 0x82int 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 myDatastruct_message myData;// Init ESP Now with fallbackvoid 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 Mastervoid 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-NOWif (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 infoesp_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 Addressuint8_t RxMACaddress[] = {0xE3, 0xA1, 0xFC, 0x23, 0x49, 0xEB};// Structure example to send data// Must match the receiver structuretypedef struct struct_message {uint8_t DataCommand = 0xF9;uint8_t valCommand;uint8_t EndCommand = 0x9F;} struct_message;// Create a struct_message called myDatastruct_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 sentvoid 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 MonitorSerial.begin(74880);delay(2500);// Set device as a Wi-Fi StationWiFi.mode(WIFI_STA);// Init ESP-NOWif (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 packetesp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);esp_now_register_send_cb(OnDataSent);// Register peeresp_now_add_peer(RxMACaddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);IrReceiver.begin(IR_RECEIVE_PIN); // data pin D5IrReceiver.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 Addressuint8_t RxMACaddress[] = {0xE3, 0xA1, 0xFC, 0x23, 0x49, 0xEB};// Structure example to send data// Must match the receiver structuretypedef struct struct_message {uint8_t DataCommand = 0xF9;uint8_t valCommand;uint8_t EndCommand = 0x9F;} struct_message;// Create a struct_message called myDatastruct_message myData;// Register peeresp_now_peer_info_t peerInfo;// Init ESP Now with fallbackvoid 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 peermemcpy(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 datavoid 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 sentvoid 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 MonitorSerial.begin(115200);delay(2500);// Set device as a Wi-Fi StationWiFi.mode(WIFI_STA);// Init ESP-NOWInitESPNow();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 Addressuint8_t RxMACaddress[] = {0xE3, 0xA1, 0xFC, 0x23, 0x49, 0xEB};// Structure example to send data// Must match the receiver structuretypedef struct struct_message {uint8_t DataCommand = 0xF9;uint8_t valCommand;uint8_t EndCommand = 0x9F;} struct_message;// Create a struct_message called myDatastruct_message myData;// Register peeresp_now_peer_info_t peerInfo;// Init ESP Now with fallbackvoid 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 peermemcpy(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 datavoid 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 sentvoid 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 MonitorSerial.begin(115200);delay(2500);// Set device as a Wi-Fi StationWiFi.mode(WIFI_STA);// Init ESP-NOWInitESPNow();IrReceiver.begin(IR_RECEIVE_PIN);}void loop() {if (IrReceiver.decode()) IRDataRecv();}
No comments:
Post a Comment