налив емкости по уровню

mstr19
Offline
Зарегистрирован: 20.06.2018

Здравствуйте друзья.

Только начал осваивать Ардуино и попыталься написать программу, которую прошу посмотреть на предмет ошибок.

Имеются два бака, 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);
}

 

mstr19
Offline
Зарегистрирован: 20.06.2018
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
У Вас все проверки написаны не правильно например строчка 18  If (U2 LOW)
А надо If (digitalRead(U2) == LOW)

delay(ms);

Посмотрите и исравте ВСЕ
andryn
Offline
Зарегистрирован: 08.06.2018

mstr19 пишет:

Только начал осваивать Ардуино и попыталься написать программу, которую прошу посмотреть на предмет ошибок.

Нужно исправить синтаксические ошибки, тогда это запустится.

Нужно прочитать это: Отступ, тогда код будет удобно читать.

Нужно подумать, действительно ли нужно использовать Delay(600000), или можно засечь время срабатывания R1 и потом смотреть сколько прошло времени от этого момента.

mstr19
Offline
Зарегистрирован: 20.06.2018

vosara пишет:

У Вас все проверки написаны не правильно например строчка 18  If (U2 LOW)
А надо If (digitalRead(U2) == LOW)

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);
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Нет. Приблизительно так

//назначение пинов
#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 полон
}

 

mstr19
Offline
Зарегистрирован: 20.06.2018

Спасибо!

Я думал, что при использовании "if" обязательно использовать "else".

Будем разбираться)))

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

else -можно и нужно использовать но только в зависимости от задачи. По Вашему примеру, так на вскидку, они будут мешать.

mstr19
Offline
Зарегистрирован: 20.06.2018

vosara пишет:

else -можно и нужно использовать но только в зависимости от задачи. По Вашему примеру, так на вскидку, они будут мешать.

Тогда возникает вопрос. Допустим бак 2 был наполовину полный. Соответственно, половина объема бака 1 перекачалось в бак 2 до верхнего уровня U3, а половина в нем осталась.

Теперь потребитель забрал часть воды из бака2. Включится ли насос Н1, чтобы долить бак 2 или все ушло в начало на строку 20 и программа будет ждать, когда обнулится датчик нижнего уровня U2 бака 1, чтобы начать цикл заново?

b707
Offline
Зарегистрирован: 26.05.2017

mstr19 пишет:

Теперь потребитель забрал часть воды из бака2. Включится ли насос Н1, чтобы долить бак 2 или все ушло в начало на строку 20 и программа будет ждать, когда обнулится датчик нижнего уровня U2 бака 1, чтобы начать цикл заново?

Насос не включится, но вовсе не потому. что программа выполняется последовательно. У вас по условию насос включается только когда бак 2 пуст, а бак 1 - полон. Никакого "частичного долива" не предусмотрено.

Вообще, не воспринимайте тот код, который вам дали, как готовый. Вам всего лишь написали, как пользоваться операторами языка. А логика в этом коде совсем не та, что вы планировали. В частности, задержка 10минут в этом коде будет совсем не там, где вы хотели.

 

mstr19
Offline
Зарегистрирован: 20.06.2018

Отдача очищенной воды из бака2 потребителю происходит по стандартной схеме:

насос Н2, гидроаккумулятор ГА, реле давления РДМ-5.

Заманчиво вместо дорогого датчика сухого хода использовать датчик нижнего уровня U4 в баке 2 и реле R3, которое будет разрывать цепь питания, например, РДМ.

 Примерно так

if (digitalRead (U4) == LOW)

digitalWrite(R3, HIGH);

Однако, насос Н2 работает независимо от станции и состояние датчика U4 должно отслеживаться постоянно, независимо от того, что там происходит до него.

Как тогда запихнуть в программу эти команды?

Картинка "хвостика" )))

https://cloud.mail.ru/public/84SY/bXZFyhmxz

b707
Offline
Зарегистрирован: 26.05.2017

mstr19 пишет:

Однако, насос Н2 работает независимо от станции и состояние датчика U4 должно отслеживаться постоянно, независимо от того, что там происходит до него.

Как тогда запихнуть в программу эти команды?

если состояние каких-то датчиков должно отслеживаться постоянно - в программе не должно быть  операторов delay() -тем более по 10 минут.  Ведь во время этой задержки программа просто спит и никакие датчики не контролирует.

Вам надо начать с того, что тщательно продумать логику программы. Думаю, что то, что есть сейчас - придется менять полностью.

mstr19
Offline
Зарегистрирован: 20.06.2018

b707]</p> <p>[quote=mstr19 пишет:

Насос не включится, но вовсе не потому. что программа выполняется последовательно. У вас по условию насос включается только когда бак 2 пуст, а бак 1 - полон. Никакого "частичного долива" не предусмотрено.

 В частности, задержка 10минут в этом коде будет совсем не там, где вы хотели.

Почему и где же она будет? Я предполагал, что насос Н1 включится после нее и тогда, когда нижний U2 HIGH, а верхний  U3 LOW, что вовсе не подразумевает, что бак 2 пуст, а бак 1 полон.

 

 

mstr19
Offline
Зарегистрирован: 20.06.2018

b707 пишет:

Ведь во время этой задержки программа просто спит и никакие датчики не контролирует.

Вам надо начать с того, что тщательно продумать логику программы. Думаю, что то, что есть сейчас - придется менять полностью.

Да, об этом я не подумал.

Знать бы как!)))

mstr19
Offline
Зарегистрирован: 20.06.2018

Задержка 10 минут это условно. В реальности после наполнения бака 1, а в момент наполнения происходит еще и ин-лайн озонирование через эжектор, при этом растворенное железо Fe(II) окисляется до Fe(III), еще вносится через дозатор с клапаном К2 (R3) коагулянт, затем идет перемешивание в течении 15-20 мин с включением мешалки через R4, уже потом осаждение флоккул в течении до 5 - 7 часов, затем в течении 15 минут происходит обратная промывка промежуточных фильтров с переключением двух пар клапанов НО и НЗ и реле R5, и лишь потом опрашиваются датчики U2 и U3 и включается насос Н1.

Насос же H2 в паре с датчиком U4, а также реле R6 и РДМ работает независимо от этой всей бодяги.

 

b707
Offline
Зарегистрирован: 26.05.2017

как же вам попонятнее обьяснить.... Вот, вы, наверно. думаете. что у вас программа будет выполнятся так: сначала откроется кран и заполнится бак 1,  потом кран закроется и начнется отсчет 10 минут? - на самом деле будет совсем не так.

Программа пробегает по строчкам каждое мгновение и замирает на задержках. Поэтому это будет работать так:

Проверится первое условие, допустим бак пуст - откроется кран. Тут же, спустя пару микросекунд будет проверен второй блок. Очевидно, что бак за 2 мкс заполнится не успеет - поэтому программа сразу перейдет к задержке и будет ждать 10 мин, после чего вернется к началу.

Если за 10 минут бак не заполнится - все повторится и программа снова зависнет на 10 минут. Если, скажем, бак заполнится на второй минуте задержки - все остальные 8 минут вода будет лится через край, потому что программа проверяет датчики только раз в 10 минут...

Чтобы программа ждала 10 минут ТОЛЬКО С МОМЕНТА ЗАПОЛНЕНИЯ бака - надо писать совсем не так.

mstr19
Offline
Зарегистрирован: 20.06.2018

Вон оно как! Я честно думал так, как вы описали в начале.

Как же быть то?

b707
Offline
Зарегистрирован: 26.05.2017

mstr19 пишет:

Вон оно как! Я честно думал так, как вы описали в начале.

Как же быть то?

Для начала научится, как избавится от операторов delay() - описано в уроке блинк без delay()

А чтобы программировать сложные последовательные действия. где одна стадия начинается только после окончания другой - существует такой подход, как "метод конечных автоматов"

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Если Вас не смущает зсыпание контролера на 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 полон
}

 

mstr19
Offline
Зарегистрирован: 20.06.2018

b707]</p> <p>[quote=mstr19 пишет:

А чтобы программировать сложные последовательные действия. где одна стадия начинается только после окончания другой - существует такой подход, как "метод конечных автоматов"

Я вот думаю, может для моих задач перейти на FLProg? Относительно простая графика, последовательное выполнение блоков, компилляция проекта и заливка готового скетча в ардуино.

И не надо ломать ноги в дебрях конечных автоматов)))

b707
Offline
Зарегистрирован: 26.05.2017

mstr19 пишет:

Я вот думаю, может для моих задач перейти на FLProg?

FLProg - это как памперсы вместо того чтоб учится вовремя в туалет ходить. :) Но если другие пути не подходят - то почему нет, свою задачу решает.

Только тогда перемешайтесь со своими вопросами на форум любителей этой платформы, у нас тут вопросы по фаллопрогу считаются моветоном.

mstr19
Offline
Зарегистрирован: 20.06.2018

Естественно! Бочки на С++ налили и хватит.