Контроль и автоматизация уровня воды в еврокубе

Тема в разделе "Посоветуйте детальки", создана пользователем dwk26111974, 28 фев 2016.

  1. dwk26111974

    dwk26111974 Гик

    Уважаемые амперщики! В загородном доме для водоснабжения есть евро куб с насосной станцией(стоит на выходе) для обеспечения дома.Задача: организовать автоматическое управление наполнением ево куба на базе:
    1. Ардуино Уно/Нано
    2.Ультразвуковой датчик HC-SR04
    3. Блок индикации -5 светодиодов
    4.Блок реле с коммутацией 220в/10А
    Спецификация:
    1.УЗ датчик закреплен сверху бака, 5 режимов контроля, отображающихся по 5 светодиодам, при достижении мин -вкл насоса, при достижении макс - откл насоса наполнения. Возможность калибровки от мин к макс.
    В нете есть подобный проект, но уж больно мудреный (ЛСД дисплей, 10 светодиодов итд) нужно -чем проще, тем лучше!
    По железу - нет проблем, а по скетчу...
    В итоге, прошу добрых самаритян))) откинуться))) может кто уже имеет такой проект.Нужен скетч.
     
    Последнее редактирование: 28 фев 2016
  2. Vad33

    Vad33 Капитан-оригинал

    Взять тот проект, что в инете, выкинуть лишнее и будет счастье. :)
     
  3. Onkel

    Onkel Гуру

    он рядом с водой долго не протянет, даже и в еврокубе. А поскольку он УЗ, то загерметизировать его так, чтобы пары не проходили, а УЗ проходил, вряд ли получится. Если получится - поделитеь ноу хау, плиз. Рекомендую датчик купить в магазине сантехники , или т.н. "лягушку" - это датчик, который замыкает контакт когда плавает и размыкает когда висит, такие датчики обычно идут с комплекте с дренажными насосами, или 3-х контактный с контактами на проводимость.
    Также хорошо себя зарекомендовали датчики давления (например, протокола 4-20 мА), вы подсоединяете его внизу куба, и по давлению с хорошей (достаточной) точностью знаете уровень воды, исходя из 1 атм соответсвует 10 м воды (более точные данные есть в справочниках).
    Если интересно по датчикам давления, могу подсказать , у меня такие (правда, до 10 атм) стоят в сантехнике. Брал в Москве.
    а на советы вроде
     
  4. dwk26111974

    dwk26111974 Гик

    Вы правы, почитал инфо по датчикам- долго при испарениях не протянет.Что касается поплавковых датчиков,
    то они не дадут инфо о наполнении бака, тк работают только на вкл/выкл да и затащить его в бак, через узкую горловину- проблематично, кромсать куб не хочется.
    Заинтересовал вот такой проект:
    http://elwo.ru/publ/skhemy_avtomatiki/datchik_urovnja_vody/28-1-0-738
    Что скажете?
     
  5. dwk26111974

    dwk26111974 Гик

    http://electronics-lab.ru/blog/4008.html
    А вот более подробно по такому же проекту.
    Взгляните опытным взглядом на скетч-он рабочий?
    Программный код
    #include <LiquidCrystal.h>int sump=A0;int qut=A1;int hlf=A2;int thf=A3;int ful=A4;int motor=8;int buz=7;int s;int q;int h;int t;int f;int i; //motor status flagint v=100;//comparison variable(needs some adjustment)int b=0; //buzzer flagint m=0; //motor flagint c=0; //sump flag

    LiquidCrystal lcd(12,11,5,4,3,2);

    void setup(){

    pinMode(qut,INPUT);
    pinMode(hlf,INPUT);
    pinMode(qut,INPUT);
    pinMode(ful,INPUT);
    pinMode(sump,INPUT);
    pinMode(motor,OUTPUT);
    pinMode(buz,OUTPUT);
    lcd.begin(16,2);
    digitalWrite(buz,LOW);}

    void loop(){

    i=digitalRead(motor);
    s=analogRead(sump);
    q=analogRead(qut);
    h=analogRead(hlf);
    t=analogRead(thf);
    f=analogRead(ful);
    lcd.clear();

    if(f>v && t>v && h>v && q>v ){
    lcd.setCursor(0,0);
    lcd.print(char(219));
    lcd.print(char(219));
    lcd.print(char(219));
    lcd.print(char(219));
    lcd.setCursor(5,0);
    lcd.print("FULL");
    m=0;
    b=0;}else{if(f<v && t>v && h>v && q>v){
    lcd.setCursor(0,0);
    lcd.print(char(219));
    lcd.print(char(219));
    lcd.print(char(219));
    lcd.print("_");
    lcd.setCursor(5,0);
    lcd.print("3/4th");
    b=0;}else{if(f<v && t<v && h>v && q>v){
    lcd.setCursor(0,0);
    lcd.print(char(219));
    lcd.print(char(219));
    lcd.print("_");
    lcd.print("_");
    lcd.setCursor(5,0);
    lcd.print("HALF");
    m=1;
    b=0;}elseif(f<v && t<v && h<v && q>v){
    lcd.setCursor(0,0);
    lcd.print(char(219));
    lcd.print("_");
    lcd.print("_");
    lcd.print("_");
    lcd.setCursor(5,0);
    lcd.print("1/4th");
    b=0;}else{if(f<v && t<v && h<v && q<v){
    lcd.setCursor(0,0);
    lcd.print("_");
    lcd.print("_");
    lcd.print("_");
    lcd.print("_");
    lcd.setCursor(5,0);
    lcd.print("LOW");
    b=0;}else

    {
    digitalWrite(motor,LOW);
    lcd.setCursor(0,0);
    lcd.print("ERROR!");
    b=1;}}}}if(i==HIGH){
    lcd.setCursor(0,1);
    lcd.print("Motor ON");}else{
    lcd.setCursor(0,1);
    lcd.print("Motor OFF");}

    if(s>v && m==1){
    digitalWrite(motor,HIGH);}if(s<v){
    digitalWrite(motor,LOW);
    lcd.setCursor(11,0);
    lcd.print("Low");
    lcd.setCursor(11,1);
    lcd.print("Sump");
    c=1;}if(s>v){
    c=0;}

    if(m==0){
    digitalWrite(motor,LOW);}

    if(b==1|| c==1){
    digitalWrite(buz,HIGH);
    delay(500);
    digitalWrite(buz,LOW);}else{
    digitalWrite(buz,LOW);}
    delay(100);
    lcd.clear();
    }
    Компиляция прошла без ошибок.
     
    Последнее редактирование: 29 фев 2016
  6. Onkel

    Onkel Гуру

    ну на глая скетч я проверить не могу, но в принципе нужное количество контактных сенсоров конечно будет работать. Я упоминал про них
    Только чтобы не было потом мучительно больно, лучше сразу покупать нормальные контакты в сантехнике.
    я бы обратил внимание, что в воду нужно подключать не +5, а gnd, соответсвенно подтягивать к +5, да и 10 к многовато будет. После такой легкой переделки схема должна нормально работать. Впрочем, она будет работать и до переделки, но лучше делать сразу так как надо и не делиться своими +5 с окружающим миром.
     
  7. dwk26111974

    dwk26111974 Гик

    Прежде чем начать сборку проекта по описанию:
    http://electronics-lab.ru/blog/4008.html
    Смутило данное замечание.
    "Набор фиксированных значений (по сравнению с переменой ”v”) должен быть отрегулирован, поскольку удельное электрическое сопротивление воды изменяется от слоя воды к слою и расстояние между датчиками будет различным для разных резервуаров."
    Я понимаю это калибровка, но тк я в скетчах=0, подскажите пошагово, что и где менять в скетче.
     
  8. dwk26111974

    dwk26111974 Гик

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

    Onkel Гуру

    я обычно так делаю - собираю, проверяю и выбираю значения, при которых все срабатывает. Начать я бы рекомендовал с правильных контактов. И уже потом
    int v=100;//comparison variable(needs some adjustment)
    вот эту переменную выбираем таким образом, чтобы при замыкании было <v, при размыкании (вода ниже контакта) >v.


    везде где сравниваются значения с v меняем знак, например вместо
    if(f>v && t>v && h>v && q>v )
    будет
    if(f<v && t<v && h<v && q<v )
    и т.д., но только где v
     
  10. dwk26111974

    dwk26111974 Гик

    Благодарю за оперативный ответ.Завтра буду осмысливать))
     
  11. dwk26111974

    dwk26111974 Гик

    Я правильно Вас понял-последовательность сборки и калибровки:
    1.Собрать схему с датчиками
    2.Погрузить блок датчиков в емкость (для тестовых испытаний - ведро)))
    3.Начать заполнять - достигло минимума - меняем строку в скетче, как вы написали,уровень воды достиг 3/4-снова вносим изменения в скетч, затем 50% и максимум.
    ???
     
  12. Onkel

    Onkel Гуру

    нет, не совсем так.
    1 Собрать схему, с указанными изменениями.
    2 Для тестирования взять , например, ведро, но желательно с той же самой водой.
    3 опустить датчики в воду
    4 сделать простейший скетч индикации примерно такой , как в примере (ссылке), только в loop()
    написать только
    q=analogRead(qut);
    Serial.println(q);
    delay(100);

    а в скобках
    void setup()
    добавить
    Serial.begin(9600);
    5 посмотреть на мониторе значение при опущенных в воду контактах (1/4) и вынутых из воды.
    Посчитать среднюю арифметическую.
    6 переписать программу из примера (ссылки), поменяв везде > на < и наоборот в сравнениях с v
    7 в строке
    int v=100;//comparison variable(needs some adjustment)
    вместо 100 написать величину, полученную в п.5, среднюю арифметическую.
    8 вгружаем и смотрим. должно работать.
     
  13. dwk26111974

    dwk26111974 Гик

    Мама родная)))!!! Буду пробовать)))
     
  14. dwk26111974

    dwk26111974 Гик

    По 4 пункту - я правильно понял, что указанные изменения вносятся в скетч? В итоге получим:

    //Контроль уровня воды в баке-5 датчиков http://electronics-lab.ru/blog/4008.html
    #include <LiquidCrystal.h>
    int sump=A0;
    int qut=A1;
    int hlf=A2;
    int thf=A3;
    int ful=A4;
    int motor=8;
    int buz=7;
    int s;
    int q;
    int h;
    int t;
    int f;
    int i; //motor status flag
    int v=100; //comparison variable(needs some adjustment)
    int b=0; //buzzer flag
    int m=0; //motor flag
    int c=0; //sump flag

    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    void setup( )
    {
    Serial.begin(9600); // добавил двк

    pinMode(qut,INPUT);
    pinMode(hlf,INPUT);
    pinMode(qut,INPUT);
    pinMode(ful,INPUT);
    pinMode(sump,INPUT);
    pinMode(motor,OUTPUT);
    pinMode(buz,OUTPUT);
    lcd.begin(16, 2);
    digitalWrite(buz,LOW);
    }

    void loop()
    {

    i=digitalRead(motor);
    s=analogRead(sump);
    q=analogRead(qut);
    Serial.println(q); //добавил двк
    delay(100);
    h=analogRead(hlf);
    t=analogRead(thf);
    f=analogRead(ful);
    lcd.clear();

    if(f>v && t>v && h>v && q>v )
    {
    lcd.setCursor(0,0);
    lcd.print(char(219));
    lcd.print(char(219));
    lcd.print(char(219));
    lcd.print(char(219));
    lcd.setCursor(5,0);
    lcd.print("FULL");
    m=0;
    b=0;
    }
    и далее как в исходном скетче?
     
  15. Onkel

    Onkel Гуру

    нет, по п. 4 вам нужно только посмотреть, какие будут показания сенсоров в воде и без воды, поэтому просто в теле loop{}
    loop
    {
    q=analogRead(qut);
    Serial.println(q);
    delay(100);
    }
    и все. Это нужно только для того, чтобы посмотреть и вычислить величину q
     
  16. dwk26111974

    dwk26111974 Гик

    Замер произвел, получилось следующее:
    1.Уровень максимум-689-703
    2.3/4 - 806-834
    3.Уровень минимум 1/4 - 2-7
    4.Контакты сухие =0
    И еще -когда собрал схему - резко пульсирует ЛСД и на Дуне также пульсирует Тх...при чем такая пульсация при подключенных датчиках, без и на другой ардуино.....
     
  17. Onkel

    Onkel Гуру

    не совсем понял. вот вы берете нижние контакты и не опускаете их в воду. Сколько показывает?
    Теперь опускаете их в воду. Сколько показывает?
    Как подключили - схемку можете набросать ?
     
  18. dwk26111974

    dwk26111974 Гик

    Схему собрал как написано...
    http://electronics-lab.ru/blog/4008.html
    При сухих контактах в сом порту =0, погружаю на максимум =около 700...
    Пульсация ЛСД и светодиода на дуне - никак не связана...
    Подключаю пустую дуню -загружаю скетч - сразу начинает мигать Тх на дуне...
    Для проверки загрузил стандартный скетч "Hello world" -мигания лсд нет, все нормально...
     
    Последнее редактирование: 2 мар 2016
  19. Onkel

    Onkel Гуру

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

    dwk26111974 Гик

    Резисторы поставил 10 кОм -какие посоветуете? По смене питания с + на землю -завтра попробую.
    Если у Вас есть свободная дуня - попробуйте загрузить скетч - тоже будет нервное мигание Тх?))