Điều khiển 4 Thiết bị qua HMI TJC
Hướng dẫn tích hợp toàn diện màn hình HMI TJC (USART) 2.4 inch với Arduino để điều khiển hệ thống Relay thông qua giao tiếp Serial UART.
Phần cứng
- Arduino Uno/Nano
- HMI TJC (2.4 inch)
- Module 4 Relay
Logic Điều khiển
Giao tiếp 1 chiều đơn giản: HMI gửi ký tự lệnh -> Arduino nhận và đóng ngắt Relay tương ứng.
Kết nối Phần cứng
| HMI TJC | Arduino | Chức năng |
|---|---|---|
| VCC (5V) | 5V | Nguồn (+5V) |
| GND | GND | Nối đất (0V) |
| TX | D10 (RX) | Gửi dữ liệu |
| RX | D11 (TX) | Nhận phản hồi |
| Module Relay 4 Kênh | Arduino | Chức năng |
|---|---|---|
| VCC | 5V | Nguồn cấp cho module Relay |
| GND | GND | Mass chung hệ thống |
| IN1 | D2 | Điều khiển Thiết bị 1 |
| IN2 | D3 | Điều khiển Thiết bị 2 |
| IN3 | D4 | Điều khiển Thiết bị 3 |
| IN4 | D5 | Điều khiển Thiết bị 4 |
Cảnh báo nguồn điện
Tuyệt đối không cắm ngược dây 5V và GND. HMI sẽ hỏng ngay lập tức nếu cấp sai cực tính.
Lập trình HMI (USART HMI)
Thiết lập dự án
Tạo New Project trong phần mềm. và đặt tên cho dự án.
- Chọn đúng Model màn hình
- Hướng màn hình: Ngang (0)
- Đặt biến hệ thống bauds=9600 trong program.s
Hãy chọn program.s và đặt bauds = 9600. Điều này đảm bảo HMI và Arduino giao tiếp cùng tốc độ.
Tạo giao diện điều khiển
Kéo 4 nút nhấn (Button) từ thanh công cụ ra màn hình thiết kế.
Tại bảng thuộc tính (Attribute) bên phải:
- objname: Đặt lần lượt b0, b1, b2, b3
- txt: Sửa thành "OFF"
Viết lệnh (Event Code)
Chọn từng nút nhấn, tìm tab Touch Press Event ở góc dưới màn hình. Copy đoạn code logic tương ứng vào đó.
Code này xử lý việc đổi màu nút, đổi chữ ON/OFF và gửi ký tự (A, a...) xuống Arduino.
if(b0.txt=="OFF")
{
b0.txt="ON"
b0.bco=7433 // Xanh lá
b0.pco=65535 // Chữ trắng
print "A" // Gửi lệnh Bật
}else
{
b0.txt="OFF"
b0.bco=29612 // Xám
b0.pco=65535
print "a" // Gửi lệnh Tắt
}
if(b1.txt=="OFF")
{
b1.txt="ON"
b1.bco=7433
b1.pco=65535
print "B"
}else
{
b1.txt="OFF"
b1.bco=29612
b1.pco=65535
print "b"
}
if(b2.txt=="OFF")
{
b2.txt="ON"
b2.bco=7433
b2.pco=65535
print "C"
}else
{
b2.txt="OFF"
b2.bco=29612
b2.pco=65535
print "c"
}
if(b3.txt=="OFF")
{
b3.txt="ON"
b3.bco=7433
b3.pco=65535
print "D"
}else
{
b3.txt="OFF"
b3.bco=29612
b3.pco=65535
print "d"
}
Tải File Project Mẫu
File nguồn (.HMI) đã được thiết kế giao diện và lập trình sẵn code ở trên. Bạn có thể tải về, mở bằng phần mềm USART HMI và nạp ngay.
Tải Phần Mềm Cần Thiết
Tải phần mềm lập trình HMI và driver USB-TTL trước khi nạp code. Bạn chỉ cần thay URL ở các nút bên phải.
Hướng dẫn Nạp Code (USB-TTL)
- Kết nối dây: Nối 4 dây theo sơ đồ. Chú ý nối chéo TX - RX.
- USB 5V → HMI VCC
- USB GND → HMI GND
- USB TX → HMI RX
- USB RX → HMI TX
- Cắm vào máy tính: Máy tính sẽ nhận cổng COM.
- Mở file project: Trong phần mềm HMI, vào File > Open và chọn file .HMI cần nạp.
- Nạp Code: Nhấn nút Download (biểu tượng mũi tên xanh) trên phần mềm HMI.
Nạp code cho màn HMI bằng thẻ nhớ (microSD)
Chuẩn bị thẻ nhớ
- Format thẻ nhớ microSD thành FAT32.
- Chép file .tft đã tải vào thẻ nhớ ( Tải tại đây).
- Lưu ý: chỉ để 1 file duy nhất, đặt ngoài thư mục (root của thẻ).
Gắn thẻ và bắt đầu nạp
- Tắt nguồn màn hình TJC.
- Gắn thẻ nhớ vào khe SD.
- Cấp nguồn lại, màn hình tự nhận file và hiển thị Updating....
Chờ hoàn tất
- Giữ nguồn ổn định, không rút thẻ trong lúc nạp.
- Khi báo Update Success hoặc Finished, tắt nguồn rồi rút thẻ nhớ.
Khởi động lại
- Bật nguồn lại, màn hình sẽ chạy giao diện mới vừa nạp.
Code Arduino
#include
// === CẤU HÌNH PIN ===
// RX_Pin (Arduino nhận) nối với HMI TX
// TX_Pin (Arduino gửi) nối với HMI RX
SoftwareSerial HmiSerial(10, 11); // RX = 10, TX = 11
// Định nghĩa chân điều khiển 4 Relay
const int RELAY_1 = 2;
const int RELAY_2 = 3;
const int RELAY_3 = 4;
const int RELAY_4 = 5;
void setup() {
// Serial Monitor để debug trên máy tính
Serial.begin(9600);
// Giao tiếp với HMI (Bắt buộc 9600 để khớp với HMI)
HmiSerial.begin(9600);
// Cấu hình Output cho Relay
pinMode(RELAY_1, OUTPUT);
pinMode(RELAY_2, OUTPUT);
pinMode(RELAY_3, OUTPUT);
pinMode(RELAY_4, OUTPUT);
// Trạng thái ban đầu: TẮT TOÀN BỘ (Mức HIGH cho Relay kích thấp)
digitalWrite(RELAY_1, HIGH);
digitalWrite(RELAY_2, HIGH);
digitalWrite(RELAY_3, HIGH);
digitalWrite(RELAY_4, HIGH);
Serial.println("System Ready. Waiting for HMI commands...");
}
void loop() {
// Kiểm tra có dữ liệu từ HMI gửi xuống không
if (HmiSerial.available()) {
String command = "";
char incomingByte;
// Đọc chuỗi dữ liệu cho đến khi hết buffer
while (HmiSerial.available()) {
incomingByte = HmiSerial.read();
// Loại bỏ ký tự rác hoặc ký tự kết thúc chuỗi mặc định của HMI (0xFF)
if (incomingByte != 0xFF && incomingByte >= 32) {
command += incomingByte;
}
delay(2); // Đợi một chút để buffer nhận đủ ký tự tiếp theo
}
// Nếu có lệnh hợp lệ
if (command.length() > 0) {
Serial.print("Lenh tu HMI: ");
Serial.println(command);
handleCommand(command);
}
}
}
// Hàm xử lý logic điều khiển
void handleCommand(String cmd) {
// --- THIẾT BỊ 1 ---
if (cmd == "A") {
digitalWrite(RELAY_1, LOW); // BẬT
Serial.println("-> TB 1: ON");
} else if (cmd == "a") {
digitalWrite(RELAY_1, HIGH); // TẮT
Serial.println("-> TB 1: OFF");
}
// --- THIẾT BỊ 2 ---
else if (cmd == "B") {
digitalWrite(RELAY_2, LOW);
Serial.println("-> TB 2: ON");
} else if (cmd == "b") {
digitalWrite(RELAY_2, HIGH);
Serial.println("-> TB 2: OFF");
}
// --- THIẾT BỊ 3 ---
else if (cmd == "C") {
digitalWrite(RELAY_3, LOW);
Serial.println("-> TB 3: ON");
} else if (cmd == "c") {
digitalWrite(RELAY_3, HIGH);
Serial.println("-> TB 3: OFF");
}
// --- THIẾT BỊ 4 ---
else if (cmd == "D") {
digitalWrite(RELAY_4, LOW);
Serial.println("-> TB 4: ON");
} else if (cmd == "d") {
digitalWrite(RELAY_4, HIGH);
Serial.println("-> TB 4: OFF");
}
}
