Датчик давления

Тема в разделе "Arduino & Shields", создана пользователем Artclonic, 7 мар 2018.

  1. mcureenab

    mcureenab Гуру

    Я так понимаю у тебя реализован конечный автомат. А раз так, то при отсутствии вакуума нужно перевести его в нужное состояние и покинуть функцию loop.
     
  2. Artclonic

    Artclonic Гик

    При отсутствии вакуума мне нужно повторить предыдущее деиствие, вот и все.
    Засосать детальку заново, если она не засосалась...
     
  3. Artclonic

    Artclonic Гик

    Тут мне надо что б Z - обновлялась (читалась) перед циклом..
     
  4. mcureenab

    mcureenab Гуру

    Предыдущее действие это какая то контретная команда или это любая команда которая выполнялась до проверки вакуума?
     
  5. Belkin

    Belkin Гик

    Проверка условия должна проводиться ДО выполнения операции !

    К примеру, надо отключить (!) лампу 220в при каком-то условии, а до этого в цикле она включена.
    По-твоему получается, что мы сначала даем команду на включение, потом проверяем условие и, если "прокатывает" - отключаем ?
    А если в это время "большой бух" ? ;)
    Нет !
    Сначала - условие !
    Потом, на основании условия - решение !
    Для того условия и придуманы хорошими людьми, чтоб по граблям не ходить... ;)

    PS. Ой, зря люди Basic недолюбливают...
    Очень читабельный язык, по сравнению с Си, даже с минимальным знанием английского...
     
  6. Sencis

    Sencis Нерд

    Вот что-то такое, это конечно не рабочий скетч а набор примеров

    Код (C++):
    longpreviousMillis=0;// время, когда состояние датчика обновлялось

    longinterval=1000;// половина периода работы, влючений (в миллисекундах)

    int analogPin = 3;  // номер порта (пин) к которому подключен барометр или что там у вас

    int loops;   // переменная для хранения ко-ва циклов прохождения.

    bool ready; // перемененная готовности установки


    void setup()
    {
    pinMode(ob11, OUTPUT);
    pinMode(ob12, OUTPUT);
    pinMode(ob13, OUTPUT);
    pinMode(ob14, OUTPUT);
    pinMode(z, INTPUT);

    z = analogRead(analogPin);  // считываем значение сюда нужен контакт с датчика.
    /* ну вот она читается пред циклом и какая разница? */
      }

    voidloop(){

    unsignedlongcurrentMillis=millis();// текущее время в миллисекундах

    //где функция чтения для перемененной z?

    z = analogRead(analogPin);  // считываем значение сюда нужен контакт с датчика.


    if(currentMillis-previousMillis>interval){
    // сохраняем последний момент, когда менялось состояние датчика
    previousMillis=currentMillis;

    //------------------------- я хз зачем ---------------------------------------------------------------//

    digitalWrite(ob11, HIGH);  //Включение элемента №1  (Блок I)
    digitalWrite(ob11,LOW);    //Выключение элемента №1 (Блок I)


    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)

    //-----------------------------------------------------------------------------------------------------------//

    if(500 < z ) // есть вакуум
    {
    digitalWrite(ob13, HIGH);  //Включение элемента №3 (Блок III)
    digitalWrite(ob13,LOW);    //Выключение элемента №3 (Блок III)

    if(500 > z ) // есть вакуум
    {
    digitalWrite(ob14, HIGH);  //Включение элемента №4 (Блок IV)
    digitalWrite(ob14,LOW);    //Выключение элемента №4 (Блок IV)

    /* как так если 500 > z (499 - 0) вакуум есть и если 500< z  (500 -  +&) тоже или вы думаете бывает отрицательное давление)))?  */

    else{

    digitalWrite(ob12, HIGH);  //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);    //Выключение элемента №2 (Блок II)

    //------------------------------------------------ или по другому:

    for ( int loop ; loops >= loop && ready  ;   ) // запускаем на определённое число циклов если всё нормально.
    {

    digitalWrite(ob12, HIGH);  //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);    //Выключение элемента №2 (Блок II)
    loop ++;
    }




    }
    }
    }
     
  7. Artclonic

    Artclonic Гик

    ПРошу прощения, но я пока по своему пути, опираясь на те знания которыми располагаю. Тут появилась идея сделать вакуумный датчик самому - по типу реле (конструкцию не буду обсуждать..) Но принцип таков, есть вакуум контакт - замкнут, нет вакуума - разомкнут.
    Вот навоял код под данный вариант... Смысл его, повторение команды если (в первом случае нет вакуума) (во втором наоборот если вакуум не снялся..)
    Код (C++):
    const int ob11=48; // контакт №1
    const int ob12=34; // контакт №1
    const int ob13=36; // контакт №1
    const int ob14=38; // контакт №1
    const int ob21=40; // контакт №1
    int vakuum;
    int z;

    void setup()
    {
    pinMode(ob11, OUTPUT);
    pinMode(ob12, OUTPUT);
    pinMode(ob13, OUTPUT);
    pinMode(ob14, OUTPUT);
    pinMode(vakuum, INTPUT);
      }

    // case 1: // блок команд на чтение значения «1»
    // (digitalWrite(vakuum, LOW)) при этом z = 499 нет вакуума
    // (digitalWrite(vakuum,HIGH)) при этом z = 1000 есть вакуум

        {

    digitalWrite(ob11, HIGH);  //Включение элемента №1  (Блок I)
    digitalWrite(ob11,LOW);    //Выключение элемента №1 (Блок I)

    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)
    Serial.println("ZASOS");

    z=499 //нет вакуума

    for (; z>500 ; ) {
    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)
    Serial.println("POVTORZASOSA");
    if(digitalWrite(vakuum, LOW)) //проверка значения Z
    {z=499} //нет вакуума
    else
    {z=1000}//есть вакуум
    z=1000 //принудительно назначим пока без контроллера, для проверки
    }

    digitalWrite(ob13, HIGH);  //Включение элемента №3 (Блок III)
    digitalWrite(ob13,LOW);    //Выключение элемента №3 (Блок III)
    Serial.println("USTANOVKA");

    z=1000 //есть вакуум

    for (; z<500 ; ) {
    digitalWrite(ob13, HIGH);  //Включение элемента №3 (Блок III)
    digitalWrite(ob13,LOW);    //Выключение элемента №3 (Блок III)
    Serial.println("POVTORUSTANOVKI");
    if(digitalWrite(vakuum,HIGH)) //проверка значения Z, если Z будет менее 500, то будет проигрываться цикл
    {z=1000} //есть вакуум
    else
    {z=499} //нет вакуума
    z=499 //принудительно назначим пока без контроллера, для проверки
    }

    digitalWrite(ob14, HIGH);  //Включение элемента №4 (Блок IV)
    digitalWrite(ob14,LOW);    //Выключение элемента №4 (Блок IV)
        }

        // break;
     
  8. mcureenab

    mcureenab Гуру

    Код (C++):
    z=499 //нет вакуума

    for (; z>500 ; ) { // не выполняется никогда
     
  9. mcureenab

    mcureenab Гуру

    Код (C++):
    if(digitalWrite(vakuum, LOW))
     
  10. Artclonic

    Artclonic Гик

    Как правильно записать? Почему не выполнится
    Код (C++):
    z=499 //нет вакуума

    for (; z>500 ; ) { // не выполняется никогда
    Должно выполнятся пока Z не станет больше 500. Так же?
     
    Последнее редактирование: 12 мар 2018
  11. Artclonic

    Artclonic Гик

    Вот так?
    Код (C++):
    if (digitalRead(vakuum, LOW))
     
    Последнее редактирование: 12 мар 2018
  12. mcureenab

    mcureenab Гуру

    Повторять пока z>500. А z изначально 499<500.
     
  13. Artclonic

    Artclonic Гик

    ПОМОЕМУ Я ОСОЗНАЛ,,, ВСЕ НАОБОРОТ,,,
    Вот так?
    Код (C++):
    const int ob11=48; // контакт №1
    const int ob12=34; // контакт №1
    const int ob13=36; // контакт №1
    const int ob14=38; // контакт №1
    const int ob21=40; // контакт №1
    int vakuum;
    int z;

    void setup()
    {
    pinMode(ob11, OUTPUT);
    pinMode(ob12, OUTPUT);
    pinMode(ob13, OUTPUT);
    pinMode(ob14, OUTPUT);
    pinMode(vakuum, INTPUT);
      }

    // case 1: // блок команд на чтение значения «1»
    // (digitalWrite(vakuum, LOW)) при этом z = 499 нет вакуума
    // (digitalWrite(vakuum,HIGH)) при этом z = 1000 есть вакуум

        {

    digitalWrite(ob11, HIGH);  //Включение элемента №1  (Блок I)
    digitalWrite(ob11,LOW);    //Выключение элемента №1 (Блок I)

    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)
    Serial.println("ZASOS");

    z=499 //нет вакуума

    for (; z<500;) {
    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)
    Serial.println("POVTORZASOSA");
    if(digitalRead(vakuum, LOW)) //проверка значения Z
    {z=499} // нет вакуум
    else
    {z=1000}// есть вакуума
    z=1000 //принудительно назначим пока без контроллера, для проверки
    }

    digitalWrite(ob13, HIGH);  //Включение элемента №3 (Блок III)
    digitalWrite(ob13,LOW);    //Выключение элемента №3 (Блок III)
    Serial.println("USTANOVKA");

    z=1000 //есть вакуум

    for (; z>500 ; ) {
    digitalWrite(ob13, HIGH);  //Включение элемента №3 (Блок III)
    digitalWrite(ob13,LOW);    //Выключение элемента №3 (Блок III)
    Serial.println("POVTORUSTANOVKI");
    if(digitalRead(vakuum,HIGH)) //проверка значения Z, если Z будет менее 500, то будет проигрываться цикл
    {z=1000} //есть вакуум
    else
    {z=499} //нет вакуума
    z=499 //принудительно назначим пока без контроллера, для проверки
    }

    digitalWrite(ob14, HIGH);  //Включение элемента №4 (Блок IV)
    digitalWrite(ob14,LOW);    //Выключение элемента №4 (Блок IV)
        }

        // break;
     
    Последнее редактирование: 12 мар 2018
  14. Belkin

    Belkin Гик

    Повтор ошибки, на которую было указано ранее.
    z принимает жесткое значение и вход в цикл получается уже с ним.
    Цикл будет бесконечным, т.к. z меньше 500 и значение не меняется.
    В следующем цикле - те же грабли...
     
  15. mcureenab

    mcureenab Гуру

    Вместо for тут лучше while использовать.
     
  16. mcureenab

    mcureenab Гуру

    Код (C++):
    if(LOW == digitalRead(vakuum)) //проверка значения Z
    {z=499} // нет вакуум
    else
    {z=1000}// естьвакуума
     
  17. mcureenab

    mcureenab Гуру

    Если откинуть отладку, тут повторяется один и тот же код.
    Код (C++):
    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)
    Serial.println("ZASOS");

    z=499 //нет вакуума

    for (; z<500;) {
    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)
    Serial.println("POVTORZASOSA");
    Чтобы этого не делать есть цикл с постусловием

    Код (C++):
    do {
        digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
        digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)
        Serial.println("ZASOS");
        if(LOW == digitalRead(vakuum))//проверка значения Z
            {z=499}//нет вакуума
        else
        {z=1000}// есть вакуум
    } while ( z < 500 );
    Этот цикл будет повторяться с огромной частотой. Вероятно нужна задержка по времени, чтобы исполнительный механизм успел сработать
     
  18. Belkin

    Belkin Гик

    Дополню... ;)
    Речь идет об этих строках
    Код (C++):

        digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
        digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)
     
    Лучше не задержкой, а конкретным действиям/состояниям проверять.
    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II) - включили
    ... теперь в цикле ждем результата
    Вот тут уже конкретный цикл, с минимальными задержками, на какой-то промежуток времени.
    ... вакуум появился
    Радуемся и делаем что-то дальше.
    ... вакуума нет
    Возвращаемся к digitalWrite(ob12, HIGH) и повторяем или принимаем другое решение.
     
  19. Artclonic

    Artclonic Гик

    Да, спасибо! Вот на Ваших материалах я уже построю свой код... Единственное (но это я позже к Вам пристану) попробывал сделать "пневмо реле"" на замыкание контакта - не получилось... Буду ждать с Али заказанные датчики, а там какой быстрей придет... Вакуум в моей системе - 8218,25 Па... Может какой нибудь будет реагировать на присоску, там тогда по значением разделить...
    Mpxv7002dp
    md-ps002
    Gy-bmp280
     
  20. mcureenab

    mcureenab Гуру

    Mpxv7002dp то что нужно. Остальные не понятно как подключить к вакуумной линии.