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

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

  1. Unixon

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

    SENSETIVITY - чувствительность датчика давления в вольтах на мегапаскаль (V/MPa);
    AREF_VOLTAGE - шкала АЦП по напряжению;
    AMPLIFICATION - коэф. усиления/ослабления на входе АЦП, если есть резисторный делитель или ОУ, то будет не 1.0 , а что-то больше или меньше.

    ADC_TO_MPA - коэффициент для пересчета показаний АЦП (0..1023) в мегапаскали

    min_pressure, max_pressure - верхний и нижний порог по давлению, при пересечении которого включается и выключается компрессор;
    inf_pressure, sup_pressure - верхний и нижний порог для настройки значений min_pressure, max_pressure с клавиатуры; это, кстати, тоже должны быть константы, а не переменные, можно поставить const в начале.
    inc_pressure - шаг изменения давления при настройке;

    selected_limit - выбранный для настройки предел (LOW=0 - min, HIGH=1 - max)
     
    varvik85 нравится это.
  2. Unixon

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

    Вообще-то, наверное, правильнее было бы делать наоборот, настройку вести в единицах отсчетов АЦП (pressure_level = 0..1023), а min_pressure, max_pressure уже пересчитывать как pressure_level/ADC_TO_MPA.
     
    varvik85 нравится это.
  3. varvik85

    varvik85 Нерд

    я примерно понял, вы объявили их константами присвоили им какое то значение,а дальше? больше в программе их нет,зачем это сделано тогда?

    Наверно вы не представляете с каким чайником в программировании имеете дело)))хотел еще раз сказать Вам спасибо! так как каждый ваш коментарий сокращает дни а может и недели моих попыток разобраться.
     
  4. Unixon

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

    Там программа дальше продолжается... вы все окно пролистали?
     
  5. varvik85

    varvik85 Нерд

    у меня только одно окошко,то где ваша программа

    #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);
    }
     
  6. varvik85

    varvik85 Нерд

    SENSETIVITY AREF_VOLTAGE AMPLIFICATION есть только в начале больше нету
     
  7. Unixon

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

    Они нужны только чтобы удобнее было вводить настройки, потом тут же вычисляется ADC_TO_MPA и уже одна только эта константа используется в функции pressure(). Можно ее переименовать в getPressure() если так будет читабельнее.
     
  8. varvik85

    varvik85 Нерд

    я понял!!!!! const float ADC_TO_MPA = AREF_VOLTAGE/1024.0/AMPLIFICATION/SENSETIVITY; все же в этой строке!!!!!!!спасибо!!!
     
  9. varvik85

    varvik85 Нерд

    byte selected_limit = LOW; вот с этим не понятно зачем эта строчка,что она делает?
    вернее byte selected вот это что?
     
  10. Unixon

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

    Инициализирует переменную. Представьте, что программа запустилась и вы нажали кнопку [+] или [-], а она не знает что ей менять - верхний или нижний предел. Должна быть определенность. После первоначального выбора границы интервала давлений, иных вариантов, кроме min и max у программы не будет. Следовательно, можно с самого начала с этим определиться.

    И вообще... всегда инициализируйте все переменные.
     
  11. varvik85

    varvik85 Нерд

    начинаю немного понимать!спасибо!

    вот тут

    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)
    {

    если на PIN_BTN_LOWER_LIMIT есть лог единица то устанавливать LOW
    если на UPPER_LIMIT есть лог единица то устанавливать HIGH
    и так далее верно?

    а вот тут
    {
    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);
    } не совсем понятна работа программы
     
  12. varvik85

    varvik85 Нерд

    сегодня привезли наконец две UNO не терпится скорее все испробовать,ARDUINO действительно крутая вещь!
     
  13. Unixon

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

    if (selected_limit)
    {
    selected_limit==1 (или хотя бы !=0), значит меняем max_presure

    max_pressure -= inc_pressure;
    пробуем передвинуть max_pressure вниз на величину inc_pressure

    if (max_pressure<=min_pressure) max_pressure = min_pressure+inc_pressure;
    проверяем границы: max_pressure не может быть меньше, чем min_pressure+inc_pressure

    }
    else
    {
    selected_limit==0, значит меняем min_presure

    min_pressure -= inc_pressure;
    пробуем передвинуть min_pressure вниз на величину inc_pressure


    if (min_pressure<inf_pressure) min_pressure = inf_pressure;
    }
    проверяем границы: min_pressure не может быть меньше, чем минимально возможное в системе давление inf_pressure.

    float p = pressure();
    прочитали давление с сенсора

    if (p<=min_pressure)
    {
    digitalWrite(PIN_RLY_COMPRESSOR, HIGH);
    если упало ниже плинтуса, включаем насос

    }
    if (p>=max_pressure)
    {
    digitalWrite(PIN_RLY_COMPRESSOR, LOW);
    а если пытается сорвать крышу, выключаем

    }
     
  14. varvik85

    varvik85 Нерд

    Загрузил сегодня Ваш скейтч!РАБОТАЕТ!!!!!!!!!!!!!!!!!Спасибо!!!!!!!!!!!!