Умная насосная станция

Тема в разделе "Глядите, что я сделал", создана пользователем grx1a, 8 фев 2013.

  1. grx1a

    grx1a Гик

    Здравствуйте! Написал код для умной насосной станции, может кому нибудь пригодится.
    Сподвигнул меня на этот проект часто затапливаемый подвал моего гаража.
    Особенность данного проекта в том что его можно использовать не только для откатки воды из чего либо, но и наоборот для поддержания уровня воды в чем либо (система защиты от упуска воды). Для того что бы изменить функцию достаточно снять оба поролоновых поплавка с магнитом и перевернув их на 180 градусов, одеть обратно на поплавковые выключатели
    Проект состоит из двух герконных поплавковых выключателей (я использовал такие http://5833.cn.all.biz/ru/goods_poplavkovyj-vyklyuchatel_31205), погружного насоса и релейного модуля для управления насосом от «низковольтной» ARDUINO
    В системе используются два поплавка вместо одного по причине того что бы создать некое подобие «механического триггера шмидта» (создать подобие петли гистерезиса),
    Можно использовать и один поплавок, но тогда система может стать не стабильной. Например: при срабатывании поплавка запустится насос и откачает 5 милиметров воды за какихто 30 секунд, затем насос остановится, и через две три минуты уровень снова дойдет до уровня включения насоса, и так далее, для электромотора насоса это скоро закончится плачевно. С применением двух поплавков, появляется возможность контроля уровня воды в более широком диапазоне уровней. Можно конечно использовать разнообразные таймеры в программе, но это уже другая тема.
    Вместо насоса можно использовать соленоидный клапан, если система слива основана на самотеке, или система пополнения находится под давлением.
    Принцип работы таков:
    1. Если схема настроена для откатки воды из почти опустошенной емкости:
    Предположим что в емкости есть какой-то уровень воды и он постепенно растет, после того как уровень достигнет уровня верхнего поплавка насос запустится и откачает воду до уровня нижнего поплавка, затем система снова ждет пока уровень воды поднимится до уровня верхнего поплавка
    2. Если схема настроена для поддержания уровня в наполненной емкости
    Предположим что в емкости есть какой то уровень воды, и уровень постепенно падает, после того как уровень в емкости достигнет уровня нижнего поплавка насос запустится и наполнит емкость до уровня верхнего поплавка

    Сфера применения:
    1. В первом варианте можно контролировать уровень в переодически затапливаемом помещении, поддержание уровня в открытом бассейне, откатка воды из под конденсатосборника системы кондиционирования, система контроля от перелива наполняемой ванны, система откатки воды из сборников дождевой воды на даче, и многое другое
    2. Во втором варианте можно контролировать уровень воды в водонапорной станции загородного дома, поддерживать воду в цистерне автоматического полива растительности, автоматический сливной бачек унитаза J, система защиты от упуска воды из расширительной цистерны в водяной системе обогрева загородного дома, система заполнения летнего душа на даче, Электронный дачный водяной колодец, и многое другое
    Также система имеет широкую возможность модернизации
    код:
    /*
    Программа для автоматическото управления насосом
    Два поплавка контролирут запуск и остановку насоса
    В зависимости от установки поплавковых выключателей
    система может работать иметь две разные функции
    1.Система контроля затопления (Не допускает подъема воды
    выше уровня верхнего поплавка при срабатывании верхнего поплавка
    запускает насос и откатывает воду до уровня нижнего поплавка)
    Пример: Откачка воды из часто затопляемого помещения (подвал гаража)
    2.Система поддержания воды в емкости (Не допускает упуска воды ниже нижнего
    поплавка, при срабатывании нижнего поплавка наполняет емкость до уровня верхнего поплавка)
    Пример: Защита системы отопления загородного дома от упуска воды из контура
    (устанавливается в разширительной цистерне),
    водонапорная станция на даче, бачек унитаза управляемый электроникой :),

    Что бы переключится между этими двумя функциями необходимо
    только перевернуть поплавки на поплавковых выключателях

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


    */
    #define Apin 8 //PIN верхнего поплавка
    #define Bpin 9 //PIN нижнего поплавка
    #define PumpRelayPin 13 //PIN насосного релле
    boolean floatA = 0; //Состояние верхнего поплавка
    boolean floatB = 0; //Состояние нижнего поплавка
    boolean Pumpttriger = 0; //Текущее состояние насосного релле (1-ON, 0-OFF)
    boolean Lastpumptriger =0; //Предидущее состояние насосного релле

    void setup(){
    pinMode (Apin,INPUT); //Цифровой PIN верхнего поплавка входной
    pinMode (Bpin,INPUT); //Цифровой PIN нижнего поплавка входной
    pinMode (PumpRelayPin,OUTPUT);} //цифровой PIN насосного релле выхлдной
    void loop(){
    floatA=digitalRead(Apin); //Читает состояние PIMа верхнего поплавка и запоминает его
    floatB=digitalRead(Bpin); //Читает состояние PIMа нижнего поплавка и запоминает его
    if(floatA+floatB==2) //Условие запуска насоса(Остановки)
    {Pumpttriger=1;}
    Lastpumptriger=!Lastpumptriger;
    if((floatA+floatB==0)&&(Lastpumptriger==0)) //Условие Остановки насоса (Запуска)
    {Pumpttriger=0;}
    if(Pumpttriger==1)
    {digitalWrite(PumpRelayPin,HIGH);}
    else
    {digitalWrite(PumpRelayPin,LOW);}
    }
    /*
    Подключение поплавковых выключателей так же как подключение кнопок
    через 10 килоомный резистор подключеный к земле
    */
     
  2. Perun61

    Perun61 Нерд

    А в чем преимущество перед готовым изделием ? например таким: http://www.agrovodcom.ru/jeelex-drenazhnik.php
    Есть и еще дешевле ...
    Хотя если цель стояла именно сделать своими руками, уважуха ))
     
  3. grx1a

    grx1a Гик

    Самое главное правильно рабочий код, а вместо поплавков можно подключить что угодно, и это уже будет далеко не насосная станция, а к примеру ветро генератор, или этот код в ключить в более больший код, сделать одной маленькой функцией большлго кода например роботизированого умного дома, и дело здесь далеко не в цене погружного насоса с автоматикой, если разговор идет о насосной станции, этот код может использоваться не только для насосной станции описаной выше, но и для любых кнопочных или цифровых датчиков в других устройствах имеющих абсолютно другое предназначение, где требуется подобный алгоритм работы исполнительного механизма! А что касается цены данного проекта, датчики я купил по 125р за штуку, + цена простого дешового китайского контроллера http://www.elecfreaks.com/store/freaduino-pro-328-5v16mhz-p-373.html +какойнибудь дешоаый погружной насос, в некоторых случаях если не нужна большая производительность насоса, можно использовать от аквариумного фильтра тот вообще рублей 300 стоит, ну и плюс мелочевка, транзистор релле резисторы, стоят копейки.
     
  4. grx1a

    grx1a Гик

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

    Chanov Нерд

    Тоже хотел по весне сделать в гараж, но на MSP430 - она вообще копеечная, и для такой задачи выше крыши ... хотя с 2мя поплавками можно и просто на транзисторах сделать + реле ... Затормозил потому что только 1 датчик есть на руках ... тут или городить ... или задержку запуска насоса просто сделать ... минут 15 например.
    p/s кстати не плохая идея использовать 3 датчика - один как аварийный нужен (вдруг граничный датчик забьётся мусором и клин словит) ...
     
  6. grx1a

    grx1a Гик

    Аварийная функция, да это нужная штука, у нас на параходе система откатки льяльных вод в машинном отделениии так работает: накопилась вода в одном из колодцев насос сам запустился, ушла до нижнего уровня, насос сам остановился, еще там есть функция защиты насоса от сухого хода, LONG RUN, по сути это таймер каторый запускается и останавливается вместе с насосом, и выставлен он на 15 минут, если насос запустился и через 15 минут не остановился, срабатывает сигнализация, здесь тоже можно такую защиту сделать.
     
  7. Chanov

    Chanov Нерд

    Добавил 3ий аварийный датчик (ещё не проверял на макетке), но не сделал универсальную систему и на откачку и на поддержание ... как то меня вот эта конструкция напрягла - Lastpumptriger=!Lastpumptriger; Видимо проще вообще с нуля переписать код ...


    const int Apin = 8; //PIN верхнего поплавка
    const int Bpin = 9; //PIN нижнего поплавка
    const int Cpin = 10; //PIN аварийного поплавка

    const int PumpRelayPin = 13; //PIN насосного релле

    boolean floatA = 0; //Состояние верхнего поплавка
    boolean floatB = 0; //Состояние нижнего поплавка
    boolean floatC = 0; //Состояние аварийного поплавка

    boolean Pumpttriger = 0; //Текущее состояние насосного релле (1-ON, 0-OFF)
    boolean Lastpumptriger =0;//Предыдущее состояние насосного релле

    void setup(){

    pinMode (Apin,INPUT); //Цифровой PIN верхнего поплавка входной
    pinMode (Bpin,INPUT); //Цифровой PIN нижнего поплавка входной
    pinMode (Cpin,INPUT);//Цифровой PIN аварийного поплавка входной
    pinMode (PumpRelayPin,OUTPUT); //цифровой PIN насосного релле выходной
    // initialize serial communication:
    Serial.begin(9600);
    }

    void loop(){

    floatA=digitalRead(Apin); //Читает состояние PIMа верхнего поплавка и запоминает его
    floatB=digitalRead(Bpin); //Читает состояние PIMа нижнего поплавка и запоминает его
    floatC=digitalRead(Cpin); //Читает состояние PIMа аварийного поплавка и запоминает его

    if(floatA+floatB==2) //Условие запуска насоса(Остановки)
    {
    Serial.println("Pump on");
    Pumpttriger=1;
    }

    Lastpumptriger=!Lastpumptriger;

    if((floatA+floatB==0)&&(Lastpumptriger==0)) //Условие Остановки насоса (Запуска)
    {
    Serial.println("Pump off");
    Pumpttriger=0;
    }

    //Условие Аварийной Остановки насоса при сработке датчика аварийного поплавка
    if (floatC==0) {
    Serial.println("Pump failure!");
    Pumpttriger=0;
    }

    if(Pumpttriger==1)
    {
    digitalWrite(PumpRelayPin,HIGH);
    }
    else
    {
    digitalWrite(PumpRelayPin,LOW);
    }
    }
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Это следует понимать так:
    Код (Text):
    if(Lastpumptriger == HIGH)
      Lastpumptriger = LOW;
    else
      Lastpumptriger = HIGH;
    Еще вариант записи того же выражения:
    Код (Text):
    Lastpumptriger = Lastpumptriger ? LOW : HIGH;
     
  9. Chanov

    Chanov Нерд

    Ну что она означает то понятно .... инвертирует просто значение, но оно же будет постоянно туда - сюда прыгать ... чужой код - потёмки )
     
  10. apomelov

    apomelov Нерд

    Вообще понятие инверсии для чисел не очень удачно. Когда мы используем число в качестве условного выражения, то любое ненулевое значение будет истиной. Я не уверен, что стандарт даже ansi c декларирует что !0 -- это непременно 1, а не, скажем, 10. А когда мы имеем дело с какой-нибудь реализацией cpp, тут я вообще ни в чем не уверен.
    Тот факт, что константа HIGH это 1, это тоже чистое совпадение. Могла бы быть и 5, с точки зрения api ничего не изменилось бы. Имхо, единственный устойчивый вариант этого кода такой:
    Код (Text):
    lastPumpTrigger = (lastPumpTrigger == HIGH) ? LOW : HIGH;
     
  11. Chanov

    Chanov Нерд

    Жаль автор кода пропал ... Мне кажется в оригинале вообще ошибка .... и это переключение тригера состояния должно быть где то в условии ... что то типа этого видимо ...

    if(floatA+floatB==2) //Условие запуска насоса(Остановки)
    {Pumpttriger=1;
    Lastpumptriger=!Lastpumptriger;}

    А то сейчас в loop(){ этот тригер же просто прыгает туда - сюда ....
     
  12. grx1a

    grx1a Гик

    Главное все правильно без замечаний работает
     
  13. grx1a

    grx1a Гик

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

    Megakoteyka Оракул Модератор

    stdbool.hзаголовочный файл стандартной библиотеки языка программирования С, который содержит четыре макроса для работы с типом данных bool. Данный заголовочный файл появился в стандарте C99.
    Определение макросов согласно стандарту IEEE Std 1003.1-2001:
    • bool расширяется к _Bool
    • true расширяется до 1
    • false расширяется до 0
    • __bool_true_false_are_defined расширяется до 1
    Программы, использующие эти макросы, могут отменять и переопределять bool, true, и false.
    Отсюда
     
  15. Chanov

    Chanov Нерд

    Как всегда весна подошла неожиданно, и пока не потекло в гараже буду срочно лепить устройство. Делал только на откачку с дополнительным аварийным датчиком. Вот пока переделал из того что выше было под Launchpad от TI (но для ардуинки тоже должно работать). Если кто перепишет под универсальное применение (и на откачку и на поддержание), то будет не плохо =) Как устройство наваяю в железе, выложу фотографии.

    Код (Text):
    /*
     
    Подключение поплавковых выключателей так же как подключение кнопок
    через 10 килоомный резистор подключеный к земле.
     
    Насос погружной, нижняя часть находится между датчиками B и C.
     
    |   _   |
    |_A | |  |
    |~~~| |~~~|
    |_B | |  |
    |  \o/  |
    |_С      |
    |_________|
     
    */
     
    const int Apin = 8; //PIN верхнего поплавка
    const int Bpin = 9; //PIN нижнего поплавка
    const int Cpin = 10;    //PIN аварийного поплавка
     
    const int PumpRelayPin = 13;    //PIN насосного релле
     
    boolean floatA = 0; //Состояние верхнего поплавка
    boolean floatB = 0; //Состояние нижнего поплавка
    boolean floatC = 0; //Состояние аварийного поплавка
     
    boolean Pumpttriger = 0;    //Текущее состояние насосного релле (1-ON, 0-OFF)
     
    void setup(){
     
      pinMode (Apin,INPUT); //Цифровой PIN верхнего поплавка входной
      pinMode (Bpin,INPUT); //Цифровой PIN нижнего поплавка входной
      pinMode (Cpin,INPUT); //Цифровой PIN аварийного поплавка входной
      pinMode (PumpRelayPin,OUTPUT);    //цифровой PIN насосного релле выходной
     
      // initialize serial communication:
      Serial.begin(9600);
    }
     
    void loop(){
     
      delay(1500);
     
      floatA = digitalRead(Apin);   //Читает состояние PIMа верхнего поплавка и запоминает его
      floatB = digitalRead(Bpin);   //Читает состояние PIMа нижнего поплавка и запоминает его
      floatC = digitalRead(Cpin);   //Читает состояние PIMа аварийного поплавка и запоминает его
     
      if (floatA + floatB == 2) //Условие запуска насоса
      {
        Serial.println("Pump on");
        Pumpttriger=1;
      }
     
      if(floatA+floatB==0)  //Условие Остановки насоса
      {
        Serial.println("Pump off");
        Pumpttriger=0;
      }
     
      //Условие Аварийной Остановки насоса при сработке датчика аварийного поплавка
     
      if (floatC==0) {
        Serial.println("Pump STOP!");
        Pumpttriger=0;
      }
     
      if(Pumpttriger==1)
      {
        digitalWrite(PumpRelayPin,HIGH);
      }
      else
      {
        digitalWrite(PumpRelayPin,LOW);
      }
    }
     
  16. grx1a

    grx1a Гик

    объясните пожалуста что означает универсальное и на откачку и поддержание , ну на простом примере, простыми словами, попробую покубатурить, может что и предумаю, возможно поплавки придется заменить на другие датчики, пока не знаю какие, надо подумать, вы главное объясните на примере, а я подумаю!
     
  17. Chanov

    Chanov Нерд

    Я просто не правильно выразился видимо ... по идее тоже что и в самом первом скетче имел ввиду - "2.Система поддержания воды в емкости"
    Только тот скетч мне вот как то трудно понять ( , поэтому написал свой, просто на откачку ...
    p/s сделал поплавковый узел ... думаю чем соединять датчики и МК ... пока решил стандартной витой парой ... надеюсь за недельку доделаю в железе и повезу в гараж на установку ...
     
  18. grx1a

    grx1a Гик

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

    Chanov Нерд

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

    grx1a Гик

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