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

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

  1. grx1a

    grx1a Гик

    как говорится меняется принцип действия: НОРМАЛЬНО РАЗОМКНУТЫЙ ТИП или НОРМАЛЬНО ЗАМКНУТЫЙ ТИП переключателя
     
  2. grx1a

    grx1a Гик

    NO (normaly open) или NC (normaly closed)
     
  3. grx1a

    grx1a Гик

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

    grx1a Гик

    код остается не изменным как для вариант закатки, так и для варианта откатки, меняется только положение поплавка с магнитом тем самым герконный выключатель меняется по типу своего действия с NC на NO и наоборот
     
  5. roggedhorse

    roggedhorse Гик

    Может вам будет полезна следующая информация:

    Я пользовался вот такой станцией очистки бытовых стоков
    [​IMG]

    http://www.topol-eco.ru/production/topas/topas-8-long/#appearance

    В ней штатно применяется вот такой поплавковый переключатель
    [​IMG]

    http://kipia.ru/catalog/detail/Nivo...hatel_signalizator_urovnya_poplavkovyiy_2484/

    Станция - вещь! Но поплавковый переключатель подвел один раз - не переключился. Вероятно, из-за низкой температуры или по причине внутреннего дефекта. А может из-за корочки льда на поверхности воды в спокойном резервуаре (не исследовал вопрос).

    Поэтому пришлось сделать датчик уровня и добавить немного логики.
    Использовал вот эту схему http://www.masterkit.ru/main/set.php?code_id=209295 для съема данных об уровне воды.
    Собственно сами датчики уровня сделал из ПВХ-трубы холодного водоснабжения, вставив в нее медную трубку, которая служила электродом. Оказалось, что использовать просто металлический погружной электрод нельзя - в результате циркуляции воды на него наматывались волосы и нитки от тряпок, все это свисало с электрода и касалось поверхности воды, в итоге датчик работал некорректно.

    Один был минус у этой системы: я тогда еще не знал про Ардуино :)
     
    Megakoteyka нравится это.
  6. grx1a

    grx1a Гик

    Вот еще один код насосной станции работающей по тому же принципу, только датчиками в этом случае служат датчики холла


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

    */

    #define HL 0
    #define LL 1
    #define PumpRelayPin 8

    boolean floatHL = 0;
    boolean floatLL = 0;

    boolean Pumpttriger = 0;
    boolean Lastpumptriger =0;

    void setup(){
    pinMode (PumpRelayPin,OUTPUT);}

    void loop(){
    int HLRead = analogRead(HL);
    int LLRead = analogRead(LL);
    if(HLRead>520)
    {floatHL=1;}
    else
    {floatHL=0;}
    if(LLRead>520)
    {floatLL=1;}
    else
    {floatLL=0;}

    if(floatHL==1)
    {Pumpttriger=1;}

    if(floatLL==1)
    {Pumpttriger=0;}

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

    grx1a Гик

    Про автоматику защиты пока не думал но , скорее всего думаю надо делать на таймере, если кому надо постораюсь написать добавление
     
  8. NeAndryxa

    NeAndryxa Нерд

    Ребят если использовать насос типа "Малыш" какое лучше всего реле взять?
     
  9. shraik

    shraik Нуб

    Немного доработал...
    Из изменений,
    - добавлена проверка времени работы насоса, при превышении выключает и выдаёт аварию, ждёт ручного сброса.
    -алгоритм проверки срабатывания поплавков дополнен, при сливе бака ждём срабатывания второго поплавка и после этого включаем насос. При заливе в бак ждём срабатывания второго поплавка выключаем насос и переключаем состояние на слив.
    Поплавок С аварийное отключение насоса. Как вариант это последовательное подключение поплавка в колодце "низкий уровень воды" и в баке "переполнение" или одно из двух. При восстановлении состояния С, система продолжает работу в штатном режиме.
    Время срабатывания превышения работы насоса в данном случае ограничено 1,5 часами = delay(5000) * 1079 . Если нужно меняем соответствующие значения получаем нужное время. Также в этом алгоритме идёт обратный отсчёт времени простоя насоса от времени работы. То есть время работы насоса не должно быть больше времени простоя иначе остановка и аварийный режим. Если такая функция не требуется отрезаем...
    Можно подключить сброс переработки насоса через 1.5 часа убираем комментарий.

    const int Apin = 8; //PIN верхнего поплавка
    const int Bpin = 9; //PIN нижнего поплавка
    const int Cpin = 10; //PIN аварийного поплавка
    const int PumpRelayPin = 3; //PIN насосного релле
    const int Pinledavaria = 13; //PIN светодиода авария
    boolean floatA = 0; //Состояние верхнего поплавка
    boolean floatB = 0; //Состояние нижнего поплавка
    boolean floatC = 0; //Состояние аварийного поплавка
    int taim = 0; // Текущее время работы насоса

    boolean Pumpttriger = 0; //Текущее состояние насосного релле (1-ON, 0-OFF)
    boolean Overtime = 0; //Триггер превышения времени работы насоса


    void setup(){
    pinMode (Apin, INPUT); //Цифровой PIN верхнего поплавка входной
    digitalWrite(Apin, HIGH);
    pinMode (Bpin, INPUT); //Цифровой PIN нижнего поплавка входной
    digitalWrite(Bpin, HIGH);
    pinMode (Cpin, INPUT); //Цифровой PIN аварийного поплавка входной
    digitalWrite(Cpin, HIGH);
    pinMode (PumpRelayPin, OUTPUT); //цифровой PIN насосного релле выходной
    digitalWrite(PumpRelayPin, LOW);
    // initialize serial communication:
    Serial.begin(9600);
    }
    void loop(){
    delay(5000);
    floatA = digitalRead(Apin); //Читает состояние PIMа верхнего поплавка и запоминает его
    floatB = digitalRead(Bpin); //Читает состояние PIMа нижнего поплавка и запоминает его
    floatC = digitalRead(Cpin); //Читает состояние PIMа аварийного поплавка и запоминает его
    if ((floatA + floatB == 2)&&(floatC == 1)&&(Overtime ==0)) //Условие запуска насоса
    {
    Pumpttriger=1;
    }
    if((floatA + floatB == 0)&&(floatC == 1)) //Условие Остановки насоса верх и низ сработали
    {
    Pumpttriger=0;
    }
    if((floatA + floatB == 1)&&(floatC == 1)&&(Pumpttriger == 1)) //Условие заполнения бака
    {
    Pumpttriger=1;
    }

    if((floatA + floatB == 1)&&(floatC == 1)&&(Pumpttriger == 0)) //Условие опустошения бака
    {
    Pumpttriger = 0;
    }

    //Условие Аварийной Остановки насоса при срабатывании датчика аварийного поплавка или превышения времени работы насоса
    if ((floatC == 0)||(Overtime == 1)) {
    Pumpttriger=0; //Выключаем насос
    digitalWrite(Pinledavaria,HIGH); //Включаем диод авария
    }
    else
    {
    digitalWrite(Pinledavaria,LOW); //Выключаем диод авария
    }
    if(Pumpttriger == 1) //Управление и подсчёт времени работы насоса
    {
    digitalWrite(PumpRelayPin,LOW);
    taim++;
    }
    else //Обратный отсчёт времени работы насоса
    {
    digitalWrite(PumpRelayPin,HIGH);
    taim--;
    }
    if ((taim > 1079)&&(Overtime == 0)) //и при превышении остановка и авария
    {
    Overtime = 1;
    }
    // if ((taim = 0)&&(Overtime == 1)) // Сброс Overtime
    // {
    // Overtime = 0;
    // }
    if (taim < 0) //если время отрицательная величина обнуляем
    {
    taim=0;
    }
    Serial.print ("Pump = "); // Смотрим что происходит
    Serial.print(Pumpttriger);
    Serial.print(" A = ");
    Serial.print(floatA);
    Serial.print(" B = ");
    Serial.print(floatB);
    Serial.print(" C = ");
    Serial.print(floatC);
    Serial.print(" TimeON = ");
    Serial.print(taim);
    Serial.print(" Overtime = ");
    Serial.println(Overtime);
    }