Sử dụng rơle với ESP8266 là một cách tuyệt vời để điều khiển các thiết bị gia dụng AC từ xa. Hướng dẫn này giải thích cách điều khiển môđun chuyển tiếp bằng ESP8266 NodeMCU. Chúng ta sẽ xem xét cách môđun chuyển tiếp hoạt động, cách kết nối rơle với ESP8266 và xây dựng máy chủ web để điều khiển rơle từ xa (hoặc nhiều rơle như bạn muốn).
Trang 1ESP8266 Mô-đun chuyển tiếp NodeMCU - Thiết bị AC
điều khiển (Máy chủ Web)
Sử dụng rơle với ESP8266 là một cách tuyệt vời để điều khiển các thiết bị gia dụng AC
từ xa Hướng dẫn này giải thích cách điều khiển mô-đun chuyển tiếp bằng ESP8266
NodeMCU Chúng ta sẽ xem xét cách mô-đun chuyển tiếp hoạt động, cách kết nối rơle
với ESP8266 và xây dựng máy chủ web để điều khiển rơle từ xa (hoặc nhiều rơle như
bạn muốn)
Tìm hiểu cách điều khiển mô-đun rơle bằng bảng ESP32: Hướng dẫn cho Mô-đun rơle
ESP32 - Điều khiển Thiết bị AC + Ví dụ về Máy chủ Web.
Giới thiệu Relays
Rơle là một công tắc hoạt động bằng điện và giống như bất kỳ công tắc nào khác, nó có thể được bật hoặc tắt, cho phép dòng điện đi qua hoặc không Nó có thể được điều khiển với điện áp thấp, như 3.3V được cung cấp bởi ESP8266 GPIO và cho phép chúng tôi
điều khiển điện áp cao như 12V, 24V hoặc điện áp nguồn (230V ở Châu Âu và 120V ở
Mỹ)
Mô-đun chuyển tiếp 1, 2, 4, 8, 16 kênh
Có các mô-đun chuyển tiếp khác nhau với số lượng kênh khác nhau Bạn có thể tìm thấy các mô-đun chuyển tiếp với một, hai, bốn, tám và thậm chí mười sáu kênh Số lượng
kênh xác định số lượng đầu ra mà chúng tôi có thể kiểm soát
Trang 2Có các mô-đun rơle có nam châm điện có thể được cấp nguồn bởi 5V và với 3.3V Cả
hai đều có thể được sử dụng với ESP8266 - bạn có thể sử dụng chân Vin (cung cấp 5V) hoặc chân 3.3V
Ngoài ra, một số đi kèm với bộ ghép quang tích hợp bổ sung thêm một "lớp" bảo vệ,
cách ly quang học ESP8266 khỏi mạch rơle
Nhận mô-đun chuyển tiếp:
Sơ đồ chân rơle
Đối với mục đích trình diễn, chúng ta hãy xem sơ đồ chân của mô-đun rơle 2 kênh Sử
dụng mô-đun chuyển tiếp với số lượng kênh khác nhau cũng tương tự
Trang 3Hai đầu nối (mỗi đầu nối có ba ổ cắm) ở phía bên trái của mô-đun rơle kết nối điện áp
cao và các chân ở phía bên phải (điện áp thấp) kết nối với GPIO ESP8266
Kết nối điện áp nguồn
Mô-đun rơle được hiển thị trong ảnh trước có hai đầu nối, mỗi đầu nối có ba ổ cắm:
chung (COM), thường đóng (NC) và thường mở (NO)
COM: kết nối dòng điện bạn muốn điều khiển (điện áp nguồn).
NC (Thường đóng): cấu hình thường đóng được sử dụng khi bạn muốn đóng rơle
theo mặc định NC là các chân COM được kết nối, có nghĩa là dòng điện đang chạy trừ khi bạn gửi tín hiệu từ ESP8266 đến mô-đun rơle để mở mạch và dừng dòng
điện
NO (Thường mở): cấu hình thường mở hoạt động theo cách khác: không có kết
nối giữa các chân NO và COM, do đó mạch bị hỏng trừ khi bạn gửi tín hiệu từ
ESP8266 để đóng mạch
Chân điều khiển
Trang 4Phía điện áp thấp có một bộ bốn chân và một bộ ba chân Bộ đầu tiên bao gồm VCC và GND để cấp nguồn cho mô-đun và đầu vào 1 (IN1) và đầu vào 2 (IN2) để điều khiển rơle dưới cùng và trên cùng, tương ứng
Nếu mô-đun chuyển tiếp của bạn chỉ có một kênh, bạn sẽ chỉ có một chân IN Nếu bạn
có bốn kênh, bạn sẽ có bốn chân IN, v.v
Tín hiệu bạn gửi đến các chân IN, xác định xem rơle có hoạt động hay không Rơle được kích hoạt khi đầu vào xuống dưới khoảng 2V Điều này có nghĩa là bạn sẽ có các tình
huống sau:
Cấu hình thường đóng (NC):
Tín hiệu CAO - dòng điện đang chảy
Tín hiệu LOW – dòng điện không chạy
Cấu hình thường mở (NO):
Tín hiệu CAO – dòng điện không chạy
Tín hiệu LOW - dòng điện đang chạy
Bạn nên sử dụng cấu hình thường đóng khi dòng điện nên chạy hầu hết thời gian và bạn chỉ muốn thỉnh thoảng dừng nó
Sử dụng cấu hình thường mở khi bạn muốn thỉnh thoảng dòng điện chạy (ví dụ: thỉnh
thoảng bật đèn)
Lựa chọn nguồn điện
Trang 5Bộ chân thứ hai bao gồm các chân GND, VCC và JD-VCC Chân JD-VCC cấp nguồn cho nam châm điện của rơle Lưu ý rằng mô-đun có nắp nhảy kết nối các chân VCC và JD-VCC; Cái được hiển thị ở đây có màu vàng, nhưng màu của bạn có thể là một màu khác Khi bật nắp nhảy, các chân VCC và JD-VCC được kết nối Điều đó có nghĩa là nam châm điện rơle được cấp nguồn trực tiếp từ chân nguồn ESP8266, do đó mô-đun rơle và mạch ESP8266 không được cách ly vật lý với nhau
Nếu không có nắp nhảy, bạn cần cung cấp một nguồn năng lượng độc lập để cấp nguồn cho nam châm điện của rơle thông qua chân JD-VCC Cấu hình đó cách ly vật lý các rơle khỏi ESP8266 với bộ ghép quang tích hợp của mô-đun, giúp ngăn ngừa thiệt hại cho
ESP8266 trong trường hợp tăng đột biến điện
ESP8266 Chân an toàn nhất để sử dụng với rơle
Một số chân ESP8266 phát ra tín hiệu 3.3V khi ESP8266 khởi động Điều này có thể có vấn đề nếu bạn có rơle hoặc các thiết bị ngoại vi khác được kết nối với các GPIO đó
Ngoài ra, một số chân phải được kéo CAO hoặc THẤP để khởi động ESP8266
Có tính đến điều này, các chân ESP8266 an toàn nhất để sử dụng với rơle là: GPIO 5,
GPIO 4, GPIO 14, GPIO 12 và GPIO 13
Để biết thêm thông tin về các GPIO ESP8266, hãy đọc: Tham chiếu sơ đồ chân
ESP8266: Bạn nên sử dụng chân GPIO nào?
Đấu dây mô-đun rơle với bảng mạch ESP8266 NodeMCU
Trang 6Kết nối mô-đun rơle với ESP8266 như thể hiện trong sơ đồ sau Sơ đồ cho thấy hệ thống dây điện cho mô-đun rơle 2 kênh, nối dây một số kênh khác nhau là tương tự
Cảnh báo: trong ví dụ này, chúng ta đang xử lý điện áp nguồn Sử dụng sai có thể dẫn
đến thương tích nghiêm trọng Nếu bạn không quen thuộc với điện áp lưới, hãy hỏi ai đó
sẽ giúp bạn Trong khi lập trình ESP hoặc nối dây mạch của bạn, hãy đảm bảo mọi thứ
được ngắt kết nối khỏi điện áp nguồn
Ngoài ra, bạn có thể sử dụng nguồn điện 12V để điều khiển các thiết bị 12V
Trong ví dụ này, chúng ta đang điều khiển đèn Chúng tôi chỉ muốn thỉnh thoảng thắp
sáng đèn, vì vậy tốt hơn là sử dụng cấu hình mở bình thường
Chúng tôi đang kết nối chân IN1 với GPIO 5, bạn có thể sử dụng bất kỳ GPIO phù hợp
nào khác Xem Hướng dẫn Tham khảo GPIO ESP8266
Điều khiển mô-đun chuyển tiếp với ESP8266 NodeMCU - Arduino Sketch
Mã để điều khiển rơle với ESP8266 cũng đơn giản như điều khiển đèn LED hoặc bất kỳ đầu ra nào khác Trong ví dụ này, khi chúng ta đang sử dụng cấu hình thường mở, chúng
ta cần gửi tín hiệu LOW để cho dòng điện chạy và tín hiệu HIGH để dừng dòng điện
Trang 7Đoạn mã sau sẽ sáng đèn của bạn trong 10 giây và tắt thêm 10 giây nữa
/*********
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);
}
Xem mã thô
ế
Trang 8Mã hoạt động như thế nào
Xác định chốt mà chân IN rơle được kết nối
const int relay = 5;
Trong setup(), định nghĩa relay là đầu ra
pinMode(relay, OUTPUT);
Trong loop(), gửi tín hiệu LOW để dòng điện chạy và thắp đèn
digitalWrite(relay, LOW);
Nếu bạn đang sử dụng cấu hình thường đóng, hãy gửi tín hiệu CAO để thắp đèn Sau
đó, đợi 5 giây
delay(5000);
Dừng dòng điện bằng cách gửi tín hiệu CAO đến chân rơle Nếu bạn đang sử dụng cấu hình thường đóng, hãy gửi tín hiệu THẤP để dừng dòng điện
digitalWrite(relay, HIGH);
Điều khiển nhiều rơle với Máy chủ Web ESP8266 NodeMCU
Trang 9Trong phần này, chúng tôi đã tạo một ví dụ về máy chủ web cho phép bạn kiểm soát bao nhiêu rơle tùy thích thông qua máy chủ web cho dù chúng được định cấu hình như
thường mở hay đóng bình thường Bạn chỉ cần thay đổi một vài dòng mã để xác định số lượng rơle bạn muốn điều khiển và gán pin
Để xây dựng máy chủ web này, chúng tôi sử dụng thư viện ESPAsyncWebServer
Cài đặt thư viện ESPAsyncWebServer
Làm theo các bước tiếp theo để cài đặt thư viện ESPAsyncWebServer:
1 Bấm vào đây để tải xuống thư viện ESPAsyncWebServer Bạn sẽ có một thư mục zip trong thư mục Tải xuống của mình
2 Giải nén thư mục zip và bạn sẽ nhận được thư mục ESPAsyncWebServer-master
3 Đổi tên thư mục của bạn từ ESPAsyncWebServer-master thành
ESPAsyncWebServer
4 Di chuyển thư mục ESPAsyncWebServer vào thư mục thư viện cài đặt Arduino IDE
của bạn
Ngoài ra, trong Arduino IDE, bạn có thể vào Sketch > Include Library > Add ZIP
library và chọn thư viện bạn vừa tải xuống.
Cài đặt thư viện ESPAsyncTCP cho ESP8266
Thư viện ESPAsyncWebServer yêu cầu thư viện ESPAsyncTCP hoạt động Làm theo
các bước tiếp theo để cài đặt thư viện đó:
1 Bấm vào đây để tải xuống thư viện ESPAsyncTCP Bạn sẽ có một thư mục zip
trong thư mục Tải xuống của mình
2 Giải nén thư mục zip và bạn sẽ nhận được thư mục ESPAsyncTCP-master
3 Đổi tên thư mục của bạn từ ESPAsyncTCP-master thành ESPAsyncTCP
4 Di chuyển thư mục ESPAsyncTCP vào thư mục thư viện cài đặt Arduino IDE của
bạn
5 Cuối cùng, mở lại Arduino IDE của bạn
Ngoài ra, trong Arduino IDE, bạn có thể vào Sketch > Include Library > Add ZIP
library và chọn thư viện bạn vừa tải xuống.
Sau khi cài đặt các thư viện cần thiết, hãy sao chép mã sau vào Arduino IDE của bạn
Trang 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
*********/
// 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);
Trang 11%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++){
Trang 12pinMode(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);
Trang 13void loop() {
}
Xem mã thô
Xác định cấu hình rơle
Sửa đổi biến sau để cho biết bạn đang sử dụng rơle của mình trong cấu hình thường mở (NO) hay thường đóng (NC) Đặt biến RELAY_NO thành true cho hệ điều hành thường
mở được đặt thành false cho thường đóng
#define RELAY_NO true
Xác định số lượng rơle (kênh)
Bạn có thể xác định số lượng rơle bạn muốn kiểm soát trên biến NUM_RELAYS Đối với mục đích trình diễn, chúng tôi đặt nó thành 5
#define NUM_RELAYS 5
Xác định gán pin rơle
Trong biến mảng sau, bạn có thể xác định các GPIO ESP8266 sẽ điều khiển các rơle
int relayGPIOs[NUM_RELAYS] = {5, 4, 14, 12, 13};
Số lượng rơle được đặt trên biến NUM_RELAYS cần phải khớp với số lượng GPIO được gán trong mảng relayGPIOs
Thông tin đăng nhập mạng
Chèn thông tin đăng nhập mạng của bạn vào các biến sau
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Nối dây 8 kênh Relay đến ESP8266 NodeMCU
Đối với mục đích trình diễn, chúng tôi đang kiểm soát 5 kênh chuyển tiếp Nối bảng mạch ESP8266 NodeMCU với mô-đun chuyển tiếp như thể hiện trong sơ đồ tiếp theo