Реализация идеи беспроводного уровнемера

от автора

В процессе работы с установкой появилась задача сделать уровнемер в баки, т.к. периодически происходили случаи перелива, а когда 8-10 тонн воды оказываются в подвале, который когда-то был бассейном для испытания торпед, то вытянуть это все ведрами на третий этаж является очень непростым делом. Казалось бы ничего особенного в задаче нет, но появилось несколько сложностей.

Условия:

  • Объем баков: 2 по 8000 литров
  • Геопозиция баков: -2й этаж (8 метров под землей)
  • Перекрытия этажей: дерево
  • Необходимая точность определения уровня: ± 10 литров
  • Предупреждение о критических уровнях
  • Индикация на рабом месте

Аналоговый вариант

Вариант со щупами в крайних положениях отпадал сразу, из-за отсутствия информации о текущем уровне. Первой идеей была реализация на аналоговом принципе компаратора. Основа — LM3915N-1, которая используется, в основном, для логарифмических индикаторов в акустике. Схема — проще некуда.

Вывод уровня — точка или столбик на линейку светодиодов. На плате видно одно плечо делителя напряжения, которым устанавливался начальный уровень.

В качестве измерительного элемента была сделана цепочка резисторов длиной в полтора метра, она же являлась вторым плечом делителя на входе микрухи. Номиналы резисторов подбирались так, чтобы выходное напряжение варьировалось от 2 до 5 В, необходимых по даташиту для LM-ки. Цепочка погружена в трубку для визуального контроля вдоль бака. Связь со «щупом» — 15 метров двужильного провода.

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

Back to the old drawing board.

В качестве новой реализации я решил сделать девайс на контроллере. Arduino и аналоги не использую принципиально, интереснее все делать с нуля, хоть научиться можно чему-нибудь. С контроллерами я работаю немного, год-полтора максимум, поэтому в каждой разработке стараюсь учить что-то новое, это к тому, что тут можно было бы обойтись гораздо более дешевыми элементами (дисплей, связь), но менее интересными. Также не сильно пинайте за реализацию и код.

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

Составляющие:

Все это было врезано в слой теплоизоляции, которой обшиты баки, вот выпотрошенная обратная сторона блока который был врезан в обшивку бака:

Программу контроллера писал на С (CodeVision AVR), клиентскую часть на Delphi 7.
Суть работы заключается в следующем, контроллер по таймеру считает длительность эхо-импульсов от УЗ-датчика, пересчитывает в расстояние, потом в объем. Данные по блутусу передаются на компьютер, где идет графический вывод заполнения бака, расстояние до глади и глубина. Все это вычисляется в контроллере. С клиента в контроллер задаются максимальная и минимальная границы, при достижении которых загорается красный или зеленый светодиод на прилабуде, а в программе на компьютере выводится звук и мигает отображение бака в котором достигли границы. Также задается коэффициент объема [л/см] для того, чтобы можно было позиционировать датчик или вообще поставить его на бак с другой геометрией. Все параметры хранятся в EPPROM. Система имеет два канала, передаются данные с двух баков одновременно. На момент съемки один бак был спущен и я этот канал отключил, чтобы глаза не мусолил.

Изначально идея была передавать данные по проводам, но 15 метров провода было проблематично проложить мимо перекрытий. По воздуху расстояние получилось порядка 8 метров. Приемник стоит в компе, в спецшкафу около шахты, система управления установкой, которая питается от подопытных баков разнесенная, одно место оператора рядом с шахтой и трубопроводом, второе вынесено подальше. Сами датчики установлены в пластиковую трубу диаметром 100 мм внутри бака для того, чтобы при сливе воды в баки их не забрызгивало и уровень плавно изменялся, не было волн и ряби на поверхности, так, на всякий случай. Плюс этого еще и в том, что заузилась диаграмма направленности УЗ датчика. К сожалению, фото места установки нет, крышки баков уже закручены на 40 мелких болтов и весят немерено, сам не сдвину + там сейчас ремонт затеяли.

Вид дисплея в теплоизоляции (один канал):

Пленку забыл снять

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

Можно залить это все силиконом или компаундом, но у меня ничего не окислилось пока при влажности 60-70%, на сами УЗ-датчики китайцы пишут IP68, кто их знает может и правда, я все равно залил термоклеем по кругу.

Вот такая получилась система, работает исправно, возможно, кому-то пригодится, вполне применима на даче в колодце да и в других труднодоступных местах. Главное — идея.

В архив не жалея слил все что было, прошивка МК, файлы PROTEUS, сырцы на Delphi 7, скомпиленый экзешник, все библиотеки, короче, вся папка проекта. [пароль архива: idkfa]
AVR LevelMeter Graphic LCD 2ch BLUETOOTH.rar [2.6 Mb]

ссылка на оригинал статьи http://habrahabr.ru/post/156261/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *