Контроллер уровня жидкости/датчик уровня жидкости
- Войдите на сайт для отправки комментариев
Ср, 25/03/2015 - 17:20
Однажды стал вопрос о создании контроллера уровня воды в баке. Основная задача была держать бак полным и поддерживать определенную в нем температуру. Покурил форум, ужаснулся от сложных конструкций, что были тут популярны. Решил не заморачиваться, Уровень воды будем узнавать ультразвыковым датчиком при улавливании пинга от поверхности, датчик который ставим вверху бака (делаем две дырки в крышке или одну если использовать водостойкий датчик).
Мой садовый Бак, на тонну воды, высотой 70 см.
1000л/70см= 14,28л в одном сантиметре уровня воды в баке.
Значит литраж в баке можно узнать по формуле: "=(70-дистанция датчика)*14,3
Далее пишем скетч вывода дистанции уровня воды до края бака и расчет литража. Реализовываем на макете.
Далее, при необходимости, добавляем релюшки по нагреву, насосу, всякие пищалки и.т.п.
Для примера привожу мой скетч (я использовал только стандартные библиотеки. Никакой экзотики.)
мой экран 1602 не знал русских букв, пришлось некоторые рисовать побайтно.
Я попутно добавил звуковую сигнализацию при переливах (для отладки).
#define Trig 9 #define Echo 8 #define ledPin 13 /* Константа: высота символа в точках */ enum { SYMBOL_HEIGHT = 8 }; /* Описываем наши собственные символы в виде массивов битовых масок. * Каждый символ - это восемь масок по пять бит. */ byte van [SYMBOL_HEIGHT] = //буква ы { B10101, B11111, B10111, B11111, B11111, B00111, B11110, B00000, }; byte dva [SYMBOL_HEIGHT] =//буква л { B00100, B01010, B01010, B10001, B10001, B10001, B10001, B00000, }; byte tri [SYMBOL_HEIGHT] =//буква и { B10001, B10001, B10011, B10011, B10101, B10101, B11001, B00000, }; enum { LCD_WIDTH = 16, LCD_HEIGHT = 2 }; #include <LiquidCrystal.h> //Подключаем библиотеку для работы с LCD LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD, указывая управляющие контакты int Count = 0; // счетчик обновлений float litr = 0; // переменная для температуры void setup() { /* Регистрируем собственные символы с кодами 0, 1 и 2 */ lcd.createChar(3, van);//буквы lcd.createChar(1, dva); lcd.createChar(2, tri); /* Начинаем работу с дисплееем */ lcd.begin(LCD_WIDTH, LCD_HEIGHT); pinMode(6, OUTPUT); // устанавливаем 6 ногу как выход пищалки pinMode(Trig, OUTPUT); //инициируем как выход pinMode(Echo, INPUT); //инициируем как вход pinMode(ledPin, OUTPUT); Serial.begin(9600); lcd.begin(16, 2); lcd.print("Loading"); // вывод надпись «загрузка» при старте delay(500); // ждем 0.5 секунды lcd.print(".");// тоЧко) delay(500); // ждем 0.5 секунды lcd.print("."); delay(500); // ждем 0.5 секунды lcd.print("."); delay(1000); // ждем 1 секунду lcd.clear(); //очистка экрана analogWrite(6, 60); // дважды пищим delay(200); analogWrite(6, 0); // 0 - выключаем пьезо delay(300); // пауза delayms мс analogWrite(6, 60); // второй тон delay(200); analogWrite(6, 0); // 0 - выключаем пьезо } unsigned int impulseTime=0; unsigned int distance_sm=0; void loop() { lcd.clear(); //очистка экрана digitalWrite(Trig, HIGH); /* Подаем импульс на вход trig дальномера */ delayMicroseconds(10); // равный 10 микросекундам digitalWrite(Trig, LOW); // Отключаем impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=impulseTime/58; // Пересчитываем в сантиметры Serial.println(distance_sm); // Выводим на порт if (distance_sm<11) // Если расстояние менее 11 сантиметром { digitalWrite(ledPin, HIGH); // Светодиод горит на 13 выходе lcd.print("!!TANK IS FULL!!"); lcd.setCursor(0, 1); // устанавливаем курсор в 0-ом столбце, 2 строке lcd.print("!!STOP WATER!!"); analogWrite(6, 60); // значение должно находится между 0 и 255 // поэкспериментируйте для получения хорошего тона delay(500); // пауза delayms мс analogWrite(6, 230); // второй тон delay(900); analogWrite(6, 0); // 0 - выключаем пьезо delay(300); // пауза delayms мс } else { digitalWrite(ledPin, LOW); // иначе не горит } delay(100); analogWrite(6, 0); // 0 - выключаем пьезо /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего. Это время называется периодом цикла (cycle period). Рекомендованный период между импульсами должен быть не менее 50 мс. */ lcd.clear(); //очистка экрана // считываем и вычисляем температуру litr =(70-distance_sm)* 14.3; // 70 см высота. =1000литров. 1 см = 14,3литра lcd.setCursor(0, 0); // устанавливаем курсор в 0-ом // столбце, 1 строке (начинается с 0) lcd.print("Distance="); lcd.print(distance_sm); // выводим текущую дистанцию lcd.print(" cm");//припись см lcd.setCursor(0, 1); // устанавливаем курсор в 0-ом столбце, 2 строке lcd.print("\1\2TPOB="); // обозначение литража. через чертку номер кода прописанных байтами букв. Надпись «Литров» lcd.print(litr); delay(4*500); // задержка перед повторением измерений Count++; // инкремент счетчика измерений }
прошу любить и жаловать, конструктивно критиковать)
Схему бы подключения глянуть. Смотрю на фото, вы там какие то резисторы здоровенные используете?
Сам заморачивался этим же вопросом в соседней теме: http://arduino.ru/forum/proekty/datchik-urovnya-zhidkosti
Но мне там дисплей не нужен. Все проще: при пустом баке включаем насос (или открываем гран) при полном - выключаем (закрываем). Можно наверное сигнализацию перелива добавить, хотя если воду не перекроет, никакая сигнализация уже не поможет. Тупо добежать не успею. Да еще и дома нужно в это время оказаться.
Резисторы толстенные пятиватки по причине того, что под рукой в тот момент просто ничего инного не было, безисходность) Пусть они Вас не смущают, они нужны исключительно для экрана и светодиодов индикации режимов работы.
Да, в вашем случае подключение будет еще проще.
Информация по портам подключения к ардуино для моего скетча:
Сигнальный светодиод подключил на 13 порт.
Эхолот вешаем на:
#define Trig 9 й
#define Echo 8й
Дисплей подключаем к выводам:
12, 11, 10, 5, 4, 3, 2 (я не подключал через I2C).
+ Пьезо(пищалку) вешаем на 6 порт. Она будет сигнализировать переполнение бака.(не обязательно)
Если есть вопросы - пишите, поможем.
Могу выслать на емейл более детальное описание в 1 файле.
Как УЗ-дальномер будет себя чувствовать в баке с конденсатом?
Как УЗ-дальномер будет себя чувствовать в баке с конденсатом?
Я месяц использовал эту модель эхолота. Проблем не было. После чего сменил сисему в целом в связи со строительством на участке.
Для более долговременного использования - всеже лучше берите гермитичные датчики.
В скетче можно добавлять самотестировение -> "все ок если дистанция более 1 см". Если менее - "алярм, неисправность!".
http://radioskot.ru/publ/izmeriteli/indikator_urovnja_vody/15-1-0-605
А такую схему можно прикрутить к ардуино ? Дребезжать не будет?
Можно, но зачем? Это как приспособа вместо решения. Да и электролиз на контактах будет. Очень не люблю проводить токи через жидкости дял сигнальных схем
Bierman , уже много обсуждений было по этому вопросу....
неуже ли тибе надо знать литраж с точьностью до 0,5 литра ?
и гробить УЗ-датчик влажностью ?
от низа ёмкости хоть фанину 50 мм до ВЫШЕ бака ( сообщающиеся сосуды ),
внутри поплавок с магнитом , снаружи герконы или датчики Холла ( я ставил три - мин , 0.5 , макс )
для поддержания постоянного наполнения бака - достаточно
да и правильно Nemo дал ссылку http://rusautomation.ru/poplavkovye-datchiki-urovnya-vody
.....система "бачок унитаза" работает уж сколько лет..... САУ , однако....
и зачем Ардуина ?
мне нужно наличие воды в трубе.... даже не воды а сладкой жижы.... Датчик Холла не пойдет... Залипнет.
Мой садовый Бак, на тонну воды, высотой 70 см.
...откудова там варенье ? ( Карлсон и Энгельсон ) ?
мне нужно наличие воды в трубе.... даже не воды а сладкой жижы.... Датчик Холла не пойдет... Залипнет.
танк по производству варенья ?
пивное сусло
Тоже интересует датчик наличия воды в трубе (давление от 2 метров - 0.2 кгс). Лучше такой чтобы можно было сделать самому. Нужны для анализа аварийных ситуаций в системе.
у меня вообще давления не будет.... Просто нужно перекачать из одного бакав другой. И определить когда вода кончится в 1м баке
Датчик уровня в бочке будет на герконах (20шт 28x4 на 80см высоты) с магнитом от динамика.
Bierman , уже много обсуждений было по этому вопросу....
неуже ли тибе надо знать литраж с точьностью до 0,5 литра ?
и гробить УЗ-датчик влажностью ?
от низа ёмкости хоть фанину 50 мм до ВЫШЕ бака ( сообщающиеся сосуды ),
внутри поплавок с магнитом , снаружи герконы или датчики Холла ( я ставил три - мин , 0.5 , макс )
для поддержания постоянного наполнения бака - достаточно
Да, обсуждений было много, и ниодно из них не удовлитворила определенной спецификации по точности и надежности. Все решения на уровне "приспособ", а не девайсов. Хотя весьма креативно.
Вопервых, бывает много задач, где необходима большая точность. Я показал одно из решений для возможной адаптации под проджекты форумчан. Во многих проджектах подобная точность не нужна, тут Вы правы.
Во вторых, мы уже показывали решения где использовали ultrasonic waterproof sensor которому не страшна влага и пары.
В третьих, системы поплавков, замыкающихся контактов, линейки герконов на больших танках или не юзабельны или не достаточно точны/надежны или монтируються с головняком. Это прошлый век! Мы же должны тянуться к гламуру*, верно?)
В четвертых, какова надежность полумеханических систем с подвижными частями, которые контактируют с жидностью? Если к примеру Попловок залипнет... Вы не задавались вопросом, почему в унитазных баках есть защита от перелива? И что делать если перелив или инная неточность категорически недопустима? С эхолотами все намного проще (эхо в заданых пределах есть - девайс работает; детектируемое расстояние более 1 см, датчик живой, ничего не перенаполнит, самотестирование на лету. При нарушении логики - отключение насосов или стравливание бака. Унитазный попловок или система герконов будет защищена от возможных механических сбоев? Нет. А значит риск сбоя велик, а точнее резко отличен от ноля. В некоторых проджектах это может тянуть за собой и дополнительный сопутствующий матущерб.)
P.S. * - Под тягой к гламуру, я вовсе не агитирую использовать микроволновые датчики для детектирования объемов материи. ;)
Для расшрения функционала. Хотя зачем... можно же за веревочку дергать...
Уважаемый Автор, сам много лет мучался с задачей определения остатка воды в баке зарытого под землю, по понятным причинам механические системы во первых трудоемки в установке во вторых недолговечны. Ваш способ пошел на ура и на макете все заработало как надо.
Однако, есть небольшая просьба, не могли бы Вы помочь встроить в код аналоговый выход в зависимости от расстояния? Например на каждый сантиметр +0.1 вольт на аналог, даже вместо пищалки. Спасибо!
На каждый ваш "условный шаг" можете получить 5 / 256 примерно 0.02 Вольта.
http://arduino.ru/Reference/AnalogWrite
Спасибо, разобрался и все получилось
Я здесь не частый гость, но рад, что уже все решилось. Помните про ограничения "шага" на аналоговых ножках ардуинки. Удачи в свершениях.
Доброго времени суток!
Подскажите по ультразвуковому влагозащитному датчику. http://www.ebay.com/itm/381374561353
Как написано в описании у него слепая зона 25см.
Кто тестировал его на близкие растояния? (меннее 25см) Как он себя ведет?
Дело в том, что в моем проекте емкость всего порядка 40 см и хочется понять целесообразность его использования.
Или стоит обратить внимание на другие датчики? Важно измерять именно уровень жидкости, а не пороговые значения.
Заранее спасибо за Ваши ответы!!!
У меня уже не первый год работает, к тензодатчику привязан поплавок на всю глубину бочки. Поплавок герметичный из ПП трубы, внутри арматурина на всю длину поплавка(хотя...) для равномерного веса(плотности) и что-бы чуть тонул, до дна 10мм. Архимед однако!
Здравствуйте! 2 дня назад стал счастливым обладателем набора Ардуино датчики и сенсоры. Пока только что и освоил мигающий светодиод ). У меня тоже есть емкость в которой необходимо конролировать воду 130 см 1300 л. Ваше решение на мой взгляд самое продвинутое и практичное. Буду очень благодарен за более детальное описание на o821mo@mail.ru. Спасибо!
По идее можно использовать трубку с барометрическим датчиком. Идея с тензодатчиком интересная, но механика опять же. Впрочем всё это только для негустых жидкостей....