Система защиты от протечки воды
- Войдите на сайт для отправки комментариев
После того как лопнула гибкая подводка в ванной задумался над такой системой. Готовую покупать неспортивно :)
на текущий момент 2 варианта ,отличие в подключении кнопоп. У себя планирую выносной блок кнопок и индикации,поэтому задача была уложиться в восем проводов .
Логика : при срабатывание датчика перекрывается вода,включается бузер и блокируется кнопка " Открыть". При нажатии кнопки "Сброс/Уборка" блокируется датчик протечки на час(время можно выставить любое в самом скетче) и появлюяется возможность открыть воду. Так же эту кнопку можно использовать просто для отключения датчиков протечки на час,что удобно в случае уборки в ванной.
первый вариант( удобен когда всё в одном корпусе):
#define alarmLed 6 // индикатор "протечка/уборка"
#define openLed 4 // индикатор состояния "открыто"
#define closeLed 5 // индикатор состояния "закрыто"
#define openRele 3 // реле закрытия крана
#define closeRele 12 // реле открытия крана
#define openButton 10 // кнопка "Открыть" кран
#define closeButton 11 // кнопка "Закрыть" кран
#define resetButton 2 // кнопка "Сброс/Уборка"
#define leaksensor 8 // датчик протечки,при срабатывание на входе LOW
bool leakState = 0;
bool lastleakState = 0;
bool openState=0;
bool lastopenState=0;
bool closeState=0;
bool lastcloseState=0;
bool resetState=0;
bool lastresetState=0;
boolean opS = 0;
boolean clS =0;
boolean leak=0;
boolean wait=0;
int ledStateLeak = LOW;
int ledStateWait = LOW;
boolean new_button_state1 = false;
boolean new_button_state2 = false;
boolean new_button_state3 = false;
boolean old_button_state1 = false;
boolean old_button_state2 = false;
boolean old_button_state3 = false;
unsigned long previousMillis = 0;
unsigned long previousMillisOpen = 0;
unsigned long previousMillisClose = 0;
unsigned long previousMillisWait = 0;
unsigned long previousMillisWaitLed = 0;
unsigned long intervalLeak =500;
unsigned long intervalWaitLed =3000;
unsigned long intervalRele =4000;
unsigned long intervalWait=3600000;
void setup() {
pinMode(alarmLed,OUTPUT);
pinMode(openLed,OUTPUT);
pinMode(closeLed,OUTPUT);
pinMode(openRele,OUTPUT);
pinMode(closeRele,OUTPUT);
pinMode(openButton, INPUT);
pinMode(closeButton, INPUT);
pinMode(resetButton, INPUT);
pinMode(leaksensor, INPUT);
Serial.begin(9600);
}
void loop(){
//**************Анализ состояния входов ***************************
leakState=digitalRead(leaksensor);
leakState=!leakState;
if (leakState != lastleakState) {
if ((leakState == HIGH)&&(wait==0)) {
leak=1; // если сработал датчик протечки устанавливаем статус "протечка"
Serial.println("LEAK");
}
lastleakState = leakState;
}
if (leak==1){
clS=1;
opS=0;
}
openState = digitalRead(openButton);
if (openState != lastopenState) {
if ((openState == HIGH)&&(leak==0)) {
opS=1; // если нажата кнопка "открыть" устанавливаем статус "открыто"
clS=0;
Serial.println("OPEN");
}
lastopenState = openState;
}
closeState = digitalRead(closeButton);
if (closeState != lastcloseState) {
if ((closeState == HIGH) ||(leak==1)) {
opS=0;
clS=1; // если нажата кнопка "закрыть" или статус "протечка" устанавливаем статус "закрыть"
Serial.println("CLOSE");
}
lastcloseState = closeState;
}
resetState = digitalRead(resetButton);
if (resetState != lastresetState) {
if (resetState == HIGH) {
leak=0; // если нажата кнопка "сброс/уборка" сбрасываем статус "протечка" и устанавливаем статус "уборка" и блокируем датчик протечки
wait=1;
previousMillisWait = millis();
Serial.println("RESET");
Serial.println("WAIT");
}
lastresetState = resetState;
}
if((previousMillisWait>0) && (millis()-previousMillisWait >= intervalWait))
{
wait=0; // если прошло 60 минут убираем статус "уборка" и разблокируем датчик протечки
previousMillisWait = 0;
Serial.println("END WAIT");
}
//*************** Управление реле закрытия кранов**************************
new_button_state1 = opS;
if ( (new_button_state1 != old_button_state1) && new_button_state1 )
{
digitalWrite(openRele, HIGH); // если установлен статус "открыто" включаем реле открытия кранов на 4 секунды
previousMillisOpen = millis();
}
old_button_state1 = new_button_state1; // сохраняем изменения
if((previousMillisOpen>0) && (millis()-previousMillisOpen >= intervalRele))
{
digitalWrite(openRele, LOW);
previousMillisOpen = 0;
}
new_button_state2 = clS;
if ( (new_button_state2 != old_button_state2) && new_button_state2 )
{
digitalWrite(closeRele, HIGH); // если установлен статус "закрыто" включаем реле закрытия кранов на 4 секунды
previousMillisClose = millis();
}
old_button_state2 = new_button_state2; // сохраняем изменения
if((previousMillisClose>0) && (millis()-previousMillisClose >= intervalRele))
{
digitalWrite(closeRele, LOW);
previousMillisClose = 0;
}
//*************** управление светодиодами индикации состояния *****************
if (opS==1){
digitalWrite(openLed, HIGH); // если установлен статус "открыто" включаем индикатор состояния "открыто"
}
else {
digitalWrite(openLed, LOW); //иначе выключаем
}
if (clS==1){
digitalWrite(closeLed, HIGH); // если установлен статус "закрыто" включаем индикатор состояния "закрыто"
}
else {
digitalWrite(closeLed, LOW); //иначе выключаем
}
if ((leak==1)&&(wait==0)){
digitalWrite(alarmLed, ledStateLeak); // если "протечка" ,то моргаем индикатор "протечка/уборка" с интервалом равным intervalLeak
}
if ((leak==0)&&(wait==1)){
digitalWrite(alarmLed, ledStateWait); // если "уборка" ,то моргаем индикатор "протечка/уборка" с интервалом равным intervalWaitLed
}
if ((leak==0)&&(wait==0)){
digitalWrite(alarmLed, LOW); // иначе выключаем
}
//********** управление бузером ********
if ( leak==1) // если "протечка" включаем бузер
{
tone(9, 600, 150);
delay(300);
}
//********* задание частоты мигания светодиода *******
unsigned long currentMillis = millis(); // частота моргания для режима "протечка"
if(currentMillis - previousMillis > intervalLeak) {
previousMillis = currentMillis;
if (ledStateLeak == LOW)
ledStateLeak = HIGH;
else
ledStateLeak = LOW;
}
unsigned long currentMillisWaitLed = millis(); // частота моргания для режима "уборка"
if(currentMillisWaitLed - previousMillisWaitLed> intervalWaitLed) {
previousMillisWaitLed = currentMillisWaitLed;
if (ledStateWait == LOW)
ledStateWait = HIGH;
else
ledStateWait = LOW;
}
}
Схема в вормате sPlan https://yadi.sk/d/7UYPF58lVcs7h
Второй вариант с кнопками подключенными к аналоговому входу :
#define alarmLed 6 // индикатор "протечка/уборка"
#define openLed 4 // индикатор состояния "открыто"
#define closeLed 5 // индикатор состояния "закрыто"
#define openRele 3 // реле закрытия крана
#define closeRele 12 // реле открытия крана
#define leaksensor 8 // датчик протечки,при срабатывание на входе LOW
int analog=0; // вход кнопок
bool leakState = 0;
bool lastleakState = 0;
boolean opS = 0;
boolean clS =0;
boolean leak=0;
boolean wait=0;
int ledStateLeak = LOW;
int ledStateWait = LOW;
boolean new_button_state1 = false;
boolean new_button_state2 = false;
boolean new_button_state3 = false;
boolean old_button_state1 = false;
boolean old_button_state2 = false;
boolean old_button_state3 = false;
unsigned long previousMillis = 0;
unsigned long previousMillisOpen = 0;
unsigned long previousMillisClose = 0;
unsigned long previousMillisWait = 0;
unsigned long previousMillisWaitLed = 0;
unsigned long intervalLeak =500;
unsigned long intervalWaitLed =3000;
unsigned long intervalRele =4000;
unsigned long intervalWait=3600000;
void setup() {
pinMode(alarmLed,OUTPUT);
pinMode(openLed,OUTPUT);
pinMode(closeLed,OUTPUT);
pinMode(openRele,OUTPUT);
pinMode(closeRele,OUTPUT);
pinMode(leaksensor, INPUT);
Serial.begin(9600);
}
void loop(){
//**************Анализ состояния входов ***************************
leakState=digitalRead(leaksensor);
leakState=!leakState;
if (leakState != lastleakState) {
if ((leakState == HIGH)&&(wait==0)) {
leak=1; // если сработал датчик протечки устанавливаем статус "протечка"
Serial.println("LEAK");
}
lastleakState = leakState;
}
if (leak==1){
clS=1;
opS=0;
}
analog=analogRead(A0);
if ((analog>690&&analog<700)&&(leak==0)) {
opS=1; // если нажата кнопка "открыть" устанавливаем статус "открыто"
clS=0;
Serial.println("OPEN");
}
if ((analog>768&&analog<798) ||(leak==1)) {
opS=0;
clS=1; // если нажата кнопка "закрыть" или статус "протечка" устанавливаем статус "закрыть"
Serial.println("CLOSE");
}
if (analog>598&&analog<628) {
leak=0; // если нажата кнопка "сброс/уборка" сбрасываем статус "протечка" и устанавливаем статус "уборка" и блокируем датчик протечки
wait=1;
previousMillisWait = millis();
Serial.println("RESET");
Serial.println("WAIT");
}
if((previousMillisWait>0) && (millis()-previousMillisWait >= intervalWait))
{
wait=0; // если прошло 60 минут убираем статус "уборка" и разблокируем датчик протечки
previousMillisWait = 0;
Serial.println("END WAIT");
}
//*************** Управление реле закрытия кранов**************************
new_button_state1 = opS;
if ( (new_button_state1 != old_button_state1) && new_button_state1 )
{
digitalWrite(openRele, HIGH); // если установлен статус "открыто" включаем реле открытия кранов на 4 секунды
previousMillisOpen = millis();
}
old_button_state1 = new_button_state1; // сохраняем изменения
if((previousMillisOpen>0) && (millis()-previousMillisOpen >= intervalRele))
{
digitalWrite(openRele, LOW);
previousMillisOpen = 0;
}
new_button_state2 = clS;
if ( (new_button_state2 != old_button_state2) && new_button_state2 )
{
digitalWrite(closeRele, HIGH); // если установлен статус "закрыто" включаем реле закрытия кранов на 4 секунды
previousMillisClose = millis();
}
old_button_state2 = new_button_state2; // сохраняем изменения
if((previousMillisClose>0) && (millis()-previousMillisClose >= intervalRele))
{
digitalWrite(closeRele, LOW);
previousMillisClose = 0;
}
//*************** управление светодиодами индикации состояния *****************
if (opS==1){
digitalWrite(openLed, HIGH); // если установлен статус "открыто" включаем индикатор состояния "открыто"
}
else {
digitalWrite(openLed, LOW); //иначе выключаем
}
if (clS==1){
digitalWrite(closeLed, HIGH); // если установлен статус "закрыто" включаем индикатор состояния "закрыто"
}
else {
digitalWrite(closeLed, LOW); //иначе выключаем
}
if ((leak==1)&&(wait==0)){
digitalWrite(alarmLed, ledStateLeak); // если "протечка" ,то моргаем индикатор "протечка/уборка" с интервалом равным intervalLeak
}
if ((leak==0)&&(wait==1)){
digitalWrite(alarmLed, ledStateWait); // если "уборка" ,то моргаем индикатор "протечка/уборка" с интервалом равным intervalWaitLed
}
if ((leak==0)&&(wait==0)){
digitalWrite(alarmLed, LOW); // иначе выключаем
}
//********** управление бузером ********
if ( leak==1) // если "протечка" включаем бузер
{
tone(9, 600, 150);
delay(300);
}
//********* задание частоты мигания светодиода *******
unsigned long currentMillis = millis(); // частота моргания для режима "протечка"
if(currentMillis - previousMillis > intervalLeak) {
previousMillis = currentMillis;
if (ledStateLeak == LOW)
ledStateLeak = HIGH;
else
ledStateLeak = LOW;
}
unsigned long currentMillisWaitLed = millis(); // частота моргания для режима "уборка"
if(currentMillisWaitLed - previousMillisWaitLed> intervalWaitLed) {
previousMillisWaitLed = currentMillisWaitLed;
if (ledStateWait == LOW)
ledStateWait = HIGH;
else
ledStateWait = LOW;
}
}
Схема в формате sPlan : https://yadi.sk/d/cCYmCrYnVctHx
Печатная плата датчиков протечки в Sprint-Layout : https://yadi.sk/d/jl14mQ4mVcu8n
Поставите исполнительные механизмы - отпишитесь, фото хорошо бы.
Поставите исполнительные механизмы - отпишитесь, фото хорошо бы.
Испольнительные механизьмы будут когда появятся наних финансы,пока в приоритете семейные проблемы.
Как придут кнопки (http://www.ebay.com/itm/201079742203?var=500259285110&ssPageName=STRK:ME...) соберу в корпус(http://www.ebay.com/itm/310878723786?ssPageName=STRK:MEWNX:IT&_trksid=p3...) и буду тестировать пока с выходом на бузер,попутно обкатаю конструкцию датчиков протечки.
Просьба отписатся об опыте эксплуатации кранов с электроприводами....
был такой вариант,но доверия к нему нет (http://www.aliexpress.com/item/motorized-ball-valve-DN15-2-way-electrica...) ,заказывать не стал.
Краны с электроприводом рекомендую заказывать или у gidrolock или аквосторожа
некачественные краны сделают ваш проект не только бесполезным, но и вредным
не дешево, но оно может легко окупиться в случае протечки
некачественные краны сделают ваш проект не только бесполезным, но и вредным
не дешево, но оно может легко окупиться в случае протечки
Это как бы и так понятно :)
У меня много лет в квартире стоят два гидролока и один нептун xp ( это который с беспроводными датчиками)
для дачи сейчас вот думаю самому делать или покупать. В цене финальной покупной системы блок электроники стоит около половины, если не меньше
так что разработка самому вопрос не однозначный ибо:
- радикально не снижает стоимость, хоть и снижает заметно
- нужно решить ряд технических проблем :
- автономное питание
- управление кранами. У гидролока шаговые двигатели, а у нептуна и аквастлрожа обычные моторы с концевиками
- разработать надежные датчики. Их тоже можно купить, но тогда смысл делать блок электроники еще станет меньше
- добиться высоченной надежности, иначе зависшая в момент протечки ардуина встанет ооооочень дорого
- встроить в скетч программу против закисания кранов, у гидролока и нептуна этт периодическое поворачиванте кранов туда-сюда
тогда вопрос : что надо подать на кран гидролока чтобы он закрылся? Так как смотрю именно в их сторону.
Контроллер с датчиками уже готов и автономное питание тоже будет.Скетч уже доработан и изменен,защита от зависаний есть.
Я написал выше, у гидролока шаговые моторы. Надо подавать чередование импульсов. Какой там мотор, не знаю, можно их спросить. Скорее всего юниполярный с двумя катушками
правда.. В блоке электроники на плате не видно силовых ключей или микросхем для управления шаговиками. Может быть драйвер встроен в сам кран
Как то так http://gidrolock-m.ru/download/pasport_gidrolock_ultimate.pdf
Ну значит драйвер внутри и это все сильно упрощает
хм, блок электроники у гидролока стоит 1200р. Чтоит ли оно того?
в смысле их блок?
ну да. к блоку нужны краны и датчики. Датчики конечно дорогие, по 400р за проводной, но это вроде как за позолоту, которая гарантирует отсутствие окисления и надежное срабатывание
забыл, еще нужен аккумулятор
трудно сказать что там внутри,но в любом случае это готовое изделие.
я видел что там внутри) маленькая платка управления, но кроме нее ничего то и не нужно, зато все тех проблемы там уже решены и по цене очень сопоставима с самоделкой на ардуине
Мне интересен сам процесс )) Так бы уже давно купил).тем более у меня получилось 3 в одном)
http://arduino.ru/forum/proekty/umnye-tualet-i-vannaya?page=7#comment-72304
ну... с точки зрения надежности это чревато
можно поставить покупной блок, а свой сбоку прикрутить для сопутствующих задач, таких как контроль температуры стояков) добавить кнопку принудительного закрытия кранов на время отпуска, можно даже сделать эту кнопку радиоуправляемой и поставить в прихожей, можно сигнализировать об отключении горячей воды) и т.д
с надежностью согласен. Пока вообще без кранов погоняю,видно будет. Кстати на время отпуска лучше обычные краны закрыть на стояках,для надежности)
А повседневно есть мысль прикрутить к домашней сигнализации,чтобы вода перекрывалась когда поставлено на охрану
мне больше нравится вариант автоматического перекрытия стояков в случае именно отъезда
статус отъезда уже давно автоматически выставляется, не хватает только интеграции с гидролоками
каждый раз акрывать краны по уходу не правильно. Может быть машинка на стирке, посудомойка на мойке и накопительный фильтр для воды тоже работает. А вот когда уже ясно, что никого долго не будет, тогда можно и перекрыть. Да и сами шаровые краны по нескольку раз в день дергать не правильно, это снизит сильно их ресурс
Да и сами шаровые краны по нескольку раз в день дергать не правильно, это снизит сильно их ресурс
Тоже разумно. Я стараюсь не оставлять работающую технику уходя из дома.
Да и сами шаровые краны по нескольку раз в день дергать не правильно, это снизит сильно их ресурс
Но и оставлять годами без движения - закиснет и не закроется в решающий момент!
Но и оставлять годами без движения - закиснет и не закроется в решающий момент!
об этом я выше писал - туда-сюда должно быть встроено в алгоритм, но не сильно часто
у меня такой алгоритм есть и в гидролоке и в нептуне, только там что-то типа раз в неделю или даже в месяц
Это как дверные защёлки- нормально открытые и нормально закрытые. В общественных зданиях должны стоять нормально открытые- пропало питание ( или сработала пожарка) - входи-выходи кто хочет. А не как в филиале банка в Москве когда люди сгорели при закрытых дверях.
Для воды есть тоже подобное, нормально закрытые клапана, а еще годик назад крутил в руках шаровой вентиль с тихоходным мотором, мотор его медленно ( секунд за 20 ) открывал, а закрывала пружина когда снималось питание с моторчика.
Скажите, а как насчет датчика протечки, а точнее обрыв провода, как это предусмотреть?
нет,если придумаете как -буду признателен :)
Уже придумано (давно используется в охранных и прочих системах). Итак, простейший датчик наличия воды - это два электрода/контакта/проводника, сопротивление между которыми мы измеряем. Он имеет два состояния: 0 - очень большое сопротивление когда воды нет, или когда датчик не присоединен; 1 - меньшее сопротивление когда вода на контактах.
Для контроля исправности датчика соединяем контакты резистором, например, у меня стоят 300 кОм. Теперь имеем три состояния: 0 - очень большое сопротивление когда датчик не присоединен; 1- большое сопротивление (300 кОм) когда воды нет; 2 - меньшее сопротивление когда вода на контактах. Датчик подтягиваем к земле, или к плюсу, и на аналоговый пин. Читаем показания, усредняем по времени и анализируем, например, так:
if ( WaterLeakLevel1 < 10) { WaterLeakLevel1 = -1; } // АЛЯРМ, Датчик не присоединен
else if ( WaterLeakLevel1 > 100) { WaterLeakLevel1 = 1; } // АЛЯРМ, Вода на контактах
else { WaterLeakLevel1 = 0; } // Мир и спокойствие
P.S. А еще можно спросить Google про "шунтирующее сопротивление шлейфа"
Про это я знаю,но тогда изначально надо прросчитывать колличество датчиков ,их общее сопротивление.В случае отсутсвия одного из них будет тревога. Все равно буду передеввать блок управления,добавлять пир датчик и радиоканал,возможно буду паять в него голую атмегу( уже заказал) и выкидывать кампаратор на датчики протечки...( кстати на самих датчиках даже место предусмотрел для SMD резистора:) )
Не в тему : заказал http://www.ebay.com/itm/140991979989 , но нигде не нашел на какой частоте работает,аналогичный купленный сто лет назад работает на 315 мГц,рулится с ардуины без проблем.
Пы.Сы. Araris если придумаете как добавите пир датчик в ванну- поделитесь)))) Все таки переодически не четко страбатывают датчики прохода. ( жена уже привыкла ручками перед ними помахать :) )
Пы.Сы. Araris если придумаете как добавите пир датчик в ванну- поделитесь)))) Все таки переодически не четко страбатывают датчики прохода. ( жена уже привыкла ручками перед ними помахать :) )
У меня с четкостью тоже были проблемы, оттого от датчиков прохода и отказался.
А что там, собственно, придумывать ? Есть срабатывание - ставим количество присутствующих = 1, нет срабатывания в течение указанного периода времени - ставим количество присутствующих = 0. Как-то так на первый взгляд.
Вариант скетча с аналогвыми кнопками и контролем обрыва датчиков.
https://yadi.sk/d/y_brqCI2X9REf
Сделал наброски принципиальной схемы для блока WC . Включает в себя аквасторож,управление светом от ИК датчиков прохода и включение вытяжки в зависимости от влажности и состояния света . Блок кнопок и датчик влажности DHT11 (обьеденен с разьемом ISP) выносные. Алгоритм подключения кранов выбирается перемычками в зависимомти от преминяемых кранов. Контроль обрыва датчиков предусмотрен.
Схема в формате sPlan
https://yadi.sk/d/q9nkZ4RjXy8nk
Мой опыт, может кому пригодится: http://rn3aig.ru/phpBB3/viewtopic.php?f=3&t=65
Спасибо
Вторая версия платы, выносным раьемом ISP и колодкой под NRF24L01 . Теперь не надо разбирать потолок чтоб перепрошить)
В процессе пострадала одна плата про мини- изьял процессор)))
Очень удобны эти телефонные розетки под разные датчики,дешево и сердито)
Перепрошивка по радио? Как организована?
По радио никак, радио на будущее, рядом с NRF ISP разьем. С радио пока не разберусь никак, со структурами, знаний не хватает. Задел на будущее )
Блок кнопок со встроенными светодиодами:
Куплены наконец краны,сделаны очень качественно.
Напряжение срабатывания от 2.5 вольт,рабочее напряжение 5 вольт. Ток в момент пуска 0.17 А , дальше 0.07 А . Стоят микрики в качестве концевых выключателей ,так что о жестком времени импульса управления можно не беспокоиться :)
Шестерни все целиком металлические .
Спасибо Ustas за наводку :)
Где брал?
http://xn--80aafrr0aaphk.xn--p1ai/many.html
Релизный вариант V3 :) Симисторы и разьемы будут запаяны в последний момент ,после отладки..
Финал...
Тупанул создав новую тему.....
Контроль обрыва провода , применительно к схеме.....
Тупанул создав новую тему.....
Спасибо...
Релизный вариант V3 :) Симисторы и разьемы будут запаяны в последний момент ,после отладки..
отличная работа!
что за краны?
Спасибо. Краны чуть выше http://arduino.ru/forum/proekty/sistema-zashchity-ot-protechki-vody#comment-85219 ,аквасторож. Оказались очень удачные в плане управления,на вид сделаны качественно,но время покажет.
ещё одна фотка,сорри за качество
Скажите, как я понял, краны управляются по двум проводам в заисимости от полярности, а в них есть концевики?
Да ,так и есть ,внутри концевики ,сами себя отрубают. Для закрытия достаточно 4-5 сек. Но я напряжение с них снимаю через 5 секунд.
А как они работают? ну в смысле, если концевик разрывает цепь как питается реверс? там стоят диоды?
там стоят микрики с перекидными контактами