Система защиты от протечки воды
- Войдите на сайт для отправки комментариев
После того как лопнула гибкая подводка в ванной задумался над такой системой. Готовую покупать неспортивно :)
на текущий момент 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 секунд.
А как они работают? ну в смысле, если концевик разрывает цепь как питается реверс? там стоят диоды?
там стоят микрики с перекидными контактами