Логика работы насоса на двух герконовых датчиках

JekaS
Offline
Зарегистрирован: 09.06.2015

Приветствую профессионалов.

Весенняя проблема - осушить яму в гараже. Два геркона и поплавок с магнитом.  Нормальное состояние с герконов = 1. При магнитном поле = 0. Запутался в логике  включения/отключения насоса. Подскажите по коду или направьте где подсмотреть.

const int Relay =  13;// насос откачки
const int buttonPin1 = 2;//геркон выключения (нижний) насоса откачки 
const int buttonPin2 = 3;//геркон включения (верхний) насоса откачки
bool releState = false; // состояние реле когда включено
bool upDown;
void setup() {
  Serial.begin(9600);
  pinMode(Relay, OUTPUT);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
}

void loop() {
  bool gerk1=digitalRead(buttonPin1); //считываем контакт нижнего геркона, без магнита = 1
  bool gerk2=digitalRead(buttonPin2); //считываем контакт верхнего геркона, без магнита = 1 
  // принимаем решение что нужно делать
  //если нижний геркон = 0 магнит рядом, отключаем насос и запоминаем что идет наполнение
  if (gerk1==false) {
    if (gerk1!=upDown) {
      //запутался с выставлением ...флага направления помогите с логикой...
    }
    releState = false;
    upDown = true; //идет наполнение 
  } else {
    releState = true;
    upDown = false; //идет выкачка 
  }

  Serial.print("\tgerk1=");
  Serial.print(gerk1);
  Serial.print("\tgerk2=");
  Serial.print(gerk2);
  Serial.print("\tupDown=");
  Serial.print(upDown);
  Serial.print("\trelay=");
  Serial.println(releState);
  delay(700);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JekaS пишет:

 //запутался с выставлением ...флага направления помогите с логикой...

А сделать то чего хотели?

JekaS
Offline
Зарегистрирован: 09.06.2015

Осушать яму.

Включать насос по верхнему геркону, запоминать включение до срабатывания нижнего геркона - выключать

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

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Так тут и ардуина не нужна - одно реле , два геркона и все

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, причем тут яма? Вы пишете, что хотели какие-то флаги куда-то выставлять. Так чего именно хотели то?

JekaS
Offline
Зарегистрирован: 09.06.2015

ЕвгенийП пишет:

Да, причем тут яма? Вы пишете, что хотели какие-то флаги куда-то выставлять. Так чего именно хотели то?

Включать насос по верхнему геркону=0, запоминать включение(флаг=работает откачка) до срабатывания нижнего геркона - выключать

Выключать насос по нижнему геркону=0, запоминать выключение(флаг=накапливается вода) до срабатывания верхнего геркона - включать

Как написать логику if else if ....?

JekaS
Offline
Зарегистрирован: 09.06.2015

Пока расписывал что надо - написал сам. Правильно?

const int Relay =  13;// насос откачки
const int buttonPin1 = 2;//геркон выключения (нижний) насоса откачки 
const int buttonPin2 = 3;//геркон включения (верхний) насоса откачки
bool releState = false; // состояние реле когда включено
bool upDown; // флаг работы осушение=false  наполнение=true
void setup() {
  Serial.begin(9600);
  pinMode(Relay, OUTPUT);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
}

void loop() {
  bool gerk1=digitalRead(buttonPin1); //считываем контакт нижнего геркона, без магнита = 1
  bool gerk2=digitalRead(buttonPin2); //считываем контакт верхнего геркона, без магнита = 1 
  // принимаем решение что нужно делать
  //если нижний геркон = 0 магнит рядом, отключаем насос и запоминаем что идет наполнение
  if ((gerk1==false) && (upDown==true))  { //если магнит сработал внизу и работает осушение тогда выключаем насос и флаг в наполнение
    upDown = false;
    releState = false;
  } else if ((gerk2==false) && (upDown==false))  { //если магнит сработал вверху и насос остановлен тогда включаем насос и флаг в осушение
    upDown = true;
    releState = true;    
  }

  Serial.print("\tgerk1=");
  Serial.print(gerk1);
  Serial.print("\tgerk2=");
  Serial.print(gerk2);
  Serial.print("\tupDown=");
  Serial.print(upDown);
  Serial.print("\trelay=");
  Serial.println(releState);
  delay(700);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не понимаю проблему. Почему вот прямо так, как Вы и говорите и написать безо всяких сложностев? Тут что-то не так? 

//
// Функции датчиков
//
bool srabotalVerhniy(void) { return digitalRead(buttonPin1) == 0; }
bool srabotalNizhniy(void) { return digitalRead(buttonPin2) == 0; }

//
// Функции управления насосом
//
void turnON(void) { digitalWrite(Relay, LOW); } // мож HIGH - Вам виднее
void turnOFF(void) { digitalWrite(Relay, HIGH); } // мож LOW - Вам виднее

// А потом просто писать где надо

if (srabotalVerhniy()) turnON();
if (srabotalNizhniy()) turnOff();

И собственно всё. Специально запоминать включено или нет нафиг не надо. В любой момент можно прямо спросить  digitalRead(Relay); и узнать включено или нет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JekaS пишет:

Пока расписывал что надо - написал сам. Правильно?

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

Pyotr
Offline
Зарегистрирован: 12.03.2014

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

#define PUMP_ON()  digitalWrite(relay, 0)
#define PUMP_OFF() digitalWrite(relay, 1)
const int relay =  13;// насос откачки
const int buttonPin1 = 2;//геркон выключения (нижний) насоса откачки 
const int buttonPin2 = 3;//геркон включения (верхний) насоса откачки
bool releState = false; // состояние реле когда включено
unsigned long prevMillis, carrMillis; 

void setup() {
  Serial.begin(9600);
  pinMode(relay, OUTPUT);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
}

void loop(){
   carrMillis = millis();
   if(carrMillis - prevMillis >= 50){   
     prevMillis = carrMillis;
     if(releState == 0){//насос работает
       if(digitalRead(buttonPin1) == 0){// и нижн.уровень
         PUMP_OFF(); 
         releState = 1; 
       } 
     }else{//насос не работает
       if(digitalRead(buttonPin2) == 0){// и верхний уровень
         PUMP_ON(); 
         releState = 0;
       }  
     }
   }
}

 

JekaS
Offline
Зарегистрирован: 09.06.2015

Спасибо за участие! Работает.

Иногда, по весне :), на тривиальной логике стопоришься......

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

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

sadman41
Offline
Зарегистрирован: 19.10.2016

А может там вообще ардуина не нужна...

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

sadman41 пишет:

А может там вообще ардуина не нужна...

без дуино жисть теряет смысл.

mexanic38
Offline
Зарегистрирован: 26.02.2018

я видел в старом журнале Радио такую же схему насоса на трех  реле.