Автоматическое наполнение бака водой

Ребята, всем привет, делаю программу для автоматического наполнения бака. 2 датчика XKC-Y25-NPN, одно реле для управления клапаном. Проблема в цикле наполнения бака. Не срабатывает условие И(&&). Как только срабатывает первый датчик minVal - выходит из цикла.

const int max_pin = 3; // Определяем пин, используемый для подключения max-воды
const int relay_pin = 9; // Определяем пин, используемый для подключения реле

void setup() {
  Serial.begin(9600);
  pinMode (3, INPUT_PULLUP);
  pinMode (4, INPUT_PULLUP);
  pinMode(relay_pin, OUTPUT);
  digitalWrite(relay_pin, HIGH); // Выключаем реле - посылаем высокий сигнал
}
void loop() {
  int minVal = digitalRead(3);
  int maxVal = digitalRead(4);
  if (minVal == 1 && maxVal == 1) {
    while (digitalRead(3) == 1 &&  digitalRead(4) == 1) {
      Serial.println("Реле ВКЛючено 2");
      digitalWrite(relay_pin, LOW); // Включаем реле - посылаем низкий уровень сигнала
      delay(1000);
    }
  } else if (minVal == 1 && maxVal == 0) {
    Serial.println("Неисправность!!! 3");
  } else {
    digitalWrite(relay_pin, HIGH); // Отключаем реле - посылаем высокий уровень сигнала
    Serial.println("Реле вЫключено 1");
  }
  delay(2000);
}```

Программа уже написана. Называется “поплавок от унитаза”.

1 лайк

&& не может не срабатывать.

Давайте схему и фото сборки.

Поясните, как работают датчики? В каком положении у них 1, а в каком ноль.
Иными словами, что означает вот это условие:

Датчики подтянуты командой PULLUP, по этому сигнал инвертирован.

Это не ответ на мой вопрос.
Попробую чуть развернутее, вдруг не ясно.
Когда датчик выдает единицу - это вода есть или нет?

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

В данном случае воды нет.

у вас в коде не так.
Как только вода поднимется выше первого датчика - система напишет “Неисправность” и отключит насос (строка 20-21)

Неисправность если верхний показывает воду, а нижний нет.

Да, перепутал. Но если вода дошла до нижнего - срабатывает строка 23 и насос все равно отключается.

У вас насос работает только пока воды нет и на нижнем и на верхнем датчике - строки 15-18

В какой строчке, по вашему, не срабатывает логическое И (&&)?

Да, так и происходит. Как только доходит до нижнего - отключается. Цикл while (пока выполняется условие в скобках, т.е. первый и второй датчик не сработали) - выполнять тело, разве нет.

Не путайте себя неясными терминами. Что такое “пока датчик не сработал” ? - это пока вода на нем есть или пока нет?

Сформулируйте условие четко - и все станет ясно. У вас в условии так - “выполнять пока на обоих датчиках нет воды”. Как только на любом из датчиков появилась вода - условие уже не выполняется и цикл заканчивается.
Код работает ровно так, как вы написали.

1 лайк

И еще - тут вообще не нужен цикл while. While - это когда что-то надо делать многократно. Вы в цикле включаете реле. Много-много раз подряд. Зачем?
Вы когда в туалет идете и освещение включаете - вы разве стоите и держите кнопку нажатой? - нет, включили один раз и оно горит, пока не выключили

@Jo_on Вы сами себе мозг выносите, а потом нам. Вам совершенно правильно написали:

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

void loop(void) {
	if (nizVoda() && verhVoda()) relayOFF();
	else if (nizNetVody() && verhNetVody()) relayON();
	else if (verhVoda() && nizNetVody()) Serial.println("Ошибочка вышла");
}

Всё стало гораздо понятнее, не надо каждый раз голову ломать где там 0, а где 1. Согласны?
Осталось только приписать выше определения функций, но они все в одну строчку:

inline bool voda(const uint8_t pin) {
	return digitalRead(pin) == HIGH;
}

inline bool nizVoda(void) {
	return voda(pinNIZ);
}

inline bool verhVoda(void) {
	return voda(pinVERH);
}

inline bool nizNetVody(void) {
	return ! nizVoda();
}

inline bool verhNetVody(void) {
	return ! verhVoda();
}

Попробуйте привыкнуть так писать и жизнь сразу станет легче. Не бойтесь Вы этих функций, они Вам помогают.

5 лайков

Спасибо всем за популярное объяснение, особенно с выключателем в туалете :grinning: Программу писал последний раз в институте на паскале, от этого все и проблемы. Пытаюсь разобраться, не судите строго…

Не, проблемы не из-за Паскаля, это точно!!!

2 лайка

Паскаль у меня ассоциируется с Виртом, точно не из-за Паскаля…