Контроллер уровня жидкости/датчик уровня жидкости

Bierman
Offline
Зарегистрирован: 13.05.2014
Однажды стал вопрос о создании контроллера уровня воды в баке. Основная задача была держать бак полным и поддерживать определенную в нем температуру. Покурил форум, ужаснулся от сложных конструкций, что были тут популярны. Решил не заморачиваться, Уровень воды будем узнавать ультразвыковым датчиком при улавливании пинга от поверхности, датчик который ставим вверху бака (делаем две дырки в крышке или одну если использовать водостойкий датчик).

Мой садовый Бак, на тонну воды, высотой 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++;         // инкремент счетчика измерений
}
  

 

прошу любить и жаловать, конструктивно критиковать)

Nemo
Offline
Зарегистрирован: 07.03.2015

Схему бы подключения глянуть. Смотрю на фото, вы там какие то резисторы здоровенные используете?

Сам заморачивался этим же вопросом в соседней теме: http://arduino.ru/forum/proekty/datchik-urovnya-zhidkosti

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

Bierman
Offline
Зарегистрирован: 13.05.2014

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

Да, в вашем случае подключение будет еще проще.

 

Информация по портам подключения к ардуино для моего скетча:

Сигнальный светодиод подключил на 13 порт. 

Эхолот вешаем на:

#define Trig 9 й

#define Echo 8й

Дисплей подключаем к выводам:

12, 11, 10, 5, 4, 3, 2 (я не подключал через I2C).

+ Пьезо(пищалку) вешаем на 6 порт. Она будет сигнализировать переполнение бака.(не обязательно)

Если есть вопросы - пишите, поможем.

Могу выслать на емейл более детальное описание в 1 файле.

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Как УЗ-дальномер будет себя чувствовать в баке с конденсатом?

Bierman
Offline
Зарегистрирован: 13.05.2014

Andrey_Y_Ostanovsky пишет:

Как УЗ-дальномер будет себя чувствовать в баке с конденсатом?

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

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

 

В скетче можно добавлять самотестировение -> "все ок если дистанция более 1 см". Если менее - "алярм, неисправность!".

mishgan
Offline
Зарегистрирован: 25.04.2014

http://radioskot.ru/publ/izmeriteli/indikator_urovnja_vody/15-1-0-605

А такую схему можно прикрутить к ардуино ? Дребезжать не будет?

Bierman
Offline
Зарегистрирован: 13.05.2014

Можно, но зачем? Это как приспособа вместо решения. Да и электролиз на контактах будет.  Очень не люблю проводить токи через жидкости дял сигнальных схем

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Bierman  , уже много обсуждений было по этому вопросу....
неуже ли тибе надо знать литраж с точьностью до 0,5 литра ?
и гробить УЗ-датчик влажностью ?
от низа ёмкости хоть фанину 50 мм до ВЫШЕ бака ( сообщающиеся сосуды ),
внутри поплавок  с магнитом , снаружи герконы или датчики Холла ( я ставил три - мин , 0.5 , макс )
для поддержания постоянного наполнения бака - достаточно

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

да и правильно Nemo дал ссылку http://rusautomation.ru/poplavkovye-datchiki-urovnya-vody
.....система "бачок унитаза" работает уж сколько лет..... САУ , однако....
и зачем Ардуина ?

mishgan
Offline
Зарегистрирован: 25.04.2014

мне нужно наличие воды в трубе.... даже не воды а сладкой жижы.... Датчик Холла не пойдет... Залипнет.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Мой садовый Бак, на тонну воды, высотой 70 см.
...откудова там варенье ? ( Карлсон и Энгельсон ) ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

mishgan пишет:

мне нужно наличие воды в трубе.... даже не воды а сладкой жижы.... Датчик Холла не пойдет... Залипнет.

танк по производству варенья ?

mishgan
Offline
Зарегистрирован: 25.04.2014

пивное сусло

nevkon
Offline
Зарегистрирован: 20.01.2015

Тоже интересует датчик наличия воды в трубе (давление от 2 метров - 0.2 кгс). Лучше такой чтобы можно было  сделать самому. Нужны для анализа аварийных ситуаций в системе.

mishgan
Offline
Зарегистрирован: 25.04.2014

у меня вообще давления не будет.... Просто нужно перекачать из одного бакав другой. И определить когда вода кончится в 1м баке

nevkon
Offline
Зарегистрирован: 20.01.2015

Датчик уровня в бочке будет на герконах (20шт 28x4 на 80см высоты) с магнитом от динамика.

Bierman
Offline
Зарегистрирован: 13.05.2014

SU-27-16 пишет:

Bierman  , уже много обсуждений было по этому вопросу....
неуже ли тибе надо знать литраж с точьностью до 0,5 литра ?
и гробить УЗ-датчик влажностью ?
от низа ёмкости хоть фанину 50 мм до ВЫШЕ бака ( сообщающиеся сосуды ),
внутри поплавок  с магнитом , снаружи герконы или датчики Холла ( я ставил три - мин , 0.5 , макс )
для поддержания постоянного наполнения бака - достаточно

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

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

Во вторых, мы уже показывали решения где использовали ultrasonic waterproof sensor которому не страшна влага и пары.

В третьих, системы поплавков, замыкающихся контактов, линейки герконов на больших танках или не юзабельны или не достаточно точны/надежны или монтируються с головняком. Это прошлый век! Мы же должны тянуться к гламуру*, верно?)

В четвертых, какова надежность полумеханических систем с подвижными частями, которые контактируют с жидностью? Если к примеру Попловок залипнет... Вы не задавались вопросом, почему в унитазных баках есть защита от перелива? И что делать если перелив или инная неточность категорически недопустима? С эхолотами все намного проще (эхо в заданых пределах есть - девайс работает; детектируемое расстояние более 1 см, датчик живой, ничего не перенаполнит, самотестирование на лету. При нарушении логики - отключение насосов или стравливание бака. Унитазный попловок или система герконов будет защищена от возможных механических сбоев? Нет. А значит риск сбоя велик, а точнее резко отличен от ноля. В некоторых проджектах это может тянуть за собой и дополнительный сопутствующий матущерб.)

P.S. * - Под тягой к гламуру, я вовсе не агитирую использовать микроволновые датчики для детектирования объемов материи. ;) 

SU-27-16 пишет:
и зачем Ардуина ?

Для расшрения функционала. Хотя зачем... можно же за веревочку дергать... 

 

Zulu
Offline
Зарегистрирован: 11.07.2015

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

Однако, есть небольшая просьба, не могли бы Вы помочь встроить в код аналоговый выход в зависимости от расстояния? Например на каждый сантиметр +0.1 вольт на аналог, даже вместо пищалки. Спасибо!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

На каждый ваш "условный шаг" можете получить 5 / 256 примерно 0.02 Вольта.

http://arduino.ru/Reference/AnalogWrite

Zulu
Offline
Зарегистрирован: 11.07.2015

Спасибо, разобрался и все получилось

Bierman
Offline
Зарегистрирован: 13.05.2014

Я здесь не частый гость, но рад, что уже все решилось. Помните про ограничения "шага" на аналоговых ножках ардуинки. Удачи в свершениях.

treezzz
Offline
Зарегистрирован: 30.06.2014

Доброго времени суток!

Подскажите по ультразвуковому влагозащитному датчику. http://www.ebay.com/itm/381374561353

Как написано в описании у него слепая зона 25см.

Кто тестировал его на близкие растояния? (меннее 25см) Как он себя ведет?

Дело в том, что в моем проекте емкость всего порядка 40 см и хочется понять целесообразность его использования.

Или стоит обратить внимание на другие датчики? Важно измерять именно уровень жидкости, а не пороговые значения.

Заранее спасибо за Ваши ответы!!!

Stephan
Offline
Зарегистрирован: 01.10.2015

У меня уже не первый год работает, к тензодатчику привязан поплавок на всю глубину бочки. Поплавок герметичный из ПП трубы, внутри арматурина на всю длину поплавка(хотя...) для равномерного веса(плотности) и что-бы чуть тонул, до дна 10мм. Архимед однако!

АдамскийАВ
Offline
Зарегистрирован: 01.12.2016

Здравствуйте! 2 дня назад стал счастливым обладателем набора Ардуино датчики и сенсоры. Пока только что и освоил мигающий светодиод ). У меня тоже есть емкость в которой необходимо конролировать воду 130 см 1300 л. Ваше решение на мой взгляд самое продвинутое и практичное. Буду очень благодарен за более детальное описание на o821mo@mail.ru. Спасибо!

Kidd_Death
Offline
Зарегистрирован: 02.12.2016

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