ESP8266 NodeMCU Модуль реле — Управление бытовыми приборами переменного тока (Веб-сервер)

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

ESP8266 Модуль реле — Управление бытовыми приборами переменного тока (Веб-сервер)

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

Смотрите видеоурок

Посмотрите следующий видеоурок или продолжайте читать эту страницу для получения письменных инструкций и всех ресурсов.

Введение в реле

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

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

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

Модули реле с различным количеством каналов

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

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

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

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

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

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

Два разъёма (с тремя гнёздами каждый) на левой стороне модуля реле предназначены для подключения высокого напряжения, а выводы на правой стороне (низковольтной) подключаются к GPIO ESP8266.

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

Модуль реле — сторона сетевого напряжения

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

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

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

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

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

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 соединены. Это означает, что электромагнит реле питается непосредственно от вывода питания ESP8266, поэтому цепь модуля реле и цепь ESP8266 физически не изолированы друг от друга.

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

Безопасные выводы ESP8266 для использования с реле

Некоторые выводы ESP8266 выдают сигнал 3,3 В при загрузке ESP8266. Это может быть проблематично, если к этим GPIO подключены реле или другие периферийные устройства.

Кроме того, некоторые выводы должны быть подтянуты к HIGH или LOW для загрузки ESP8266.

С учётом этого, наиболее безопасные выводы ESP8266 для использования с реле: GPIO 5, GPIO 4, GPIO 14, GPIO 12 и GPIO 13.

Для получения дополнительной информации о GPIO ESP8266 читайте: Справочник по распиновке ESP8266: Какие выводы GPIO следует использовать?

Подключение модуля реле к плате ESP8266 NodeMCU

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

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

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

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

Подключение модуля реле к плате ESP8266 NodeMCU

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

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

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

Код для управления реле с помощью ESP8266 так же прост, как управление светодиодом или любым другим выходом. В этом примере, поскольку мы используем нормально разомкнутую конфигурацию, нам нужно отправить сигнал LOW, чтобы пропустить ток, и сигнал HIGH, чтобы остановить протекание тока.

Управление лампой с помощью ESP8266 через реле

Следующий код будет включать лампу на 10 секунд и выключать её на ещё 10 секунд.

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-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 = 5;

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 = 5;

В setup() определите реле как выход.

pinMode(relay, OUTPUT);

В loop() отправьте сигнал LOW, чтобы пропустить ток и зажечь лампу.

digitalWrite(relay, LOW);

Если вы используете нормально замкнутую конфигурацию, отправьте сигнал HIGH, чтобы зажечь лампу. Затем подождите 5 секунд.

delay(5000);

Остановите протекание тока, отправив сигнал HIGH на вывод реле. Если вы используете нормально замкнутую конфигурацию, отправьте сигнал LOW, чтобы остановить протекание тока.

digitalWrite(relay, HIGH);

Управление несколькими реле с помощью веб-сервера ESP8266 NodeMCU

Управление несколькими реле с помощью веб-сервера ESP8266

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

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

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

Вы можете установить эти библиотеки с помощью менеджера библиотек Arduino. Перейдите в Sketch > Include Library > Manage Libraries и найдите названия библиотек.

Код

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

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp8266-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 "ESP8266WiFi.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] = {5, 4, 14, 12, 13};

// 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 ESP8266 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) конфигурации. Установите переменную RELAY_NO в true для нормально разомкнутой или в false для нормально замкнутой конфигурации.

#define RELAY_NO true

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

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

#define NUM_RELAYS 5

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

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

int relayGPIOs[NUM_RELAYS] = {5, 4, 14, 12, 13};

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

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

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

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

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

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

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

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

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

Откройте Serial Monitor на скорости 115200 бод и нажмите кнопку RST на ESP8266, чтобы получить его IP-адрес.

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

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

Веб-сервер ESP8266, управляющий лампой переменного тока через модуль реле

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

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

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

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

Заключение

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

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

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

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

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