Ребята, всем привет, делаю программу для автоматического наполнения бака. 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);
}```
Бочка - 2 датчика (верх\низ). Как только уровень воды опустится ниже нижнего датчика, включается клапан через реле и наполняется бак пока не сработает второй датчик.
Да, так и происходит. Как только доходит до нижнего - отключается. Цикл while (пока выполняется условие в скобках, т.е. первый и второй датчик не сработали) - выполнять тело, разве нет.
Не путайте себя неясными терминами. Что такое “пока датчик не сработал” ? - это пока вода на нем есть или пока нет?
Сформулируйте условие четко - и все станет ясно. У вас в условии так - “выполнять пока на обоих датчиках нет воды”. Как только на любом из датчиков появилась вода - условие уже не выполняется и цикл заканчивается.
Код работает ровно так, как вы написали.
И еще - тут вообще не нужен цикл while. While - это когда что-то надо делать многократно. Вы в цикле включаете реле. Много-много раз подряд. Зачем?
Вы когда в туалет идете и освещение включаете - вы разве стоите и держите кнопку нажатой? - нет, включили один раз и оно горит, пока не выключили
@Jo_on Вы сами себе мозг выносите, а потом нам. Вам совершенно правильно написали:
Вот, смотрите, если бы Вы вместо того, что у Вас написано, написал бы в терминах задачи, то проблем бы не возникло от слова совсем.
void loop(void) {
if (nizVoda() && verhVoda()) relayOFF();
else if (nizNetVody() && verhNetVody()) relayON();
else if (verhVoda() && nizNetVody()) Serial.println("Ошибочка вышла");
}
Всё стало гораздо понятнее, не надо каждый раз голову ломать где там 0, а где 1. Согласны?
Осталось только приписать выше определения функций, но они все в одну строчку:
Спасибо всем за популярное объяснение, особенно с выключателем в туалете Программу писал последний раз в институте на паскале, от этого все и проблемы. Пытаюсь разобраться, не судите строго…