Управление насосом по датчикам

В общем задача такая: Есть 2 датчика (геркона) “Верхний аварийный уровень” и “Нижний аварийный уровень”. Два реле имитирующие кнопки соответственно включения и отключения. Надо чтобы по приходе сигнала на датчик единожды срабатывало реле на заданное время и отключалось. Вот что я наваял но в итоге получается последовательное переключение реле несмотря на сигнал. Помогите пожалуйста.

int VAU = 2;
int NAU = 4;
int VKL = 3;
int VYKL = 5;
bool St;
bool Sto;
void setup() {
 pinMode (VAU,INPUT_PULLUP);
 pinMode (NAU,INPUT_PULLUP);
 pinMode(VKL,OUTPUT);
 pinMode(VYKL,OUTPUT);
 St = 0;
 Sto = 0;
 }
void loop() {
  if (digitalRead(VAU)  == HIGH)
  {
  St = 1;
  St = 0;     
  }
  else
  {
  St = 0;
  } 
if ((St) = 1);
 {
   Start();  
 }
  if (digitalRead(NAU) == LOW)
  {
  Sto = 1;
  }
  else
  {
  Sto = 0;
  }
  if ((Sto) = 1)
{
  Stop ();
  Sto = 0;  
}
}  
void Start (){
   digitalWrite (VKL,HIGH);
   delay(3000);
   digitalWrite(VKL,LOW);
}
void Stop (){
    digitalWrite (VYKL,HIGH);
    delay(3000);
    digitalWrite(VYKL,LOW);   
}

Изучите синтаксис оператора if… после условия точка с запятой не ставится.
И почитайте, чем отличаются операторы “=” и “==”

дальше смотреть не стал…

Прошу прощения не тот код скопировал. Вот исходник.

int VAU = 2;
int NAU = 4;
int VKL = 3;
int VYKL = 5;
bool St;
bool Sto;
void setup() {
 pinMode (VAU,INPUT_PULLUP);
 pinMode (NAU,INPUT_PULLUP);
 pinMode(VKL,OUTPUT);
 pinMode(VYKL,OUTPUT);
 St = 0;
 Sto = 0;
 }
void loop() {
  if (digitalRead(VAU)  == HIGH)
  {
  St = 1;     
  }
  else
  {
  St = 0;
  } 
if ((St) = 1)
 {
   Start(); 
   St = 0;
 }
  if (digitalRead(NAU) == LOW)
  {
  Sto = 1;
  }
  else
  {
  Sto = 0;
  }
  if ((Sto) = 1)
{
  Stop ();
  Sto = 0;  
}
}  
void Start (){
   digitalWrite (VKL,HIGH);
   delay(3000);
   digitalWrite(VKL,LOW);
}
void Stop (){
    digitalWrite (VYKL,HIGH);
    delay(3000);
    digitalWrite(VYKL,LOW);   
}

Ну вы бы посмотрели, нет ли в новом коде тех же ошибок, прежде чем копировать.
А они есть.

2 лайка

На старом форуме была тема про насос по датчикам. Там все проблемы решили.

И зачем Вам переменные St и Sto?

попробуйте такое:

// программа обеспечивает управление насосом для подкачки в расходный бак, по включению датчика верхнего уровня насос отключается ( бак наполнен)
//  при отключении датчика нижнего уровня, насос включается (достигнут нижний уровень)
//  время наполнния/расходования бака много больше времени включения/ отключения ( 3 секунды)
//  насос остается во включенном / отключенном состоянии после снятия сигналов VKL /VYKL (в шкафу управления насосом есть  контактор с самоболкировкой во включенном/ отключенном состоянии)
#define VAU 2
#define NAU 4
#define VKL 3
#define VYKL 5

bool pumpWork;

void setup() {
  pinMode (VAU, INPUT_PULLUP);
  pinMode (NAU, INPUT_PULLUP);
  pinMode(VKL, OUTPUT);
  pinMode(VYKL, OUTPUT);
  digitalWrite(VKL, LOW);
  digitalWrite(VYKL, LOW);
  pumpWork = false;  // нужна переменная для хранения состояния насоса , чтоб его не включать/ выключать  постоянно
}

void loop() {
  if ( (digitalRead(VAU)  == HIGH) && ( pumpWork ) )  // если верхний уровень и насос не остановлен, то останавливаем
  {
    Stop();
    pumpWork = false;
  }
  if ( (digitalRead(NAU) == LOW) && ( !pumpWork ) ) // если разомкнулся уже и геркон нижнего уровня ( пройден нижний уровень), а насос не запущен, то включаем
  {
    Start();
    pumpWork = true;
  }
  delay(1000);  // ну можно и молотить непрерывно убрав задержку
}

void Start () {
  digitalWrite (VKL, HIGH);
  delay(3000);
  digitalWrite(VKL, LOW);
}
void Stop () {
  digitalWrite (VYKL, HIGH);
  delay(3000);
  digitalWrite(VYKL, LOW);
}
1 лайк

@Nemo

Вы тут человек новый, позвольте несколько слов.

Во-первых, не слишком хорошая услуга для спрашивающего давать ему готовый код. Для новичка гораздо полезнее было бы найти и исправить ошибки в СВОЕМ коде.
Хотя я понимаю, каждый помогает|, как считает нужным.

Важнее другое - вы выкладываете свой код не по правилам форума, без тегов и номеров строк. Как его обсуждать? Для человека, ПОМОГАЮЩЕГО новичку - то есть предположительно более грамотного - это просто неприлично.

Пожалуйста, вернитесь обратно в свое сообщение и отредактируйте его. Или удалите неправильное и вставьте новое.

1 лайк

На какой датчик? Их два.
Старт и стоп одинаковые подпрограммы. Зачем две?
Если два датчика то по одному логично включать по второму выключать. И так же выключать через 3 минуты, если раньше не выключилось по верхнему датчику, для защиты.

Всем большое спасибо. Теперь работает как надо! Прошу меня простить, просто я новичек. Все замечания на будущее учту. Просто я бился с этим кодом 2 недели и по ночам тоже. Перелапатил все что возможно. Скорее всего навыков не хватает пока подстроить программу под себя. Еще раз СПАСИБО!

Я бы посоветовал вам подучить С. Например есть сайт Метанит, там кратко справочно есть по С и С++. Хотя плюсы вас пока не должны волновать. Далее надо найти какой то курс по С , например на степике и пройти его. Главное чтоб там были автоматически проверяемые задачи, ну например https://stepik.org/course/3078/promo
Что касается конкретно Ардуино и систем автоматики. Системы автоматики часто строятся как конечные автоматы ( желательно посмотреть какую то старую книжку на тему конечных автоматов, теория особая вам не нужна). Конечные автоматы имеют внутренние состояния меняющиеся по какому-то закону/алгоритму от внешних сигналов. В вашем случае такое состояние - режим насоса pumpWork- он работает или остановлен. В зависимости от внешних сигналов и состояния насоса с ним нужно делать действия ( например - включить). Наличие состояния позволяет выполнять цепочки последовательных действий в которых переход на следующий шаг ( и выбор самого шага) зависит от сигналов внешних датчиков. В тоже время не выполняются глупые действия, например зачем каждый цикл отключать насос, если он уже и так выключен.
Такое впечатление, что интуитивно вы почувствовали, необходимость иметь память о предыдущих событиях - это фактически и есть внутренне состояние конечного автомата. Понавводили переменных, ну дальше… мучительные 2 недели. Если хотите расти в этой области - расширяйте кругозор, учитесь. И начните с принципов работы систем аналоговой и дискретной автоматики.
Если моя программа вам помогла - поставьте лайк под сообщением :slight_smile:

1 лайк