Почти умный дом [сигнализация]

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

 Доброго дня, комрады.

За неимением бложиков и прочих не очень нужных вещей, в этой теме я буду рассказывать о проекте, который я ласково называю "Почти умный дом". Почему "почти" ? Потому что, мне кажется, что именно "Умный дом" - это удел коммерческих реализаций с профессиональными инженерами и программистами, а я пытаюсь, в меру своего интереса, изобразить нечто похожее.

Стремясь к максимальному удешевлению и ничем не ограниченный во времени, я решил сделать следующую систему.

Краткое описание: Комплекс датчиков, объединенных платформой arduino с подключением к компьютеру.

Особенности: смс оповещения при определенных событиях, запись в sql базу и использование (в моем случае) ubuntu 10.04

Подробно: 1. Датчик утечки воды. Вдохновлен был идеей http://habrahabr.ru/company/masterkit/blog/122984/

2. Датчик открытия двери на основе геркона. После открытия необходима авторизация через iButton протокол (домофонным ключом)

3... и любой другой датчик, будь то PIR датчик движения, фотодатчик и др

Конфигурация компьютера: ПК, на базе ubuntu 10.04 с подключенным по USB телефоном (/dev/ACM0). По usb подключен adruino как /dev/ttyUSB0. Разводка датчиков по квартире осуществляется с помощью витой пары.

идеи "чего бы добавить еще" приветствуются!

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

В этом посте будет принципиальная схема.

предварительный вариант:

 

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

  Код arduino

В этом посте будет лежать актуальный код для arduino, и краткое описание датчиков, обрабатываемых устройством.

Код обрабатывает открытие двери и датчик воды.

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

Тут я опишу фичу, которую решил добавить чуть позже. Это контроль напряжения в сети 220В.

Нашел в барахле опторазвязку с маркировкой L 00039 817A, и планирую применить его к своборному пину. Схема и фотки будут позже.

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

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

После некоторых раздумий я решил сделать скрипт на питоне.

Идея такова, что он будет перезапускаться (допустим каждые полчаса) без перезагрузки МК. Шанс, что что-то произойдет во время перезапуска ничтожно мал. Это нужно для проверки подключения ардуино (т.к. когда я открываю и слушаю её, то даже если она отваливается, что скрипт все равно продолжает слушать)

Структура mysql:

база smart-house, таблица sensors, логин smart, пароль smart. В таблице sensors 4 поля: id (инкрементный), date (формат DATETIME), sensor (TEXT), stat (TEXT).

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

код на питоне совсем прост (подсветка для питона не работает) :)

записи в БД выглядят так

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

Датчики

1. Датчик открытия двери

На данный момент, в черновой спецификации используются следующие провода:

1 - земля

2 - +5В

3 - красный светодиод

4 - зеленый  светодиод

5 - пищалка

6 - устройство чтения iButton

7 - собственно датчик открытия двери (геркон)

8 - пока свободно

Отличительная особенность: используется компьютерная розетка RJ-45

[обновлено] Обновил вариант считывающего устройства ля домофонного ключа. Такой пока и прицеплю себе. В левом углу проделаны отверстия, динамик под ними скрыт.

2 светодиода, пищалка и читалка домофонных ключей. Провод от датчика двери (геркона) заходит сверху.

Для разводки внутри розетки использовались выводы самой розетки (для соединения по витой паре)

2. Датчик воды

Опять же в целях удешевления всего вышеизложенного, было принятно решение использовать датчик на основе бутылочной крыжки и двух параллельных медных проводов на расстоянии около 1мм и сопротивления (уточню) 50 КОм

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

 По деньгам что вышло:

1200р - комплект ардуино на ebay (платформа, дислпей, куча проводов, резисторы кнопычки и прочая мелочь

400р - кнопка (читалка) iButton 

 

Розетка, витая пара, и прочая мелочь досталась бесплатно. частично с работы, частично нашел еще где-то :)

12sd
Offline
Зарегистрирован: 04.08.2011

 возможность сброса на USB0 - просто при работе с портом, попытайся подкючиться, если вернет true- все ОК, если false - подключайся к след. порту, делая это в цикле. выход из цикла при успешном подключении (ключевое слово break; - делаешь в if-условии, типа if(connect(blabla)==true) {break;}, иначе цикл идет дальше.

вот такую идею тебе подкинул)

обращайся в скайп)

madguitar
Offline
Зарегистрирован: 17.06.2011

 привет) я занимался похожим проектом, но за неимением средств приостановил его) могу добавить, что прогу на ПК для слушания ком порта удобнее написать на шарпе, там не надо использовать эти замысловатые WinAPI функции. Вся инфа на MSDN по тегам SerialPort

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

madguitar уточню, что софт под виндовс пока не планировал делать

madguitar
Offline
Зарегистрирован: 17.06.2011

 тогда на питоне) там вообще порт как файл открыл и читай-пиши)

madguitar
Offline
Зарегистрирован: 17.06.2011

 http://robocraft.ru/blog/algorithm/208.html например вот так

Mogalkov
Offline
Зарегистрирован: 23.06.2011

 Не совсем уверен что система сигнализации это "умный дом", имхо "умный дом" это всетаки централизованное управление в доме чем-то. Тоесть если при срабатывание датчика воды пищит - это сигнализация, если перекрывает воду - это умный дом.

Что происходит при прикладывании таблетки? Может на электорнике съэкономить, (Вместо использования ардуины - используй только контроллер с минимумом обвязки, если планируется подключение к компу, то подумай RF232 самая известная мс преобразователь, но не самая дешевая) и подключить электромеханический замок (типа такого, можно найти и дешевле: www.trascon.ru/index.php)?

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

Ну и желательно следить за напряжением сети и потребляемым током.

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

Mogalkov

Соглашусь, да. умный дом - это скорее свет и прочие упраялемые устройства.

Я же решил начать с сигнализации, а "умный дом" - это, скорее для меня идеалогия автоматизации и компьютеризации, если можно так выразиться.

Да и делаю я это не потому, что боюсь, что меня ограбят, а потому что возможность такая есть. ДА и просто круто это) Насчет управления светом и розетками я тоже думал, есть некоторые мысли...

 

Mogalkov
Offline
Зарегистрирован: 23.06.2011

bakemono пишет:

Mogalkov

Соглашусь, да. умный дом - это скорее свет и прочие упраялемые устройства.

Я же решил начать с сигнализации, а "умный дом" - это, скорее для меня идеалогия автоматизации и компьютеризации, если можно так выразиться.

Да и делаю я это не потому, что боюсь, что меня ограбят, а потому что возможность такая есть. ДА и просто круто это) Насчет управления светом и розетками я тоже думал, есть некоторые мысли...

 

Понятное дело что делаешь не из страха что ограбят а ради прикола, тот кто боится что ограбят ставит сигнализацию с контролем в милиции и тому подобное. Замок я указал потому что тоже прикольно, не ключ крутишь а таблетку прикладываешь и замок открывается (подал на замок 12в и он открылся, в ардуине это либо через реле либо через транзисторный ключ с выхода, HIGH открыт). А электромагнитные замки мне не нравятся, электричество отрубили и дверь на распашку, электричество жрет постоянно. А вообще имхо самая большая проблемма в подобных решениях - это связь, самое простое - провода, но их прятать надо, либо в короб либо стену штробить.

dronsoft
Offline
Зарегистрирован: 02.06.2011

Mogalkov пишет:

А электромагнитные замки мне не нравятся, электричество отрубили и дверь на распашку, электричество жрет постоянно.

 

Для этого есть електромеханические замки и источники резервногопитания ихмо такое оборудование питается как минимум 12в, а замок это защелка ппричем их несколько вариантов и запасной как правило это обычный ключь который открывает эту защелку.

но мне кажется смысл есть делать на Proximy Frid картах от СКУД ( система управления доступом) 

ибо нет возможности откопировать ключь как это возможно сделать на далласах (таблетках)

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

*удалено*

Вообщем потихоньку продвигаемся. Мысли чего бы еще прикрутить приветствуются

Появилась идея - сделать чайник с веб интерфейсом ( в котором выбривается температура нагрева) :)

Mogalkov
Offline
Зарегистрирован: 23.06.2011

bakemono пишет:

*удалено*

Вообщем потихоньку продвигаемся. Мысли чего бы еще прикрутить приветствуются

Появилась идея - сделать чайник с веб интерфейсом ( в котором выбривается температура нагрева) :)

А еще неплохо чтобы он сам наполнялся (можно использовать электрически управляемый кран или насос, за уровнем воды вполне может следить поплавок). Сам наливал воду в стакан (насос и пара трубок, или мощьная серва наклоняющая чайник). Сам кидал заварку и сахар, можно использовать спиральную подачу как в торговых автоматах. Сам все это привозил (пара моторчиков, датчики препятствия, gps модуль). Нехилый чайничек получается, но в принципе все это вполне реализуемо. 

dronsoft
Offline
Зарегистрирован: 02.06.2011

может с чегонибудь по просче начать 

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

Товарищи !

Нужна некоторая консультация по следущему вопросу. Выше я написал, что хочу сделать контроль 220В напряжения в домашней электросети. Для этого я нашел опторазвязку 817A (даташит http://octopart.com/h11a817a-fairchild+semiconductor-704481 а именно тут http://datasheet.octopart.com/H11A817A-Fairchild-datasheet-4722.pdf )

Идея была такова: на диодный мост 2KBP06M  (даташит http://www.datasheetcatalog.org/datasheets/150/490075_DS.pdf через резистор 50 кОм поступает питание по 220В. оттуда напрямую подключена опторазвязка 817А. Вообщем, когда я подаю напряжение, на свободных концах опторазвязки возникает сопротивление в 60 Ом, но при этом реально быстро нагревается резистор. Больше 30 сек я не держал включенным, но и за это время он успел достаточно нагреться.

(при необходимости, могу нарисовать схему, но под рукой нет редактора, так что только в гимпе)

 

Вопрос. Т.к. я планирую эту конструкцию держать 24ч включеной, подскажите пожалуйста что можно поменять в данной схеме для контроля напряжения в сети. по возможности с имеющимися деталями)

Спасибо

12sd
Offline
Зарегистрирован: 04.08.2011

 думаю, что стоит изучить все даташиты на конкретный резистрор. и собрать комбо (последовательно поставить)из самых мощных, которые найдутся.

последовательно - один сгорит, ток не пойдет, надежнее. 

а вообще 220 страшная штука, лучше не шутить)

Mogalkov
Offline
Зарегистрирован: 23.06.2011

 Чтобы увеличивать мощьность рассеивания резистеров - их ставят паралельно, тоесть к примеру два 5Вт резистера  по 100Ком если поставить паралельно будут работать как 1резистор 10Вт 50Ком.

Диодный мост тут нафиг не сдался, тебе достаточно одного диода включенного в обраттку, в том же даташите у модели 
H11AA814 он уже стоит, к 817 ты можешь просто выпрямительный диод прикрутить таким же образом. И откуда взялось 50К сопративление?

DJey
Offline
Зарегистрирован: 05.12.2011

Для контроля наличия электро питания лучше использовать безконтактный способ на основе AC Current Sensor Transformer. На ebay такой сенсор обойдется рублей в 400, к тому же есть готовые шелды под него и реализованные проекты: openenergymonitor.org www.desert-home.com/p/test-html-code.html .

Bigul
Offline
Зарегистрирован: 09.12.2011

 Я не претендую на специалиста, но тоже планирую такую систему в своей новой квартире, так вот что я нарыл:

1. промышленность выпускает системы обнаружения утечек (нептун, невод, гидролок, автостораж и множество иностранных) которые стыкуются почти стандартно;

2. есть системы регулирования тепла (управляемые вентили-регуляторы температуры на батареи-радиаторы с приводом);

3. датчики обнаружения, присутствия, нажатия, и т.д,

 

В общем случае все давно решено, если не строить самоделку в смысле стратегии и протоколов - то есть технология Z-Wave (посмотрите сервер Vera - чудная штука) и более старая американская технология Х10.

В любом случае - на все это выпускаются стандартные модули под ДИН рейку и монтируемые в корпус выкючателей и розеток, а так же множество вариантов исполнения. Если Вы сами все будете делать на Ardu, то тут нет поддержки, нет эстетики, ну и конечно если что-то с Вами случитя (не дай бог - а у меня так было ) и в это время заглючит Ваш продукт - то родные останутся без воды, еды и т.д.) - вот собственно и все что я хотел сказать.

 

Олег.

 
maus
Offline
Зарегистрирован: 10.01.2012

 приветствую товарищи ... позвольте присоединиться к вашей банде - сам страдаю идеей почти умного дома ...

перечитал гору всякой литературы, с ибея уже едут микроконтроллеры, жк-панелька, rf-трансмиттеры и прочая мелочь - как доедут, перейду к практической части ...

maus
Offline
Зарегистрирован: 10.01.2012

 по сути проекта:

1. контолировать надо не напряжение, а ток. для этого можно (нужно) использовать датчик холла: ru.wikipedia.org/wiki/%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82_%D0%A5%D0%BE%D0%BB%D0%BB%D0%B0

с ардуиной дружит на ура.

 

2. не совсем понял, зачем тут нужен комп? если задача писать лог - можно на сд-карту писать текстовик и скриптом его читать. ардуина с сд-картой дружит отлично.

3. у себя планирую пока следующее: планируется следующая система: а) ардуино-мама - ничего не измеряет, просто ведет лог и опрашивает ардуино-детей. опрашивает по радиоканалу, тк с проводами уже пролет. б) есть ардуино дети (по количеству комнат + ванная + коридор): комнаты - датчик влажности, датчик температуры, шаговые двигатели управления освещением, датчики открытия окон; ванная/кухня - датчики протечки, эл.м. клапаны, нагреватель воды; корридор - управление освещением по всему периметру (типа выключить свет везде по уходу), плюс жк панель для графического отображения ситуации везде и тач-панель для команд. ардуино-дети разговаривают по: с мамой по радиоканалу, внутри комнаты - есть еще ик-приемник, который с отдельного пульта принимает команды. 

4. может закручу еще веб-байду какую-нибудь, но пока еще не решил окончательно.

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

я снова вернулся.
Много чего было за это время :)
Все предыдущие желающие сотрудничества куда-то потерялись :(

Было желание переписать весь код, кучу всего оптимизировать, сделать консоль управления. Но то одно, то другое... то с машиной провозился... в общем я снова в деле.

maus как приедут МК пиши, может чего придумаем.
позвольте полюбопытствовать, тов. maus, вы откуда ?

dronsoft
Offline
Зарегистрирован: 02.06.2011

 bakemono я не пропал у меня тоже делов хватает но потихоньку стараюсь мутить есть два мк нано v4 , Mega .

еще моник 2х строчный на 16 символов.

еще фото транзисторы ик диоды и датчики обьема от Охранной системы.

источник бесперебойного питания на 12 вольт.

maus
Offline
Зарегистрирован: 10.01.2012

 мы из Киева. Позавчера пришла первая партия с ибея, но пока только хвостики к батарейкам на 9в. Жду, пока придет все остальное. А там и ардуина, и меги (пару штук отдельно), и жк-шка и ик датчики/приемники ... одним словом много добра всякого ...

mosknikita
Offline
Зарегистрирован: 26.02.2012

Доброго времени суток! Относительно давно работаю в сфере охранно-пожарных сигнализаций. Начинал с монтажа и обслуживания, сейчас руковожу техническим отделом одного ЧОПа. Последнее время заинтересовался следующей идеей, на мой взгляд весьма перспективной: создание на базе того же Ардуина (с Ethernet) приемо-контрольного охранного прибора...

Необходим следующий функционал: - постановка/снятие с охраны с помощью ibutton ключа, - контроль в охраняемое время состояния охранных извещателей (состояния подключаемой цепи), - передача информациии TCP\IP протоколом через интернет на статик IP сервера. Ну и без серверно ПО тут тоже скорее всего не обойтись...

Что скажете, насколько сложно эту идею реализовать? )

 

Mastino
Offline
Зарегистрирован: 03.12.2011

mosknikita пишет:

Доброго времени суток! Относительно давно работаю в сфере охранно-пожарных сигнализаций. Начинал с монтажа и обслуживания, сейчас руковожу техническим отделом одного ЧОПа. Последнее время заинтересовался следующей идеей, на мой взгляд весьма перспективной: создание на базе того же Ардуина (с Ethernet) приемо-контрольного охранного прибора...

Необходим следующий функционал: - постановка/снятие с охраны с помощью ibutton ключа, - контроль в охраняемое время состояния охранных извещателей (состояния подключаемой цепи), - передача информациии TCP\IP протоколом через интернет на статик IP сервера. Ну и без серверно ПО тут тоже скорее всего не обойтись...

Что скажете, насколько сложно эту идею реализовать? )

Руководители технического отдела, относительно давно работающие в сфере охранно-пожарных сигнализаций. Должны сами определять сложность данного проекта. Так как сложность зависеть от знаний.. То что одному легко, другому невозможно.  Точно не знаю, но думаю есть уже готовые решение этого проекта.

Diemon
Offline
Зарегистрирован: 18.11.2011

 mosknikita, посмотрите пожалуйста тут: ajc.su/zhelezo/signalizaciya-v-pomeshhenie-na-arduino/

leshak
Offline
Зарегистрирован: 29.09.2011

mosknikita пишет:

Необходим следующий функционал: - постановка/снятие с охраны с помощью ibutton ключа, - контроль в охраняемое время состояния охранных извещателей (состояния подключаемой цепи), - передача информациии TCP\IP протоколом через интернет на статик IP сервера. Ну и без серверно ПО тут тоже скорее всего не обойтись...

Что скажете, насколько сложно эту идею реализовать? )

 

Технически - возможно все. Были бы бюджеты :). Квалифицированный труд - стоит дорого. А вот целесообразность - вызывает сомнение (если это не просто "хобби для души"). Если это "разовый проект" - дешевле, все-таки,  искать что-то готовое.

 

bigsens
Offline
Зарегистрирован: 21.07.2012

Привет, меня зовут Константин.

Занимаюсь подобной разработкой, есть деньги на развитие.

Свяжись со мной по адресу bigsensinc@gmail.com.

Skype: hermeswallet

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

mosknikita пишет:

Доброго времени суток! Относительно давно работаю в сфере охранно-пожарных сигнализаций. Начинал с монтажа и обслуживания, сейчас руковожу техническим отделом одного ЧОПа. Последнее время заинтересовался следующей идеей, на мой взгляд весьма перспективной: создание на базе того же Ардуина (с Ethernet) приемо-контрольного охранного прибора...

 

 

ха-ха, может вы его еще и сертифицируете :)   во конкуренты животы понадрывают:)))

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Short Circuit пишет:

ха-ха, может вы его еще и сертифицируете :)   во конкуренты животы понадрывают:)))

Вот это провалы во времени, посту сто лет в обед.

Перестаньте употреблять валерьянку!

Сергей Львович ...
Offline
Зарегистрирован: 11.07.2016

Прошу прощения если не в тему, но нужного для себя не нашёл....... Пожайлуста помогите в разработке и написание программы, хочу собрать gsm сигнализацию на Ардуино Мега 2560 для гаража. Чтобы она срабатывала на открытие ворот (герконовый датчик) вторжение в гараж (датчик движения) и запись тревожных событий на видео камеру, и отправкой видео/фото на эл. почту и отправкой sms уведомлений о тревогах. Не мешало бы ещё датчик задымления и пожара. Да и чуть не забыл про ключь/таблетку которой буду снимать и ставить на охрану.

В наличие есть контролёр Ардуино Мега 2560, куча разных датчиков движения от профессиональных охранных сигнализаций, видеокамера видеонаблюдения, остальное смогу подкупить....

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Сергей Львович Олицкий пишет:

Пожайлуста помогите в разработке и написание программы

То есть, разработать и написать программу за Вас? Тогда Вам сюда - Ищу исполнителя (напишут за вознаграждение)

rossolimo
Offline
Зарегистрирован: 24.10.2016

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

rossolimo
Offline
Зарегистрирован: 24.10.2016

и да как это ключь имеет такой длины значения

1OneWire  ds(iButtonPin); //ibutton
2byte code1[5] = {0x01, 0x58, 0x3E, 0xD8, 0x11};  //первый ключ
3byte code2[5] = {0x01, 0x90, 0xBA, 0xAB, 0x00};  // второй ключ

 

если оно должно иметь значения вида
1= { 0x01, 0xCA, 0x4E, 0xA5, 0x00, 0x00, 0x00, 0x0E };

не 5 байт а 8

 

rossolimo
Offline
Зарегистрирован: 24.10.2016

c трудом но сделал рабочим код

 

001char* RUS(char* StrIn){char* StrOut=StrIn; uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; while(i[2]>0&&i[0]<255){if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0){StrOut[i[1]]=i[3]+0x30;i[0]++;}else if(i[2]==0xd0&&i[3]==0x81){StrOut[i[1]]=0xA8;i[0]++;}else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90){StrOut[i[1]]=i[3]+0x70;i[0]++;}else if(i[2]==0xd1&&i[3]==0x91){StrOut[i[1]]=0xB8;i[0]++;}else{StrOut[i[1]]=i[2];} i[0]++; i[1]++; i[2]=StrIn[i[0]]; i[3]=StrIn[i[0]+1];} StrOut[i[1]]='\0'; return StrOut;}
002#include <OneWire.h>
003#include "pitches.h"
004const byte greenLed = 10; //зеленая лампочка
005const byte redLed = 11;  //красная лампочка
006const byte gerkonPin = 8; //gerkon
007const byte iButtonPin = 12; //пин для ibutton
008const byte tonePin = 7; // пин для пищалки
009const byte waterPin = 9; // пин датчика воды
010  
011const byte alarmTime = 15; // время, чтобы поднести ключ при разблокировке
012const byte startTime = 10; // время на закрытие двери при постановке на сигнализацию
013  
014OneWire  ds(iButtonPin); //ibutton
015byte code1[8] = {0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB};  //первый ключ
016byte code2[8] = {0x01, 0xCA, 0x4E, 0xA5, 0x00, 0x00, 0x00, 0x0E};  // второй ключ
017  
018boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде
019boolean alarmState = 0; //флаг работающей сигнализации
020boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке.
021boolean Hacked = 0;
022// стандартные коды: 1- включение, 2- выключение, 3- тревога
023void setup()
024{
025    Serial.begin(9600);
026    delay(2000); //задержка включения
027    pinMode(greenLed, OUTPUT); //задаем режим работы пинов
028    pinMode(redLed, OUTPUT);
029    pinMode(waterPin, INPUT);
030    pinMode(gerkonPin, INPUT);
031    Notify(98); // оповещение о включении ардуино (напр. после перезагрузки)
032}
033void loop()
034{
035    byte returnedValue = 0;
036    if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ
037        returnedValue = findKey();
038        if (returnedValue == 1)  { // нашли известный ключ
039            guardON(); //вкл статус сигнализации
040        }
041    }
042    if(alarmState==1) { // если включена сигнализация, то
043        gerkonState = digitalRead(gerkonPin); //смотрим геркон
044        // Serial.println(gerkonState, HEX);
045        if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана ;)
046            Notify(1); // сообщаем компьютеру об открытии двери
047            alarmON(); //включаем сигналку
048        }
049        returnedValue = findKey(); //нужно выключить изнутри квартиры
050        if (returnedValue == 1)  { // нашли известный ключ и
051            alarmState=0;
052            guardOFF();
053        }
054    }
055    returnedValue = 0; //обнуляем для обработки датчиков воды
056    //returnedValue = checkWater();
057    //if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды
058    //  Notify(10); //сообщаем о срабатывании датчика воды
059    //}
060    delay (500);
061}
062int checkWater() //функция проверки датчика воды
063{
064    int WsensorState = analogRead(waterPin);
065    Serial.println(WsensorState);
066    if (WsensorState == 1 && waterAlarmed == 0){
067        waterAlarmed =1;
068        return 1;
069    }
070    return 0;
071}
072int findKey() // функция поиска ключа
073{
074    byte i;
075    byte addr[8];
076    byte checkOK = 0; //счетчик совпадений массива с эталоном
077    // Serial.println("searching key...");
078    if ( !ds.search(addr)) {  // тут надо сделать нормально сделатЬ!!!
079    //    Serial.println("No key connected..."); // сообщаем об этом
080        return; // и прерываем программу
081 
082        for(int i = 0; i < 8; i++)
083            ds.reset_search(); // сброс ключа
084   
085            if (addr[i]==code1[i] || addr[i]==code2[i]) {
086                checkOK++;
087            }
088         
089        if (checkOK == 5 )
090        return 1;
091    }
092return 0;
093}
094void guardON() // выполнение действие при на сигнализацию
095{
096    int j;
097    alarmState=1; //включаем статус сигнализации
098    guardSound(1); //бибикаем
099    for (j=0; j < startTime; j++) {
100        guardBlink(1); //моргаем лампочками и ждем время для закрытия двери
101    }
102    Notify(0);
103}
104void guardOFF() // выполнение действие при снятии с сигнализации
105{
106    alarmState=0; // выключаем статус сигнализации
107    Hacked = 0; // отменям статус "взломано"
108    digitalWrite(greenLed, LOW);
109    guardSound(2); //бибикаем
110    guardBlink(2); //моргаем лампочками
111    Notify(3);
112}
113int alarmON() // выполнение действий при срабатывании сигнализации
114{
115    int checkcount=0;
116    while (checkcount < alarmTime) { // даем alarmTime секунд для поднесения ключа
117        int alarmCancel = findKey(); //ищем ключик
118        if (alarmCancel == 1) { // нашли ключ
119            guardOFF(); //отключаем сигналку,
120            break; // выходим из цикла
121        }
122        checkcount++;
123        guardBlink(3); //пищим о том, что ищем ключ
124        guardSound(3); //светим о том, что ищем ключ
125    }
126    if (checkcount==alarmTime) { // если не нашли, то включаем оповещение
127        Notify(2);
128        guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО
129        guardSound(4); //светим о том, что УСЁ ПРОПАЛО
130        Hacked = 1;
131    }
132}
133int guardBlink (int x) //функция светового оповещения
134{
135    if (x==1) { // первое ожидание для закрытия двери.
136        digitalWrite(redLed, HIGH);
137        digitalWrite(greenLed, LOW);
138        delay(500);
139        digitalWrite(redLed, LOW);
140        digitalWrite(greenLed, HIGH);
141        delay(500);
142    }
143    if (x==2) { // выключаем сигнализацию и диоды
144        digitalWrite(redLed, LOW);
145        digitalWrite(greenLed, LOW);
146    }
147    if (x==3) { // во время ожидания ключа при открытой двери
148        digitalWrite(redLed, HIGH);
149        delay (250);
150        digitalWrite(redLed, LOW);
151        delay (250);
152    }
153    if (x==4) { // просрочено, ахтунг
154        digitalWrite(redLed, HIGH);
155    }
156}
157int guardSound (int x)  //функция звукового оповещения
158{
159    if (x==1) {
160        int melody[] = { // музыка при включении сигнализацию
161            NOTE_G3, NOTE_G3, NOTE_G3
162        };
163        int noteDurations[] = {
164            4,4,4
165        };
166        for (int thisNote = 0; thisNote < 3; thisNote++) {
167            int noteDuration = 1000/noteDurations[thisNote];
168            tone(tonePin, melody[thisNote],noteDuration);
169            int pauseBetweenNotes = noteDuration * 1.30;
170            delay(pauseBetweenNotes);
171            noTone(tonePin);
172        }
173    }
174    if (x==2) { // выключаем сигнализацию
175        int melody[] = {
176            NOTE_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3
177        };
178        int noteDurations[] = {
179            4, 8, 8, 4,4,4,4,4
180        };
181        for (int thisNote = 0; thisNote < 8; thisNote++) {
182            int noteDuration = 1000/noteDurations[thisNote];
183            tone(tonePin, melody[thisNote],noteDuration);
184            int pauseBetweenNotes = noteDuration * 1.30;
185            delay(pauseBetweenNotes);
186            noTone(tonePin);
187        }
188    }
189    if (x==3) { //тон ожидания ключа
190        tone(tonePin,NOTE_C4, 100);
191    }
192    if (x==4) { //тон просроченного ключа
193        tone(tonePin,NOTE_E4, 500);
194    }
195}
196int Notify(int x) //функция оповещения в последователньый порт
197{
198    if (x==0) { // оповещение о постановке на сигнализацию
199        Serial.println(RUS("Сигнализация включена"));
200    }
201    if (x==1) { // оповещение о открытии двери
202        Serial.println(RUS("Дверь открыта"));
203    }
204    if (x==2) { // оповещение о взломе квартиры!
205        Serial.println(RUS("Тревога, проникновение"));
206    }
207    if (x==3) { // оповещение о выключении сигнализации
208        Serial.println(RUS("Сигнализация отключена"));
209    }
210    if (x==98) { // оповещение о включении ardunio
211        Serial.println(RUS("Arduino готово к работе"));
212    }
213    if (x==99) { // оповещение о ОШИБКЕ
214        Serial.println(RUS("Error"));
215    }
216}

 

rossolimo
Offline
Зарегистрирован: 24.10.2016

доделал поиск ключа и сравнения

и изменил милодию сирены

001char* RUS(char* StrIn){char* StrOut=StrIn; uint8_t i[4]={0,0,StrIn[0],StrIn[1]}; while(i[2]>0&&i[0]<255){if(i[2]==0xd0&&i[3]>0x8F&&i[3]<0xC0){StrOut[i[1]]=i[3]+0x30;i[0]++;}else if(i[2]==0xd0&&i[3]==0x81){StrOut[i[1]]=0xA8;i[0]++;}else if(i[2]==0xd1&&i[3]>0x7F&&i[3]<0x90){StrOut[i[1]]=i[3]+0x70;i[0]++;}else if(i[2]==0xd1&&i[3]==0x91){StrOut[i[1]]=0xB8;i[0]++;}else{StrOut[i[1]]=i[2];} i[0]++; i[1]++; i[2]=StrIn[i[0]]; i[3]=StrIn[i[0]+1];} StrOut[i[1]]='\0'; return StrOut;}
002#include <OneWire.h>
003#include "pitches.h"
004const byte greenLed = 10; //зеленая лампочка
005const byte redLed = 11;  //красная лампочка
006const byte gerkonPin = 8; //gerkon
007const byte iButtonPin = 12; //пин для ibutton
008const byte tonePin = 7; // пин для пищалки
009const byte waterPin = 9; // пин датчика воды
010  
011const byte alarmTime = 3; // время, чтобы поднести ключ при разблокировке
012const byte startTime = 5; // время на закрытие двери при постановке на сигнализацию
013  
014OneWire  ds(iButtonPin); //ibutton
015byte code1[8] = {0x01, 0x9F, 0xDC, 0x02, 0x00, 0x00, 0x96, 0x1C};  //первый ключ
016 
017  
018boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде
019boolean alarmState = 0; //флаг работающей сигнализации
020boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке.
021boolean Hacked = 0;
022// стандартные коды: 1- включение, 2- выключение, 3- тревога
023void setup()
024{
025    Serial.begin(115200);
026    delay(2000); //задержка включения
027    pinMode(greenLed, OUTPUT); //задаем режим работы пинов
028    pinMode(redLed, OUTPUT);
029    pinMode(waterPin, INPUT);
030    pinMode(gerkonPin, INPUT);
031    Notify(98); // оповещение о включении ардуино (напр. после перезагрузки)
032}
033void loop()
034{
035    byte returnedValue = 0;
036    if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ
037        returnedValue = findKey();
038        if (returnedValue == 1)  { // нашли известный ключ
039            guardON(); //вкл статус сигнализации
040        }
041    }
042    if(alarmState==1) { // если включена сигнализация, то
043        gerkonState = digitalRead(gerkonPin); //смотрим геркон
044       //  Serial.println(gerkonState, HEX);
045        if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана ;)
046            Notify(1); // сообщаем компьютеру об открытии двери
047            alarmON(); //включаем сигналку
048        }
049        returnedValue = findKey(); //нужно выключить изнутри квартиры
050        if (returnedValue == 1)  { // нашли известный ключ и
051            alarmState=0;
052            guardOFF();
053        }
054    }
055    returnedValue = 0; //обнуляем для обработки датчиков воды
056    //returnedValue = checkWater();
057    //if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды
058    //  Notify(10); //сообщаем о срабатывании датчика воды
059    //}
060    delay (500);
061}
062int checkWater() //функция проверки датчика воды
063{
064    int WsensorState = analogRead(waterPin);
065    Serial.println(WsensorState);
066    if (WsensorState == 1 && waterAlarmed == 0){
067        waterAlarmed =1;
068        return 1;
069    }
070    return 0;
071}
072int findKey() // функция поиска ключа
073 
074 
075 
076{
077    byte i;
078    byte addr[8];
079    byte checkOK = 0; //счетчик совпадений массива с эталоном
080    //Serial.println("searching key...");
081    if (!ds.search(addr)) {  // тут надо сделать нормально сделатЬ!!!
082    //Serial.println("No key connected..."); // сообщаем об этом
083ds.reset_search();
084delay(200);
085return; // и прерываем программу
086 
087        for(int i = 0; i<8; i++)
088Serial.print(addr[i],HEX);
089Serial.print(" ");
090}
091Serial.println("\n");
092 
093 
094for (int i=0; i<8; i++)
095   
096            if (addr[i]==code1[i]) {
097                checkOK++;
098            }
099         
100        if (checkOK == 8 ){
101        return 1;
102    }
103return 0;
104}
105 
106 
107 
108void guardON() // выполнение действие при на сигнализацию
109{
110    int j;
111    alarmState=1; //включаем статус сигнализации
112    guardSound(1); //бибикаем
113    for (j=0; j < startTime; j++) {
114        guardBlink(1); //моргаем лампочками и ждем время для закрытия двери
115    }
116    Notify(0);
117}
118void guardOFF() // выполнение действие при снятии с сигнализации
119{
120    alarmState=0; // выключаем статус сигнализации
121    Hacked = 0; // отменям статус "взломано"
122    digitalWrite(greenLed, LOW);
123    guardSound(2); //бибикаем
124    guardBlink(2); //моргаем лампочками
125    Notify(3);
126}
127int alarmON() // выполнение действий при срабатывании сигнализации
128{
129    int checkcount=0;
130    while (checkcount < alarmTime) { // даем alarmTime секунд для поднесения ключа
131        int alarmCancel = findKey(); //ищем ключик
132        if (alarmCancel == 1) { // нашли ключ
133            guardOFF(); //отключаем сигналку,
134            break; // выходим из цикла
135        }
136        checkcount++;
137        guardBlink(3); //пищим о том, что ищем ключ
138        guardSound(3); //светим о том, что ищем ключ
139    }
140    if (checkcount==alarmTime) { // если не нашли, то включаем оповещение
141        Notify(2);
142        guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО
143        guardSound(4); //светим о том, что УСЁ ПРОПАЛО
144        Hacked = 1;
145    }
146}
147int guardBlink (int x) //функция светового оповещения
148{
149    if (x==1) { // первое ожидание для закрытия двери.
150        digitalWrite(redLed, HIGH);
151        digitalWrite(greenLed, LOW);
152        delay(500);
153        digitalWrite(redLed, LOW);
154        digitalWrite(greenLed, HIGH);
155        delay(500);
156    }
157    if (x==2) { // выключаем сигнализацию и диоды
158        digitalWrite(redLed, LOW);
159        digitalWrite(greenLed, LOW);
160    }
161    if (x==3) { // во время ожидания ключа при открытой двери
162        digitalWrite(redLed, HIGH);
163        delay (250);
164        digitalWrite(redLed, LOW);
165        delay (250);
166    }
167    if (x==4) { // просрочено, ахтунг
168        digitalWrite(redLed, HIGH);
169    }
170}
171int guardSound (int x)  //функция звукового оповещения
172{
173    if (x==1) {
174        int melody[] = { // музыка при включении сигнализацию
175            NOTE_G3, NOTE_G3, NOTE_G3
176        };
177        int noteDurations[] = {
178            4,4,4
179        };
180        for (int thisNote = 0; thisNote < 3; thisNote++) {
181            int noteDuration = 1000/noteDurations[thisNote];
182            tone(tonePin, melody[thisNote],noteDuration);
183            int pauseBetweenNotes = noteDuration * 1.30;
184            delay(pauseBetweenNotes);
185            noTone(tonePin);
186        }
187    }
188    if (x==2) { // выключаем сигнализацию
189        int melody[] = {
190            NOTE_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3
191        };
192        int noteDurations[] = {
193            4, 8, 8, 4,4,4,4,4
194        };
195        for (int thisNote = 0; thisNote < 8; thisNote++) {
196            int noteDuration = 1000/noteDurations[thisNote];
197            tone(tonePin, melody[thisNote],noteDuration);
198            int pauseBetweenNotes = noteDuration * 1.30;
199            delay(pauseBetweenNotes);
200            noTone(tonePin);
201        }
202    }
203    if (x==3) { //тон ожидания ключа
204        tone(tonePin,NOTE_C4, 100);
205    }
206    if (x==4) { //тон просроченного ключа
207        tone(tonePin, 500); //включаем на 500 Гц
208        delay(100); //ждем 100 Мс
209        tone(tonePin, 1000); //включаем на 1000 Гц
210        delay(100); //ждем 100 Мс
211    }
212}
213int Notify(int x) //функция оповещения в последователньый порт
214{
215    if (x==0) { // оповещение о постановке на сигнализацию
216        Serial.println(RUS("Сигнализация включена"));
217    }
218    if (x==1) { // оповещение о открытии двери
219        Serial.println(RUS("Дверь открыта"));
220    }
221    if (x==2) { // оповещение о взломе квартиры!
222        Serial.println(RUS("Тревога, проникновение"));
223    }
224    if (x==3) { // оповещение о выключении сигнализации
225        Serial.println(RUS("Сигнализация отключена"));
226    }
227    if (x==98) { // оповещение о включении ardunio
228        Serial.println(RUS("Устройство готово к работе"));
229    }
230    if (x==99) { // оповещение о ОШИБКЕ
231        Serial.println(RUS("Ошибка"));
232    }
233}
TixZ
Offline
Зарегистрирован: 10.10.2019

Всем здравствуйте! Есть ли тут еще кто живой? 

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