Перейти к содержимому

Датчик температуры и влажности RS-WS-N01-2D-LCD

Добрый день, уважаемые читатели! Нет, это не секретный шифр и не случайный набор символов. Это всего-лишь обозначение влагозащищенного датчика температуры и влажности для шины 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 В

Нижний предел напряжения питания. Ниже – гаснет дисплей, но данные по шине идут до ~3В

  • Диапазон измерения температуры: -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 регистра:

Таблица регистров Modbus

Первые два регистра отвечают за выдачу оперативных данных о текущих температуре и влажности. Другие два – отвечают за настройку адреса устройства и скорости передачи данных.

Как видите, отсутствуют регистры, отвечающих за корректировку измеренных значений температуры и влажности, но эти параметры в приборе есть. Что это? Ошибка документации или лень было регистры программировать и они реально отсутствуют?

 


Настройка прибора с помощью встроенной клавиатуры

Для данного сенсора совсем не обязательно настраивать адрес и скорость с помощью компьютера. Гораздо проще сделать это прямо на приборе. Для этого нажмите кнопку ОК, перед вами появятся три ноля – это приглашение для ввода пароля.

По умолчанию пароль – 888. Набираем пароль с помощью стрелок и кратковременного нажатия кнопки OK. По окончании ввода нажмите ОК но уже дольше 1 секунды.

На экране появится экран выбора адреса:

Можно поставить адрес от 1 до 125

Принцип изменения тот же – стрелками изменяем адрес, длительное нажатие ОК – записывает его в память и осуществляет переход к следующему параметру. Я сразу же ставлю адрес отличный от 1 на случай, если в системе будет датчик или исполнительное устройство, у которого по каким-либо причинам не удастся изменить адрес

Следующий параметр – скорость шины:

Здесь доступны 2400 или 4800 или 9600 бод

Следующий параметр – корректировка температуры:

Как видите – такой параметр все-таки существует. А регистра для него якобы не предусмотрено. Я думаю, что это все-таки ошибка документации, китайцы часто относятся к ней очень небрежно.

Далее идет корректировка влажности:

Ну и последний параметр – пароль доступа к настройкам:

Пароль служит защитой от всяких чересчур любопытных и шаловливых ручек, которые так и норовят понажимать на интересные кнопочки.


Подключение к 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-канале!

💠 Полный архив статей вы найдете здесь


Пожалуйста, оцените статью:
[ 5 из 5, всего 1 оценок ]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *