본문 바로가기

ESP32

Relay Web Server

반응형

 

 

ESP32 릴레이 모듈 - AC 가전제품 제어(웹 서버)

 

ESP32와 함께 릴레이를 사용하면 원격으로 AC 가전제품을 제어할 수 있는 좋은 방법입니다. 이 튜토리얼에서는 ESP32로 릴레이 모듈을 제어하는 방법을 설명합니다. 릴레이 모듈의 작동 방식, 릴레이를 ESP32에 연결하는 방법, 릴레이를 원격으로 제어하는 웹 서버를 구축하는 방법(또는 원하는 만큼의 릴레이)을 살펴보겠습니다.

 

 

ESP32로 릴레이 모듈 제어(웹 서버)

 

ESP8266 보드로 릴레이 모듈을 제어하는 방법을 알아보세요: ESP8266 릴레이 모듈 가이드 - AC 가전제품 제어 + 웹 서버 예제.

 

비디오 튜토리얼 보기

 

다음 비디오 튜토리얼을 보거나 이 페이지를 계속 읽어 서면 지침과 모든 리소스를 확인하세요.

 

릴레이 소개

 

릴레이는 전기적으로 작동하는 스위치이며 다른 스위치와 마찬가지로 켜거나 끌 수 있으며 전류를 흐르게 하거나 흐르지 않게 할 수 있습니다. ESP32 GPIO에서 제공하는 3.3V와 같은 저전압으로 제어할 수 있으며 12V, 24V 또는 주전압(유럽에서는 230V, 미국에서는 120V)과 같은 고전압을 제어할 수 있습니다.

 

1, 2, 4, 8, 16채널 릴레이 모듈

 

채널 수가 다른 다양한 릴레이 모듈이 있습니다. 1, 2, 4, 8, 심지어 16채널의 릴레이 모듈을 찾을 수 있습니다. 채널 수는 제어할 수 있는 출력 수를 결정합니다.

 

채널 수가 다른 릴레이 모듈 1, 2, 4, 8, 16채널

 

전자석에 5V와 3.3V 전원을 공급할 수 있는 릴레이 모듈이 있습니다. 둘 다 ESP32와 함께 사용할 수 있습니다. VIN 핀(5V 제공) 또는 3.3V 핀을 사용할 수 있습니다.

 

또한 일부 제품에는 내장형 광커플러가 있어 ESP32를 릴레이 회로에서 광학적으로 분리하여 보호 "계층"을 추가합니다.

 

릴레이 핀아웃

 

데모 목적으로 2채널 릴레이 모듈의 핀아웃을 살펴보겠습니다. 채널 수가 다른 릴레이 모듈을 사용하는 것도 비슷합니다.

 

 

2채널 릴레이 모듈 핀아웃

 

왼쪽에는 고전압을 연결하기 위한 3개의 소켓 세트가 두 개 있고 오른쪽(저전압)의 핀은 ESP32 GPIO에 연결됩니다.

 

주 전압 연결

 

 

릴레이 모듈 주 전압 측

 

이전 사진에 표시된 릴레이 모듈에는 커넥터가 두 개 있으며 각각 3개의 소켓이 있습니다. 공통(COM), 정상적으로 닫힘(NC), 정상적으로 열림(NO).

 

  • COM: 제어하려는 전류(주 전압)를 연결합니다.
  • NC(정상적으로 닫힘): 기본적으로 릴레이를 닫으려는 경우 정상적으로 닫힌 구성을 사용합니다. NC는 COM 핀이 연결되어 있으므로 ESP32에서 릴레이 모듈로 신호를 보내 회로를 열고 전류 흐름을 멈추지 않는 한 전류가 흐릅니다.
  • NO(정상 개방): 정상 개방 구성은 반대로 작동합니다. NO와 COM 핀 사이에 연결이 없으므로 ESP32에서 회로를 닫는 신호를 보내지 않는 한 회로가 끊어집니다.

 

제어 핀

 

 

2채널 릴레이 모듈

 

저전압 측에는 4개의 핀 세트와 3개의 핀 세트가 있습니다. 첫 번째 세트는 모듈에 전원을 공급하는 VCC와 GND, 하단 및 상단 릴레이를 각각 제어하는 입력 1(IN1)과 입력 2(IN2)로 구성됩니다.

 

릴레이 모듈에 채널이 하나뿐인 경우 IN 핀이 하나만 있습니다. 채널이 4개인 경우 IN 핀이 4개이고 이런 식으로 계속됩니다.

 

IN 핀에 보내는 신호는 릴레이가 활성화되었는지 여부를 결정합니다. 입력이 약 2V 이하로 떨어지면 릴레이가 트리거됩니다. 즉, 다음과 같은 시나리오가 있습니다.

 

  • Normally Closed configuration (NC):
    • HIGH signal – current is flowing
    • LOW signal – current is not flowing
  • Normally Open configuration (NO):
    • HIGH signal – current is not flowing
    • LOW signal – current in flowing

 

전류가 대부분 흐르고 가끔만 멈추고 싶을 때는 일반적으로 닫힌 구성을 사용해야 합니다.

 

전류가 가끔 흐르게 하려는 경우(예: 가끔 램프를 켭니다) 일반적으로 열린 구성을 사용합니다.

 

전원 공급 장치 선택

 

2채널 릴레이 모듈 제어 핀

 

두 번째 핀 세트는 GND, VCC 및 JD-VCC 핀으로 구성됩니다. JD-VCC 핀은 릴레이의 전자석에 전원을 공급합니다. 모듈에는 VCC 및 JD-VCC 핀을 연결하는 점퍼 캡이 있습니다. 여기에 표시된 것은 노란색이지만 사용자의 것은 다른 색상일 수 있습니다.

 

점퍼 캡을 씌우면 VCC 및 JD-VCC 핀이 연결됩니다. 즉, 릴레이 전자석은 ESP32 전원 핀에서 직접 전원을 공급받으므로 릴레이 모듈과 ESP32 회로는 서로 물리적으로 분리되지 않습니다.

 

점퍼 캡이 없으면 JD-VCC 핀을 통해 릴레이의 전자석에 전원을 공급하기 위해 독립적인 전원을 제공해야 합니다. 이 구성은 모듈의 내장 광커플러로 릴레이를 ESP32에서 물리적으로 분리하여 전기 스파이크가 발생할 경우 ESP32가 손상되는 것을 방지합니다.

 

ESP32에 릴레이 모듈 배선

 

다음 다이어그램에 표시된 대로 릴레이 모듈을 ESP32에 연결합니다. 다이어그램은 2채널 릴레이 모듈의 배선을 보여주며, 다른 수의 채널을 배선하는 것도 비슷합니다.

 

경고: 이 예에서는 주 전압을 다루고 있습니다. 오용하면 심각한 부상을 입을 수 있습니다. 주 전압에 익숙하지 않으면 도움을 줄 사람에게 문의하세요. ESP를 프로그래밍하거나 회로를 배선하는 동안 모든 것이 주 전압에서 분리되었는지 확인하세요.

 

또는 12V 전원을 사용하여 12V 기기를 제어할 수 있습니다.

 

 

이 예에서는 램프를 제어합니다. 가끔 램프를 켜고 싶을 뿐이므로 일반적으로 열린 구성을 사용하는 것이 좋습니다.

 

IN1 핀을 GPIO 26에 연결하고 있으며, 다른 적합한 GPIO를 사용할 수 있습니다. ESP32 GPIO 참조 가이드를 참조하세요.

 

ESP32로 릴레이 모듈 제어하기 – Arduino 스케치

 

ESP32로 릴레이를 제어하는 코드는 LED나 다른 출력을 제어하는 것만큼 간단합니다. 이 예에서 일반적으로 열린 구성을 사용하므로 전류가 흐르도록 하려면 LOW 신호를 보내고 전류 흐름을 멈추려면 HIGH 신호를 보내야 합니다.

 

릴레이를 사용하여 ESP32로 램프 제어하기

 

다음 코드는 10초 동안 램프를 켜고 10초 동안 더 끕니다.

 

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-relay-module-ac-web-server/
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

const int relay = 26;

void setup() {
  Serial.begin(115200);
  pinMode(relay, OUTPUT);
}

void loop() {
  // Normally Open configuration, send LOW signal to let current flow
  // (if you're usong Normally Closed configuration send HIGH signal)
  digitalWrite(relay, LOW);
  Serial.println("Current Flowing");
  delay(5000); 
  
  // Normally Open configuration, send HIGH signal stop current flow
  // (if you're usong Normally Closed configuration send LOW signal)
  digitalWrite(relay, HIGH);
  Serial.println("Current not Flowing");
  delay(5000);
}

 

코드 작동 방식

 

릴레이 IN 핀이 연결된 핀을 정의합니다.

 

const int relay = 26;

 

setup()에서 릴레이를 출력으로 정의합니다.

 

pinMode(relay, OUTPUT);

 

loop()에서 전류가 흐르도록 하려면 LOW 신호를 보내고 램프를 켭니다.

 

digitalWrite(relay, LOW);

 

일반적으로 닫힌 구성을 사용하는 경우 HIGH 신호를 보내 램프를 켭니다. 그런 다음 5초 동안 기다립니다.

 

delay(5000);

 

릴레이 핀에 HIGH 신호를 보내 전류 흐름을 중지합니다. 일반적으로 닫힌 구성을 사용하는 경우 LOW 신호를 보내 전류 흐름을 중지합니다.

 

digitalWrite(relay, HIGH);

 

ESP32 웹 서버로 여러 릴레이 제어

 

ESP32 웹 서버로 여러 릴레이 제어

 

 

 

이 섹션에서는 웹 서버를 통해 일반적으로 열린 것으로 구성되었는지 일반적으로 닫힌 것으로 구성되었는지에 관계없이 원하는 만큼 많은 릴레이를 제어할 수 있는 웹 서버 예제를 만들었습니다. 제어하려는 릴레이 수와 핀 할당을 정의하기 위해 몇 줄의 코드만 변경하면 됩니다.

 

이 웹 서버를 빌드하기 위해 ESPAsyncWebServer 라이브러리를 사용합니다.

 

ESPAsyncWebServer 라이브러리 설치

다음 단계에 따라 ESPAsyncWebServer 라이브러리를 설치합니다.

 

  1. 여기를 클릭하여 ESPAsyncWebServer 라이브러리를 다운로드합니다. 다운로드 폴더에 .zip 폴더가 있어야 합니다.
  2. .zip 폴더의 압축을 풀면 ESPAsyncWebServer-master 폴더가 나옵니다.
  3. 폴더 이름을 ESPAsyncWebServer-master에서 ESPAsyncWebServer로 바꿉니다.
  4. ESPAsyncWebServer 폴더를 Arduino IDE 설치 라이브러리 폴더로 옮깁니다.

또는 Arduino IDE에서 Sketch > 라이브러리 포함 > .ZIP 라이브러리 추가...로 이동하여 방금 다운로드한 라이브러리를 선택할 수 있습니다.

 

ESP32용 비동기 TCP 라이브러리 설치

 

ESPAsyncWebServer 라이브러리는 작동하려면 AsyncTCP 라이브러리가 필요합니다. 다음 단계에 따라 해당 라이브러리를 설치하세요.

  1. 여기를 클릭하여 AsyncTCP 라이브러리를 다운로드하세요. 다운로드 폴더에 .zip 폴더가 있어야 합니다.
  2. .zip 폴더의 압축을 풀면 AsyncTCP-master 폴더가 나옵니다.
  3. 폴더 이름을 AsyncTCP-master에서 AsyncTCP로 바꿉니다.
  4. AsyncTCP 폴더를 Arduino IDE 설치 라이브러리 폴더로 옮깁니다.
  5. 마지막으로 Arduino IDE를 다시 엽니다.

또는 Arduino IDE에서 스케치 > 라이브러리 포함 > .ZIP 라이브러리 추가...로 이동하여 방금 다운로드한 라이브러리를 선택할 수 있습니다.

 

필수 라이브러리를 설치한 후 다음 코드를 Arduino IDE에 복사합니다.

 

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp32-relay-module-ac-web-server/
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

// Import required libraries
#include "WiFi.h"
#include "ESPAsyncWebServer.h"

// Set to true to define Relay as Normally Open (NO)
#define RELAY_NO    true

// Set number of relays
#define NUM_RELAYS  5

// Assign each GPIO to a relay
int relayGPIOs[NUM_RELAYS] = {2, 26, 27, 25, 33};

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

const char* PARAM_INPUT_1 = "relay";  
const char* PARAM_INPUT_2 = "state";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    h2 {font-size: 3.0rem;}
    p {font-size: 3.0rem;}
    body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
    .switch {position: relative; display: inline-block; width: 120px; height: 68px} 
    .switch input {display: none}
    .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 34px}
    .slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 68px}
    input:checked+.slider {background-color: #2196F3}
    input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)}
  </style>
</head>
<body>
  <h2>ESP Web Server</h2>
  %BUTTONPLACEHOLDER%
<script>function toggleCheckbox(element) {
  var xhr = new XMLHttpRequest();
  if(element.checked){ xhr.open("GET", "/update?relay="+element.id+"&state=1", true); }
  else { xhr.open("GET", "/update?relay="+element.id+"&state=0", true); }
  xhr.send();
}</script>
</body>
</html>
)rawliteral";

// Replaces placeholder with button section in your web page
String processor(const String& var){
  //Serial.println(var);
  if(var == "BUTTONPLACEHOLDER"){
    String buttons ="";
    for(int i=1; i<=NUM_RELAYS; i++){
      String relayStateValue = relayState(i);
      buttons+= "<h4>Relay #" + String(i) + " - GPIO " + relayGPIOs[i-1] + "</h4><label class=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"" + String(i) + "\" "+ relayStateValue +"><span class=\"slider\"></span></label>";
    }
    return buttons;
  }
  return String();
}

String relayState(int numRelay){
  if(RELAY_NO){
    if(digitalRead(relayGPIOs[numRelay-1])){
      return "";
    }
    else {
      return "checked";
    }
  }
  else {
    if(digitalRead(relayGPIOs[numRelay-1])){
      return "checked";
    }
    else {
      return "";
    }
  }
  return "";
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);

  // Set all relays to off when the program starts - if set to Normally Open (NO), the relay is off when you set the relay to HIGH
  for(int i=1; i<=NUM_RELAYS; i++){
    pinMode(relayGPIOs[i-1], OUTPUT);
    if(RELAY_NO){
      digitalWrite(relayGPIOs[i-1], HIGH);
    }
    else{
      digitalWrite(relayGPIOs[i-1], LOW);
    }
  }
  
  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP32 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });

  // Send a GET request to <ESP_IP>/update?relay=<inputMessage>&state=<inputMessage2>
  server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String inputMessage;
    String inputParam;
    String inputMessage2;
    String inputParam2;
    // GET input1 value on <ESP_IP>/update?relay=<inputMessage>
    if (request->hasParam(PARAM_INPUT_1) & request->hasParam(PARAM_INPUT_2)) {
      inputMessage = request->getParam(PARAM_INPUT_1)->value();
      inputParam = PARAM_INPUT_1;
      inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
      inputParam2 = PARAM_INPUT_2;
      if(RELAY_NO){
        Serial.print("NO ");
        digitalWrite(relayGPIOs[inputMessage.toInt()-1], !inputMessage2.toInt());
      }
      else{
        Serial.print("NC ");
        digitalWrite(relayGPIOs[inputMessage.toInt()-1], inputMessage2.toInt());
      }
    }
    else {
      inputMessage = "No message sent";
      inputParam = "none";
    }
    Serial.println(inputMessage + inputMessage2);
    request->send(200, "text/plain", "OK");
  });
  // Start server
  server.begin();
}
  
void loop() {

}

 

릴레이 구성 정의

 

다음 변수를 수정하여 릴레이를 정상적으로 열린(NO) 구성 또는 정상적으로 닫힌(NC) 구성으로 사용하는지 여부를 나타냅니다. 정상적으로 열린 OS의 경우 RELAY_NO 변수를 true로 설정하고 정상적으로 닫힌 OS의 경우 false로 설정합니다.

 

#define RELAY_NO true

 

릴레이 수(채널) 정의

 

NUM_RELAYS 변수에서 제어하려는 릴레이 수를 정의할 수 있습니다. 데모 목적으로 5로 설정합니다.

 

#define NUM_RELAYS 5

 

릴레이 핀 할당 정의

 

다음 배열 변수에서 릴레이를 제어할 ESP32 GPIO를 정의할 수 있습니다.

 

int relayGPIOs[NUM_RELAYS] = {2, 26, 27, 25, 33};

 

NUM_RELAYS 변수에 설정된 릴레이 수는 relayGPIOs 배열에 할당된 GPIO 수와 일치해야 합니다.

 

네트워크 자격 증명

 

다음 변수에 네트워크 자격 증명을 삽입합니다.

 

const char* ssid = "REPLACE_WITH_YOUR_SSID";

const char* password = "REPLACE_WITH_YOUR_PASSWORD";

 

ESP32에 8채널 릴레이 연결

 

데모 목적으로 5개의 릴레이 채널을 제어합니다. 다음 회로도에 표시된 대로 ESP32를 릴레이 모듈에 연결합니다.

 

ESP32 8채널 릴레이 모듈 배선도 회로도

 

데모

 

필요한 변경을 한 후 코드를 ESP32에 업로드합니다.

 

115200의 전송 속도로 직렬 모니터를 열고 ESP32 EN 버튼을 눌러 IP 주소를 가져옵니다.

 

그런 다음 로컬 네트워크에서 브라우저를 열고 ESP32 IP 주소를 입력하여 웹 서버에 액세스합니다.

 

코드에서 정의한 릴레이 수만큼의 버튼이 있는 다음과 같은 것을 얻을 것입니다.

 

ESP32 웹 서버로 릴레이 모듈로 AC 램프 제어하기

 

이제 버튼을 사용하여 스마트폰을 사용하여 원격으로 릴레이를 제어할 수 있습니다.

 

안전을 위한 인클로저

 

마지막 프로젝트로 릴레이 모듈과 ESP를 인클로저 안에 넣어 AC 핀이 노출되지 않도록 하세요.

 

릴레이 모듈용 인클로저

 

마무리

 

ESP32와 함께 릴레이를 사용하면 원격으로 AC 가전제품을 제어할 수 있는 좋은 방법입니다. ESP8266으로 릴레이 모듈을 제어하는 다른 가이드도 읽어보세요.

 

ESP32로 릴레이를 제어하는 것은 다른 출력을 제어하는 것만큼 쉽습니다. LED를 제어하는 것처럼 HIGH 및 LOW 신호만 보내면 됩니다.

 

출력을 제어하는 웹 서버 예제를 사용하여 릴레이를 제어할 수 있습니다. 사용하는 구성에만 주의하면 됩니다. 일반적으로 열린 구성을 사용하는 경우 릴레이는 역 논리로 작동합니다. 다음 웹 서버 예제를 사용하여 릴레이를 제어할 수 있습니다.

 

  • ESP32 웹 서버 - Arduino IDE
  • SPIFFS(제어 출력)를 사용하는 ESP32 웹 서버
  • ESP32/ESP8266 MicroPython 웹 서버 - 제어 출력

 

다음 리소스를 통해 ESP32에 대해 자세히 알아보세요.

 

  • Arduino IDE로 ESP32 배우기(비디오 과정 + 전자책)
  • ESP32 및 ESP8266을 사용한 MicroPython 프로그래밍
  • 추가 ESP32 리소스…

 

읽어주셔서 감사합니다.

 

배움을 멈추지 마세요. 더불어 절대 포기하지 마시구요.

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^