Защита от протечки

я ж написал, что для батарей отопления алгоритм. Перекрывать на две секунды. Секунда на переходные процессы после закрытия, секунду на измерение.

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

где перекрывать то, у каждой батареи чтоль?
или на входе, после счетчика?

к сожалению

и че туда лапшу тянуть или как?

У батареи еще и обратку перекрывать нужно

пока люди активны (дома и не спят) система выключена.
когда спят или отсутствубт - включена.

в таком режиме и для душа со стиралкой пойдет :slight_smile:

ЗЫЖ: а если объект военный, то нехай еще курсант жмет кнопку каждые 108 секунд, типа живой человек у пульта.

ZigBee же.

а питать “перекрыватели” тоже от нее?

Маленькие есть, магнитные. От батарейки самое то. К тому же 2 секунды - это ниочем

ссылочку можно?

Эммм… при случае, да. Я не помню на память наазваний. Я их в руках вертел :). Сколько то там атмосфер, короче, для сетей отопления пойдет.

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

Краны перекрывающие воду:

Платы датчиков. Всего приобретено шесть комплектов.

Скетч 7-07_store

       int Red_LED   = 8;            // красный светодиод тревоги
       int Green_LED = 11;        // зелёный светодиод деж. режима
       int LED_PIN_2 = 7;          // синий светодиод открытия
       int Buzzer    = 6;              // зуммер
       int Rain_sensor = A0;     // сенсор протечки
       int Rain_detected; 
       int IN2 = 9;                 // Input2 подключен к выводу 9 на мотор
       int IN1 = 10;
       int BUTTON_PIN = 5;    // номер контакта 1 кнопки "Закрыть"
       int BUTTON_PIN_2 = 4;  // номер контакта 2 кнопки "Открыть"
       // переменные таймеров
       uint32_t myTimer;

       // переменные изменятся:
       int  buttonState = 0;    // переменная для чтения состояния кнопки 1
       int  buttonState_2 = 0;  // переменная для чтения состояния кнопки 2

       void setup()  
       {  
         Serial.begin(9600);  
         pinMode(Red_LED, OUTPUT);       // выход на красный светодиод тревоги
         pinMode(Green_LED, OUTPUT);     // выход на зелёный светодиод деж. режима
         pinMode(Buzzer, OUTPUT);        // выход на зуммер
         pinMode(Rain_sensor, INPUT);    // выход на датчик дождя
         pinMode (IN1, OUTPUT);          // выход на драйвер: 
         pinMode (IN2, OUTPUT);          // выход на драйвер: 
         pinMode (BUTTON_PIN,  INPUT_PULLUP);    // выход на кнопку 1
         pinMode (BUTTON_PIN_2,  INPUT_PULLUP);  // выход на кнопку 2
         pinMode (LED_PIN_2,  OUTPUT);   // выход на синий светодиод открытия

       }  

       void loop()  
       {  
          buttonState =  digitalRead  (BUTTON_PIN); 
          buttonState_2 =  digitalRead  (BUTTON_PIN_2);

         // управляем мотором в ручном режиме в соответствии с состоянием кнопки 1 (открыть)
         if(buttonState == LOW) {
         digitalWrite (IN1, HIGH);    // включить мотор
         digitalWrite(Red_LED, HIGH); // включить светодиод
         delay(7000); // 7 секунд
         digitalWrite(IN1, LOW);      // выключить мотор
         digitalWrite(Red_LED, LOW);  // выключить светодиод
         }
         // управляем мотором в ручном режиме в соответствии с состоянием кнопки 2 (закрыть)
         if(buttonState_2 == LOW) {
         digitalWrite (IN2, HIGH);      // включить мотор
         digitalWrite(LED_PIN_2, HIGH); // включить светодиод
         delay(7000); // 7 секунд
         digitalWrite(IN2, LOW);        // выключить мотор
         digitalWrite(LED_PIN_2, LOW);  // выключить светодиод
         }

         // управляем мотором в автоматическом режиме в соответствии с состоянием сенсора
          Rain_detected = digitalRead(Rain_sensor);  
          Serial.println(Rain_detected);  
          delay(500);  
          if (Rain_detected == 0)  
         {  
           Serial.println("Обнаружена вода! Немедленно примите меры!");
           if (millis() - myTimer >= 500) {   // таймер на 500 мс (2 раза в сек)
             myTimer = millis();              // сброс таймера
             // выполнить действие 1
           digitalWrite(Red_LED, !digitalRead(Red_LED));
           digitalWrite(Buzzer, !digitalRead(Buzzer));
           }
           digitalWrite(Green_LED, LOW);   // выключить светодиод деж. режима
           digitalWrite (IN1, HIGH);       // включить мотор
                  
         }  
         else  
         {  
           Serial.println("Вода не обнаружена."); 
           digitalWrite(IN1, LOW);           // выключить мотор 
           digitalWrite(Red_LED, LOW);       // выключить светодиод
           digitalWrite(Green_LED, HIGH);    // включить светодиод деж. режима
           digitalWrite(Buzzer, HIGH);       // выключить зуммер
         }  
       }  

При использовании скетча 7-07_store и параллельном подключении датчиков к одному входу всё работает, нет лишь индикации на каком из датчиков произошла протечка, поскольку при данном подключении светодиоды DO-LED тревоги загораются сразу у ВСЕХ компараторов, а мне хотелось бы, чтобы имелась индикация, показывающая где именно произошла протечка. Поэтому я попытался это решить и создал скетч 7-08_store.

       int Red_LED   = 8;          // красный светодиод тревоги
       int Green_LED = 11;         // зелёный светодиод деж. режима
       int LED_PIN_2 = 7;          // синий светодиод открытия
       int Buzzer    = 6;          // зуммер
       int Rain_sensor = A0;       // сенсор протечки
       int Rain_sensor1 = A1;
       int Rain_sensor2 = A2;
       int Rain_detected;
       int Rain_detected1; 
       int Rain_detected2;
       int IN2 = 9;                 // Input2 подключен к выводу 9 на мотор
       int IN1 = 10;
       int BUTTON_PIN = 5;    // номер контакта 1 кнопки "Закрыть"
       int BUTTON_PIN_2 = 4;  // номер контакта 2 кнопки "Открыть"
       // переменные таймеров
       uint32_t myTimer;

       // переменные изменятся:
       int  buttonState = 0;    // переменная для чтения состояния кнопки 1
       int  buttonState_2 = 0;  // переменная для чтения состояния кнопки 2

       void setup()  
       {  
         Serial.begin(9600);  
         pinMode(Red_LED, OUTPUT);       // выход на красный светодиод тревоги
         pinMode(Green_LED, OUTPUT);     // выход на зелёный светодиод деж. режима
         pinMode(Buzzer, OUTPUT);        // выход на зуммер
         pinMode(Rain_sensor, INPUT);    // выход на датчик дождя
         pinMode(Rain_sensor1, INPUT);   // выход на датчик дождя 1
         pinMode(Rain_sensor2, INPUT);   // выход на датчик дождя 2
         pinMode (IN1, OUTPUT);          // выход на драйвер: 
         pinMode (IN2, OUTPUT);          // выход на драйвер: 
         pinMode (BUTTON_PIN,  INPUT_PULLUP);    // выход на кнопку 1
         pinMode (BUTTON_PIN_2,  INPUT_PULLUP);  // выход на кнопку 2
         pinMode (LED_PIN_2,  OUTPUT);   // выход на синий светодиод открытия

       }  

       void loop()  
       {  
          buttonState =  digitalRead  (BUTTON_PIN); 
          buttonState_2 =  digitalRead  (BUTTON_PIN_2);

         // управляем мотором в ручном режиме в соответствии с состоянием кнопки 1 (открыть)
         if(buttonState == LOW) {
         digitalWrite (IN1, HIGH);    // включить мотор
         digitalWrite(Red_LED, HIGH); // включить светодиод
         delay(7000); // 7 секунд
         digitalWrite(IN1, LOW);      // выключить мотор
         digitalWrite(Red_LED, LOW);  // выключить светодиод
         }
         // управляем мотором в ручном режиме в соответствии с состоянием кнопки 2 (закрыть)
         if(buttonState_2 == LOW) {
         digitalWrite (IN2, HIGH);      // включить мотор
         digitalWrite(LED_PIN_2, HIGH); // включить светодиод
         delay(7000); // 7 секунд
         digitalWrite(IN2, LOW);        // выключить мотор
         digitalWrite(LED_PIN_2, LOW);  // выключить светодиод
         }

         // управляем мотором в автоматическом режиме в соответствии с состоянием сенсора
          Rain_detected = digitalRead(Rain_sensor);
          Rain_detected1 = digitalRead(Rain_sensor1);
          Rain_detected2 = digitalRead(Rain_sensor2);
          Serial.println(Rain_detected or Rain_detected1 or Rain_detected2);  
          delay(500);  
          if (Rain_detected == 0 or Rain_detected1 == 0 or Rain_detected2 == 0)
  
         {  
           Serial.println("Обнаружена вода! Немедленно примите меры!");
           if (millis() - myTimer >= 500) {   // таймер на 500 мс (2 раза в сек)
             myTimer = millis();              // сброс таймера
             // выполнить действие 1
           digitalWrite(Red_LED, !digitalRead(Red_LED));
           digitalWrite(Buzzer, !digitalRead(Buzzer));
           }
           digitalWrite(Green_LED, LOW);   // выключить светодиод деж. режима
           digitalWrite (IN1, HIGH);       // включить мотор
                             
         }  
         else  
         {  
           Serial.println("Вода не обнаружена."); 
           digitalWrite(IN1, LOW);           // выключить мотор 
           digitalWrite(Red_LED, LOW);       // выключить светодиод
           digitalWrite(Green_LED, HIGH);    // включить светодиод деж. режима
           digitalWrite(Buzzer, HIGH);       // выключить зуммер
         }  
       }  







Здесь (в скетче я подключил только 3 датчика для пробы) индикация работает как надо , однако , если какие-то прописанные в скетче датчики отключить, вдруг какой-то окажется ненужен, то сразу же срабатывает тревога и закрываются краны.

А так ли важно знать из какой именно трубы затопило соседей? У подобных вещей не делают отдельную индикацию для датчиков.

Как? Физически? Так аналоговый вход просто “виснет в воздухе” и ловит сигналы далёких галактик. Как минимум надо делать INPUT_PULLUP.
Активный уровень датчика 0?
Тогда эта конструкция

Сработает, если входы не имеют подтяжки.
Кстати, не знал что можно применить OR. Обычно двойная черта “||”.

и AND тоже )))

По алгоритму.
Домашние вас проклянут. Если датчик сбойнет, или просто на него случайно брызнут, нет возможности включить воду и отменить тревогу. Придется отключать питание от устройства и вручную крутить краны под приводами.

Если дома кот(-шка), он(а) обязательно догадаются как нашкодить хозяину во время душа😄

А расскажите нам, как вы управляете направлением вращения кранов? А коде закрытия и коде открытия везде

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

Ну и схемку бы. Неужели прямо с пина ардуины на мотор? …чета вопросики полезли как червячки…

Ну он же тебе написал про L298D. У меня такие же, управляются ДВУМЯ пинами на 1 мотор

Да, я тут попался на плохое оформление кода. Сложилось впечатление, что кранами управляют независимо.