Регулятор давления для скважены

Тема в разделе "Arduino & Shields", создана пользователем Дмитрий76, 5 апр 2017.

  1. qwone

    qwone Гик

    Что бы вам легче разбираться в этом стиле скину простую программу Пакет здесь https://yadi.sk/d/jwV-7Ejz3GmADU
    Код (C++):
    /* class_Led_A.ino
      #1 светодиод ->13
      #2 кнопка 1 -> 4 вкл светодиод
      #3 кнопка 2 -> 5 выкл светодиод
      #4 кнопка 3 -> 6 светодиод мигает
    */

    // шина выхода
    #include "Cl_digitalOut.h"
    Cl_digitalOut Out(13);
    // шина входа
    #include "Cl_digitalIn.h"
    Cl_digitalIn In[] = {
      Cl_digitalIn(4), // 0- кнопка 1  вкл светодиод
      Cl_digitalIn(5), // 1- кнопка 2  выкл светодиод
      Cl_digitalIn(6)  // 2- кнопка 3 светодиод мигает
    };
    // #1 светодиод
    #include "Cl_led.h"
    Cl_led *Led1 = new Cl_led(&Out, 1); // подключить светодиод
    // #2 кнопка
    void Do_Btn1() {
      Led1->ON(); // включит светодиод
    }
    void Do_Btn2() {
      Led1->OFF(); // выключит светодиод
    }
    void Do_Btn3() {
      Led1->blink(500); // мигать 0.5 горит -0.5 нет
    }
    #include "Cl_do_btn.h"
    Cl_do_btn * Btn[] =  {
      new Cl_do_btn(&In[0], 0,    // шина, уровень при наж кнопки
      & Do_Btn1   ),              // какую функцию надо сделать
      new Cl_do_btn(&In[1], 0,    // шина, уровень при наж кнопки
      & Do_Btn2   ),              // какую функцию надо сделать
      new Cl_do_btn(&In[2], 0,    // шина, уровень при наж кнопки
      & Do_Btn3   )               // какую функцию надо сделать
    };
    void setup() {
      Led1->setup();
      for (byte i = 0; i < 3; i++)
        Btn[i]->setup();
    }

    void loop() {
      Led1->loop();
      for (byte i = 0; i < 3; i++)
        Btn[i]->loop();
    }
     
  2. Дмитрий76

    Дмитрий76 Нерд

    Проект супер. Но я в нем полный "0" чем глубже в лес тем я тупее.:(
     
  3. Дмитрий76

    Дмитрий76 Нерд

    Спасибо. В выходные будет чем заняться.
     
  4. Дмитрий76

    Дмитрий76 Нерд

    Подскажи еще пожалуйста. При старте на дисплее моргает ON:400 и горит только светодиод работы насоса. На давление не реагирует. пока не нажмешь кнопку авто-мануал.
    После работает нормально.
     
  5. qwone

    qwone Гик

    мигает 400 это установка когда насос надо вкл. дальше нажать кнопку Sel будет мигать OFF 700 , следующее нажатие Sel ничего не мигает. И так по кругу. Когда мигает то можно кнопками Up Down менять значения. Понятно что пока в EPROM они не пишутся. Программа то еще не доработаная. Надо же не только ее написать по алгоритму, но и подобрать для удобства пользования. Например что бы прибавить или отнять надо щелкнуть по кнопке. А 100 раз нажимать это мазохизм.

    eсть там переменая line . так она выбирает какую строку в меню задействовать. 0 просто показ. 1 менять нижнюю планку для вкл насоса 2 менять верхнюю планку отк насоса.
     
  6. qwone

    qwone Гик

    Вариант 3 Пакет https://yadi.sk/d/Vdl8mqie3GmWPZ
    Код (C++):
    /* pressure_swith_v3.ino
      светодиод работа насоса  -> 13  1  вкл / 1 откл
      реле насоса              -> 12  1  вкл / 1 откл
      датчик давления          -> A1  0 нажата / 1 нет
      кнопка "SELECT"          -> 2   0 нажата / 1 нет
      кнопка "DOWN"          " -> 3   0 нажата / 1 нет
      кнопка "UP"              -> 4   0 нажата / 1 нет
      кнопка "Manual OFF_PUMP" -> 5   0 нажата / 1 нет
      кнопка "Manual ON_PUMP"  -> 6   0 нажата / 1 нет

      0 экран - величина давления / режим индик реж авто-ручной / вкл-откл насос
      1 экран уст реж авто-ручной / величина вкл насоса/ величина откл насоса
    */

    //#1 menu
    #include "Cl_menu_A.h"

    // шины выхода
    #include "Cl_digitalOut.h"
    Cl_digitalOut Out[] = {
      Cl_digitalOut(12) , // 0- выход 10  реле насоса
      Cl_digitalOut(13)   // 1- выход 11  работа насоса
    };
    // шины входа аналоговые
    #include "Cl_analogIn.h"
    Cl_analogIn aIn = Cl_analogIn(A1); // аналог.вход датчика давления
    // шины входа цифровые
    #include "Cl_digitalIn.h"
    Cl_digitalIn In[] = {
      Cl_digitalIn(2), //  0- вход 2  кнопка "SET"
      Cl_digitalIn(3), //  1- вход 3  кнопка "DOWN"
      Cl_digitalIn(4), //  2- вход 4  кнопка "UP"
      Cl_digitalIn(5), //  3- вход 5  кнопка "Manual OFF_PUMP"
      Cl_digitalIn(6)  //  4- вход 6  кнопка "Manual ON_PUMP"
    };
    // насос
    #include "Cl_led.h"
    Cl_led * Pump = new Cl_led(&Out[0], 0); //0- реле насоса
    // светодиод
    Cl_led * Led  = new Cl_led(&Out[1], 1); //0- работа насоса
    // кнопки
    void Do_SELECT() {
      Menu_select();
    }
    void Do_DOWN() {
      Menu[line]->down();
    }
    void Do_UP() {
      Menu[line]->up();
    }
    void Do_MANUAL_OFF_PUMP() {
      if (!mode_Auto) {
        Pump->OFF();
        Pump_On = 0;
        Led->OFF();
      }
    }
    void Do_MANUAL_ON_PUMP() {
      if (! mode_Auto) {
        Pump->ON();
        Pump_On = 1;
        Led->blink(200); // мигать 0.2 сек вкл 0.2 сек выкл
      }
    }
    #include "Cl_do_btn.h"
    Cl_do_btn * Btn[] =  {
      new Cl_do_btn(&In[0] , 0, &Do_SELECT         ) , //кнопка "SELECT"          0 нажата / 1 нет
      new Cl_do_btn(&In[1] , 0, &Do_DOWN           ) , //кнопка "DOWN"            0 нажата / 1 нет
      new Cl_do_btn(&In[2] , 0, &Do_UP             ) , //кнопка  "ON_PUMP"        0 нажата / 1 нет
      new Cl_do_btn(&In[3] , 0, &Do_MANUAL_OFF_PUMP) , //кнопка "Manual OFF_PUMP" 0 нажата / 1 нет
      new Cl_do_btn(&In[4] , 0, &Do_MANUAL_ON_PUMP )   //кнопка "Manual ON_PUMP"  0 нажата / 1 нет
    };
    // датчик давления
    void Do_change();
    #include "Cl_do_analog_sens.h"
    Cl_do_analog_sens * Sens = new Cl_do_analog_sens(&aIn, &Do_change);
    void Do_change() {
      pressure = Sens->value;
      if (mode_Auto) {
        if (pressure <= pressure_ON && ! Pump_On) {
          Pump->ON();
          Pump_On = 1;
          Led->blink(); // мигать 0.5 сек вкл 0.5 сек выкл
        }
        if (pressure >= pressure_OFF && Pump_On) {
          Pump->OFF();
          Pump_On = 0;
          Led->OFF();
        }
      }
    }
    void setup() {
      Menu_setup();// инициализация дисплея
      Sens->setup();
      Pump->setup();
      Led->setup();
      for (byte i = 0; i < 5; ++i)Btn[i]->setup();
      Pump_On = 0;
      Led->OFF();
    }
    void loop() {
      Menu_viev();// вывод текущей информации
      Sens->loop();
      Pump->loop();
      Led->loop();
      for (byte i = 0; i < 5; ++i)Btn[i]->loop();
    }
     
  7. Дмитрий76

    Дмитрий76 Нерд

    Добрый день. Спасибо. Вы убрали 1 светодиод и добавили 1 кнопку. Теперь при работе насоса моргает светодиод. Но реле не включается!

    У вас получается что вы пишите универсальные библиотеки и их можно использовать под любой проект.
     
  8. qwone

    qwone Гик

    Самая большая сложность при программировании это не само программирование. А вот запрограммировать удобное устройство. Так что после написания программы надо ее"обрабатывать напильником"- бувально менять константы, корректировать отображение и куча других вещей. Тем более "сейчас заказчик видит так", а потом после реализации видит что это "не очень". Это я все говорю , что нужны более менее унивестальные библиотеки. Вот и приходится писать самому или пользоваться чужими. Вот чужих подходящих для меня я не нашел.
    ПС: Попробуйте заменить головной файл на этот.
    Код (C++):
    /* pressure_swith_v3.ino https://yadi.sk/d/Vdl8mqie3GmWPZ
      светодиод работа насоса  -> 13  1  вкл / 1 откл
      реле насоса              -> 12  1  вкл / 1 откл
      датчик давления          -> A1  0 нажата / 1 нет
      кнопка "SELECT"          -> 2   0 нажата / 1 нет
      кнопка "DOWN"          " -> 3   0 нажата / 1 нет
      кнопка "UP"              -> 4   0 нажата / 1 нет
      кнопка "Manual OFF_PUMP" -> 5   0 нажата / 1 нет
      кнопка "Manual ON_PUMP"  -> 6   0 нажата / 1 нет

      0 экран - величина давления / режим индик реж авто-ручной / вкл-откл насос
      1 экран уст реж авто-ручной / величина вкл насоса/ величина откл насоса
    */

    //#1 menu
    #include "Cl_menu_A.h"

    // шины выхода
    #include "Cl_digitalOut.h"
    Cl_digitalOut Out[] = {
      Cl_digitalOut(12) , // 0- выход 10  реле насоса
      Cl_digitalOut(13)   // 1- выход 11  работа насоса
    };
    // шины входа аналоговые
    #include "Cl_analogIn.h"
    Cl_analogIn aIn = Cl_analogIn(A1); // аналог.вход датчика давления
    // шины входа цифровые
    #include "Cl_digitalIn.h"
    Cl_digitalIn In[] = {
      Cl_digitalIn(2), //  0- вход 2  кнопка "SET"
      Cl_digitalIn(3), //  1- вход 3  кнопка "DOWN"
      Cl_digitalIn(4), //  2- вход 4  кнопка "UP"
      Cl_digitalIn(5), //  3- вход 5  кнопка "Manual OFF_PUMP"
      Cl_digitalIn(6)  //  4- вход 6  кнопка "Manual ON_PUMP"
    };
    // насос
    #include "Cl_led.h"
    Cl_led * Pump = new Cl_led(&Out[0], 0); //0- реле насоса
    // светодиод
    Cl_led * Led  = new Cl_led(&Out[1], 1); //0- работа насоса
    // кнопки
    void Do_SELECT() {
      Menu_select();
    }
    void Do_DOWN() {
      Menu[line]->down();
    }
    void Do_UP() {
      Menu[line]->up();
    }
    void Do_MANUAL_OFF_PUMP() {
      if (!mode_Auto) {
        Pump->OFF();
        Pump_On = 0;
        Led->OFF();
      }
    }
    void Do_MANUAL_ON_PUMP() {
      if (! mode_Auto) {
        Pump->ON();
        Pump_On = 1;
        Led->blink(200); // мигать 0.2 сек вкл 0.2 сек выкл
      }
    }
    #include "Cl_do_btn.h"
    Cl_do_btn * Btn[] =  {
      new Cl_do_btn(&In[0] , 0, &Do_SELECT         ) , //кнопка "SELECT"          0 нажата / 1 нет
      new Cl_do_btn(&In[1] , 0, &Do_DOWN           ) , //кнопка "DOWN"            0 нажата / 1 нет
      new Cl_do_btn(&In[2] , 0, &Do_UP             ) , //кнопка  "ON_PUMP"        0 нажата / 1 нет
      new Cl_do_btn(&In[3] , 0, &Do_MANUAL_OFF_PUMP) , //кнопка "Manual OFF_PUMP" 0 нажата / 1 нет
      new Cl_do_btn(&In[4] , 0, &Do_MANUAL_ON_PUMP )   //кнопка "Manual ON_PUMP"  0 нажата / 1 нет
    };
    // датчик давления
    void Do_change();
    #include "Cl_do_analog_sens.h"
    Cl_do_analog_sens * Sens = new Cl_do_analog_sens(&aIn, &Do_change);
    void Do_change() {
      pressure = Sens->value;
      if (mode_Auto) {
        if (pressure <= pressure_ON && ! Pump_On) {
          Pump->ON();
          Pump_On = 1;
          Led->blink(); // мигать 0.5 сек вкл 0.5 сек выкл
        }
        if (pressure >= pressure_OFF && Pump_On) {
          Pump->OFF();
          Pump_On = 0;
          Led->OFF();
        }
      }
    }
    void setup() {
      Menu_setup();// инициализация дисплея
      Sens->setup();
      Pump->setup();
      Led->setup();
      for (byte i = 0; i < 5; ++i)Btn[i]->setup();
      Pump_On = 0;
      Led->OFF();
    }
    void loop() {
      Menu_viev();// вывод текущей информации
      Sens->loop();
      Pump->loop();
      Led->loop();
      for (byte i = 0; i < 5; ++i)Btn[i]->loop();
    }
    ПС: Насос на 12 ноге.
    Cl_led * Pump =new Cl_led(&Out[0], 0);//0- реле насоса это если насос вкл когда на выводе 0

    Cl_led * Pump =new Cl_led(&Out[0], 1);//0- реле насоса тоже но вкл насос когда на выводе 1
    Ай блин там еще отображение на экране. А у вас экрана нет. :(
     
    Последнее редактирование: 8 апр 2017
  9. Дмитрий76

    Дмитрий76 Нерд

    Пин не посмотрел. Дисплей уже есть. Пришел из китая. LCD1602.
     
  10. Дмитрий76

    Дмитрий76 Нерд

    qwone подскажи пожалуйста. При старте ардуино давление показывает маленькое но реле не включается и еще когда включен ручной режим и включаешь насос давление показывает для примера 402 а когда выключаешь то 396.
     
  11. qwone

    qwone Гик

    в файле Cl_do_analog_sens.h
    строка5 : const byte hysteresis = 5; // +- точность с которой считаем что ничего не изменилось
    и строка 20-21 :
    aaa = wire->transferIn();
    if (! bounce && ((value < (aaa - hysteresis)) || (value > (aaa + hysteresis))) ) { // если прошел фронт изм на выводн
    В общем если давление изменится меньше чем на 5, то считать что ничего не менялось.
    Или я не понял вас. У вас что чем выше давление, тем ниже величина уровня на выв А1
     
  12. qwone

    qwone Гик

    Я прикидывал такую модель. Есть рессивер, есть компрессор воздуха. Если давление ниже опред уровня, то вкл насос. Когда давление накачало ресивер до опрел величины давления то насос выкл. И пока давление не просело до опред величины насос не вкл. Разумеется эти величины можно менять. Но (1) есть мин и мак величины за которые не надо выставлять. (2) велична вкл насоса должна быть ниже величины выкл насоса. и у меня в файле Cl_menu_A.cpp строка 19
    const byte delta = 5; // минимальное расстояние между pressure_ON и pressure_OFF
    это величина между этими величинами.
     
  13. Дмитрий76

    Дмитрий76 Нерд

    получается заданно 400. потенциометром делаю 301. после перезагрузки ардуино реле не включается.
    при переключении manual - auto тоже самое
     

    Вложения:

  14. qwone

    qwone Гик

  15. Дмитрий76

    Дмитрий76 Нерд

    при 302 если перегрузить дуину то реле сработает? если не трогать потенциометр. сразу после перезагрузки.
     
  16. Дмитрий76

    Дмитрий76 Нерд

    Вот видео. https://yadi.sk/i/sXhwtXX83Gmuzh. если изменить значение хотя бы на единицу то реле включится.
     
  17. Дмитрий76

    Дмитрий76 Нерд

  18. qwone

    qwone Гик

    Смени на это
    Код (C++):
    /* pressure_swith_v3.ino
      светодиод работа насоса  -> 13  1  вкл / 1 откл
      реле насоса              -> 12  1  вкл / 1 откл
      датчик давления          -> A1  0 нажата / 1 нет
      кнопка "SELECT"          -> 2   0 нажата / 1 нет
      кнопка "DOWN"          " -> 3   0 нажата / 1 нет
      кнопка "UP"              -> 4   0 нажата / 1 нет
      кнопка "Manual OFF_PUMP" -> 5   0 нажата / 1 нет
      кнопка "Manual ON_PUMP"  -> 6   0 нажата / 1 нет

      0 экран - величина давления / режим индик реж авто-ручной / вкл-откл насос
      1 экран уст реж авто-ручной / величина вкл насоса/ величина откл насоса
    */

    //# menu
    #include "Cl_menu_A.h"
    // шины выхода
    #include "Cl_digitalOut.h"
    Cl_digitalOut Out[] = {
      Cl_digitalOut(12) , // 0- выход 10  реле насоса
      Cl_digitalOut(13)   // 1- выход 11  работа насоса
    };
    // шины входа аналоговые
    #include "Cl_analogIn.h"
    Cl_analogIn aIn = Cl_analogIn(A1); // аналог.вход датчика давления
    // шины входа цифровые
    #include "Cl_digitalIn.h"
    Cl_digitalIn In[] = {
      Cl_digitalIn(2), //  0- вход 2  кнопка "SET"
      Cl_digitalIn(3), //  1- вход 3  кнопка "DOWN"
      Cl_digitalIn(4), //  2- вход 4  кнопка "UP"
      Cl_digitalIn(5), //  3- вход 5  кнопка "Manual OFF_PUMP"
      Cl_digitalIn(6)  //  4- вход 6  кнопка "Manual ON_PUMP"
    };
    // насос
    #include "Cl_led.h"
    Cl_led * Pump = new Cl_led(&Out[0], 0); //0- реле насоса
    // светодиод
    Cl_led * Led  = new Cl_led(&Out[1], 1); //0- работа насоса
    // кнопки
    void Do_SELECT() {
      Menu_select();
    }
    void Do_DOWN() {
      Menu[line]->down();
    }
    void Do_UP() {
      Menu[line]->up();
    }
    void Do_MANUAL_OFF_PUMP() {
      if (!mode_Auto) {
        Pump->OFF();
        Pump_On = 0;
        Led->OFF();
      }
    }
    void Do_MANUAL_ON_PUMP() {
      if (! mode_Auto) {
        Pump->ON();
        Pump_On = 1;
        Led->blink(200); // мигать 0.2 сек вкл 0.2 сек выкл
      }
    }
    #include "Cl_do_btn.h"
    Cl_do_btn * Btn[] =  {
      new Cl_do_btn(&In[0] , 0, &Do_SELECT         ) , //кнопка "SELECT"          0 нажата / 1 нет
      new Cl_do_btn(&In[1] , 0, &Do_DOWN           ) , //кнопка "DOWN"            0 нажата / 1 нет
      new Cl_do_btn(&In[2] , 0, &Do_UP             ) , //кнопка  "ON_PUMP"        0 нажата / 1 нет
      new Cl_do_btn(&In[3] , 0, &Do_MANUAL_OFF_PUMP) , //кнопка "Manual OFF_PUMP" 0 нажата / 1 нет
      new Cl_do_btn(&In[4] , 0, &Do_MANUAL_ON_PUMP )   //кнопка "Manual ON_PUMP"  0 нажата / 1 нет
    };
    // датчик давления
    void Do_change();
    #include "Cl_do_analog_sens.h"
    Cl_do_analog_sens * Sens = new Cl_do_analog_sens(&aIn, &Do_change);
    void Do_change() {
      pressure = Sens->value;
      if (mode_Auto) {
        if (pressure <= pressure_ON ) {
          Pump->ON();
          Pump_On = 1;
          Led->blink(); // мигать 0.5 сек вкл 0.5 сек выкл
        }
        if (pressure >= pressure_OFF ) {
          Pump->OFF();
          Pump_On = 0;
          Led->OFF();
        }
      }
    }
    void setup() {
      Menu_setup();// инициализация дисплея
      Sens->setup();
      Pump->setup();
      Led->setup();
      for (byte i = 0; i < 5; ++i)Btn[i]->setup();
      Pump_On = 0;
      Led->OFF();
      Do_change();// <----- поставил сюда
    }
    void loop() {
      Menu_viev();// вывод текущей информации
      Sens->loop();
      Pump->loop();
      Led->loop();
      for (byte i = 0; i < 5; ++i)Btn[i]->loop();
    }
     
  19. Дмитрий76

    Дмитрий76 Нерд

    Это получается вы добавили в сетап "Do_change();"
     
  20. Дмитрий76

    Дмитрий76 Нерд

    после смены режима авто - манул - авто тоже не включается