XY-MD01 SHT20 thermal and humidity sensor. RS485. Modbus RTU.

Для тестирования работы модуля Modbus TCP в Azure IoT Edge проще использовать простой датчик температуры и влажности поддерживающий протокол Modbus RTU.

Когда покупаешь железо на Aliexpress нередко натыкаешься на продавцов, которые ничего не смыслят в том, что продают. Соотвественно, описание убогое и надо понимать, что немало времени уйдет на разбирательство.

C сайта продавца имеем такую информацию:

  1. Возможный производитель — Aideepen. Сайт не нашел.
  2. Плата промаркирована как XY-MD01.
  3. В качестве сенсора температуры и влажности используется прецизионный чип SHT20.
  4. Рабочее напряжение: DC4-30 v (highest do not exceed 33 v).
  5. Потребляемая мощность: 0.2 W.
  6. Рабочие характеристики:
    1. Temperature  20 ℃ — 60 ℃,
    2. Humidity  0-100.
  7. Точность изменений:
    1. Temperature±0.3℃,
    2. Humidity  ±3%RH.
  8. Интерфейс подключения — RS485. Baud rate: 9600 (the user can set), 8 bits, one stop, no check.
  9. Протокол для работы Modbus RTU.

Modbus protocol

Для подключения датчика по Modbus нужен Slave ID и адреса регистров с описанием.

Указанный на сайте: «Device address: 1-247 can be set, the default is 1». Соотвественно, Slave ID = 1, по умолчанию. Уже хорошо, не нужно перебирать.

Modbus Function Code:

  • 0x03: Read «keep register»
  • 0x04: Read «input register»
  • 0x06: Write a single «keep register»
  • 0x10: Write more keep registers

Этих данных недостаточно для подключения. Банально, не понятно как менять Slave ID, скорости, с какого смещения считывать показания температуры и влажности и если они двубайтные, каков порядок разбора последовательности. Продавец предоставляет абсолютно левую документацию, не относящуюся к устройству, но цена радует.

Поискав по Alaexpress аналогичные датчики, нахожу отдельно продаваемую плату, по неадекватно высокой цене, но с более подробным описанием, уже достаточным для подбора параметров.

Offset Description

Number of bytes

Input register

0x0001

temperature scale

2

0x0002

Humidity value

2

Hold register

0x0101

device address

(1~247)

2

0x0102

Baud rate

0:9600

1:14400

2:19200

2

0x0103

Temperature correction(/10)

-10.0~10.0

2

0x0104

Humidity correction value(/10)

-10.0~10.0

2

Тестирование

Для работы потребуется переходник USB <-> RS 485 и блок питания. Я использовал БП на 6 Вольт. Соединяем клеммы питания и передачи данных.

В качестве ПО для опроса ModBus RTU устройства мне понравился бесплатный QModMaster. В настройках ПО Options -> Modbus RTU устаналиваем параметры соединения. Порт, на который установился конвертер, легко найти в Control Panel -> System -> Devices -> COM ports. Нажимаем Commands -> Connect.

Устанавливаем:

  • Modbus Mode -> RTU.
  • Slave address -> 1.
  • Function code -> Read Input Registers (0x04).
  • StartAddress -> 1 Hex.
  • Number of registers -> 1 (один регистр — 2 байта)
  • Data format -> Dec

Открываем View -> Bus Monitor.

Нажимаем Commands -> Read/Write.

Получаем значение 259 и в Bus Monitor:

Поскольку температура 259 — довольно высокая, есть гипотеза, что значение регистра нужно делить на 10. Т.е. это 25,9 оС, что примерно соответствует комнатной температуре. Чтобы проверить гипотезу нужно нагреть сенсор до некоторой эталонной температуры.

Под рукой ничего подходящего не оказалось, поэтому пометил датчик в подмышку, чтобы измерить свою температуру. Сначала температура доползла до 36,6 (366), а потом перевалила и дошла до 37,5 оС. Я напрягся и пошел измерять температуру ртутным градусником. Он показал 36,6 оС.

После остывания термодатчика он показал 26,2 при том, что спиртовые конатные собратья показывают температуру от 21 до 23 оС. В общем, либо такая низкая точность, либо нужно откалибровать датчик введя поправочные коэффициенты в соотвествующие hold register.

Если перейти в режим Commands -> Scan, то устройство будет опрашиваться с периодичностью установленной в параметре Scan Rate (ms).

Смена Slave ID (device address)

Чтобы прочитать SlaveID достаточно

SlaveID Function code Starting address Hi Starting address Lo Count Hi Count Lo
0x01 0x03 0x01 0x01 0x00 0x01

Чтобы изменить SlaveID нужно использовать 0х06 функцию. В примере смена SlaveID на адрес 0х02.

SlaveID Function code Starting address Hi Starting address Lo Count Hi Count Lo
0x01 0x06 0x01 0x01 0x00 0x02

В примере у меня SlaveID уже был изменен ранее на 0х02. В случае, если адрес ранее не менялся Unit ID = 0х01. Рекомендую сразу наклеить на устройство стикер с новым Unit ID. Если забыть адрес — единственный способ определить — простой перебор по всем адресам с вычитыванием значения регистра.

Upd. Продавец с Aliexpress прислал подробную документацию по термодатчику (pdf и doc варианты):

Temperature and humidity transmitter SHT20 sensor Modbus RS485

Temperature and humidity transmitter SHT20 sensor Modbus RS485

Spread the love
Запись опубликована в рубрике IT опыт, IT рецепты, IT решения для бизнеса с метками , . Добавьте в закладки постоянную ссылку.