Я так понимаю у тебя реализован конечный автомат. А раз так, то при отсутствии вакуума нужно перевести его в нужное состояние и покинуть функцию loop.
При отсутствии вакуума мне нужно повторить предыдущее деиствие, вот и все. Засосать детальку заново, если она не засосалась...
Предыдущее действие это какая то контретная команда или это любая команда которая выполнялась до проверки вакуума?
Проверка условия должна проводиться ДО выполнения операции ! К примеру, надо отключить (!) лампу 220в при каком-то условии, а до этого в цикле она включена. По-твоему получается, что мы сначала даем команду на включение, потом проверяем условие и, если "прокатывает" - отключаем ? А если в это время "большой бух" ? Нет ! Сначала - условие ! Потом, на основании условия - решение ! Для того условия и придуманы хорошими людьми, чтоб по граблям не ходить... PS. Ой, зря люди Basic недолюбливают... Очень читабельный язык, по сравнению с Си, даже с минимальным знанием английского...
Вот что-то такое, это конечно не рабочий скетч а набор примеров Код (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 ++; } } } }
ПРошу прощения, но я пока по своему пути, опираясь на те знания которыми располагаю. Тут появилась идея сделать вакуумный датчик самому - по типу реле (конструкцию не буду обсуждать..) Но принцип таков, есть вакуум контакт - замкнут, нет вакуума - разомкнут. Вот навоял код под данный вариант... Смысл его, повторение команды если (в первом случае нет вакуума) (во втором наоборот если вакуум не снялся..) Код (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;
Как правильно записать? Почему не выполнится Код (C++): z=499 //нет вакуума for (; z>500 ; ) { // не выполняется никогда Должно выполнятся пока Z не станет больше 500. Так же?
ПОМОЕМУ Я ОСОЗНАЛ,,, ВСЕ НАОБОРОТ,,, Вот так? Код (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;
Повтор ошибки, на которую было указано ранее. z принимает жесткое значение и вход в цикл получается уже с ним. Цикл будет бесконечным, т.к. z меньше 500 и значение не меняется. В следующем цикле - те же грабли...
Код (C++): if(LOW == digitalRead(vakuum)) //проверка значения Z {z=499} // нет вакуум else {z=1000}// естьвакуума
Если откинуть отладку, тут повторяется один и тот же код. Код (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 ); Этот цикл будет повторяться с огромной частотой. Вероятно нужна задержка по времени, чтобы исполнительный механизм успел сработать
Дополню... Речь идет об этих строках Код (C++): digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II) digitalWrite(ob12,LOW); //Выключение элемента №2 (Блок II) Лучше не задержкой, а конкретным действиям/состояниям проверять. digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II) - включили ... теперь в цикле ждем результата Вот тут уже конкретный цикл, с минимальными задержками, на какой-то промежуток времени. ... вакуум появился Радуемся и делаем что-то дальше. ... вакуума нет Возвращаемся к digitalWrite(ob12, HIGH) и повторяем или принимаем другое решение.
Да, спасибо! Вот на Ваших материалах я уже построю свой код... Единственное (но это я позже к Вам пристану) попробывал сделать "пневмо реле"" на замыкание контакта - не получилось... Буду ждать с Али заказанные датчики, а там какой быстрей придет... Вакуум в моей системе - 8218,25 Па... Может какой нибудь будет реагировать на присоску, там тогда по значением разделить... Mpxv7002dp md-ps002 Gy-bmp280