Страница 1 из 1

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 13:31}
tarakanov
Всем привет.
Датчик измеряет температуру в аквариуме. Если выводить показания напрямую, то температура прыгает в пределах 0,5-0,7 градуса случайным образом (что вроде бы соответствует характеристикам). Вывод усреднённого значения вроде бы улучшил ситуацию. А вот пользовательский блок для вычисления медианы дал практически идеальный результат: значение вообще не прыгает. Но есть проблема: время от времени выводится ошибочное значение, которое ровно на 0,5 градуса меньше истинного. В принципе ерунда, но в будущем это будет обратная связь для термостата, поэтому хочется разобраться в чём дело.
Датчик герметичный в металлической гильзе, с АлиЭкспресса. Кабель наращен, общая длина около 2м, используется резистор на 4,7 кОм. Периодичность опроса 3 сек, других устройств на шине нет. Встроенный и пользовательский блоки датчика дают одинаковый результат.
Да, ещё оказалось что показания на 1,5 градуса ниже реальных (проверил ртутным лабораторным термометром).

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 14:22}
Alias
А если так усреднить? Можно массив и покрупнее задать.

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 15:55}
tarakanov
Alias писал(а):
30.07.2018{, 14:22}
А если так усреднить? Можно массив и покрупнее задать.
Так это обычное среднеарифметическое. Всё равно есть "дрожание" значения, просто разброс меньше. А вот проверку CRC и ERROR добавлю.
Меня смущает, что "глючные" значения всегда строго на 0,5 меньше реальных.

Отправлено спустя 2 часа 26 минут 42 секунды:
Добавил проверку, не помогло. Добавил условие: если новое значение меньше текущего на 0.4, оно не учитывается. Вот такие костыли :smile44:

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 19:55}
Alias
Я бы ушел от таких тяжелых типов переменных. Вот Вам мечта перфекциониста:
Каждый такт - в данном случае ежесекундно - считываем показания с датчика и, если нет ошибки, заносим в стек, сравнивая разницу между двумя соседними по времени измерениями и, если разница между ними не больше двух десятых, заносим новое показание датчика в переменную.
Имхо.
Не забудьте - значения в переменной 10х, то есть с десятыми, но без "запятой" :smile44:

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 20:44}
tarakanov
Сдаётся мне, такая конструкция работать не будет. Нефильтрованные показания прыгают в бОльшем диапазоне, чем 0,4 градуса. Если такое случайное значение выпрыгнет за диапазон, а потом температура продолжит меняться в том же направлении, то показания просто "зависнут". Во-вторых как быть при включении (свет мигнул)? Ну и в третьих на экране будет хаотичное дрожание в разрешённом диапазоне.

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 21:06}
Alias
Она не может меняться бесконечно и пропуски в несколько секунд для аквариума категорически не фатальны. Данные будут доступны для системы после того, как значения устаканятся, что нам и нужно, ведь, очевидно, что температура воды не может меняться быстро.
Свет мигнул? Получили 85С и отсеяли, максимум несколько секунд - и показания в тренде.
Дрожание? У меня куча датчиков, не сталкивался с таким поведением. Но, опять же, соберите стек для среднего и забудьте, что там дрожало.
Можно вообще не выводить десятые на экран, пусть автоматика отслеживает запятые, но наблюдателю что зачем цветомузыка? Да и термостат, даже если и будет пытаться ловить эти десятые, на поведение системы никак не повлияет, тк теплоемкость и масса воды - колоссальная интегрирующая цепь.
Впрочем, проект Ваш и я все, что мог прокомментировать исходя из скупости описания проекта, прокомментировал.

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 21:53}
nalnik
У DS18B20 разрядность 0,06 градуса.
Так и работайте с сотыми (выводите на экран) - заметите разницу. Прыгать будит только на 0,06.
А уставку ставьте к примеру в 0,1 градуса и дельту в 0,1.
У меня так управление двухконтурным котлом на отопление дома работает, но я еще добавил - реле не может переключатся чаще одного раза за три секунды.
Зимой температура не превышает уставку на +- 0,3 градуса.

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 22:24}
dizzyy
И у меня по такому датчику прыгает 0.05-0.06{немогу понять розрядность)

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 22:29}
nalnik
dizzyy
Это потому что округление через одно место работает, поэтому при десятых прыгает по 0,5 градуса.

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 23:03}
tarakanov
Свет мигнул? Получили 85С и отсеяли, максимум несколько секунд - и показания в тренде.
Пожалуй что да, зависания будут только в случае очень быстрого изменения температуры, что для 150л аквариума вряд ли возможно.
Alias писал(а):
30.07.2018{, 21:06}
Дрожание? У меня куча датчиков, не сталкивался с таким поведением.
Вот это странно, может с моим датчиком что-то не то? Мало того, что показания прыгают, так ещё и статическая ошибка в 1,5 градуса
nalnik писал(а):
30.07.2018{, 22:29}
Это потому что округление через одно место работает, поэтому при десятых прыгает по 0,5 градуса.
Я правильно понял, что если вывести на экран не 26,8 а 26,81 то колебания уменьшатся?

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 23:33}
Alias
Не думаю, что датчик изменит показания, если на него будут в мелкоспоп смотреть :) Слышал, что есть разные версии DS18, какие-то грубые, иные - с тонкой душевной организацией, но и их тоже можно как-то заставить работать грубо. Но так и не понял, как это задать. Ни в одном пользовательском блоке нет такого параметра, чтобы управлять разрядностью датчика. Или не нашел. У Вас не с паразитным питанием, кстати?
Если честно, то аквариум не тот случай, чтобы гнаться за долями. У меня сейчас вообще вода за 26,7, и ничего, только кормить не забывай :) Рыбы ничего не знают о научных изысканиях ихтиологов и живут в тех условиях, которые им предоставлены, остальное - от лукавого. Про морской не скажу.

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 23:37}
tarakanov
Alias писал(а):
30.07.2018{, 23:33}
Если честно, то аквариум не тот случай, чтобы гнаться за долями.
Схема из первого сообщения работает практически идеально, за исключением небольшого глюка. Но этот глюк настолько странный, что прям не даёт мне покоя :yes: :smile14:

Фильтрация значений датчика DS18B20

Добавлено: 30.07.2018{, 23:54}
Alias
Ну, это другой разговор ))) Странностей хватает на каждом шагу. Я, когда макетирую отдельные элементы своих проектов, часто с этим сталкиваюсь, и можно было бы костылями подпереть, но душа не лежит и начинаешь копать глубже. Вижу в этом только перспективы - как решения проблемы, так и углубление знаний и расширение кругозора.
Что же по датчику, то я бы попробовал другой. Нет, не сразу в воду, а на стенде посмотреть, как кто себя ведет и какие пользовательские блоки что показывают. И оставить ту погрешность, что есть, ведь если Вы промерите температуру воды в разных точках объема, то озадачитесь совсем другими вопросами )))