Добавить в корзинуПозвонить
Найти в Дзене

Статья 12. Ультразвуковой датчик расстояния AJ-SR04M. Как подключить к Home Assistant и для чего использовать.

Ультразвуковые датчики расстояния используются в парктрониках, а значит хорошо изучены, работают при любой погоде и температуре, а значит идеально подойдут для определения уровня воды подумал я, но в процессе изучения, чтения документации и небольших тестов всплыли нюансы. В этой статье я расскажу, почему AJ-SR04M мне не подошёл для измерения уровня воды, но в теории должен отлично справляться с контролем сыпучих материалов — корма в автоматических кормушках и пеллет в котлах. Идея использовать водонепроницаемый ультразвуковой датчик для контроля уровня воды в бассейне казалась очевидной. Но практика показала одно значительное ограничение - широкий угол луча - луч 45-75°, т. е. близко к краю бассейна не установишь, в трубу не засунешь, эти ограничения сильно усложняют монтаж. Есть и проблемы менее значительные, но требующие дополнительного учета, доработок и изучения на практике (особенно если речь идет о дешевом китайском варианте, свою стоимость он отрабатывает на 1000%, но ждать ид
Оглавление

Введение.

Ультразвуковые датчики расстояния используются в парктрониках, а значит хорошо изучены, работают при любой погоде и температуре, а значит идеально подойдут для определения уровня воды подумал я, но в процессе изучения, чтения документации и небольших тестов всплыли нюансы. В этой статье я расскажу, почему 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 кОм (так и ищем в любом маркет плейсе). Такие резисторы в домашних условиях проще впаять термофеном, но у большинства его нет (у меня тоже нет), поэтому я впаял обычным паяльником, получилось на вид не очень, но работает:

-2

После впайки резистора, можно считать, что сборка завершена на 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

Шаги про пришивке описывались ранее, комментарий к коду постарался сделать максимально подробными в коде.

Для наглядности как работает фильтр прикладываю графики с данными:

-3

Часть 5: Добавляем вспомогательные объекты для удоства работы с данными и алертов

Создаём переменную для расстояния от дна бассейна до датчика.

Настройки → Устройства и службы → Вспомогательное → Создать вспомогательный объект → Число

-4

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

Создаём шаблонный сенсор для глубины воды.

Мы знаем расстояние от датчика до воды и расстояние от дна до датчика, глубину бассейна вчисляем с помощью вспомогательное объекта с типом 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) }}

Сенсор и вспомогательный объект у вас могут называться по другому, подставьте свои.

-5

Создаём шаблонный сенсор для уведомлений о нештатных ситуациях.

На этот раз пригодится объект Пороговое значение:

-6

Пока глубина в заданных пределах сенсор принимает значение ON, в противном случае OFF. Удобно для настройки алертов.

Часть 5: Панель управления с настройкой

Нам необходимо вывести:

  • глубину бассейна;
  • высоту от дна до датчика для возможности редактирования с панели;
  • сенсор с пороговыми значениями.

Чтобы все данные отображались рядом и их не разносило на разные строки, создадим горизонтальный стек.

-7

Называем создаваемый блок и добавляем Сенсор:

-8

Выбираем из выпадающего списка необходимый нам сенсор с глубиной бассейна:

-9

Добавляем через плюсик объекты:

-10

Выбираем:

  • расстояние до воды;
  • от дна до датчика;
  • Глубина бассена пороги (сенсор выхода за пороговые значения);
  • включаем "Показывать цвет состояния".
-11

Для удобства в расстоянии от дна до датчика, добавляем доп информацию "Состояние" - заданное значение начнет отображаться на панели:

-12
-13

А в сенсоре с порогами добавляем "Последнее изменение" - на панели начнет отображаться, когда последний раз изменялся статус:

-14

Часть 6: Настраиваем уведомления telegram + email

Создаем автоматизацию на возвращение к норме.

В блоке Когда выбираем Объект - Состояние:

-15

Уведомления копируем из предыдущих автоматизаций. Текст уведомлений:

✅ *УСТРАНЕНА ПРОБЛЕМА*
*Устройство:*
• Имя: {{ 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
-16

Создаем автоматизацию на аварийное состояние.

Копируем предыдущую интеграцию, меняем условия срабатывания на переход из Включено в любое состояние, а в сообщение отправляем:

🚨 *ВОЗНИКЛА ПРОБЛЕМА* - {{ 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 устройствами с высокой нагрузкой.