Датчик температуры-влажности SHT20 RS485

В файле /var/log/messages

tail -f /var/log/messages

будет выводить в консоль по мере появления новых.

Вот лог:

    Sep  9 13:25:37 wirenboard-ASW77GNT user.notice serial: Write: 17 04 00 02 00 01 92 fc
Sep  9 13:25:37 wirenboard-ASW77GNT user.notice serial: ReadFrame: 17 04 02 01 2E 71 7F
Sep  9 13:25:37 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 1 of device modbus:21
Sep  9 13:25:37 wirenboard-ASW77GNT user.notice serial: Write: 15 04 00 01 00 01 63 1e
Sep  9 13:25:37 wirenboard-ASW77GNT user.notice serial: ReadFrame: 15 04 02 01 14 88 AC
Sep  9 13:25:37 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 2 of device modbus:21
Sep  9 13:25:37 wirenboard-ASW77GNT user.notice serial: Write: 15 04 00 02 00 01 93 1e
Sep  9 13:25:38 wirenboard-ASW77GNT user.notice serial: ReadFrame: 15 04 02 01 2C 89 7E
Sep  9 13:25:38 wirenboard-ASW77GNT user.notice serial: Init: Reg_5_0: setup register <modbus:185:<unspec>: 5> <-- 0
Sep  9 13:25:38 wirenboard-ASW77GNT user.notice serial: modbus: write 1 <unspec>(s) @ 5 of device modbus:185
Sep  9 13:25:38 wirenboard-ASW77GNT user.notice serial: Write: b9 06 00 05 00 00 82 b3
Sep  9 13:25:38 wirenboard-ASW77GNT user.notice serial: WARNING: device 'modbus:185' register '<modbus:185:<unspec>: 5>' setup failed: Serial protocol error: failed to write <unspec> @ 5: Serial protocol error: request timed out
Sep  9 13:25:38 wirenboard-ASW77GNT user.notice serial: modbus: read 1 holding(s) @ 8 of device modbus:157
Sep  9 13:25:38 wirenboard-ASW77GNT user.notice serial: Write: 9d 03 00 08 00 01 18 54
Sep  9 13:25:39 wirenboard-ASW77GNT user.notice serial: ModbusRTU::ReadRegisterRange(): failed to read 1 holding(s) @ 8 of device modbus:157: Serial protocol error: request timed out
Sep  9 13:25:39 wirenboard-ASW77GNT user.notice serial: device modbus:185 disconnected
Sep  9 13:25:39 wirenboard-ASW77GNT user.notice serial: device modbus:157 disconnected
Sep  9 13:25:39 wirenboard-ASW77GNT user.notice serial: Init: Reg_5_0: setup register <modbus:185:<unspec>: 5> <-- 0
Sep  9 13:25:39 wirenboard-ASW77GNT user.notice serial: modbus: write 1 <unspec>(s) @ 5 of device modbus:185
Sep  9 13:25:39 wirenboard-ASW77GNT user.notice serial: Write: b9 06 00 05 00 00 82 b3
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: WARNING: device 'modbus:185' register '<modbus:185:<unspec>: 5>' setup failed: Serial protocol error: failed to write <unspec> @ 5: Serial protocol error: request timed out
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 1 of device modbus:22
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: Write: 16 04 00 01 00 01 63 2d
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: ReadFrame: 16 04 02 01 15 0D 6C
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 2 of device modbus:22
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: Write: 16 04 00 02 00 01 93 2d
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: ReadFrame: 16 04 02 01 2D 0C BE
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: new val for <modbus:22:input: 2>: 12d
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: register value change: <modbus:22:input: 2> <- 30.1
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: channel humid device id: sens_temp_humid_22 -- topic: /devices/sens_temp_humid_22/controls/humid <-- 30.1
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 1 of device modbus:23
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: Write: 17 04 00 01 00 01 62 fc
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: ModbusRTU::ReadRegisterRange(): failed to read 1 input(s) @ 1 of device modbus:23: Serial protocol error: request timed out
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 2 of device modbus:23
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: Write: 17 04 00 02 00 01 92 fc
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: ReadFrame: 17 04 02 01 2E 71 7F
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 1 of device modbus:21
Sep  9 13:25:40 wirenboard-ASW77GNT user.notice serial: Write: 15 04 00 01 00 01 63 1e
Sep  9 13:25:41 wirenboard-ASW77GNT user.notice serial: ModbusRTU::ReadRegisterRange(): failed to read 1 input(s) @ 1 of device modbus:21: Serial protocol error: request timed out
Sep  9 13:25:41 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 2 of device modbus:21
Sep  9 13:25:41 wirenboard-ASW77GNT user.notice serial: Write: 15 04 00 02 00 01 93 1e

На ошибки вида “modbus:185:: 5” не смотрите, это релюшки временно отключены.

Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 1 of device modbus:23
Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: Write: 17 04 00 01 00 01 62 fc
Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: ReadFrame: 17 04 02 01 13 B0 AE
Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 2 of device modbus:23
Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: Write: 17 04 00 02 00 01 92 fc
Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: ReadFrame: 17 04 02 01 2C F0 BE
Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: new val for <modbus:23:input: 2>: 12c
Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: register value change: <modbus:23:input: 2> <- 30
Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: channel humid device id: sens_temp_humid_23 -- topic: /devices/sens_temp_humid_23/controls/humid <-- 30
Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 1 of device modbus:22
Sep  9 13:28:43 wirenboard-ASW77GNT user.notice serial: Write: 16 04 00 01 00 01 63 2d
Sep  9 13:28:44 wirenboard-ASW77GNT user.notice serial: ReadFrame: 16 04 02 01 15 0D 6C
Sep  9 13:28:44 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 2 of device modbus:22
Sep  9 13:28:44 wirenboard-ASW77GNT user.notice serial: Write: 16 04 00 02 00 01 93 2d
Sep  9 13:28:44 wirenboard-ASW77GNT user.notice serial: ReadFrame: 16 04 02 01 2C CD 7E
Sep  9 13:28:44 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 1 of device modbus:21
Sep  9 13:28:44 wirenboard-ASW77GNT user.notice serial: Write: 15 04 00 01 00 01 63 1e
Sep  9 13:28:44 wirenboard-ASW77GNT user.notice serial: ModbusRTU::ReadRegisterRange(): failed to read 1 input(s) @ 1 of device modbus:21: Serial protocol error: request timed out
Sep  9 13:28:44 wirenboard-ASW77GNT user.notice serial: modbus: read 1 input(s) @ 2 of device modbus:21
Sep  9 13:28:44 wirenboard-ASW77GNT user.notice serial: Write: 15 04 00 02 00 01 93 1e
Sep  9 13:28:44 wirenboard-ASW77GNT user.notice serial: ReadFrame: 15 04 02 01 2C 89 7E

И нормально, что сообщения опроса сыпятся часто? Я поставил desired poll interval = 10000, по идее раз в 10 сек должен быть опрос? А опрос, судя по логам, идет гораздо чаще.

Не вижу удачных обращений к одному и тому же устройству чаще чем раз в 10000 мсек.
Ну и насчет таймаутов - у меня тоже такое было. Победить окончательно не получилось.
Можно, конечно, взять анализатор, написать тест, который:
Отправляет посылку на датчик, при этом инициирует запись с анализатора, подключенного:

  • к выходу конвертора 485 (max485 стоит, ЕМНИП)
  • к i2c линии между МК и датчиком.

В случае получения тестом удачного ответа - данные анализатора не сохранять. Если таймаут - то сохранять. Ну и выяснить в итоге что бага в прошивке МК. Исходников которой нет.
Можно потратить пару дней на изучение спецификаций МК, настроить среду, написать/использовать готовую библиотеку modbus-slave. Отладить прошивку, пройтись по граблям и добиться приемлемой работы. На выходе получим WB-MS.

Если нравится познавать что-то новое - то мешать не буду. На вопросы по работе контроллера - с удовольствием отвечу.
PS не забудьте отключить отладку.

можно ещё с параметром guard_interval_us поиграть - это как раз доп. задержка для глючных девайсов

Спасибо. Но так низко не хочу “опускаться”, конечно ))
Отладку отключил. Если ее оставить, я так понимаю, может потом весь диск забиться логами?

А где задавать этот параметр?

Да. ну и физически отключенные устройства - лучше тоже исключать из опроса (снимать “enable”) - зачем постоянные ошибки.

В /etc/wb-mqtt-serial.conf, подробно описано в https://github.com/wirenboard/wb-mqtt-serial

2 сообщения было перенесено в новую тему: Китайские DS18B20 через WB-M1W2

Попробовал с guard_interval_us, стало получше, но ошибки есть все равно. И самое странное – подключаю датчик к китайскому usb-rs485, запускаю циклический опрос на 100мс в проге Termite и ни одной ошибки не вижу, скорость та же 9600. А в контроллере даже при 1000мс часто бывают, при 5000 бывает неск штук за сутки. Может несовместимость какая? Когда вместо верной температуры 19гр, показывает неверную, то ответ принимается контроллером, значит crc верная.

И еще попутно вопрос: если отключать/подключать датчики rs485 и 1wire не отключая питания контроллера – можно так? Т.е. с контроллера проводка идет на клеммные колодки и на лету я туда подключаю датчики. Питание от +5В контроллера. А то почему-то 1wire датчики перестали контроллером определяться, пробовал подключать и к 1 и ко 2 входу. Питание 5в точно рабочее, т.к. rs485 работают.

В общем нежелательно. И если rs485 еще более терпим к подобному - то нежные 1wire могут не перенести.
Кстати, выход 5Vout (и Vout тоже) можно же программно отключить https://wirenboard.com/wiki/Wiren_Board_6

Несколько за сутки - на том же проводе, и при тех же условиях?

Понял, буду выключать программно. Забыл про этот функционал. А то контроллеру тоже, наверное, не полезно выкл/вкл кнопкой. А программно выключить не всегда возможно.

Я точно не считал еще. Но даже когда было подключено к вб короткими проводами на тестовом стенде это было, часто моргало красным в devices при частом опросе (выше переписка), решил тут проверить с адаптером usb – не увидел такого. На чистоту эксперимента не претендую, но погонял несколько минут датчик с адаптером – все значения ровные. Питание адаптера от usb, питание датчика от адаптера +5В. На контроллере датчик тоже подключен к +5В адаптеру, на тестовой сборке датчик был подключен к БП +24В – картина была одинаковая.

Добрый день!
Я настроил
Desired poll interval (ms) 1000
Delay before accessing the device (ms) 500

И у меня этот датчик перестал моргать красным, исчезли ошибки опроса.

Не знаю, как с выбросами температуры, нужно будет ещё посмотреть.

Мне так не помогло ((
Все равно датчики возвращает периодически -3276.8, что по темп, что по влажности.
У вас один датчик? У меня 3 таких висят на шине.
Интересно, можно как-то игнорировать кривые значения программно и возвращать предыдущее или вообще не посылать в mqtt?
Пока знаний хватило сделать так, но по факту не работает (видимо бесполезно менять newValue):

defineRule(“corr_sens_temp_21”, {
whenChanged: “sens_temp_humid_21/temp”,
then: function (newValue, devName, cellName) {
if (newValue < -50) {
log("sens temp 21 value = " + newValue);
newValue = 0;
}
}
});

Еще такой момент с этими датчиками: сначала они у меня висели на +5В от контроллера, врали на +2-3 градуса (в них есть регистр корректировки, но я не заморачивался пока). Повесил на +12В от отдельного БП, стали показывать точнее, в пределах +1гр. Хочу еще попробовать на +24В повесить, может точность еще возрастет :grinning:

У меня два датчика на напряжении 24 В. Я их тарировал по китайскому цифровому термометру. Оба одинаково от него врали: температура – на 4 градуса, влажность – на 10%. Прописал эти значения в корректирующие регистры и всё – теперь совпадают %)

Нашел раздел “History” в веб-интерфейсе, и понял, как построить график. Оказалось, что у меня тоже были выбросы, причём довольно частые -3276,8.

Сегодня поигрался с параметрами опроса, и, как ни странно, выбросы пропали. Вот таки параметры установил (всё остальное по умолчанию):
Desired poll interval (ms) 60000
Delay before accessing the device (ms) 500

Буду следить дальше.

Опрос раз в минуту? Долговато для меня. Хотелось бы почаще. понятно, что при таком редком опросе вероятность ошибки минимальна. Как-то бы игнорировать эти значения в mqtt. Сами по себе они мне не мешают, а вот график из-за них кривой получается и статистика сбивается.
А вот верить китайскому цифровому термометру тоже не надо )) Он сам может врать. Хотя я сам сейчас сравниваю с температурой оригинального 1-wire ds18b20.

Ну, я не вижу смысла делать опрос чаще, это ж температура в комнате, а не в атомном реакторе %)

Сделал ещё один эксперимент. Подключил датчик через китайский Serial<->USB converter на чипе ch341. Питание 12 В. Частота опроса — 2 раза в секунду по протоколу MODBUS. Получился вот такой график

plot

Видно, что по влажности присутствуют выбросы. Причём они не выбиваются за пределы измерения (от 0 до 100 %), а по температуре всё в порядке. С чем связано, не могу понять.

Также у этого датчика есть опрос просто через UART. Т.е. я пишу ему
$ echo READ > /dev/ttyUSB0
$ cat /dev/ttyUSB0
27.5 23.4
^^^^^^^
Что-то в таком духе…

Вопрос такой: может ли это повлиять или вызывать несогласованность работы через протокол MODBUS? Могут ли эти два варианта конфликтовать?

В результате добавил два фильтра: по диапазону измеряемых параметров и медианный по трем последовательным показаниям. Проблемы исчезли, но, насколько можно доверять таким датчикам, вопрос остаётся открытым.