Регулятор давления.

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем varvik85, 27 янв 2013.

  1. varvik85

    varvik85 Нерд

    Здравствуйте уважаемые знатоки и ветераны ARDUINO.Появилась очень большая необходимость в регуляторе давления насосной станции.От регулятора требуется выводить показания давления на дисплей, а так же возможность устанавливать нужное значение давления(которое так же отображалось бы на дисплее) дойдя до которого насос бы отключался.Планируемый датчик давления MPX2010DP.Не нашел ничего подобного,даже описания простого вольтметра,код которого можно было бы приспособить.Примеров HELLO WORLD куча ну а дальше???Помогите пожалуйста разобраться,задача для меня очень сложная.Может маленькие кусочки кода которые можно использовать или подобные проекты,за любую помощь буду очень признателен!!!
     
  2. Unixon

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

    Да тут дело не в коде. Весь код простейшего вольтметра состоит из одного вызова analogRead().
    У вас датчик с выходом по напряжению, у которого полная шкала 25mV, значит нужно либо ставить операционынй усилитель (например, тот же LM358) и растягивать 25mV до Vref (5.0V), либо делителем напряжения получать нужный Vref из Vcc, но во втором случае шкала поменяется для всего АЦП, что очень не удобно, если у вас есть еще и другие сенсоры. Кроме того, питается датчик от 10V..16V при токе 6mA, чтобы запитать его от ардуины придется воспользоваться повышающим DC-DC преобразователем типа MAX662 (12V).
     
  3. varvik85

    varvik85 Нерд

    Да про операционный усилитель я тоже думал,но меня не эта часть больше волнует,а то что я не знаю как привязать изменения напряжения к дисплею (точнее как их выводить) + возможность выставить нужный порог при котором отключался и включался компрессор,например 2МПа когда накачивает - выключается, падает до 1.5МПа включается снова,причем главное чтобы была возможность регулировки нижнего и верхнего порога включения/выключения(например 4-6 кнопками)
     
  4. varvik85

    varvik85 Нерд

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

    /*
    Voltmeter
    Voltmeter base on voltage divider concept.

    Code based on: http://www.clarenceho.net:8123/blog/articles/2009/05/17/arduino-test-voltmeter
    Coded by: arduinoprojects101.com
    */

    // include the library code:
    #include <LiquidCrystal.h>

    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

    // variables for input pin and control LED
    int analogInput = 1;
    float vout = 0.0;
    float vin = 0.0;
    float R1 = 50000.0; // !! resistance of R1 !!
    float R2 = 4400.0; // !! resistance of R2 !!

    // variable to store the value
    int value = 0;

    void setup(){
    // declaration of pin modes
    pinMode(analogInput, INPUT);

    // set up the LCD's number of columns and rows:
    lcd.begin(16, 2);
    lcd.print("Vin=");
    }

    void loop(){
    // read the value on analog input
    value = analogRead(analogInput);

    vout = (value * 5.0) / 1024.0;
    vin = vout / (R2/(R1+R2));

    // print result to lcd display
    lcd.setCursor(4, 0);
    lcd.print(vin);
    lcd.print("V");

    // sleep...
    delay(500);
    }
     
  5. Unixon

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

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

    Внутри loop() будет конечный автомат (см. вики, раздел "программирование"), обрабатывающий все события в системе (нажатия кнопок, выход давления за заданный интервал). Пересчет напряжения в давление - через чувствительность датчика (см. даташит) и коэф. усиления входного ОУ, если он есть, и значение Vref (по умолчанию 5V). Вывод на дисплей - как в примере.

    Для редактирования настроек хватит трех кнопок: "выбор", "+", "-". Всего будет 3 состояния: "работа", "установка нижнего порога", "установка верхнего порога". Альтернативно, можно использовать 4 кнопки: "+P1", "-P1", "+P2", "-P2" и всего одно состояние, т.е. по сути просто главный цикл. Еще вариант: "автомат/ручное", "вкл/выкл", "+P1", "-P1", "+P2", "-P2", но логика переключений будет немного сложнее.
     
    nailxx нравится это.
  6. varvik85

    varvik85 Нерд

    Подумал использовать переключатель "нижний предел давления" "верхний предел" и кнопки вверх вниз для регулировки выбранного значения.значение с датчика в 10МВ будт соответствовать 0,1МПа предел измерения 5MПа.Как переделать эту болванку программы немного не понял (((
     
  7. varvik85

    varvik85 Нерд

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

    #include <LiquidCrystal.h>
    #define SW_VERH 8 // Переключатель верхний придел давления
    #define SW_NIZ 9 // Переключатель нижний предел давления
    #define BUT_UP 18//Кнопка вверх
    #define BUT_DOWN 19 // Кнопка вниз
    #define RLY_COMPRESSOR 14 // Реле компрессора

    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

    // variables for input pin and control LED
    int analogInput = 1;
    float vout = 0.0;
    float vin = 0.0;
    float R1 = 50000.0; // сопротивления пожалуй оставлю
    float R2 = 4400.0; // буду менять эти значения когда буду настраивать
    int value = 0; // переменная для хнанения значений если можно прокоментируйте зачем она нужна
    //устанавливаем пины
    pinMode(analogInput, INPUT);
    pinMode(SW_VERH, INPUT);
    pinMode(SW_NIZ, INPUT);
    pinMode(BUT_UP, INPUT);
    pinMode(BUT_DOWN, INPUT);
    pinMode(RLY_COMPRESSOR, OUTPUT)
    // Инициализируем дисплей
    lcd.begin(16, 2);
    lcd.print("Vin=");
    }
    void loop(){
    // считываем аналоговый вход
    value = analogRead(analogInput);

    vout = (value * 5.0) / 1024.0;
    vin = vout / (R2/(R1+R2));

    // выводим результат на дисплей
    lcd.setCursor(4, 0);
    lcd.print(DAVLENIYE);
    lcd.print("MPa");
     
  8. varvik85

    varvik85 Нерд

    хотелось бы в верхней строке дисплея выводить показания с датчика а в нижей строке нижний включения и верхний порог отключения давления,как это сделать?
     
  9. karvet

    karvet Нерд

    lcd.setCursor(X, Y);
    X=0..15 - позиция в строке
    Y=0,1 - строка. 0- верхняя, 1 нижняя.
    Ставите курсор на нужную строчку и выводите lcd.print("Что Вам надо");
     
  10. varvik85

    varvik85 Нерд

    спасибо! а как теперь мне привязать кнопки? чтоб при каждом нажатии вверх или вниз изменялись в большую или меньшую сторону значения выводились на дисплей + как ко всему этому примастерить реле чтоб программа сравнивала значения и если они совпадали например с нижним то включалось а если совпадало с верхним отключалось?
     
  11. Unixon

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

    Код (Text):
    #include <LiquidCrystal.h>
     
    const byte PIN_BTN_LOWER_LIMIT = 8;
    const byte PIN_BTN_UPPER_LIMIT = 9;
    const byte PIN_BTN_UP         = 18;
    const byte PIN_BTN_DOWN     = 19;
    const byte PIN_RLY_COMPRESSOR  = 14;
    const byte PIN_SENSE_PRESSURE  = A1;
     
    const int BTN_DELAY = 100;
    const int CTL_DELAY = 100;
     
    const float SENSETIVITY = 0.025; // 25mV / MPa
    const float AREF_VOLTAGE = 5.0;
    const float AMPLIFICATION = 1.0;
     
    const float ADC_TO_MPA = AREF_VOLTAGE/1024.0/AMPLIFICATION/SENSETIVITY;
     
    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
     
    const float inc_pressure = 0.05;
    float inf_pressure = 0.05;
    float min_pressure = 0.10;
    float max_pressure = 1.00;
    float sup_pressure = 2.00;
     
    byte selected_limit = LOW;
     
    // returns pressure in MPa
    float pressure()
    {
    float value = analogRead(PIN_SENSE_PRESSURE);
    return value*ADC_TO_MPA;
    }
     
    void setup()
    {
    pinMode(PIN_SENSE_PRESSURE, INPUT);
    pinMode(PIN_BTN_LOWER_LIMIT, INPUT);
    pinMode(PIN_BTN_UPPER_LIMIT, INPUT);
    pinMode(PIN_BTN_UP, INPUT);
    pinMode(PIN_BTN_DOWN, INPUT);
    pinMode(PIN_RLY_COMPRESSOR, OUTPUT);
    //
    lcd.begin(16,2);
    //
     
    }
     
    void loop()
    {
    // process controls
    if (digitalRead(PIN_BTN_LOWER_LIMIT))
    {
      selected_limit = LOW;
    }
    else if (digitalRead(PIN_BTN_UPPER_LIMIT))
    {
      selected_limit = HIGH;
    }
    else if (digitalRead(PIN_BTN_UP))
    {
      if (selected_limit)
      {
      max_pressure += inc_pressure;
      if (max_pressure>sup_pressure) max_pressure = sup_pressure;
      }
      else
      {
      min_pressure += inc_pressure;
      if (min_pressure>=max_pressure) min_pressure = max_pressure-inc_pressure;
      }
    }
    else if (digitalRead(PIN_BTN_DOWN))
    {
      if (selected_limit)
      {
      max_pressure -= inc_pressure;
      if (max_pressure<=min_pressure) max_pressure = min_pressure+inc_pressure;
      }
      else
      {
      min_pressure -= inc_pressure;
      if (min_pressure<inf_pressure) min_pressure = inf_pressure;
      }
    }
    // check valve state
    float p = pressure();
    if (p<=min_pressure)
    {
      digitalWrite(PIN_RLY_COMPRESSOR, HIGH);
    }
    if (p>=max_pressure)
    {
      digitalWrite(PIN_RLY_COMPRESSOR, LOW);
    }
    // display
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Pressure: "); lcd.print(p); lcd.print("MPa");
    lcd.print("Valve: "); if (digitalRead(PIN_RLY_COMPRESSOR)) lcd.print("ON"); else lcd.print("OFF");
    lcd.setCursor(0,1);
    lcd.print("Min.Pressure: "); lcd.print(min_pressure); lcd.print("MPa, ");
    lcd.print("Max.Pressure: "); lcd.print(max_pressure); lcd.print("MPa");
    //
    delay(CTL_DELAY);
    }
    Редактор сообщений форума опять съел всё форматирование :mad:
     
    varvik85 нравится это.
  12. varvik85

    varvik85 Нерд

    ОГО!!!!!!!! Да Вы мне готовую программу написали!!!!!!!Спасибо огроменное!
     
  13. Unixon

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

    Это просто один из примеров как оно в принципе должно выглядеть...
     
    varvik85 нравится это.
  14. varvik85

    varvik85 Нерд

    Спасибо!
     
  15. varvik85

    varvik85 Нерд

    Давайте распишу подробнее.

    устройство включается и опрашивается датчик давления(подключенный к аналоговому входу) который при увеличении давления на 0,1МПа увеличивает напряжение на 100МВ которое измеряется программой и переводится в МПа и вывоится на дисплей в верхней строке

    Далее считывается память в которой сохранено значения выбраного нижнего и верхнего порога срабатывания насоса,значения выводятся на дисплей в нижней строке

    если значение с датчика меньше или равно минимальному значению например 1МПа то насос включается далее как только наберет верхнее значение например 2МПа выключается,если при включении давление больше или равно верхниму пределу насос естественно не включается.

    если при включении давление больше заданного на 0,5 МПа выводить сигнал об переизбытке давления

    если при включении насоса давление не начнет нарастать в течении некоторого времини (около 20сек/МПа) выводиь соообщение о нарушении работы насоса.

    регулировка порога срабатывания переключив тумблер в режим "включение" и "выключение" под которыми я подрузомеваю неижние и верхние пороги включения/отключения насоса и кнопками вверх и вниз изменять эти значения. которые занесутся в память и будут хранится там даже после отключения устройства.
     
  16. varvik85

    varvik85 Нерд

    очень здоровский код,но у Вас совпадают пины входных кнопок и пины дисплея,как происходит управление кнопками и вывод арифметического действия произведенного ими на дисплей тоже не совсем мне понятно
     
  17. Unixon

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

    Ой, забыл я про них. Не знаю на какие пины вы будете на самом деле вешать дисплей, просто скопировал номера пинов из вашего кода.
     
    varvik85 нравится это.
  18. karvet

    karvet Нерд

    Я бы даже избавился бы от одной из кнопок - PIN_BTN_LOWER_LIMIT или PIN_BTN_UPPER_LIMIT, одной хватит. Нажата кнопка - верхний предел меняем, не нажата - нижний.
    То что совпадают пины, можно же поменять.
    Насчет арифметики в коде вроде все понятно:
    ...
    else if (digitalRead(PIN_BTN_UP))- если нажата PIN_BTN_UP
    if (selected_limit) - и выбран верхний предел
    {
    max_pressure += inc_pressure; - увеличить предел max_pressure на величину inc_pressure
    ...

    lcd.clear();- очистить экран
    ....
    lcd.setCursor(0,1); - установить курсор в левый нижний угол экрана
    lcd.print("Min.Pressure: "); lcd.print(min_pressure); lcd.print("MPa, ");- вывести нижний предел
    lcd.print("Max.Pressure: "); lcd.print(max_pressure); lcd.print("MPa");- верхний предел
     
    varvik85 нравится это.
  19. Unixon

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

    Я выше предлагал три других варианта клавиатуры:

    1) [select (min/max/none)] [+] [-]
    2) [+max] [-max] [+min] [-min]
    3) [auto/manual] [on/off (manual)] [+max] [-max] [+min] [-min]
     
    varvik85 нравится это.
  20. varvik85

    varvik85 Нерд

    сижу весь вечер и ничего не понимаю...((( прокоментируйте подробнее Вашу программу пожалуйста
    const float SENSETIVITY = 0.025; // 25mV / MPa
    const float AREF_VOLTAGE = 5.0;
    const float AMPLIFICATION = 1.0;

    const float ADC_TO_MPA = AREF_VOLTAGE/1024.0/AMPLIFICATION/SENSETIVITY;

    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

    const float inc_pressure = 0.05;
    float inf_pressure = 0.05;
    float min_pressure = 0.10;
    float max_pressure = 1.00;
    float sup_pressure = 2.00;

    byte selected_limit = LOW;