Bỏ qua để đến Nội dung

Điều khiển nhiệt độ bằng giao thức Modbus


Để đ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


Đăng nhập để viết bình luận