Насос, ардуино, реле, 2 геркона.

shurrik
Offline
Зарегистрирован: 20.11.2012

Всем доброго времени суток. Помогите начинающему.

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

Суть такова: есть геркон1 (Г1)  и геркон2(Г2). Герконы на замыкание.  Г1 - нижний уровень воды, Г2-верхний. Нужно выкачивать воду из ёмкости.

Нужно включать реле когда г1 и г2 замкнуты оба, затем  г2 размыкается (реле остаётся включенным), затем г1 размыкается - реле выключается и по новой на цикл ожидания замкнутых г1+г2.

 

leshak
Offline
Зарегистрирован: 29.09.2011

shurrik пишет:

Всем доброго времени суток. Помогите начинающему.

 

Начинающего не видно.

zsm@nxt.ru
Offline
Зарегистрирован: 27.05.2013

shurrik пишет:

Всем доброго времени суток. Помогите начинающему.

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

Суть такова: есть геркон1 (Г1)  и геркон2(Г2). Герконы на замыкание.  Г1 - нижний уровень воды, Г2-верхний. Нужно выкачивать воду из ёмкости.

Нужно включать реле когда г1 и г2 замкнуты оба, затем  г2 размыкается (реле остаётся включенным), затем г1 размыкается - реле выключается и по новой на цикл ожидания замкнутых г1+г2.

как то так , но очень расточительно дуню для таких задач использовать...

а вообще прочитав тему , сами бы код написали :)

 

const int ledPin2 =  13;// насос откачки
const int buttonPin1 = 2;//поплавок выключения насоса откачки подключен к земле и 2 пину
const int buttonPin2 = 3;//поплавок включения насоса откачки подключен к земле и 3 пину
void setup() 
{
  pinMode(ledPin2, OUTPUT);
  pinMode(buttonPin1, INPUT);
  digitalWrite(buttonPin1, HIGH); 
  pinMode(buttonPin2, INPUT);
  digitalWrite(buttonPin2, HIGH);
}

void loop()
{
  if (digitalRead(buttonPin1)== HIGH) {val = HIGH;}
  if (digitalRead(buttonPin2)== LOW) {val = LOW;}
  digitalWrite(ledPin2, !val);
}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
  pinMode(buttonPin1, INPUT);
  digitalWrite(buttonPin1, HIGH); 
  pinMode(buttonPin2, INPUT);
  digitalWrite(buttonPin2, HIGH);

равно и намного понятнее:

  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  

 

zsm@nxt.ru
Offline
Зарегистрирован: 27.05.2013

Спасибо не знал, я тоже новичёк  :)

shurrik
Offline
Зарегистрирован: 20.11.2012

leshak пишет:

Начинающего не видно.

Язык "С"  пока новый для меня.    Есть только опыт на бейсике и турбо-паскале.

zsm@nxt.ru пишет:

как то так , но очень расточительно дуню для таких задач использовать...

Знаю.  Надо на пару недель, потом разберу.   Есть простые схемы без МК, но нет быстрого доступа к элементной базе.

Что получается в итоге....

const int Relay =  13;// насос откачки
const int buttonPin1 = 2;//поплавок выключения насоса откачки подключен к земле и 2 пину
const int buttonPin2 = 3;//поплавок включения насоса откачки подключен к земле и 3 пину
void setup() 
{
  pinMode(Relay, OUTPUT);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(buttonPin1)== HIGH) {val = HIGH;}
  if (digitalRead(buttonPin2)== LOW) {val = LOW;}
  digitalWrite(Relay, !val);
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

trembo пишет:

  pinMode(buttonPin1, INPUT);
  digitalWrite(buttonPin1, HIGH); 
  pinMode(buttonPin2, INPUT);
  digitalWrite(buttonPin2, HIGH);

равно и намного понятнее:

  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  

 

А можно было и просто:

  digitalWrite(buttonPin1, HIGH); 
  digitalWrite(buttonPin2, HIGH);

Так как по умолчанию входы уже настроены на INPUT. Так что pinMode(INPUT,...), в данном(!) случае, не производят никакой полезной работы.

Но лично я предпочитаю, все-таки написать два лишних "ничего не делающих" pinMode. Что-бы явно было в коде видно какие пины используются и кто вход, а кто выход.

А INPUT_PULLUP - действительно вполне наглядно и соотвествует "официальной политике". Но есть одно но... в старых версиях оно не работает. Не компилится. Не помню точно с какой версии его ввели, но в 1.0 - еще не работает. А эта версия еще много у кого стоит.

Вообщем это все дело вкуса. Работать будут одинаково все три варианта. Но мое личное предпочтение: изначальный вариант zsm@nxt.ru . Покрайней мере пока, я стараюсь именно так писать pinMode/digitalWrite

 

leshak
Offline
Зарегистрирован: 29.09.2011

shurrik пишет:

leshak пишет:

Начинающего не видно.

Язык "С"  пока новый для меня.    Есть только опыт на бейсике и турбо-паскале.

Ну если ничего на нем не писать, то он навсегда новым останется. А эта задача - как раз идеальна для того что-бы попытатся написать "свои первые пару строк". 

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

А опыта турбо-паскаля - тут более чем достаточно. Значит знаете что такое переменная, что такое if.
С различиями синтаксиса, заглянув в справочник можно разобаратся от пары минут, до пары часов (это если нужно еще разобратся что такое входы/выходы арудины и т.п.).

Там (в паскале) у вам были BEGIN/END, а тут фигурные скобки. Там было IF (УСЛОВИЕ) THEN, а тут if (УСЛОВИЕ), там логические выражения собирались с помощью операторов AND и OR, а тут с помощью && и ||, там у вас оператор присваивания был ":=", а тут просто "=", там оператор "равно" был "=", а тут "==".

Вообще разница на простых задачах - ну минимально косметическая. 

Так что если есть ЖЕЛАНИЕ, то можно разобартся. Ну врайнем случае накидать ПСЕВДОКОД на паскале. Оно даже короче и однозначней было-бы чем словами объяснять "что вы хотите". И намного проще понять любому програмеру.

Кстати, если у вас действительно есть опыт паскаля. То вы должны увидить, что преведенный выше код, не будет работать как вы хотели. Условие " затем  г2 размыкается (реле остаётся включенным)" - не выполнится. Код "вырубит" реле, как только разомкнется второй геркон.
 

shurrik
Offline
Зарегистрирован: 20.11.2012

leshak пишет:

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

Виноват...   согласен. Знал как подключить реле и код ля него, а вот с кнопками....

 

leshak пишет:

Кстати, если у вас действительно есть опыт паскаля. То вы должны увидить, что преведенный выше код, не будет работать как вы хотели. Условие " затем  г2 размыкается (реле остаётся включенным)" - не выполнится. Код "вырубит" реле, как только разомкнется второй геркон.

попробуемс..


  if (digitalRead(buttonPin1)== HIGH) {val = HIGH;} and (digitalRead(buttonPin2)== HIGH) {val = HIGH;} do
{
digitalWrite(Relay, !val);
 } while (digitalRead(buttonPin1)== LOW) {val = LOW;};

 

leshak
Offline
Зарегистрирован: 29.09.2011

shurrik пишет:

Виноват...   согласен. Знал как подключить реле и код ля него, а вот с кнопками....

А что с кнопками?  С ArduinoIDE идут примеры работы с кнопками. В форуме программирование в шапке висит прикрепленная тема "в помощь новичку работа с кнопками.." (выше вам ссылку как раз на нее и дали. Читайте обязательно, хотя-бы начало). 

P.S. Про вашиу "попытку...." чуть-чуть позже отвечу

shurrik
Offline
Зарегистрирован: 20.11.2012

ой,  AND'а нет   тут....

 if (digitalRead(buttonPin1)== HIGH &&  digitalRead(buttonPin2)== HIGH) {val = HIGH;} do
{
digitalWrite(Relay, !val);
 } while (digitalRead(buttonPin1)== LOW) {val = LOW;};

 

leshak
Offline
Зарегистрирован: 29.09.2011

shurrik пишет:

ой,  AND'а нет   тут....

 if (digitalRead(buttonPin1)== HIGH &&  digitalRead(buttonPin2)== HIGH) {val = HIGH;} do
{
digitalWrite(Relay, !val);
 } while (digitalRead(buttonPin1)== LOW) {val = LOW;};

 

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

И еще, "циклы" (если вы пытались его написать) - тут не нужны.  Само loop() - оно уже бесконечно вызывается в цикле. Раз за разом. Считайте в уме что loop() уже запусщен в некоем бесконечном цикле:

while(true){
  loop();
}

Так что сама структура того что вам дал zsm - абсолютно верная. Ее менять не нужно. Два if-фа в loop и все.
Нужно только чуток подправить сами условия при котором срабатывают эти IF. Что-бы они соотвествовали вашей постановке задачи.

P.S. Кстати для первого IF-фа условие вы уже поправили верно, осталось поправить для второго... а остальное оставить как было у zsm

leshak
Offline
Зарегистрирован: 29.09.2011

Хотя... блин... стоп.... Кажись я навел тень на плетень. Напраслину наговорил на код zsm.

Но я не виноват... это он запутал ;). У нас же герконы выдают LOW когда замыкаются, а HIGH когда разомкнуты. Обычно "инвертирование" Что-бы HIGH означало "включен" делают при чтении состояния кнопки. А он сделал "инвертирование" уже на выключении/выключении реле ;)

Щас... попробуем привести к "прямой логике" (и будем читать состояние герконов в переменные, что-бы лишние digitalRead не делать).

shurrik
Offline
Зарегистрирован: 20.11.2012

да, без внутреннего цикла, пока не разомкнется нижний - никак

msng
Offline
Зарегистрирован: 07.06.2012

зачем тут дуня????

может сделать так:

leshak
Offline
Зарегистрирован: 29.09.2011

Вот как-то так.

const int Relay =  13;// насос откачки
const int buttonPin1 = 2;//поплавок выключения насоса откачки подключен к земле и 2 пину
const int buttonPin2 = 3;//поплавок включения насоса откачки подключен к земле и 3 пину

bool releState=false; // состояние реле TRUE когда включено
void setup() 
{
  pinMode(Relay, OUTPUT);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
}

void loop()
{
  bool gerk1=!digitalRead(buttonPin1); // состояние первого геркона, TRUE когда замкнут
  bool gerk2=!digitalRead(buttonPin2); 
  
  // принимаем решение что нужно делать
  if (gerk1 && gerk2 ) {releState = true;} //Нужно включать реле когда г1 и г2 замкнуты оба
  if (!gerk1 && !gerk2 ) {releState = true;} // Выключаем когда ОБА разомкнуты
  
  // выполняем решение
  digitalWrite(Relay, releState); // теперь инвертирование не делаем, выводим состояние "как есть"
  

}

Толкьо я тут переименовал val  в releState  (кстати val - была не объявлена, так что оно не могло скомпилится).

Вообщем IMHO так получается более "дословный перевод" условия задачи с "человеческого", на C++

shurrik
Offline
Зарегистрирован: 20.11.2012

msng пишет:

зачем тут дуня????

может сделать так:

Да уж.... всё гиниальное просто.   В наличии только шилд на 2 реле   или старые релюхи на 220 в.  Думаю, герконы вряд ли выдержат.

В шилд на in1  и in2   какое надо напряжение подавать для срабатывания?

Скетч опробую вечером..

msng
Offline
Зарегистрирован: 07.06.2012

у вас есть шилд на два реле, его вполне хватит... не больше не меньше...

izh_dima
Offline
Зарегистрирован: 13.09.2013

Давайте разовьем эту тему, она актуальна.

Теперь следующий шаг - чтобы насос не работал на "сухую", т.е. нужно проследить каким-то образом, что вода качается. Кто, что может подсказать для этого?

Я заказал флоуметр, но, боюсь, он любитель кристальной воды, а в скважине вначале(да и не только) идет мутная.

 

ЗЫ: в скетче ошибка, поправьте:

20  if (!gerk1 && !gerk2 ) {releState = false;} // Выключаем когда ОБА разомкнуты

msng
Offline
Зарегистрирован: 07.06.2012

обычно в погружных насосах есть поплавки, т.е. если поплавок не плавает насос не работает

что-то типа такого:

shurrik
Offline
Зарегистрирован: 20.11.2012

izh_dima пишет:

Теперь следующий шаг - чтобы насос не работал на "сухую", т.е. нужно проследить каким-то образом, что вода качается. Кто, что может подсказать для этого?

1-2   промежуточных датчиков чтобы следить за падением/ростом уровня воды в ёмкости и  предельные таймауты по  ним выставить. Или общий таймаут между верхним и нижним .   

Или следить за массой ёмкости, если это возможно.

msng пишет:

обычно в погружных насосах есть поплавки, т.е. если поплавок не плавает насос не работает

что-то типа такого:

есть вариант "перемерзла или сорвало трубу"

izh_dima
Offline
Зарегистрирован: 13.09.2013

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

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

Про таймеры не совсем актуально, насос сгореть может раньше, чем выйдет таймер.

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

msng пишет:

зачем тут дуня????

может сделать так:

Так не интересно :)

gena
Offline
Зарегистрирован: 04.11.2012

" Зато дёшево, надежно и практично! Быстро сымаем гипс и смываемся!.."