Thứ Sáu, Tháng Chín 25, 2020
Trang chủ DIY Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 - Bài 2:...

Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 2: Bật tắt đèn 220V với module Relay

Giới Thiệu

Trong phần trước chúng ta đã xây dựng xong giao diện điều khiển cho Dashboard với Switch. Trong bài viết này mình sẽ hướng dẫn sử đóng ngắt thực tế một bóng đèn 220V với Module Relay. Mình dùng luôn Module 4 Relay luôn để trong trường hợp muốn mở rộng thêm bóng đèn thì chúng ta đã có sẵn Relay rồi^^. Với lại mình sẽ hướng dẫn thêm một xíu về việc chống nhiễu cho Relay bằng cách sử dụng nguồn ngoài. Chúng ta bắt đầu thôi nào

Chuẩn Bị

1. Phần cứng

  • Kit RF Thu Phát Wifi ESP8266 NodeMCU Lua CP2102
  • Một board Raspberry Pi ( ở đây mình sử dụng Raspberry Pi 3 Model B) bạn có thể tham khảo mua tại đây . Bạn nên mua đủ nguồn, thẻ nhớ – ít nhất 16GB và vỏ case để bảo vệ tốt cho board RasPi của bạn!
  • Mạch 4 Relay Opto Cách Ly 5VDC: Mình sử dụng 4 Relay thay vì module 1 relay cho các bạn muốn mở rộng đỡ mất công phải mua thêm module nữa , thứ hai module này có cách ly nguồn relay với nguồn điều khiển nếu chúng ta đấu đúng cách, và quan trọng nhất là nó rẻ :))))
  • Nguồn Power Adaptor AC-DC 5V 2A: Sử dụng nguồn này để nuôi Relay,giúp cách ly với nguồn điều khiển
  • Đầu Chuyển Domino Sang Giắc DC Cái 2.1mm: Vì đầu của Adapter là đầu DC đực nên  sẽ cần cái này để dễ dàng cấp nguồn cho Module Relay

2. Phần mềm

  • Raspberry Pi

Các bạn cần cài đặt server MQTT trên Raspberry. Nếu bạn chưa cài đặt bạn có thể tham khảo bài viết: Raspberry Pi giao tiếp với NodeMCU ESP8266 qua giao thức MQTT – Phần 1

  • Arduino IDE

Các bạn cần cài đặt sẵn Arduino IDE có tương thích với ESP8266. Nếu bạn chưa biết cách cài đặt có thể tham khảo bài viết sau: Hướng dẫn lập trình ESP8266 với Arduino IDE.

Hướng dẫn

Lưu ý: Bài này là bài nối tiếp của bài: Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 1: Bật tắt đèn LED nên các bạn lưu ý cần thực hiện bài trước OK đã chúng ta mới làm được bài này bởi vì mình sẽ bỏ qua những gì đã giải thích ở bài trước.

1. NodeMCU ESP8266 

A. Phần Mềm

Mình sẽ đưa ra source code luôn ^^

Source Code

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
const char* ssid = "NhaptenWiFi"; // Nhập tên WiFi  
const char* password = "Nhapmatkhau"; // Nhập Mật khẩu WiFi  
const char* mqttServer = "IPADDRESS"; // Nhập địa chỉ của server MQTT
String clientId = "ClientESP8266";            // Client ID của mạch
const char* relay_topic = "Maker_relay";      // Topic của relay

#define SW_1 D1
#define SW_2 D2
#define SW_3 D3
#define SW_4 D4

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
void setup() {
  pinMode(D0, OUTPUT);
  Serial.begin(115200);
  setup_wifi();
  /* Hàm start - read Callback client */
  client.setServer(mqttServer, 1883);
  client.setCallback(callback);
}
void setup_wifi() {
  delay(10);
  pinModes();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
/* Ham call back nhan lai du lieu */
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message read [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  if (strcmp(topic, relay_topic) == 0)
  {
    handlingData_Relay(payload);
  }
}
void handlingData_Relay(byte* data)
{
  switch ((char)data[0]) {
    case '0':
      digitalWrite(SW_1, LOW);
      client.publish(relay_topic, "Relay 1 is ON");
      break;
    case '1':
      digitalWrite(SW_1, HIGH);
      client.publish(relay_topic, "Relay 1 is OFF");
      break;
    case '2':
      digitalWrite(SW_2, LOW);
      client.publish(relay_topic, "Relay 2 is ON");
      break;
    case '3':
      digitalWrite(SW_2, HIGH);
      client.publish(relay_topic, "Relay 2 is OFF");
      break;
    case '4':
      digitalWrite(SW_3, LOW);
      client.publish(relay_topic, "Relay 3 is ON");
      break;
    case '5':
      digitalWrite(SW_3, HIGH);
      client.publish(relay_topic, "Relay 3 is OFF");
      break;
    case '6':
      digitalWrite(SW_4, LOW);
      client.publish(relay_topic, "Relay 4 is ON");
      break;
    case '7':
      digitalWrite(SW_4, HIGH);
      client.publish(relay_topic, "Relay 4 is OFF");
      break;
  }


}
void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      client.publish(relay_topic, "Reconnect");               // Gửi dữ liệu
      client.subscribe(relay_topic);                          // Theo dõi dữ liệu
    } else {
      Serial.println("failed, rc=");
      Serial.print(client.state());
      // Doi 1s
      delay(1000);
    }
  }
}
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}


void pinModes() {
  pinMode(SW_1, OUTPUT);
  pinMode(SW_2, OUTPUT);
  pinMode(SW_3, OUTPUT);
  pinMode(SW_4, OUTPUT);

  digitalWrite(SW_1, HIGH);
  digitalWrite(SW_2, HIGH);
  digitalWrite(SW_3, HIGH);
  digitalWrite(SW_4, HIGH);

}

Mình sẽ giải thích sơ lược về phần code này khác gì so với bài trước:

+ Đầu tiên là chúng ta sẽ sử dụng 4 chân của NodeMCU D1,D2,D3,D4 nên mình sẽ #define các chân tương ứng với các Relay đó

#define SW_1 D1
#define SW_2 D2
#define SW_3 D3
#define SW_4 D4

+ Cấu hình chân Relay là OUTPUT, sau đó đưa lên mức HIGH. Vì sao lại “HIGH”? bởi vì module relay này kích ở mức 0V, và sẽ không kích ở mức cao. Mình sẽ giải thích phần này ở dưới

pinMode(SW_1, OUTPUT);digitalWrite(SW_1, HIGH);
pinMode(SW_2, OUTPUT);digitalWrite(SW_2, HIGH);
pinMode(SW_3, OUTPUT);digitalWrite(SW_3, HIGH);
pinMode(SW_4, OUTPUT);digitalWrite(SW_4, HIGH);

+ Phần topic mình đã đổi tên thành “Maker_relay” , các bạn nên phân chia ra các topic riêng cho phù hợp , ví dụ bài tới chúng ta đọc cảm biến thì sẽ cần thêm một Topic khác ví dụ như “Maker_sensor” chẳng hạn

const char* relay_topic = “Maker_relay”; // Topic của relay

+ Trong hàm callback , ở bài trước thì mình lấy luôn giá trị của “payload” để xử lí luôn , nhưng bài này và những bài sau chúng ta sẽ  kiểm tra xem tên “topic” trả về với tên “relay_topic” chúng ta đặt ở phần trên giống nhau chưa , nếu giống thì mới xử lí dữ liệu “payload“. Thêm một xíu về cấu trúc dữ liệu vì “topic” và “relay_topic” là dữ liệu kiểu char nên không so sánh “==” như string được. Các bạn phải dùng hàm strcmp(a,b).

if (strcmp(topic, relay_topic) == 0)
{
handlingData_Relay(payload);
}

+ Thêm một phần mới là mình không dùng IF nữa vì nhiều quá gõ cũng hơi mỏi tay mà copy thì nhìn hơi vướng víu nên mình chuyển qua dùng Switch-Case để xử lí dữ liệu “payload” trả về, các bạn nhớ xem qua và chỉnh sửa lại nhé, mình để phần xử lí đó ở trong:

void handlingData_Relay(byte* data)

+ Những phần khác mình đã giải thích ở các bài viết trước rồi , nếu các bạn không rõ có thể xem lại những bài trước nhé. Về cơ bản là chúng ta đã xong phần code rồi 😀 . Phần nạp chương trình mình đã nói ở những phần trước nên sẽ bỏ qua nhé ^^

B. Phần Cứng

Mình vẫn thích hướng dẫn về phần cứng trước. Tuy nhiên nếu các bạn xuất các chân là OUTPUT và đưa lên HIGH ở chương trình cũ, mà các bạn lại cắm dây đọc từ cảm biến INPUT vào thì sẽ gây cháy mạch. Mặc dù đôi khi bạn thấy không có gì nhưng thôi thì cứ an toàn là trên hết. Cháy cái board cũng mất toi 100k chứ ít ỏi gì. Lan man vậy thôi chúng ta vào cắm dây nào.

+ Các bạn sẽ nối 5 dây từ NodeMCU vào module Relay như sau: Lưu ý : Không cắm chân GND

Kit RF Thu Phát Wifi ESP8266 NodeMCU Lua CP2102

Mạch 4 Relay Opto Cách Ly 5VDC

D1 IN1
D2 IN2
D3 IN3
D4 IN4
3.3V  VCC

+ Bây giờ đến module Relay , các bạn sẽ rút cái Jumper màu vàng góc bên phải có ghi VCC và JD-VCC ra.

+ Gắn Adapter 5V-2A  vào Đầu Chuyển Domino. Sau đó các bạn kết nối với dây bus đực cái để cấp nguồn nuôi cho Relay (Dây bus để test thôi nhé, nếu làm thực tế thì nên dùng dây tốt tốt xíu cho nó tải dòng tốt hơn). Ví dụ trong hình: dây trắng(5V) – các bạn kết nối vào dấu “+” trên domino , dây đen(GND) – các bạn kết nối vào dấu “-” trên domino

Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 2: Bật tắt đèn 220V với module Relay

+ Kết nối nguồn riêng cho module Relay. Hai dây trắng đen các bạn nối như sau

  • Dây trắng : vào JD-VCC các bạn lưu ý đừng cắm nhầm vào VCC nhé, vì  sẽ gây cháy NodeMCU ESP8266
  • Dây đen cắm vào GND bên cạnh chân IN1

Về cơ bản chúng ta đã kết nối xong rồi. Mình sẽ giải thích một xíu tại sao phải cắm như vậy, các bạn có thể xem qua sơ đồ sau:

Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 2: Bật tắt đèn 220V với module Relay

Như trên sơ đồ các bạn sẽ thấy JD-VCC và GND là nguồn nguôi cho Relay

  • Nếu chúng ta để nguyên Jumper thì JD-VCC và VCC sẽ nối nhau , tức là sẽ dùng nguồn VCC để nuôi luôn nguồn relay là JD-VCC
  •  Nếu các bạn rút Jumper ra thì cần cấp nguồn riêng 5V (JD-VCC) và GND để cấp nguồn nuôi cho Relay . Bên phía VCC các bạn sẽ dùng chân 3.3V trên NodeMCU ESP8266 để cấp vào. Khi đó sẽ có 2 trường hợp: 
    • Trường hợp 1: Khi chân IN được cấp vào mức cao, tức 3.3V thì Opto sẽ không kích
    • Trường hợp 2: Khi chân IN được cấp vào mức thấp, tức 0V thì đèn led bên trong opto phát sáng làm thông 2 cực của photo diot, mở cho dòng điện chạy qua

Khi đó tín hiệu của VĐK chỉ có vai trò là đóng ngắt Opto, Opto sẽ đóng ngắt transistor , sau đó Transistor sẽ đóng ngắt relay. Như vậy thì sẽ đảm bảo an toàn hơn cho Vi điều khiển vì hồ quang điện xảy ra do quá trình đóng ngắt tiếp điểm relay sẽ không ảnh hưởng tới MCU và nguồn relay đã được cách li quang…

2. Node-Red MQTT 

Node-red hiện tại mình vẫn chưa thực hiện AutoStart cùng với OS. Vì bài này cũng khá dài rồi nên mình sẽ nói trong bài tiếp theo. Các bạn bật Terminal lên và bật Node-Red

node-red

Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 - Bài 1 Bật tắt đèn LED

Chúng ta sẽ truy cập vào trang giao diện của Node-Red thông qua IP Address của RasPi.

Đầu tiên mình sẽ kéo vào một mqtt indebug để debug chương trình
Sau đó bạn sẽ cấp nguồn cho module ESP8266. Nếu kết quả trả về trong “debug” nhận được là “Reconnect” thì ESP8266 đã kết nối thành công với Server và topic “Maker_relay” đã giao tiếp được”
Bây giờ chúng ta sẽ thêm switch theo thứ tự sau:
+ Switch_1
   –  On payload -> number -> 0  ->  ON
   –  Off payload -> number -> 1  ->  OFF

Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 2: Bật tắt đèn 220V với module Relay

+ Switch_2,Switch_3,Switch_4 làm tương tự, bạn chỉ cần thay đổi tên và thông số On/Off payload.Chúng ta có thể copy và chỉnh sửa lại cho nhanh.
   – Switch_2: ON -> 2 , OFF -> 3
   – Switch_3: ON -> 4 , OFF -> 5
   – Switch_4: ON -> 6 , OFF -> 7
Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 2: Bật tắt đèn 220V với module RelayBây giờ chúng ta sẽ kéo ra “mqtt out”  với topic là “Maker_relay” để gửi giá trị của payload. Sau đó các bạn ấn vào Deploy để hoàn tất

Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 2: Bật tắt đèn 220V với module Relay

Các bạn truy cập vào “IPAddress:1880/ui” từ trình duyện web, hoặc bạn cũng có thể dùng điện thoại để truy cập vào giao diện điều khiển:
Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 2: Bật tắt đèn 220V với module Relay

Vậy về cơ bản là đã xong , nếu mọi thứ OK thì khi bạn nhấn Switch thì trạng thái đèn trên relay sẽ thay đổi Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 2: Bật tắt đèn 220V với module Relay

Bây giờ chúng ta sẽ đóng ngắt thực tế một bóng đèn 220V, Các bạn sẽ đấu nối như sau:
Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 2: Bật tắt đèn 220V với module RelayVề cơ bản các bạn sẽ đấu nối như một công tắc đèn bình thường tương ứng với hai đầu công tắc là COM và NO. 

Sau khi đã kết nối dây xong chúng ta sẽ cắm điện vào và chạy thử. Các bạn lưu ý nên đóng những thiết bị công suất < 40W để đảm bảo an toàn cho Relay , hạn chế đóng ngắt các tải cảm ví dụ động cơ….

Node-Red MQTT với Raspberry Pi và WiFi Kit ESP8266 – Bài 2: Bật tắt đèn 220V với module Relay

Tổng Kết

Vậy trong bài này chúng ta đã:
+ Tìm hiểu về module Relay và cách sử dụng
+ Phương pháp cách ly quang với Opto PC817
+ Điều khiển bóng đèn 220, xây dựng 4 Switch

Vậy là trong bài này mình đã hướng dẫn đấu nối thực tế một bóng đèn 220V thông qua dashboard trên điện thoại. Trong bài viết tới chúng ta sẽ đọc cảm biến môi trường và gửi dữ liệu lên dashboard theo dạng gauge và chart

Chúc các bạn thành công với dự án của mình !

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments

Most Popular

Hướng dẫn sử dụng Mạch đóng ngắt tải không tiếp xúc chế tạo Thiết bị vệ sinh tự động

Từ ngày 03/08/2020 mạch chuyển sang phiên bản mới tuy nhiên kích thước, vị trí linh kiện và chức năng của mạch giống và...

Lưu trữ nhật ký dữ liệu Online với ESP32 và Google Spreadsheets

Giới Thiệu Chào các bạn, trong các dự án IoT nhỏ gọn thì việc lưu trữ  và kiểm soát dữ liệu trên đám mây cũng...

Đọc Cảm Biến DHT11/DHT21/DHT22 không bị DELAY chương trình

Giới Thiệu Chào các bạn, hôm nay mình giới thiệu và hướng dẫn cách đọc cảm biến các dòng DHT11/DHT21/DHT22 ở bài này mình sử...

Gỡ lỗi ESP8266/ESP32 với thư viện ArduinoTrace

Giới Thiệu Chào các bạn, thông thường khi các bạn debug chương trình các bạn thường sử dùng hàm Serial.print() tuy nhiên, hôm nay mình sẽ...

Recent Comments

0
Would love your thoughts, please comment.x
()
x