ESP32 и модуль реле – управление бытовыми электроприборами (веб-сервер)

Использование реле с ESP32 – это отличный способ дистанционного управления бытовыми электроприборами переменного тока. В этом руководстве объясняется, как управлять модулем реле с помощью ESP32. Мы рассмотрим принцип работы модуля реле, как подключить реле к ESP32 и создадим веб-сервер для дистанционного управления реле (или любым количеством реле).

Управление модулем реле с помощью ESP32 (веб-сервер)

Узнайте, как управлять модулем реле с платой ESP8266: Руководство по модулю реле для ESP8266 – управление бытовыми электроприборами + пример веб-сервера.

Знакомство с реле

Реле – это электрически управляемый переключатель, и, как любой другой переключатель, оно может быть включено или выключено, пропуская или не пропуская через себя ток. Реле может управляться низкими напряжениями, например 3,3 В, которые обеспечивают GPIO ESP32, и позволяет нам управлять высокими напряжениями, такими как 12 В, 24 В или сетевое напряжение (230 В в Европе и 120 В в США).

Модули реле с 1, 2, 4, 8, 16 каналами

Существуют различные модули реле с разным количеством каналов. Вы можете найти модули реле с одним, двумя, четырьмя, восемью и даже шестнадцатью каналами. Количество каналов определяет количество выходов, которыми мы сможем управлять.

Модули реле с различным количеством каналов 1, 2, 4, 8, 16

Существуют модули реле, электромагнит которых может питаться напряжением 5 В или 3,3 В. Оба варианта можно использовать с ESP32 – вы можете использовать либо вывод VIN (который обеспечивает 5 В), либо вывод 3,3 В.

Кроме того, некоторые модули оснащены встроенным оптопарой (оптоизолятором), которая добавляет дополнительный «уровень» защиты, оптически изолируя ESP32 от цепи реле.

Где приобрести модуль реле:

Распиновка реле

Для демонстрации давайте рассмотрим распиновку 2-канального модуля реле. Использование модуля реле с другим количеством каналов аналогично.

Распиновка 2-канального модуля реле

Слева расположены два набора из трёх разъёмов для подключения высокого напряжения, а выводы справа (низковольтная сторона) подключаются к GPIO ESP32.

Подключения сетевого напряжения

Сторона сетевого напряжения модуля реле

Модуль реле, показанный на предыдущем фото, имеет два разъёма, каждый с тремя контактами: общий (COM), нормально замкнутый (NC) и нормально разомкнутый (NO).

  • COM: подключите ток, которым хотите управлять (сетевое напряжение).

  • NC (нормально замкнутый): конфигурация «нормально замкнутый» используется, когда вы хотите, чтобы реле было замкнуто по умолчанию. Контакты NC и COM соединены, то есть ток протекает до тех пор, пока вы не отправите сигнал с ESP32 на модуль реле для размыкания цепи и прекращения протекания тока.

  • NO (нормально разомкнутый): конфигурация «нормально разомкнутый» работает наоборот: между контактами NO и COM нет соединения, поэтому цепь разомкнута до тех пор, пока вы не отправите сигнал с ESP32 для замыкания цепи.

Управляющие выводы

2-канальный модуль реле

Низковольтная сторона имеет набор из четырёх выводов и набор из трёх выводов. Первый набор состоит из VCC и GND для питания модуля, а также входа 1 (IN1) и входа 2 (IN2) для управления нижним и верхним реле соответственно.

Если ваш модуль реле имеет только один канал, у вас будет только один вывод IN. Если у вас четыре канала, у вас будет четыре вывода IN, и так далее.

Сигнал, отправляемый на выводы IN, определяет, активно реле или нет. Реле срабатывает, когда входной сигнал опускается ниже примерно 2 В. Это означает, что возможны следующие сценарии:

  • Конфигурация «нормально замкнутый» (NC):

    • Сигнал HIGH – ток протекает

    • Сигнал LOW – ток не протекает

  • Конфигурация «нормально разомкнутый» (NO):

    • Сигнал HIGH – ток не протекает

    • Сигнал LOW – ток протекает

Используйте конфигурацию «нормально замкнутый», когда ток должен протекать большую часть времени, и вы хотите лишь изредка его прерывать.

Используйте конфигурацию «нормально разомкнутый», когда хотите, чтобы ток протекал лишь время от времени (например, включать лампу время от времени).

Выбор источника питания

Управляющие выводы 2-канального модуля реле

Второй набор выводов состоит из GND, VCC и JD-VCC. Вывод JD-VCC питает электромагнит реле. Обратите внимание, что модуль имеет перемычку, соединяющую выводы VCC и JD-VCC; на показанном здесь модуле она жёлтая, но у вас она может быть другого цвета.

С установленной перемычкой выводы VCC и JD-VCC соединены. Это означает, что электромагнит реле питается непосредственно от вывода питания ESP32, поэтому цепи модуля реле и ESP32 физически не изолированы друг от друга.

Без перемычки вам необходимо обеспечить независимый источник питания для электромагнита реле через вывод JD-VCC. Такая конфигурация физически изолирует реле от ESP32 с помощью встроенной в модуль оптопары, что предотвращает повреждение ESP32 в случае электрических скачков напряжения.

Подключение модуля реле к ESP32

Подключите модуль реле к ESP32, как показано на следующей схеме. Схема показывает подключение 2-канального модуля реле, подключение модуля с другим количеством каналов выполняется аналогично.

Предупреждение

В этом примере мы работаем с сетевым напряжением. Неправильное обращение может привести к серьёзным травмам. Если вы не знакомы с сетевым напряжением, попросите помощи у того, кто в этом разбирается. Во время программирования ESP или сборки схемы убедитесь, что всё отключено от сетевого напряжения.

Также вы можете использовать источник питания 12 В для управления устройствами на 12 В.

Схема подключения реле к ESP32

В этом примере мы управляем лампой. Нам нужно включать лампу лишь время от времени, поэтому лучше использовать конфигурацию «нормально разомкнутый».

Мы подключаем вывод IN1 к GPIO 26, но вы можете использовать любой другой подходящий GPIO. См. Справочник по GPIO ESP32.

Управление модулем реле с помощью ESP32 – скетч Arduino

Код для управления реле с помощью ESP32 так же прост, как управление светодиодом или любым другим выходом. В этом примере, поскольку мы используем конфигурацию «нормально разомкнутый», нам нужно отправить сигнал 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

В этом разделе мы создали пример веб-сервера, который позволяет управлять любым количеством реле через веб-сервер, независимо от того, настроены ли они как нормально разомкнутые или нормально замкнутые. Вам нужно изменить лишь несколько строк кода, чтобы задать количество реле, которыми вы хотите управлять, и назначение выводов.

Установка библиотек веб-сервера

Мы создадим веб-сервер с использованием следующих библиотек:

Вы можете установить эти библиотеки через менеджер библиотек Arduino. Откройте менеджер библиотек, нажав на значок библиотеки на левой боковой панели.

Найдите ESPAsyncWebServer и установите ESPAsyncWebServer от ESP32Async.

Установка ESPAsyncWebServer ESP32 Arduino IDE

Затем установите библиотеку AsyncTCP. Найдите AsyncTCP и установите AsyncTCP от ESP32Async.

Установка AsyncTCP ESP32 Arduino IDE

Код

После установки необходимых библиотек скопируйте следующий код в вашу Arduino IDE.

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  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(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). Установите переменную RELAY_NO в значение true для нормально разомкнутого или false для нормально замкнутого режима.

#define RELAY_NO true

Определение количества реле (каналов)

Вы можете задать количество реле, которыми хотите управлять, в переменной NUM_RELAYS. Для демонстрации мы устанавливаем значение 5.

#define NUM_RELAYS 5

Назначение выводов для реле

В следующей переменной-массиве вы можете определить GPIO ESP32, которые будут управлять реле:

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

Количество реле, заданное в переменной NUM_RELAYS, должно соответствовать количеству GPIO, указанных в массиве relayGPIOs.

Сетевые учётные данные

Введите ваши сетевые учётные данные в следующие переменные.

const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Подключение 8-канального реле к ESP32

Для демонстрации мы управляем 5 каналами реле. Подключите ESP32 к модулю реле, как показано на следующей принципиальной схеме.

Схема подключения 8-канального модуля реле к ESP32

Демонстрация

После внесения необходимых изменений загрузите код в ваш ESP32.

Откройте монитор последовательного порта на скорости 115200 бод и нажмите кнопку EN на ESP32, чтобы получить его IP-адрес.

Затем откройте браузер в вашей локальной сети и введите IP-адрес ESP32, чтобы получить доступ к веб-серверу.

Вы должны увидеть нечто подобное, с количеством кнопок, соответствующим количеству реле, определённых в вашем коде.

Веб-сервер ESP32 управляет лампой переменного тока через модуль реле

Теперь вы можете использовать кнопки для дистанционного управления реле с помощью вашего смартфона.

Корпус для безопасности

Для готового проекта обязательно поместите ваш модуль реле и ESP в корпус, чтобы избежать оголённых контактов переменного тока.

Корпус для модуля реле

Заключение

Использование реле с ESP32 – это отличный способ дистанционного управления бытовыми электроприборами переменного тока. Вы также можете ознакомиться с нашим другим руководством по управлению модулем реле с ESP8266.

Управлять реле с помощью ESP32 так же просто, как управлять любым другим выходом – вам нужно лишь отправлять сигналы HIGH и LOW, как вы делали бы для управления светодиодом.

Вы можете использовать наши примеры веб-серверов, управляющих выходами, для управления реле. Вам нужно лишь обратить внимание на используемую конфигурацию. В случае конфигурации «нормально разомкнутый» реле работает с инвертированной логикой. Вы можете использовать следующие примеры веб-серверов для управления вашим реле:

Узнайте больше об ESP32 с нашими ресурсами:

Спасибо за чтение.

Источник: ESP32 Relay Module – Control AC Appliances (Web Server)