ESP8266 NodeMCU Модуль реле — Управление бытовыми приборами переменного тока (Веб-сервер)
Использование реле с ESP8266 — отличный способ дистанционного управления бытовыми приборами переменного тока. В этом руководстве объясняется, как управлять модулем реле с помощью ESP8266 NodeMCU. Мы рассмотрим, как работает модуль реле, как подключить реле к 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 от цепи реле.
Приобрести модуль реле:
Модуль реле 5 В, 2-канальный (с оптопарой)
Модуль реле 5 В, 1-канальный (с оптопарой)
Модуль реле 5 В, 8-канальный (с оптопарой)
Модуль реле 5 В, 16-канальный (с оптопарой)
Модуль реле 3,3 В, 1-канальный (с оптопарой)
Распиновка реле
Для демонстрации рассмотрим распиновку 2-канального модуля реле. Использование модуля реле с другим количеством каналов аналогично.
Два разъёма (с тремя гнёздами каждый) на левой стороне модуля реле предназначены для подключения высокого напряжения, а выводы на правой стороне (низковольтной) подключаются к GPIO ESP8266.
Подключение сетевого напряжения
Модуль реле, показанный на предыдущем фото, имеет два разъёма, каждый с тремя гнёздами: общий (COM), нормально замкнутый (NC) и нормально разомкнутый (NO).
COM: подключите ток, которым хотите управлять (сетевое напряжение).
NC (Нормально замкнутый): нормально замкнутая конфигурация используется, когда вы хотите, чтобы реле было замкнуто по умолчанию. Выводы NC и COM соединены, что означает, что ток протекает, пока вы не отправите сигнал с ESP8266 на модуль реле, чтобы разомкнуть цепь и прекратить протекание тока.
NO (Нормально разомкнутый): нормально разомкнутая конфигурация работает противоположным образом: между выводами NO и COM нет соединения, поэтому цепь разомкнута, пока вы не отправите сигнал с ESP8266, чтобы замкнуть цепь.
Управляющие выводы
Низковольтная сторона имеет группу из четырёх выводов и группу из трёх выводов. Первая группа состоит из VCC и GND для питания модуля, а также входа 1 (IN1) и входа 2 (IN2) для управления нижним и верхним реле соответственно.
Если ваш модуль реле имеет только один канал, у вас будет только один вывод IN. Если у вас четыре канала, у вас будет четыре вывода IN, и так далее.
Сигнал, который вы отправляете на выводы IN, определяет, активно реле или нет. Реле срабатывает, когда входной сигнал падает ниже примерно 2 В. Это означает, что у вас будут следующие сценарии:
Нормально замкнутая конфигурация (NC):
Сигнал HIGH — ток протекает
Сигнал LOW — ток не протекает
Нормально разомкнутая конфигурация (NO):
Сигнал HIGH — ток не протекает
Сигнал LOW — ток протекает
Вы должны использовать нормально замкнутую конфигурацию, когда ток должен протекать большую часть времени, и вы хотите останавливать его лишь изредка.
Используйте нормально разомкнутую конфигурацию, когда вы хотите, чтобы ток протекал время от времени (например, включать лампу время от времени).
Выбор источника питания
Вторая группа выводов состоит из 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 В.
В этом примере мы управляем лампой. Мы просто хотим включать лампу время от времени, поэтому лучше использовать нормально разомкнутую конфигурацию.
Мы подключаем вывод IN1 к GPIO 5, вы можете использовать любой другой подходящий GPIO. Смотрите Справочник по GPIO ESP8266.
Управление модулем реле с помощью ESP8266 NodeMCU — скетч Arduino
Код для управления реле с помощью ESP8266 так же прост, как управление светодиодом или любым другим выходом. В этом примере, поскольку мы используем нормально разомкнутую конфигурацию, нам нужно отправить сигнал LOW, чтобы пропустить ток, и сигнал HIGH, чтобы остановить протекание тока.
Следующий код будет включать лампу на 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
В этом разделе мы создали пример веб-сервера, который позволяет вам управлять любым количеством реле через веб-сервер, независимо от того, настроены ли они как нормально разомкнутые или нормально замкнутые. Вам нужно лишь изменить несколько строк кода, чтобы определить количество реле, которыми вы хотите управлять, и назначение выводов.
Установка библиотек для веб-сервера
Мы создадим веб-сервер, используя следующие библиотеки:
Вы можете установить эти библиотеки с помощью менеджера библиотек 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 к модулю реле, как показано на следующей принципиальной схеме.
Демонстрация
После внесения необходимых изменений загрузите код на ваш ESP8266.
Откройте Serial Monitor на скорости 115200 бод и нажмите кнопку RST на ESP8266, чтобы получить его IP-адрес.
Затем откройте браузер в вашей локальной сети и введите IP-адрес ESP8266, чтобы получить доступ к веб-серверу.
Вы должны увидеть что-то вроде следующего, с таким количеством кнопок, сколько реле вы определили в коде.
Теперь вы можете использовать кнопки для дистанционного управления реле с помощью смартфона.
Корпус для безопасности
Для финального проекта обязательно поместите модуль реле и ESP в корпус, чтобы избежать оголённых контактов переменного тока.
Заключение
Использование реле с ESP8266 — отличный способ дистанционного управления бытовыми приборами переменного тока. Вы также можете прочитать наше другое руководство по управлению модулем реле с ESP32.
Управление реле с помощью ESP8266 так же просто, как управление любым другим выходом, вам просто нужно отправлять сигналы HIGH и LOW, как вы бы делали для управления светодиодом.
Вы можете использовать наши другие примеры веб-серверов, которые управляют выходами, для управления реле. Вам просто нужно обратить внимание на используемую конфигурацию. В случае нормально разомкнутой конфигурации реле работает с инвертированной логикой. Вы можете использовать следующие примеры веб-серверов для управления реле:
Узнайте больше о ESP8266 с нашими ресурсами:
Спасибо за чтение.