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

Не вижу удачных обращений к одному и тому же устройству чаще чем раз в 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? Могут ли эти два варианта конфликтовать?

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

А где добавили фильтры? У меня выбросы наоборот внизу идут по температуре, а по влажности и вверх и вниз.

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

Получается вот такой график:
image

А где фильтруете то? Прямо на wirenboard? Если да, то не поделитесь техническими подробностями как можно откинуть кривое значение, да и вообще любое, на уровне mqtt?
У меня контроллер используется как брокер, а вся автоматизация на homeassistant, который общается с контроллером через mqtt, поэтому в идеале на контроллере бы это все делать.

Нет, не на wirenboard.

Схема такая: на удаленном сервере запущен скрипт, который подписан на mqtt по сети (напрямую через OpenVPN, без брокера). Этот скрипт получает данные и записывает их в базу данных на сервере. В этот момент как раз и можно применить фильтр. Далее вы уже можете делать, что хотите с этими данными.

Таким датчикам доверия особо нет. Как мне кажется, лучший вариант – это его замена.