Найти тему
Дача DIY

"Киберскважина". Часть 4: Тестирование датчиков давления

Оглавление

"Киберскважина" - серия статей о разработке DIY контроллера управления скважинным насосом и мониторинга состояния оборудования кессона с доступом по WiFi на базе микроконтроллера ESP32 под управлением умного дома Home Assistant. Файлы проекта доступны на GitHub.

Выбор датчиков давления

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

Датчики XDB305 я приобрёл на AliExpress:

При заказе нужно обратить внимание на диапазон измеряемых давлений датчика. На странице товара их представлено 19 вариантов. Я выбрал вариант с диапазоном 0-0.5 Mpa, что соответствует 0-5 барам. Стабильное рабочее давление дачного водопровода у меня планируется 2.5 бара (что будет обеспечиваться редуктором давления), а давление в гидроаккумуляторе будет плавать между 2.5 и 3.2 бара. Это пока оценочные значения, по факту я их буду корректировать с целью наиболее оптимальной частоты включения насоса при максимальном давлении воды в водопроводе.

Скважинный насос в моём случае - это Belamos TF3-60, длина водоподъёмной трубы 25.6 метра. Соответственно, максимальное расчётное давление, которое способен создать этот насос (60 - 25.6 = 34.4) / 10 = 3.4 бара. Но верхнюю отсечку задавать на этом максимуме нельзя, так как чем ближе к максимуму, тем меньше скорость повышения давления, и нет смысла долго гонять насос ради пары лишних десятых бара, поэтому верхний порог будет не более 3.2 бара.

Также при заказе датчиков давления можно выбрать различные варианты питания и интерфейса: токовый выход 4-20 мА, выход по напряжению 0.5-4.5 В, 0-5 В, или 0-10 В, а также цифровой выход I2C. Была мысль заказать датчики с I2C, но решил, что это довольно специфичный вариант, и замену неисправного датчика будет подобрать сложнее. Поэтому выбрал самый распространённый стандартный вариант с токовым выходом 4-20 мА.

Макет для тестирования датчиков давления

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

Придумал использовать для этих целей автомобильный компрессор и расширительный бачок, который специально для тестов я приобрёл в магазине. Взял самое дешёвое и маленькое, что нашлось - на 2 литра за 800 рублей:

-2

И ещё немного водопроводных шелобушек, чтобы подключить датчик на 1/4" к гидроаккумулятору на 1/2". Получилось так:

-3

При первой же накачке воздухом этого гидроаккумулятора оказалось, что с его водопроводного конца давления нет, а я на него рассчитывал. Думал, что груша внутри не создаст проблемы без воды, какая разница есть вода или нет, давление воздуха должно было быть одинаковым с обоих концов резервуара.

Но груша внутри смялась и просто закупорила водопроводный выход. Что ж, я был готов к этому, да и бачок этот в хозяйстве мне не пригодится, поэтому ради дела я решил его варварски испортить и просверлил дырку в груше прямо через водопроводный вход. Это помогло и всё заработало как надо.

Собрал макет и начал с ним экспериментировать:

-4

Результаты тестирования - схема включения и код конфигурации

В Home Assistant сделал тестовую страницу с графиками давления после различных программных фильтров, чтобы оценить степень шумности сигнала:

-5

Голубой график - это необработанные данные. Все схемотехнические методы, которые я смог придумать и применить, позволили существенно снизить этот шум, изначально он был раз в пять выше. Удалось добиться амплитуды шума в пределах 0.05 бара, что вполне достаточно для требуемой точности измерений в 0.1 бара.

Как я уже упоминал во второй части этой серии статей, снизить шум АЦП микроконтроллера ESP32 удалось с помощью трёх шагов:

  • Настроить пины АЦП на работу с максимальным ослаблением входного сигнала - 11 dB, при котором диапазон измеряемых напряжений составляет от 0-2.45 В. Это делается через файл конфигурации в ESPHome.
  • Установить последовательные резисторы 10 кОм на входах АЦП.
  • Установить фильтрующий электролитический конденсатор на 220 мкФ в цепь питания микроконтроллера.

Для питания датчики давления требуют не менее 12 В, а микроконтроллер питается от 3.3 В. поэтому пришлось применить два вторичных источника питания - AC-DC преобразователь на 12 В (HDR-30-12) и DC-DC преобразователь из 12 в 3.3 В (SCWN06A-03).

В цепь токовой петли необходимо установить токозадающий резистор, номинал которого в моей схеме составил 130 Ом. Он рассчитывается исходя из максимального тока датчика в 20 мА и максимального уровня напряжения на входе АЦП в 2.45 В: 2.45 В / 0.02 А = 122.5 Ом.

Таким образом, схема включения датчика давления получилась следующая:

-6

Конфигурация YAML в ESPHome для тестирования датчика давления получилась такая (файл можно взять тут):

-7

Перед пояснениями к данному коду стоит отметить особенности терминологии Home Assistant. Есть некоторая путаница относительно термина "датчик" (sensor). Оно имеет два смысла и означает две различные сущности. Первый - привычный нам физический датчик, некое устройство, прибор, который что-то измеряет и выдаёт данные по какому-то физическому интерфейсу. Второй - программный датчик. Это некая абстракция, кусок программного кода, функция. Эта функция получает на вход какие-то данные, обрабатывает их по заданному алгоритму, и выдаёт результат в качестве выходных данных далее в программу.

И какой именно смысл термина "датчик" имеется ввиду сейчас понять можно только по контексту. Я буду говорить "физический" и "программный" датчик, хотя в сообществе Home Assistant не принято как-то выделять эти смыслы при обсуждении, там все шибко умные, и так всем всё понятно. Но лично я долго пытался вникнуть в эту путаницу и понять о чём они говорят.

Пояснения к коду конфигурации YAML датчиков

Первый блок (platform adc) - это непосредственно вход АЦП, программный датчик с именем press_pump_raw, выдающий цифровое значение, соответствующее аналоговому уровню напряжения на пине, полученному от физического датчика. Для этого программного датчика настроено ослабление входного сигнала 11 dB (attenuation: 11db), а для входных данных задано два программных фильтра.

Первый - усреднение в скользящем окне (sliding_window_moving_average). Выдаёт среднее значение за последние 25 измерений с интервалом в 5 измерений. Интервал измерений задан 200 мс (update_interval: 200ms), 25 измерений - это 5 секунд, среднее выдаётся каждые пять измерений, то есть каждую секунду. Это порождает небольшую задержку результата измерений относительно изменения входных данных. Но для данной задачи это не критично.

Второй - линейная калибровка данных (calibrate_linear). Значения от 0 до 500 соответствуют минимальному току датчика давления 4 мА и нулевому давлению воды. От 500 до 3000 - рабочий диапазон. Это место в коде конфигурации - предмет настройки в реальных условиях. Калибровку буду уточнять по месту, ориентируясь на стрелочные манометры в обвязке скважины, других опорных измерителей давления у меня нет.

Второй и третий блоки в коде (platform: template) - это шаблонные программные датчики (тоже терминология Home Assistant). То есть программные датчики, которые получают входные значения от других программных датчиков, каким-то образом обрабатывают их и выдают на выход, который можно использовать далее в коде или отобразить в интерфейсе.

Здесь программный датчик с именем press_pump_precise ещё раз усредняет данные от исходного программного датчика press_pump_raw в окне из пяти измерений, а также фильтрует "дребезг" значений, отбрасывая те из них, которые отличаются от предыдущего менее чем на 0.009 бара (delta: 0.009). Значения этого датчика я пока не знаю как буду использовать и буду ли использовать вообще, это пока просто тест.

Программный датчик с именем press_pump выдаёт окончательные данные давления. Он также получает входные данные с первого датчика press_pump_raw, но из дополнительных фильтров у него только игнорирование значений, которые отличаются от предыдущего менее чем на 0.05 бара.

На графиках отображаются значения всех трёх программных датчиков:

-8

Голубой - это исходный программный датчик press_pump_raw.
Синяя ступенька поверх голубого - это датчик press_pump_precise.
А результирующий датчик press_pump - это прямая линия над другими графиками на уровне 3.7, самые стабильные во времени данные.

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

К сожалению, я не сделал скрина с динамикой изменения давления в момент накачки гидроаккумулятора воздухом. Есть только кусочек экрана, случайно попавший в кадр:

-9

По этому графику можно понять, что данные результирующего датчика press_pump отстают от исходного press_pump_raw всего на 2-3 секунды. Данные исходного датчика press_pump_raw отстают от реального изменения давления на 5 секунд. Итого суммарная задержка результата измерений составила около 8 секунд. Мне кажется, что это вполне приемлемая задержка для выполнения задачи управления скважинным насосом.

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