Добрый день, уважаемые читатели! Нет, это не секретный шифр и не случайный набор символов. Это всего-лишь обозначение влагозащищенного датчика температуры и влажности для шины RS485 Modbus RTU, о котором и пойдет речь в данной статье.
Основная электроника датчика надежно упакована во влагозащищенный корпус ( IP65 ) с уплотнителями для кабелей. Это позволяет использовать его в запыленных и (или) влажных помещениях – например в цеху, складе, подвале и т.д. Лично у меня он будет работать в теплице.
Чувствительным элементом в данном датчике является SHT30 производства Sensirion. Сенсор в данном экземпляре прибора вынесен на некоторое расстояние от корпуса, однако можно приобрести модификацию, в которой сенсор будет смонтирован непосредственно на корпусе.
В моем экземпляре имеется встроенный LCD-дисплей, на котором отображаются измеренные значения, что позволяет оперативно контролировать их без необходимости обращения к микроконтроллеру. Дисплей достаточно крупный и четкий, я не выявил недостатков или мерцания. Подсветки нет, но и без неё данные считываются без проблем. Кроме собственно температуры и влажности, на дисплее отображается адрес прибора на шине.
Монтаж прибора осуществляется на стандартную DIN-рейку, причем в комплекте имеется своя собственная DIN-рейка, полностью адаптированная под размеры и цвет корпуса.
Но можно использовать и стандартную.
Почему именно RS485?
SHT30 гораздо чаще встречаются в виде модулей для подключения к Arduino, ESP и другим микроконтроллерам по шине IIC ( I2C ). Здесь же используется промежуточный контроллер, который реализует аппаратную шину I2C внутри прибора, в для подключения к основному микроконтроллеру используется уже другая шина – RS485 Modbus. Для чего такие сложности?
- Во первых, и это самое важное, шина RS485 позволяет не заботиться о длине проводов и напряжении питания – она будет работать на расстояниях до 1км и в широком диапазоне питающих напряжений. И не удивительно – ведь это промышленная шина, предназначенная для больших помещений и цехов.
- Во вторых, шина RS485 позволяет программно изменять адреса устройств на шине, что дает возможность одновременного подключения множества однотипных устройств.
- Ну а в третьих – это уже готовое промышленное устройство в защищенном корпусе, да еще и со своим собственным дисплеем для оперативного визуального снятия показаний.
Но за все нужно платить…
- Во первых такой прибор стоит существенно дороже аналогичного сенсора в виде микромодуля для Arduino. Ну разумеется – за корпус, дисплей и дополнительные электронные компоненты придется заплатить.
- Во вторых – мы имеем меньший шаг измерения (SHT30 имеет шаг измерения 0.01℃) и теряем доступ ко встроенному нагревателю, который можно было бы использовать для “просушки” сенсора во влажной среде.
Характеристики
- Напряжение питания: заявлено 10~30 В, однако датчик прекрасно работает от 5 В
- Диапазон измерения температуры: -40℃ ~ +80℃
- Диапазон измерения влажности: 0%RH ~ 100%RH
- Шаг измерения: 0.1℃, 0.1%RH
- Точность: ±0.4℃ (25℃), ± 2% RH (при 25℃ и 60%RH)
- Размеры:
Внутренний мир
Внутри коробочки расположена небольшая плата, на котором расположен клеммник для подключения к шине RS485:
Шлейфом подключен дисплей, который расположен на лицевой стенке корпуса.
Клеммник удобный, с подпружиненными контактами, и поэтому нет необходимости использовать отвертку или другой инструмент для подключения. Я использовал самую обычную “витую пару”.
Ещё одним несомненным достоинством данного устройства является то, что он показывает данные температуры и влажности максимально точно (насколько позволяет разрешение), без склонности к саморазогреву и завышению температуры (увы, но многие китайские же аналоги сенсоров температуры и влажности для шины RS485 имеют склонность у “уплыванию” показаний со временем).
Параметры шины
По умолчанию датчик настроен на скорость передачи данных 4800 бод, но поддерживается еще 2400 и 9600 бод.
Так как у меня в системе имеется датчик, который не может работать со скоростью ниже 9600, мне пришлось перенастроить данный приборчик на 9600 бод, благо это очень не сложно.
Регистры
Прибор имеет всего 4 регистра:
Первые два регистра отвечают за выдачу оперативных данных о текущих температуре и влажности. Другие два – отвечают за настройку адреса устройства и скорости передачи данных.
Как видите, отсутствуют регистры, отвечающих за корректировку измеренных значений температуры и влажности, но эти параметры в приборе есть. Что это? Ошибка документации или лень было регистры программировать и они реально отсутствуют?
Настройка прибора с помощью встроенной клавиатуры
Для данного сенсора совсем не обязательно настраивать адрес и скорость с помощью компьютера. Гораздо проще сделать это прямо на приборе. Для этого нажмите кнопку ОК, перед вами появятся три ноля – это приглашение для ввода пароля.
По умолчанию пароль – 888. Набираем пароль с помощью стрелок и кратковременного нажатия кнопки OK. По окончании ввода нажмите ОК но уже дольше 1 секунды.
На экране появится экран выбора адреса:
Принцип изменения тот же – стрелками изменяем адрес, длительное нажатие ОК – записывает его в память и осуществляет переход к следующему параметру. Я сразу же ставлю адрес отличный от 1 на случай, если в системе будет датчик или исполнительное устройство, у которого по каким-либо причинам не удастся изменить адрес
Следующий параметр – скорость шины:
Следующий параметр – корректировка температуры:
Как видите – такой параметр все-таки существует. А регистра для него якобы не предусмотрено. Я думаю, что это все-таки ошибка документации, китайцы часто относятся к ней очень небрежно.
Далее идет корректировка влажности:
Ну и последний параметр – пароль доступа к настройкам:
Пароль служит защитой от всяких чересчур любопытных и шаловливых ручек, которые так и норовят понажимать на интересные кнопочки.
Подключение к ESP32 или Arduino
Для подключения к микроконтроллеру потребуется недорогая платка преобразователя интерфейса, например такая:
К ESP32 я подключал её к 16 и 17 GPIO, но это не принципиально, можно выбрать и другие свободные выводы:
Чтение данных с использованием ESP-IDF
Поскольку многие TH-датчики для шины RS485 имеют одни и те же регистры для температуры и влажности, я написал очень простую универсальную библиотечку для снятия с них показаний: reSensors/reTH485 at master · kotyara12/reSensors
Как с ней работать?
- добавляем необходимые библиотеки в проект: #include “mbcontroller.h” и #include “reTH485.h”
- инициализируем modbus и rs485
// RS485 Modbus RTU #define SENSOR_MODBUS_PORT 1 #define SENSOR_MODBUS_SPEED 9600 #define SENSOR_MODBUS_PIN_RXD CONFIG_GPIO_RS485_RX #define SENSOR_MODBUS_PIN_TXD CONFIG_GPIO_RS485_TX #define SENSOR_MODBUS_PIN_RTS -1 #define SENSOR_MODBUS_PIN_CTS -1 static void* _modbus = nullptr; void sensorsInitModbus() { rlog_i(logTAG, "Modbus initialization"); // Инициализация RS485 и Modbus RE_OK_CHECK_EVENT(mbc_master_init(MB_PORT_SERIAL_MASTER, &_modbus), return); // Configure Modbus mb_communication_info_t comm; memset(&comm, 0, sizeof(comm)); comm.mode = MB_MODE_RTU; comm.port = SENSOR_MODBUS_PORT; comm.baudrate = SENSOR_MODBUS_SPEED; comm.parity = UART_PARITY_DISABLE; RE_OK_CHECK_EVENT(mbc_master_setup((void*)&comm), return); // Set UART pins RE_OK_CHECK_EVENT(uart_set_pin(SENSOR_MODBUS_PORT, SENSOR_MODBUS_PIN_TXD, SENSOR_MODBUS_PIN_RXD, SENSOR_MODBUS_PIN_RTS, SENSOR_MODBUS_PIN_CTS), return); // Start Modbus RE_OK_CHECK_EVENT(mbc_master_start(), return); // Set UART mode RE_OK_CHECK_EVENT(uart_set_mode(SENSOR_MODBUS_PORT, UART_MODE_RS485_HALF_DUPLEX), return); }
- читаем нужные регистры (сразу оба) с помощью mbc_master_send_request() и делим полученное значение на 10:
/** * Read humidity and temperature data * */ sensor_status_t reTH485::readRawData() { int16_t _data[2] = {0}; mb_param_request_t _request = { .slave_addr = _address, .command = _command, .reg_start = _reg_humd < _reg_temp ? _reg_humd : _reg_temp, .reg_size = 2 }; // Read registers esp_err_t err = mbc_master_send_request(&_request, (void*)&_data[0]); // Check exit code if (err != ESP_OK) { rlog_e(logTAG, RSENSOR_LOG_MSG_READ_DATA_FAILED, _name, err, esp_err_to_name(err)); return convertEspError(err); }; // Store values in sensors if (_reg_humd < _reg_temp) { return setRawValues((float)_data[0]/10.0, (float)_data[1]/10.0); } else { return setRawValues((float)_data[1]/10.0, (float)_data[0]/10.0); }; };
То есть для получения данных достаточно всего одной команды: mbc_master_send_request(), а остальное лишь подготовка и анализ кода ответа
На этом пока всё, до следующих встреч на сайте и на dzen-канале!
💠 Полный архив статей вы найдете здесь
Пожалуйста, оцените статью: