Để điều khiển nhiệt độ bằng giao thức Modbus sử dụng thư viện esphome-modbus-server trên ESPHome với ESP32, bạn cần thiết lập một hệ thống cho phép thiết bị hoạt động như một Modbus slave/server, nhận lệnh từ một Modbus master (ví dụ: PLC, Home Assistant, hoặc một ứng dụng tùy chỉnh) để điều khiển các thiết bị liên quan đến nhiệt độ (như quạt, máy sưởi, hoặc điều hòa).
Dưới đây là hướng dẫn chi tiết từng bước:
1. Tổng quan về hệ thống
Thư viện esphome-modbus-server:
Đây là một thành phần tùy chỉnh (external component) cho ESPHome, cho phép ESP32 hoạt động như một Modbus RTU slave/server qua giao tiếp UART. Nó hỗ trợ các thanh ghi (registers) để đọc/ghi dữ liệu, phù hợp để điều khiển nhiệt độ.
Điều khiển nhiệt độ: Bạn sẽ sử dụng các thanh ghi Modbus để lưu trữ và cập nhật giá trị nhiệt độ
(ví dụ: nhiệt độ mục tiêu, nhiệt độ hiện tại) và gửi lệnh điều khiển đến các thiết bị như relay, động cơ, hoặc quạt.
Yêu cầu phần cứng:Một board ESP32 (như ESP32 DevKit) hoặc HE PLC board.
Cảm biến nhiệt độ (ví dụ: DHT22, DS18B20).
Thiết bị điều khiển (như relay để bật/tắt máy sưởi hoặc quạt).
Module giao tiếp RS485 (như MAX485) để kết nối Modbus RTU.
Một Modbus master (như PLC, Raspberry Pi, hoặc Home Assistant với Modbus integration).
2. Cài đặt và cấu hình ESPHome
ESPHome là nền tảng để lập trình và quản lý ESP32.
Bạn cần cài đặt ESPHome và tích hợp thư viện esphome-modbus-server.
Bước 1: Cài đặt ESPHome
Cài đặt ESPHome trên máy tính hoặc sử dụng Home Assistant add-on.
Tạo một dự án mới cho ESP32:bash
esphome wizard your_device_name.yaml
Thay your_device_name bằng tên thiết bị của bạn (ví dụ: modbus-thermostat).
Bước 2: Thêm thư viện esphome-modbus-server
Trong tệp cấu hình YAML của ESPHome (your_device_name.yaml), thêm thành phần external_components để sử dụng thư viện từ GitHub:yaml
external_components:
- source: github://epiclabs-uc/esphome-modbus-server@master
refresh: 60s
Bước 3: Cấu hình UART và Modbus Server
Cấu hình UART để giao tiếp với module RS485 và thiết lập Modbus server:yaml
esphome:
name: modbus-thermostat
platform: ESP32
board: esp32dev
# Cấu hình UART
uart:
- id: intmodbus
tx_pin: 17 # GPIO cho TX
rx_pin: 16 # GPIO cho RX
baud_rate: 9600
stop_bits: 1
data_bits: 8
parity: NONE
debug:
direction: BOTH
# Cấu hình Modbus Server
modbus_server:
- id: modbuserver
uart_id: intmodbus
address: 1 # Địa chỉ slave (có thể thay đổi từ 1-247)
holding_registers:
- start_address: 40001 # Thanh ghi nhiệt độ mục tiêu
default: 2500 # Giá trị mặc định: 25.00°C (2500 = 25.00°C, nhân với 100 để lưu số thập phân)
number: 1 # Một thanh ghi
on_write: | # Lambda khi thanh ghi được ghi
ESP_LOGD("MODBUS", "Target temperature set to: %d", value);
id(target_temperature) = value / 100.0; # Chuyển đổi thành giá trị thực
- start_address: 40002 # Thanh ghi nhiệt độ hiện tại (chỉ đọc)
default: 0
number: 1
on_read: | # Lambda khi thanh ghi được đọc
int temp = id(current_temperature) * 100; # Chuyển đổi nhiệt độ hiện tại
ESP_LOGD("MODBUS", "Current temperature read: %d", temp);
return temp; # Trả về giá trị cho thanh ghi
# WiFi
wifi:
ssid: "YourSSID"
password: "YourPassword"
# Enable logging
logger:
level: DEBUG
# Enable Home Assistant API
api:
# OTA updates
ota:
Giải thích cấu hình:
UART: Định nghĩa các chân GPIO (TX/RX) để giao tiếp với module RS485.
Baud rate thường là 9600 cho Modbus RTU.
Modbus Server: Định nghĩa một slave với địa chỉ (address) là
1. Các thanh ghi (holding registers) được sử dụng:
40001: Lưu nhiệt độ mục tiêu (target temperature), có thể ghi từ Modbus master.
40002: Lưu nhiệt độ hiện tại (current temperature), chỉ đọc.
Lambda: Sử dụng để xử lý logic khi đọc/ghi thanh ghi.
Ở đây, giá trị nhiệt độ được nhân với 100 để lưu dưới dạng số nguyên
(ví dụ: 25.00°C = 2500).
Bước 4: Thêm cảm biến nhiệt độ
Kết nối cảm biến nhiệt độ (ví dụ: DHT22) và cấu hình trong ESPHome để đọc nhiệt độ hiện tại:yaml
sensor:
- platform: dht
pin: 18 # GPIO kết nối với DHT22
model: DHT22
temperature:
id: current_temperature
name: "Current Temperature"
on_value:
then:
- lambda: |-
ESP_LOGD("SENSOR", "Temperature updated: %.2f°C", x);
Lưu ý: Thay pin: 18 bằng GPIO bạn sử dụng cho cảm biến.
Bước 5: Điều khiển thiết bị (ví dụ: Relay)
Thêm logic để điều khiển thiết bị dựa trên nhiệt độ mục tiêu và nhiệt độ hiện tại.
Ví dụ, bật relay (kết nối với quạt/máy sưởi) khi nhiệt độ hiện tại vượt quá nhiệt độ mục tiêu:yaml
number:
- platform: template
id: target_temperature
name: "Target Temperature"
min_value: 15.0
max_value: 35.0
step: 0.1
optimistic: true
unit_of_measurement: "°C"
output:
- platform: gpio
pin: 19 # GPIO kết nối với relay
id: relay_output
switch:
- platform: output
id: relay_switch
name: "Heater Switch"
output: relay_output
# Logic điều khiển tự động
interval:
- interval: 10s
then:
- lambda: |-
float current_temp = id(current_temperature).state;
float target_temp = id(target_temperature).state;
if (current_temp > target_temp + 0.5) {
id(relay_switch).turn_on(); // Bật quạt nếu quá nóng
ESP_LOGD("CONTROL", "Turn on fan: Current=%.2f, Target=%.2f", current_temp, target_temp);
} else if (current_temp < target_temp - 0.5) {
id(relay_switch).turn_off(); // Tắt quạt nếu đủ mát
ESP_LOGD("CONTROL", "Turn off fan: Current=%.2f, Target=%.2f", current_temp, target_temp);
}
Giải thích:
number: Lưu trữ nhiệt độ mục tiêu, có thể được cập nhật qua Modbus hoặc Home Assistant.
output và switch: Điều khiển relay qua GPIO.
interval: Kiểm tra nhiệt độ mỗi 10 giây và điều khiển relay dựa trên so sánh nhiệt độ hiện tại với nhiệt độ mục tiêu.
3. Kết nối phần cứngESP32 với MAX485:
Kết nối TX (GPIO17) và RX (GPIO16) của ESP32 với DI và RO của module MAX485.
Kết nối DE và RE của MAX485 đến một GPIO.
Kết nối A và B của MAX485 đến bus RS485 của Modbus master.
Cảm biến nhiệt độ: Kết nối DHT22 vào GPIO18 (hoặc GPIO khác).
Relay: Kết nối relay vào GPIO19 để điều khiển thiết bị (quạt, máy sưởi, v.v.).
Nguồn điện: Đảm bảo cấp nguồn phù hợp (thường 3.3V hoặc 5V cho MAX485 và relay).
4. Kết nối với Modbus MasterHome Assistant:
Thêm integration Modbus trong Home Assistant.
Cấu hình để giao tiếp với ESP32 qua RS485 (sử dụng USB-to-RS485 adapter nếu cần).
Đọc/ghi thanh ghi:
40001: Ghi nhiệt độ mục tiêu (ví dụ: 2500 = 25.00°C).
40002: Đọc nhiệt độ hiện tại.
Ví dụ cấu hình trong configuration.yaml của Home Assistant:yaml
modbus:
- type: rtuovertcp
host: <IP của ESP32 nếu dùng Modbus TCP>
port: 502
sensors:
- name: Current Temperature
address: 40002
input_type: holding
unit_of_measurement: °C
scale: 0.01 # Chia cho 100 để lấy giá trị thực
numbers:
- name: Target Temperature
address: 40001
input_type: holding
scale: 0.01
PLC hoặc phần mềm Modbus:
Sử dụng phần mềm như Modbus Poll/Modbus Slave để kiểm tra.
Ghi giá trị vào thanh ghi 40001 để đặt nhiệt độ mục tiêu.
Đọc thanh ghi 40002 để lấy nhiệt độ hiện tại.
5. Biên dịch và nạp chương trình
Chạy lệnh để biên dịch và nạp firmware cho ESP32:
bash
esphome run your_device_name.yaml
Kết nối ESP32 qua USB hoặc OTA để nạp chương trình.
6. Kiểm tra và gỡ lỗi
Mở log trong ESPHome để kiểm tra:
bash
esphome logs your_device_name.yaml
Kiểm tra giá trị thanh ghi qua Modbus master.
Đảm bảo relay bật/tắt đúng theo logic nhiệt độ.
7. Lưu ý và mở rộng
Tùy chỉnh thanh ghi: Bạn có thể thêm nhiều thanh ghi để điều khiển các thiết bị khác (ví dụ: tốc độ quạt, trạng thái máy sưởi).
Modbus TCP: Nếu muốn dùng Modbus TCP thay vì RTU, cần thêm cấu hình mạng.
Tích hợp Home Assistant: Sử dụng Home Assistant để tạo giao diện người dùng hiển thị nhiệt độ và điều khiển nhiệt độ mục tiêu.
An toàn: Đảm bảo hệ thống điện an toàn khi sử dụng relay với thiết bị điện áp cao.
8. Ví dụ thực tế
Giả sử bạn muốn bật quạt khi nhiệt độ vượt quá 30°C:
Modbus master ghi 3000 vào thanh ghi 40001 (tương đương 30.00°C).
ESP32 đọc nhiệt độ từ DHT22 (giả sử 32°C), ghi vào 40002.
Logic trong interval phát hiện 32 > 30 + 0.5, bật relay để chạy quạt.
Tài liệu tham khảo
Thư viện: esphome-modbus-server
Tài liệu ESPHome Modbus: esphome.io
Hướng dẫn Modbus trong Home Assistant: Home Assistant Community