Контроль уровня воды в бочке для управления насосом. Нужна помощь!

Тема в разделе "Arduino & Shields", создана пользователем lextorlex, 25 сен 2019.

  1. lextorlex

    lextorlex Нерд

    Суть проблемы. Есть бочка на 500л которая наполняется от глубинного насоса. Собрал вот такую схему для управления:
    УРОВЕНЬ.jpg
    и написал вот такой код:
    Код (C++):
    // у датчиков нижнее положение +5в, верхнее 0в.
    #define MIN 2
    #define MAX 3
    #define ALARM 4
    #define RELEY 5
    boolean minlevel =0;
    boolean maxlevel =0;
    boolean alarmlevel =0;

    void setup()
    {
    pinMode(MIN, INPUT_PULLUP);
    pinMode(MAX, INPUT_PULLUP);
    pinMode(ALARM, INPUT_PULLUP);
    pinMode(RELEY, OUTPUT);
    }
    void ReadSensors (boolean *p_minlevel, boolean *p_maxlevel, boolean *p_alarmlevel)
    {
    (*p_minlevel) = digitalRead(MIN);
    (*p_maxlevel) = digitalRead(MAX);
    (*p_alarmlevel) = digitalRead(ALARM);
    }

    void loop() {
    ReadSensors(&minlevel, &maxlevel, &alarmlevel);
    if(minlevel)
    {
    digitalWrite(RELEY, HIGH);
    }

    if(maxlevel)
    {
    digitalWrite(RELEY, LOW);
    }

    if(alarmlevel)
    {
    digitalWrite(RELEY, LOW);
      while(true)
      {
        ;
      }
    }

    }
    Проблема заключается в том, что при подключении все работает нормально. На сигналы реагирует. Включает, выключает, при срабатывании аварийного датчика отключает реле и переходит в бесконечный цикл. В общем, включаю AC/DC шилд в розетку. Насос включается, который отключается по достижению уровня воды датчика maxlevel. Однако по прошествии времени, когда бочка опустошается и датчик minlevel переходит в нижнее положение насос не включается. Это навело меня на мысль что срабатывает датчик alarmlevel, который отключает систему и переводит ее в бесконечный цикл во избежание переполнения. Это было проверено удалением части кода отвечающей за бесконечный цикл:
    Код (C++):
    while(true)
      {
        ;
      }
    Как результат, наполовину наполненная бочка простояла спокойно сутки, а затем включился насос, дойдя до датчика maxlevel, затем через какое-то время снова включился дойдя до датчика alarmlevel, ну и потом включился и начал переливать бочку. В чем может быть причина? P.S. с ардуино и программированием познакомился недавно, можно сказать только начал изучать.
     
  2. DetSimen

    DetSimen Вечный нерд. Модератор

  3. b707

    b707 Гуру

    на третьей. вроде
     
  4. Andrey12

    Andrey12 Гик

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

    Что необходимо реализовать это "защиту от дребезга". Вода при наполнении точно будет немного волнами идти и датчики будут создавать дребезг и дергать насос.
    Второе что необходимо реализовать это защиту по времени, например бочка лопнула, насос будет качать бесконечно. То есть надо засечь время наполнения и если за это время плюс 3% не сработал сенсор уровня то выключать насос.

    Если у вас только тот кусок кода что привели то смысла плодить отдельные функции а все сделать в loop()
     
  5. lextorlex

    lextorlex Нерд

    Неужели этот датчик может притонуть а потом всплыть? Хотя судя по поведению наверное так и происходит.
     
  6. lextorlex

    lextorlex Нерд

    Бесконечный цикл активируется только при срабатывании самого верхнего датчика после того как отключится насос. Заново работать будет только после перезагрузки . Сделано это для того чтобы избежать в системе переполнения. И именно это меня и спасало от переполнения, так как походу поплавок самого нижнего датчика тонул и включал насос и как только падение в бесконечный цикл аварийного датчика было убрано бочка переполнилась. С точки зрения защиты мне кажется это правильное решение, только нужно еще диод подключить который будет загораться если сработал аварийный датчик чтобы видеть что произошел сбой в системе.

    На дребезг тут побольшому счету тоже все равно. Так как верхние датчики посылают сигнал только на отключение и сколько раз контролер прикажет отключить уже отключенное устройство как-то тоже по барабану, ибо сигнал на включение должен прийти не раньше чем опустошиться бочка, а к тому времени вода уже не будет касаться датчика. Насчет времени идея не плохая, но я еще совсем зеленый в этой теме поэтому пока могу писать только простые скетчи. Я только в начале пути))))
     
  7. parovoZZ

    parovoZZ Гуру

    ничего надежнее кондуктометрических датчиков ещё не придумали. Например, ДУ-1-Н.
    Если поплавковый хочется, то это ПДУ-П501 или аналогичный ему. Стоят годами и ничего с ними не происходит.
     
    noevile нравится это.
  8. noevile

    noevile Гик

    я хз конечно, но что мешало взять уже готовый модуль управления насосом с кондуктометрическими датчиками? у того же ОВНА прибамбас стоит 3 тыщи. ну и несколько датчиков ещё прикупить где-то рублей по 250 за штуку. цена вопроса 4 тыщи и забыть навсегда про бочку и насос.
     
    parovoZZ нравится это.
  9. Andrey12

    Andrey12 Гик

    Со светодиодом как раз ничего сложного, пин, например 6, объявим как выход по аналогии с пином реле, в Setup ставим его в LOW а при срабатывании верхнего сенсора в HIGH. Цепляем к нему светодиод через резистор 1кОм

    Да, по такой логике точно будет работать без дребезга :)

    А по схеме я бы еще поставил внешнюю подтяжку пинов а плюсу, резисторами килоом на 10. И еще светодиод работы насоса, хотя в некоторых твердотельных реле есть уже светодиоды которые показывают включено реле или нет.
     
  10. lextorlex

    lextorlex Нерд

    Ничего не мешало, да и не мешает. Однако покупка готовго решения не способствует обучению, понимаете? Мне стало интересна вся эта тема с контролерами и я решил начать изучать. А без реальных задач это как-то скучно. Это мой первый проект который из-за тонуще-всплывающего датчика выделывался с самого начала. Так что я за это время поиска причин написал с десяток разных скетчей паралельно изучая программирование ардуино. Да они все простые, но все были написаны по разному. Так что полученный опыт все равно был полезен. И скорее это была основная цель.
     
    Daniil и Andrey12 нравится это.
  11. noevile

    noevile Гик

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

    lextorlex Нерд

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

    на реле которое у меня стоит диод есть

    А можете объяснить в чем разница между подтяжкой резистора ардуино через INPUT_PULLUP и внешней подтяжкой?
     
  13. lextorlex

    lextorlex Нерд

    О том что бесконечных циклов лучше избегать я уже понял. Но чем бесконечный цикл плох в этом случае, в этой простой программе? Понятно что если захочу улучшать функционал, подключать различные светодиоды для отслеживания состояния, кнопку для принудительного включения, тайминг, то бесконечный цикл будет злом. Но на этом этапе это, имхо, простое и изящное решение для обеспечения элементарной защиты от перелива, которое работает, в котором только не хватало диода для отслеживания срабатывания аварийного датчика.
     
  14. noevile

    noevile Гик

    плох тем что развивает раздолбайство. мол и так сойдёт. работает ведь.
     
  15. lextorlex

    lextorlex Нерд

    Я согласен. Но я только как два месяца открыл для себя вот это все. У меня можно сказать нет вообще никакого опыта. Поэтому я стараюсь идти от простого к сложному. Исправлю проблему с датчиками и если будет работать на этом уровне, то тогда можно будет усложнять и идти дальше. А так какой смысл городить огород если на этом элементарном уровне проблема не решена?
     
  16. noevile

    noevile Гик

    на этом элементарном уровне надо сначала теорию изучать. а не бросаться с датчиком на бочку в бесконечном цикле "и так сойдёт".
     
    parovoZZ нравится это.
  17. lextorlex

    lextorlex Нерд

    Ладно, ладно. Пойду пока книжку почитаю. Других датчиков все равно пока нет. ;)
     
  18. parovoZZ

    parovoZZ Гуру

    есть еще РОС301. Примерно в эти же деньги.
     
  19. parovoZZ

    parovoZZ Гуру

    Перед этим надо изучить булеву алгебру, принцип построения машинных алгоритмов. А через пару лет можно браться за МК.
     
  20. Radius

    Radius Гик

    У меня достаточно надежно работали простейшие датчики из обычных проводов. Если у вас вода не дистиллированная, то она проводит электрический ток. Поэтому берете самый длинный провод и подключаете его к "Земле" и еще три провода на те уровни которые вам необходимы. Провода через резисторы 100 Ом ( на всякий случай) подключаете к входам Ардуино. Входы принудительно подтягиваете к +5В либо внутренним резистором, либо внешним 100 кОм. Когда уровень воды поднимается до нужного провода, цепь замыкается на "землю".