Логика работы насоса на двух герконовых датчиках
- Войдите на сайт для отправки комментариев
Пт, 27/04/2018 - 12:58
Приветствую профессионалов.
Весенняя проблема - осушить яму в гараже. Два геркона и поплавок с магнитом. Нормальное состояние с герконов = 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);
}
А сделать то чего хотели?
Осушать яму.
Включать насос по верхнему геркону, запоминать включение до срабатывания нижнего геркона - выключать
Выключать насос по нижнему геркону, запоминать выключение. до срабатывания верхнего геркона - включать
Так тут и ардуина не нужна - одно реле , два геркона и все
Да, причем тут яма? Вы пишете, что хотели какие-то флаги куда-то выставлять. Так чего именно хотели то?
Да, причем тут яма? Вы пишете, что хотели какие-то флаги куда-то выставлять. Так чего именно хотели то?
Включать насос по верхнему геркону=0, запоминать включение(флаг=работает откачка) до срабатывания нижнего геркона - выключать
Выключать насос по нижнему геркону=0, запоминать выключение(флаг=накапливается вода) до срабатывания верхнего геркона - включать
Как написать логику if else if ....?
Пока расписывал что надо - написал сам. Правильно?
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); }Я не понимаю проблему. Почему вот прямо так, как Вы и говорите и написать безо всяких сложностев? Тут что-то не так?
// // Функции датчиков // 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); и узнать включено или нет.
Пока расписывал что надо - написал сам. Правильно?
не знаю, я не до конца понимаю задачу и потому не могу понять зачем такие сложности в которых потом чёрт ногу сломит. Как я себе это вижу, я Вам написал в прошлом посте. Там писать нечего. Если я чего-то недопонял и не учёл, ... ну, не знаю даже.
Попробуйте так
#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; } } } }Спасибо за участие! Работает.
Иногда, по весне :), на тривиальной логике стопоришься......
А если будете через писать через цифровой автомат, то и тривилальной логики не надо. Все решается автоматом.
А может там вообще ардуина не нужна...
А может там вообще ардуина не нужна...
без дуино жисть теряет смысл.
я видел в старом журнале Радио такую же схему насоса на трех реле.