No Image

Arduino датчик уровня воды

СОДЕРЖАНИЕ
207 просмотров
12 декабря 2019

Всем привет!
Наконец-то завершилась моя маленькая эпопея с изготовлением блока уровня и температуры воды в баке. Проведены испытания и теперь мне есть что Вам сказать на этот счет.

Сразу скажу, что проект довольно сырой и требует доработки в каких-то моментах. Но все упирается в мои возможности, знания и умения. Быть может, помощь сведущих мне поможет. Приветствую комментарии и замечания.

Пишу максимально подробно для тех, кто захотел бы как-то его повторить.

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

Пока у нас был бак в душевой в даче прямо над головой, это не было особой проблемой, т.к. можно было залезть в бак рукой и пощупать (бак прямоугольной формы, высотой всего в 20 см).

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

Соответственно, самым важным было понимать какой уровень воды сейчас в баке, ибо незнание этого грозит перегоранием ТЭНа и (или) переливом воды из бака.

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

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

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

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

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

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

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

Разница в устройстве с ардуиной и без нее заключалась в том, что некоторые задачи можно было бы решать уже известным мне способом — через программирование.

Ну а теперь про самое то.
Задачи придуманного мной устройства сводились к следующему:
1. Отслеживать уровень воды в баке и как-то сигнализировать об этом;
2. Отслеживать температуру воды в баке и сообщать об этом;
3. Программно отслеживать различные состояния воды и сообщать об этом.

По первой задаче.
Отслеживать воду я решил через усмотренный в интернете способ:

опускаем в бак на разный уровень воды по проводу (или чему-то электропроводящему) — "датчику";
также опускаем один общий контакт, на который подаем постоянно "+".

Как только вода замыкает "+" и провод определенного уровня, ардуина понимает, что вода достигла этого уровня. Всего мною было задумано уровней на 10, 25, 50, 75 и 100 % воды.

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

По второй задаче
Здесь все просто. Был куплен датчик температуры на Али. Для показа температуры также был куплен 4-х разрядный мониторчик. Соответственно ардуино снимает показания с датчика и выдает их на мониторчик постоянно.

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

Так, мною были придуманы такие алгоритмы, как отслеживание и сигнализация о том, что:
Вода нагревается и нагрелась до нужного уровня;
Вода набирается и набралась до 100%;
Вода закончилась.

Но работают они не очень хорошо. Крайний раз вообще пришлось их отключить до лучших времен 🙂 Но об этом ниже.

Делаем устройство.
Я закупил следующее (постарался вспомнить все, что покупал):
1. Собственно, ардуино нано;
2. Пассивный пьезоизлучатель;
3. Цифровой датчик температуры DS18B20;
4. Мониторчик;
5. Клеммники для провода на плату 2 штучки;
6. Пачку RGB светодиодов (понадобилось 5 штук);
7. Микро понижающий модуль питания;
8. Кнопка с фиксацией, встраиваемая в корпус;
9. Кабель витая пара до бака;
10. Телефонный кабель для питания устройства;
11. Блок питания 12v на дин рейку (Артикул: HDR-15-12);
12. Резисторы:
10кОм — 13 штук (подключил ножки светодиодов через них, а также "датчики уровня на землю");
4,7 кОм — 1 шт для датчика температуры;
220 Ом — 1 шт для желтого (сервисного) светодиода;

Читайте также:  Авито заточной станок для ленточных пил

13. Переменный резистор (крутилка) 10 кОм;
14. Всякое для подключения витой пары D-SUB:
Разъем на плату;
Разъемы и вилки на кабель 3 штуки (с другой стороны поставил такой разъем на корпус). Соответственно выбирал, чтобы сошлись "мамы" с "папами".
15. Всякое для обеспечения питания типа штекера на провод "L-KLS1-DCP-02-2.1A" и разъем для него на плату "DS-201, Гнездо питания 2,1х5,5на плату";
16. Корпус "G311C, Корпус для РЭА 115х90х55 мм" подбирался так, чтобы туда влезла печатная плата 75х100 мм (немного подпиленная).
17. 6 велосипедных спиц из нержавейки;
18. Небольшой корпус на бак, где сделана разводка кабелей на датчики;
19. Также использовал вот такой (где 3 провода) разъем на этом же корпусе для подключения датчика температуры.
20. Всякое разное не счесть. Типа стойки для платы, болтики, гаечки и т.д.

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

Принципиально схема такая.

Ставим на ДИН рейку в щито блок питания на 12v. В принципе, можно было бы решить задачу питания и просто через розетку + блок питания от какого-нибудь телефона. Здесь тогда даже не понадобился бы понижающий блок питания на плату, а ардуину можно было бы питать через USB разъем. Но мне проще было кинуть телефонный кабель, плюс, изначально я планировал ставить блок в моечную, куда лишние 220v вести не хотелось. Кроме того, те самые 12v я смогу использовать и для других проектов. Пока в задумке у меня что-то типа пожарной сигнализации на ардуине.

В блок приходит провод с 12v и заходит в микро блок, понижающий их до 7v. Между входом и микро блоком сделан разрыв кнопкой для возможности выключения с кнопочки.

Дальше 7v идут на ардуину.

От ардуины идет разводка соответственно на:
1. "Датчики" — спицы к D-SUB разъему. Все "датчики" подтянуты 10кОм резисторами к "-";
2. RGB светодиоды. Но первые 3 к "красным" и "зеленым" ножкам. Еще два только к зеленым (т.к. пинов не хватило). Все пины также через 10кОм резисторы;
3. Плюс и минус также к D-SUB разъему для датчиков. Также отдельный пин к D-SUB разъему для датчика температуры. К этому же пину также подтянут "+" через 4,7кОм резистор;
5. Пин, плюс и минус к пищалке;
6. Два пина, плюс и минус к экранчику;
7. Пин, плюс и минус к переменному резистору;
8. Пин (через 220Ом резистор) и минус к желтому светодиоду.

Непосредственно на баке, а точнее в его крышке:

На все это посажена коробочка с "ушками", которая фиксируется к крышке болтиками. Основные провода в нее заходят через D-SUB разъем. Затем разводятся на датчик температуры и датчики уровня воды. На датчик температуры провода выходят через другой отдельный разъем.

Сам датчик температуры врезан в бак примерно на высоте 30 % от дна. К датчику потребовалось еще докупить контргайку на 1/2 (в леруа), фторопластовую прокладку и фум-ленту. Дырку сверлил специальной коронкой на 20мм (если не ошибаюсь).

Пара слов о выборе коробки для основного блока.
Изначально планировал использовать любую рандомную коробку, в корпусе которой хотел вырезать дырки для светодиодов и экранчика. Но, зная откуда у меня растут руки, я был на 146% уверен, что дырки вырезал бы криво. Поэтому в процессе изготовления родилась идея использовать блок с прозрачной крышкой. Таким образом, мне не пришлось мудрить с вырезанием дырок. Разве что экранчик я поставил на "Ножки" — стойки для платы, чтобы был повыше.

Разное
Изначально хотел реализовать весь функционал RGB светодиодов. Думал, что если будут гореть одновременно зеленый и красный диоды, то на выходе получу желтый. В итоге получил одновременно горящие внутри корпуса одного светодиода красный и зеленый огоньки )) Ни намека на желтый.
Кроме того, как писал выше, мне не хватило пинов для подключения всех ножек светодиодов. Я не смог побороть пины 0 и 1 (RX TX) и поэтому вынужден был подключать на последних двух светодиодах только 2 зеленые ножки.

Зачем тут нужен переменный резистор?

Учитывая, что вода не является супер-стабильным проводником электричества, ожидалось, что уровень сигнала будет меняться в зависимости от разных факторов. Примесей в воде и т.д. Поэтому датчики все были подключены к аналоговым входам (чтобы отлавливать весь диапазон возможного сигнала от 0 до 1023), а также в схему включен переменный резистор, с помощью которого можно было бы настроить чувствительность блока. Программно было установлено, что "вода есть" тогда, когда сигнал, получаемый датчиком, превышает какое-то значение. Вот это самое значение ("порог срабатывания") как раз и зависело от положения ручки переменного резистора.

На практике как это работает. Вот стоит у вас порог, допустим "500". Вы налили воду. Все ОК. Уровень сигнала сильный и стабильный. Но потом вода отстоялась. На датчики налип какой-то осадок. Тогда уровень сигнала падает и ардуино считает, что воды нет. Тогда вы подкручиваете крутилкой уровень, допустим, 400. И все снова работает.

Читайте также:  Виды заземлений назначение устройство

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

Ну а теперь немного об алгоритмах работы и программировании.
Как же все это программно работает. Опишу просто кратко логику процесса.

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

Когда сигналов нет вообще, ардуина зажигает 3 красных светодиода (все имеющиеся).
Когда есть 10%, то горит только самый нижний красным цветом.
Когда есть уже 25%, то горят 2 нижних зеленым.
Когда есть 50%, то три нижних зеленым и так далее.
На этом основной алгоритм собственно закончен.

Также мною была сделана попытка прикрутить некоторые программные фишки.
Например, есть сигнал с датчика 25%, затем он пропадает и остается 10%, затем пропадает и он.
Это означает, что вода была, но вся утекла.
Значит, можно об этом пропищать звуком что-то типа мелодии. Один раз. В следующий раз пищать такое только, если вода опять набралась до 25% и снова опустилась.

Аналогично все тоже самое и с перенабором воды. Но в обратном порядке.

Также, я вот только сейчас подумал, я бы сюда еще прикрутил дополнительный провод, снимающий наличие/отсутствие напряжения на проводе ТЭНа. Если уровень воды меньше положенного (ТЭН не закрыт водой), то при наличии напряжения на проводе, пищать что есть силы. Типа защита от дурака.

По температуре.
Здесь все довольно просто. Ардуина все время считывает показания температуры с датчика и выдает их на мониторчик.

Также сюда прикручен алгоритм отслеживания нагрева. Если последовательно температура была в пределах от 30 до 40, затем от 40 до 50, а затем 95 градусов, то значит вода "нагрелась" до нужной кондикции и можно также об этом пропищать.

Сервисный режим.
Здесь есть только один сервисный режим — это режим настройки порога уровня срабатывания датчиков.
Работает так. Как только крутилкой мы повысили уровень порога, а затем понизили, то устройство заходит в "Режим настройки уровня срабатывания датчиков" на 10 секунд и вместо температуры показывает уровень того самого порога срабатывания. Соответственно, крутите крутилку — видите какой порог задаете.

На а теперь о практической реализации и испытаниях.
Для того, чтобы привести устройство в более-менее рабочий режим мне потребовалось 1 раз полностью перепаять его с переделкой платы, а также более 2 месяцев программирования.
Однако и сейчас я не решил кое-какие проблемы. Их решение упирается в мои знания (а точнее их отсутствие). Возможно, дают о себе знать какие-то косяки, о которых не знаю до сих пор.

Основной косяк, вылезающий из особенностей реализации именно описанной схемы датчиков — это ложное срабатывание/несрабатывание датчиков.

Так, частенько по работе устройства (миганию диодов) вижу, что датчики ловят какие-то наводки. Не так, чтобы все датчики моргали как гирлянда на елке, но иногда происходят ложные срабатывания. То ли пар это, то ли хз что. Так то притягивание резисторами на 10кОм к "-" было как раз и призвано бороться с этим, но что-то не особо это помогает.

Именно эти наводки и делают невозможной работу программных режимов, т.к. они сбивают все флаги и устройство не способно реально понять текущее состояние дела. Так, крайний раз оно с периодичностью раз в 10 минут все время мне орало про окончание воды, хотя должно было проорать только 1 раз (это было из-за срабатывания 10 и 25 % датчиков одновременно) до следующего ее реального набора и слива. Поэтому пришлось все это отключить до лучших времен))

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

Относительно потери чувствительности также есть что сказать. Я даже было подумал, что придется сразу все выкидывать.
Так, установил я спицы в бак 2 недели назад. Через неделю после переделки я привез блок, вставил его и обнаружил отсутствие сигнала вообще.
Поднялся к баку с мультиметром и обнаружил две вещи:
спицы обросли каким-то налетом типа извести (как дно чайника) и с трудом прозванивались. Пришлось их чуть-чуть пошкурить от налета;
внезапно вода у поверхности также не прозванивалась. Видимо, отстоялась, и реально опускание щупов в воду даже рядом друг с другом ничего не давало.

После того, как пошкурил контакты и перемешал воду, все заработало.

На этом моменте я уже думал, что все. Работа устройства накрылась медным тазом. Ведь не будешь же каждую неделю лазить и шкурить эти спицы.

Читайте также:  Ввертные петли для дверей с притвором

Однако, внезапно, еще через неделю устройство продолжило работать и показывать уровень воды. Без шкурки. Посмотрим дальше сколько продержится оно 🙂

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

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

В общем, устройство худо-бедно работает, но его надо еще допиливать конечно. Прилагаю ссылки на схему разводки по плате для программы Sprint Layout и скетч с кодом так как есть.

Возможен безналичный расчёт для юридических лиц при оформлении заказа

С этим товаром берут

Общие сведения

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

Характеристики

  • Напряжение цепи: до 100 В
  • Ток в цепи: до 500 мА
  • Сопротивление при замыкании: до 100 Ом.
  • Рабочая температура: -20 . 80 °С (отрицательные температуры для незамерзающих жидкостей)
  • Длина провода: 350 мм
  • Габариты: указаны на чертеже
  • Вес: 10 г.

Подключение

Для удобства подключения к Arduino воспользуйтесь Trema Shield, Trema Power Shield, Motor Shield или Trema Set Shield.

  • Один провод датчика подключается к выводу GND (так как второй провод будет подтянут до уровня логической «1»).
  • Другой провод можно подключить к любому выводу Arduino. (вывод должен быть сконфигурирован как вход с подтяжкой).

Так как при разомкнутой цепи датчика, состояние на входе Arduino будет неопределённым, то при конфигурировании вывода как вход, его стоит подтянуть до уровня логической «1», вызвав функцию pinMode(), с параметром INPUT_PULLUP.

Для подключения к Arduino вы так же можете воспользоваться Trema-модулем Pull Switch.

Подробнее о датчике

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

Используем плату Ардуино и ультразвуковой модуль для создания своими руками проекта по определению уровня воды в баке.

Когда может пригодиться?

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

Часто узнать количество воды в резервуаре может быть утомительной задачей. Обычно вы поднимаетесь по лестнице и проверяете уровень вручную или вы услышите что вода переполняется сверху.

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

Мы решим эту задачу с совершенно другим подходом к знанию уровня воды — с использованием ультразвукового модуля и Ардуино. Преимущество этого метода заключается в том, что он бесконтактный, поэтому такие проблемы, как коррозия электродов, не будут влиять на эту систему. Кроме того, этот индикатор уровня воды Arduino намного проще устанавливать, чем обычные системы.

Как работает индикатор уровня воды Arduino?

Этот индикатор уровня воды Ардуино использует ультразвуковой датчик или, по-другому, Ping датчик для определения уровня воды в баке. Датчик Ping измеряет расстояние, используя гидролокатор.

Из аппарата передается ультразвуковой импульс (значительно выше человеческого слуха), а расстояние до цели определяется путем измерения времени, необходимого для возврата эха. На выходе Ping датчика импульс переменной ширины, который соответствует расстоянию до цели. Затем он подается в микроконтроллер, который определяет уровень воды и отображает его через ряд светодиодов.

Этот проект может быть реализован на одной из плат Arduino, если микроконтроллером платы является непосредственно микроконтроллер ATmega 328.

Комплектующие

По традиции переходим к комплектующим, набор деталей довольно большой:

1 Микроконтроллер ATMega328P или плата Arduino
1 HC-SR04 ультразвуковой модуль (также известный как датчик PING)
1 10K резистор
1 Кристалл 16 МГц
2 22pf дисковые конденсаторы
Провода-перемычки
1 Регулятор LM7805 5V
1 9В батарея и разъем
1 Электролитический конденсатор 10uF
1 Макетная плата (или печатная плата)
1 Инструмент для зачистки проводов

Схема соединений

Все детали нужно собрать соответственно диаграмме выше. Сразу заметим, что в данной схеме на макетную плату размещается микроконтроллер ATmega328. Если вы используете плату Arduino, вы можете просто установить соединения для светодиодов и ультразвукового датчика.

Скетч для Ардуино

Скопируйте прилагаемый ниже скетч в Arduino >

Загрузите код для индикатора уровня воды Arduino непосредственно на плату Arduino или в микроконтроллер ATMega328P.

Ультразвуковой датчик и водный резервуар

Закрепите датчик так, чтобы он непосредственно смотрел на воду в баке. Основная плата управления со светодиодами может быть закреплена внутри дома в любом удобном положении. Любые многожильные кабели (Ethernet-кабель) могут использоваться для соединения датчика и остальной части схемы.

Теперь просто подключите аккумулятор (питание) и ваш индикатор уровня воды Ардуино готов к использованию.

Комментировать
207 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
Adblock detector