налив емкости по уровню
- Войдите на сайт для отправки комментариев
Ср, 20/06/2018 - 16:33
Здравствуйте друзья.
Только начал осваивать Ардуино и попыталься написать программу, которую прошу посмотреть на предмет ошибок.
Имеются два бака, 1 и 2. В первый через клапан К1 управляемый реле R1 (DC5V/AC220V 10A) наливается вода. У бака два внешних датчика с выоким и низким уровнем сигнала. По достижению верхнего уровня К1 закрывается.
Далее нужна пауза 10 минут для осаждения взвеси.
Затем при условии, что в баке 1 есть вода (U2 HIGH), а возможный уровень воды в баке 2 ниже верхнего уровня, включается насос Н1, наполняя бак 2 до U3
Это часть станции водоподготовки на даче, поэтому остальное не указываю, это не важно.
Пока интересует этот момент
Это сам скетч
//назначение пинов
Int U1 = 2;
Int U2 = 3;
Int U3 = 4;
Int R1 = 5;
Int R2 = 6;
void setup ()
{
// назначение входов и выходов
pinMode (U1, INPUT);
pinMode (U2, INPUT);
pinMode (U3, INPUT);
pinMode (R1, OUTPUT);
pinMode (R2, OUTPUT);
}
Void loop ()
{
If (U2 LOW)
digitalWrite (R1, HIGH); // если нижний уровень LOW, то включается реле R1,
которое открывает клапан К1
else
digitalWrite (R1, LOW);
if (U1 HIGH)
digitalWrite (R1, LOW); // выключение клапана К1 по достижению верхнего уровня в баке 1
else
digitalWrite (R1, HIGH);
}
{
Delay (600000); // осаждение взвеси в течении 10 минут
}
{
If (U2 HIGH && U3 LOW)
digitalWrite (R2, HIGH); // включается насос Н1
else
digitalWrite (R2, LOW);
if (U2 LOW || U3 HIGH)
digitalWrite (R2, LOW); // насос Н1 выключен, если бак 1 пуст или бак 2 полон
else
digitalWrite (R2, HIGH);
}
И картинка
https://cloud.mail.ru/public/Doyy/spCtGLV81
delay(ms);
Только начал осваивать Ардуино и попыталься написать программу, которую прошу посмотреть на предмет ошибок.
Нужно исправить синтаксические ошибки, тогда это запустится.
Нужно прочитать это: Отступ, тогда код будет удобно читать.
Нужно подумать, действительно ли нужно использовать Delay(600000), или можно засечь время срабатывания R1 и потом смотреть сколько прошло времени от этого момента.
delay(ms);
Так правильно? Особенно 31 и 35
Если нужна пауза 10 часов, так и писать с кучей нолей в ms?
//назначение пинов Int U1 = 2; Int U2 = 3; Int U3 = 4; Int R1 = 5; Int R2 = 6; void setup () { // назначение входов и выходов pinMode (U1, INPUT); pinMode (U2, INPUT); pinMode (U3, INPUT); pinMode (R1, OUTPUT); pinMode (R2, OUTPUT); } Void loop () { If (digitalRead(U2) == LOW) digitalWrite (R1, HIGH); // если нижний уровень LOW, то включается реле R1, которое открывает клапан К1 else digitalWrite (R1, LOW); if (digitalRead(U1) ==HIGH) digitalWrite (R1, LOW); // выключение клапана К1 по достижению верхнего уровня в баке 1 else digitalWrite (R1, HIGH); } { delay (600000); // осаждение взвеси в течении 10 минут } { If (digitalRead(U2)== HIGH && (U3)== LOW) digitalWrite (R2, HIGH); // включается насос Н1 else digitalWrite (R2, LOW); if (digitalRead(U2) == LOW || (U3) == HIGH) digitalWrite (R2, LOW); // насос Н1 выключен, если бак 1 пуст или бак 2 полон else digitalWrite (R2, HIGH); }Нет. Приблизительно так
//назначение пинов #define U1 2 //UP 1 #define U2 3//Down 1 #define U3 4//UP 2 #define R1 5//Klapan #define R2 6//Nasos void setup () { // назначение входов и выходов pinMode (U1, INPUT); pinMode (U2, INPUT); pinMode (U3, INPUT); pinMode (R1, OUTPUT); pinMode (R2, OUTPUT); } void loop() { if (digitalRead(U2) == LOW) digitalWrite(R1, HIGH); // если нижний уровень LOW, то включается реле R1, которое открывает клапан К1 if (digitalRead(U1) == HIGH) digitalWrite(R1, LOW); // выключение клапана К1 по достижению верхнего уровня в баке 1 delay(600000); // осаждение взвеси в течении 10 минут if (digitalRead(U1) == HIGH && digitalRead(U3) == LOW) digitalWrite(R2, HIGH); // включается насос Н1 if (digitalRead(U2) == LOW || digitalRead(U3) == HIGH) digitalWrite(R2, LOW); // насос Н1 выключен, если бак 1 пуст или бак 2 полон }Спасибо!
Я думал, что при использовании "if" обязательно использовать "else".
Будем разбираться)))
else -можно и нужно использовать но только в зависимости от задачи. По Вашему примеру, так на вскидку, они будут мешать.
else -можно и нужно использовать но только в зависимости от задачи. По Вашему примеру, так на вскидку, они будут мешать.
Тогда возникает вопрос. Допустим бак 2 был наполовину полный. Соответственно, половина объема бака 1 перекачалось в бак 2 до верхнего уровня U3, а половина в нем осталась.
Теперь потребитель забрал часть воды из бака2. Включится ли насос Н1, чтобы долить бак 2 или все ушло в начало на строку 20 и программа будет ждать, когда обнулится датчик нижнего уровня U2 бака 1, чтобы начать цикл заново?
Теперь потребитель забрал часть воды из бака2. Включится ли насос Н1, чтобы долить бак 2 или все ушло в начало на строку 20 и программа будет ждать, когда обнулится датчик нижнего уровня U2 бака 1, чтобы начать цикл заново?
Насос не включится, но вовсе не потому. что программа выполняется последовательно. У вас по условию насос включается только когда бак 2 пуст, а бак 1 - полон. Никакого "частичного долива" не предусмотрено.
Вообще, не воспринимайте тот код, который вам дали, как готовый. Вам всего лишь написали, как пользоваться операторами языка. А логика в этом коде совсем не та, что вы планировали. В частности, задержка 10минут в этом коде будет совсем не там, где вы хотели.
Отдача очищенной воды из бака2 потребителю происходит по стандартной схеме:
насос Н2, гидроаккумулятор ГА, реле давления РДМ-5.
Заманчиво вместо дорогого датчика сухого хода использовать датчик нижнего уровня U4 в баке 2 и реле R3, которое будет разрывать цепь питания, например, РДМ.
Примерно так
if (digitalRead (U4) == LOW)
digitalWrite(R3, HIGH);
Однако, насос Н2 работает независимо от станции и состояние датчика U4 должно отслеживаться постоянно, независимо от того, что там происходит до него.
Как тогда запихнуть в программу эти команды?
Картинка "хвостика" )))
https://cloud.mail.ru/public/84SY/bXZFyhmxz
Однако, насос Н2 работает независимо от станции и состояние датчика U4 должно отслеживаться постоянно, независимо от того, что там происходит до него.
Как тогда запихнуть в программу эти команды?
если состояние каких-то датчиков должно отслеживаться постоянно - в программе не должно быть операторов delay() -тем более по 10 минут. Ведь во время этой задержки программа просто спит и никакие датчики не контролирует.
Вам надо начать с того, что тщательно продумать логику программы. Думаю, что то, что есть сейчас - придется менять полностью.
Насос не включится, но вовсе не потому. что программа выполняется последовательно. У вас по условию насос включается только когда бак 2 пуст, а бак 1 - полон. Никакого "частичного долива" не предусмотрено.
В частности, задержка 10минут в этом коде будет совсем не там, где вы хотели.
Почему и где же она будет? Я предполагал, что насос Н1 включится после нее и тогда, когда нижний U2 HIGH, а верхний U3 LOW, что вовсе не подразумевает, что бак 2 пуст, а бак 1 полон.
Ведь во время этой задержки программа просто спит и никакие датчики не контролирует.
Вам надо начать с того, что тщательно продумать логику программы. Думаю, что то, что есть сейчас - придется менять полностью.
Да, об этом я не подумал.
Знать бы как!)))
Задержка 10 минут это условно. В реальности после наполнения бака 1, а в момент наполнения происходит еще и ин-лайн озонирование через эжектор, при этом растворенное железо Fe(II) окисляется до Fe(III), еще вносится через дозатор с клапаном К2 (R3) коагулянт, затем идет перемешивание в течении 15-20 мин с включением мешалки через R4, уже потом осаждение флоккул в течении до 5 - 7 часов, затем в течении 15 минут происходит обратная промывка промежуточных фильтров с переключением двух пар клапанов НО и НЗ и реле R5, и лишь потом опрашиваются датчики U2 и U3 и включается насос Н1.
Насос же H2 в паре с датчиком U4, а также реле R6 и РДМ работает независимо от этой всей бодяги.
как же вам попонятнее обьяснить.... Вот, вы, наверно. думаете. что у вас программа будет выполнятся так: сначала откроется кран и заполнится бак 1, потом кран закроется и начнется отсчет 10 минут? - на самом деле будет совсем не так.
Программа пробегает по строчкам каждое мгновение и замирает на задержках. Поэтому это будет работать так:
Проверится первое условие, допустим бак пуст - откроется кран. Тут же, спустя пару микросекунд будет проверен второй блок. Очевидно, что бак за 2 мкс заполнится не успеет - поэтому программа сразу перейдет к задержке и будет ждать 10 мин, после чего вернется к началу.
Если за 10 минут бак не заполнится - все повторится и программа снова зависнет на 10 минут. Если, скажем, бак заполнится на второй минуте задержки - все остальные 8 минут вода будет лится через край, потому что программа проверяет датчики только раз в 10 минут...
Чтобы программа ждала 10 минут ТОЛЬКО С МОМЕНТА ЗАПОЛНЕНИЯ бака - надо писать совсем не так.
Вон оно как! Я честно думал так, как вы описали в начале.
Как же быть то?
Вон оно как! Я честно думал так, как вы описали в начале.
Как же быть то?
Для начала научится, как избавится от операторов delay() - описано в уроке блинк без delay()
А чтобы программировать сложные последовательные действия. где одна стадия начинается только после окончания другой - существует такой подход, как "метод конечных автоматов"
Если Вас не смущает зсыпание контролера на 10 минут или 10 часов, как Вы писали выше, то добавив одну переменную и 4 скобки можно добиться работоспособности вашей програмы.
//назначение пинов #define U1 2 //UP 1 #define U2 3 //Down 1 #define U3 4 //UP 2 #define R1 5 //Klapan #define R2 6 //Nasos bool fl_time; void setup () { // назначение входов и выходов pinMode (U1, INPUT); pinMode (U2, INPUT); pinMode (U3, INPUT); pinMode (R1, OUTPUT); pinMode (R2, OUTPUT); } void loop() { if (digitalRead(U2) == LOW) { digitalWrite(R1, HIGH); // если нижний уровень LOW, то включается реле R1 - открывает клапан К1 fl_time = 1; } if (fl_time == 1 && digitalRead(U1) == HIGH) { digitalWrite(R1, LOW); // выключение клапана К1 по достижению верхнего уровня в баке 1 fl_time = 0; delay(600000); // осаждение взвеси в течении 10 минут } if (digitalRead(U1) == HIGH && digitalRead(U3) == LOW) digitalWrite(R2, HIGH); // включается насос Н1 if (digitalRead(U2) == LOW || digitalRead(U3) == HIGH) digitalWrite(R2, LOW); // насос Н1 выключен, если бак 1 пуст или бак 2 полон }А чтобы программировать сложные последовательные действия. где одна стадия начинается только после окончания другой - существует такой подход, как "метод конечных автоматов"
Я вот думаю, может для моих задач перейти на FLProg? Относительно простая графика, последовательное выполнение блоков, компилляция проекта и заливка готового скетча в ардуино.
И не надо ломать ноги в дебрях конечных автоматов)))
Я вот думаю, может для моих задач перейти на FLProg?
FLProg - это как памперсы вместо того чтоб учится вовремя в туалет ходить. :) Но если другие пути не подходят - то почему нет, свою задачу решает.
Только тогда перемешайтесь со своими вопросами на форум любителей этой платформы, у нас тут вопросы по фаллопрогу считаются моветоном.
Естественно! Бочки на С++ налили и хватит.