Введение.
Ультразвуковые датчики расстояния используются в парктрониках, а значит хорошо изучены, работают при любой погоде и температуре, а значит идеально подойдут для определения уровня воды подумал я, но в процессе изучения, чтения документации и небольших тестов всплыли нюансы. В этой статье я расскажу, почему AJ-SR04M мне не подошёл для измерения уровня воды, но в теории должен отлично справляться с контролем сыпучих материалов — корма в автоматических кормушках и пеллет в котлах.
Часть 1: Почему AJ-SR04M не подошёл для воды?
Идея использовать водонепроницаемый ультразвуковой датчик для контроля уровня воды в бассейне казалась очевидной. Но практика показала одно значительное ограничение - широкий угол луча - луч 45-75°, т. е. близко к краю бассейна не установишь, в трубу не засунешь, эти ограничения сильно усложняют монтаж.
Есть и проблемы менее значительные, но требующие дополнительного учета, доработок и изучения на практике (особенно если речь идет о дешевом китайском варианте, свою стоимость он отрабатывает на 1000%, но ждать идеальной точности не стоит):
- мертвая зона - датчик необходимо устанавливать не ближе 30 сантиметров;
- переотраженный сигнал на большом расстоянии - это мое предположении, на расстоянии больше 1,5 м, данные не стабильны. Но может быть у меня руки тряслись, может быть нужно было в стену направить, а не делать препятствия (хотел понял угол луча и как будут вести себя данные, чтобы оценить на сколько далеко от края бассейна устанавливать), а может быть не смотря на заявленную максимальную дальность в 5 метров, на больших расстояниях уже имеет место переотраженный сигнал;
- конденсат и влага могут влиять на результат - сам датчик защищен по протоколу ip68 и на машинах работает в большинстве случаев даже в дождь, но теория говорит о том, что ультразвук отражается при переходе между средами разной плотности, т. е. датчик висящий над бассейном может запотеть и начать отсылать некорректные данные;
- данные с погрешностью - заявленная погрешность +/- 1 сантиметр, мой вариант требует корректировки в +2 сантиметра, т. е. показывает 38 сантиметров при реальных 40, но стабильно, решить можно фильтром, но при ряби на воде эти манипуляции не требуются, значения все равно изменяются на теже 1-2 сантиметра.
Часть 2: Где можно использовать?
Время потрачено, устройство собрано, если первоначальная идея с контролем уровня воды выглядит не самой удачной, значит надо подумать, где еще можно использовать. В голову пришли две идеи, где еще важно знать уровень - бункер с пелетами для котла и корм в кормушках.
Что необходимо учесть:
- бункеры обычно имеют форму усеченной пирамиды, т. е. чем меньше осталось, тем быстрее начнет убывать;
- обычно пыли не очень много и на работу влиять не должно, но конкретно в вашем случае - это может быть и не так;
- вибрации - шнек в котле и двигатель в кормушке могут при работе влиять на данные, если видите периодические резкие скачки в данных, добавьте виброразвящку (резиновое кольцо), должно решить проблему, и/или добавить время на срабатывание алерта (указать в for несколько минут);
- температура - если котел стоит в отдельном помещении и в нем жарко (больше +40), то показания тоже могут приходить с искажениями.
Часть 3: Собираем датчик
Для сборки нам понадобятся:
- AJ-SR04M - 500 р.
- Wemos D1 Mini (или любая другая плата на ESP8266) - 300 р.
- Резистор - 10 р.
- Провода - 10 р.
- Блок питания и провод - 500 р.
Итого: 1300 р. Но как и всегда - блок питания и провод от него до платы вероятно есть у вас или можно взять у кого-то из окружения, они самые стандартные, блок - 5В, 1-2А и провод USB-microUSB/USB type C в зависимости от вашей версии платы.
Резистор нужен SMD на 120 кОм (так и ищем в любом маркет плейсе). Такие резисторы в домашних условиях проще впаять термофеном, но у большинства его нет (у меня тоже нет), поэтому я впаял обычным паяльником, получилось на вид не очень, но работает:
После впайки резистора, можно считать, что сборка завершена на 90%, осталось только соединить проводами (на плате датчика с другой стороны от транзистора выходы подписаны):
- 5v датчика - 5v на плате;
- GND - GND;
- RX на датчике - TX на плате;
- TX на датчике - RX на плате.
RX и ТХ входной и выходной сигналы. Выходной сигнал с датчика должен приходить на входной на плате ESP, поэтому подключается RX - TX, TX - RX.
Часть 4: Прошиваем ESP
Код выложен в гит - https://github.com/RuVinSS/iFarm/blob/main/ultrasonic-distance-sensor.yaml
Шаги про пришивке описывались ранее, комментарий к коду постарался сделать максимально подробными в коде.
Для наглядности как работает фильтр прикладываю графики с данными:
Часть 5: Добавляем вспомогательные объекты для удоства работы с данными и алертов
Создаём переменную для расстояния от дна бассейна до датчика.
Настройки → Устройства и службы → Вспомогательное → Создать вспомогательный объект → Число
Не забудьте сразу установить значение, по умолчанию объект создается с минимальным значением.
Создаём шаблонный сенсор для глубины воды.
Мы знаем расстояние от датчика до воды и расстояние от дна до датчика, глубину бассейна вчисляем с помощью вспомогательное объекта с типом template - Сенсор.
Состояние:
{% set distance = states('sensor.ultrazvukovoi_datchik_rasstoianiia_rasstoianie_do_vody') | float %}
{% set tank_height = states('input_number.ot_dna_do_datchika') | float %}
{{ (tank_height - distance) | round(1) }}
Сенсор и вспомогательный объект у вас могут называться по другому, подставьте свои.
Создаём шаблонный сенсор для уведомлений о нештатных ситуациях.
На этот раз пригодится объект Пороговое значение:
Пока глубина в заданных пределах сенсор принимает значение ON, в противном случае OFF. Удобно для настройки алертов.
Часть 5: Панель управления с настройкой
Нам необходимо вывести:
- глубину бассейна;
- высоту от дна до датчика для возможности редактирования с панели;
- сенсор с пороговыми значениями.
Чтобы все данные отображались рядом и их не разносило на разные строки, создадим горизонтальный стек.
Называем создаваемый блок и добавляем Сенсор:
Выбираем из выпадающего списка необходимый нам сенсор с глубиной бассейна:
Добавляем через плюсик объекты:
Выбираем:
- расстояние до воды;
- от дна до датчика;
- Глубина бассена пороги (сенсор выхода за пороговые значения);
- включаем "Показывать цвет состояния".
Для удобства в расстоянии от дна до датчика, добавляем доп информацию "Состояние" - заданное значение начнет отображаться на панели:
А в сенсоре с порогами добавляем "Последнее изменение" - на панели начнет отображаться, когда последний раз изменялся статус:
Часть 6: Настраиваем уведомления telegram + email
Создаем автоматизацию на возвращение к норме.
В блоке Когда выбираем Объект - Состояние:
Уведомления копируем из предыдущих автоматизаций. Текст уведомлений:
✅ *УСТРАНЕНА ПРОБЛЕМА*
*Устройство:*
• Имя: {{ state_attr('sensor.glubina_basseina', 'friendly_name') }}
• Статус: {{ '✅ Онлайн' if is_state('binary_sensor.ultrazvukovoi_datchik_rasstoianiia_status_ustroistva', 'on') else '❌ Офлайн' }}
• Глубина: {{ states('sensor.glubina_basseina') + ' м' }}
Тема для письма:
✅ *УСТРАНЕНА ПРОБЛЕМА* - {{ state_attr('sensor.glubina_basseina', 'friendly_name') }}
В одном из камментариев мне подсказали, что можно добавить одну строчку и тогда при ошибке на шаге он завершится, но сама автоматизация продолжится. Это упрощает расстановку шагов - нет необходимости с начала отправлять письмо, а потом пытаться отправить сообщение в telegram.
continue_on_error: true
Создаем автоматизацию на аварийное состояние.
Копируем предыдущую интеграцию, меняем условия срабатывания на переход из Включено в любое состояние, а в сообщение отправляем:
🚨 *ВОЗНИКЛА ПРОБЛЕМА* - {{ state_attr('sensor.glubina_basseina', 'friendly_name') }}
*Устройство:*
• Имя: {{ state_attr('sensor.glubina_basseina', 'friendly_name') }}
• Статус: {{ '✅ Онлайн' if is_state('binary_sensor.ultrazvukovoi_datchik_rasstoianiia_status_ustroistva', 'on') else '❌ Офлайн' }}
• Глубина: {{ states('sensor.glubina_basseina') + ' м' }}
Для темы письма указываем:
🚨 *ВОЗНИКЛА ПРОБЛЕМА* - {{ state_attr('sensor.glubina_basseina', 'friendly_name') }}
Проблема с автоматизацией на аварийное состояние.
Тестировал различный отказ и настойки и обнаружил проблему - если ESP жива, а сам датчик данные не отправляет, то последние известные данные по расстоянию до воды остаются актуальными. В результате на изменение порогов уведомление придет, если само устройство отвалится от умного дома уведомление придет, а вот если отвалится только датчик, то об этом узнать можно будет только вручную, например, посмотрев на график глубины в бассейне, не должен он быть ровной прямой. Как только найду решение, обязательно дополню статью.
Итог.
Мы подробно разобрали ультразвуковой датчик AJ-SR04M — от его ограничений до практического применения на рыбной ферме и не только. Кроме этого подключили к умной ферме, добавили необходимые для мониторинга данные на дашборд, вынесли настройки из кода устройства в умный дом, настроили необходимые уведомления. Изучили новые возможности - выбор медианного значения, таймаут на отправку данных в HA, продолжение автоматизации при ошибке на одном из шагов, изучили новые объекты для добавления на дашборд.
Анонс.
Планы остаются прежними в одной из следующих статьей разобраться в бэкапировании как минимум на гугл диск, а также изучить подключение магнитного контактора, реле и кнопки для изучения управления через Home Assistant устройствами с высокой нагрузкой.