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

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, и краткое описание датчиков, обрабатываемых устройством.

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

#include <OneWire.h>
#include "pitches.h"
const byte greenLed = 10; //зеленая лампочка
const byte redLed = 11;  //красная лампочка
const byte gerkonPin = 8; //gerkon
const byte iButtonPin = 12; //пин для ibutton
const byte tonePin = 7; // пин для пищалки
const byte waterPin = 9; // пин датчика воды

const byte alarmTime = 15; // время, чтобы поднести ключ при разблокировке
const byte startTime = 10; // время на закрытие двери при постановке на сигнализацию

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

boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде
boolean alarmState = 0; //флаг работающей сигнализации
boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке.
boolean Hacked = 0;
// стандартные коды: 1- включение, 2- выключение, 3- тревога
void setup()
{
	Serial.begin(9600);
	delay(2000); //задержка включения
	pinMode(greenLed, OUTPUT); //задаем режим работы пинов
	pinMode(redLed, OUTPUT);
	pinMode(waterPin, INPUT);
	pinMode(gerkonPin, INPUT);
	Notify(98); // оповещение о включении ардуино (напр. после перезагрузки)
}
void loop()
{
	byte returnedValue = 0;
	if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ
		returnedValue = findKey();
		if (returnedValue == 1)  { // нашли известный ключ
			guardON(); //вкл статус сигнализации
		}
	}
	if(alarmState==1) { // если включена сигнализация, то
		gerkonState = digitalRead(gerkonPin); //смотрим геркон
		//Serial.println(gerkonState, HEX);
		if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана ;)
			Notify(1); // сообщаем компьютеру об открытии двери
			alarmON(); //включаем сигналку
		}
		returnedValue = findKey(); //нужно выключить изнутри квартиры
		if (returnedValue == 1)  { // нашли известный ключ и
			alarmState=0;
			guardOFF();
		}
	}
	returnedValue = 0; //обнуляем для обработки датчиков воды
	//returnedValue = checkWater();
	//if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды
	//	Notify(10); //сообщаем о срабатывании датчика воды
	//}
	delay (500);
}
int checkWater() //функция проверки датчика воды
{
	int WsensorState = analogRead(waterPin);
	//Serial.println(WsensorState);
	if (WsensorState == 1 && waterAlarmed == 0){
		waterAlarmed =1;
		return 1;
	}
	return 0;
}
int findKey() // функция поиска ключа
{
	byte i;
	byte addr[5];
	byte checkOK = 0; //счетчик совпадений массива с эталоном
	//Serial.println("searching key...");
	if ( !ds.search(addr)) {  // тут надо сделать нормально сделатЬ!!!
		ds.reset_search();
		for( i = 0; i < 5; i++) { // КРИВОКОД
			if (addr[i]==code1[i] || addr[i]==code2[i]) {
				checkOK++;
			}
		}
		if (checkOK == 5 )
		return 1;
	}
return 0;
}
void guardON() // выполнение действие при на сигнализацию
{
	int j;
	alarmState=1; //включаем статус сигнализации
	guardSound(1); //бибикаем
	for (j=0; j < startTime; j++) {
		guardBlink(1); //моргаем лампочками и ждем время для закрытия двери
	}
	Notify(0);
}
void guardOFF() // выполнение действие при снятии с сигнализации
{
	alarmState=0; // выключаем статус сигнализации
	Hacked = 0; // отменям статус "взломано"
	digitalWrite(greenLed, LOW);
	guardSound(2); //бибикаем
	guardBlink(2); //моргаем лампочками
	Notify(3);
}
int alarmON() // выполнение действий при срабатывании сигнализации
{
	int checkcount=0;
	while (checkcount < alarmTime) { // даем alarmTime секунд для поднесения ключа
		int alarmCancel = findKey(); //ищем ключик
		if (alarmCancel == 1) { // нашли ключ
			guardOFF(); //отключаем сигналку,
			break; // выходим из цикла
		}
		checkcount++;
		guardBlink(3); //пищим о том, что ищем ключ
		guardSound(3); //светим о том, что ищем ключ
	}
	if (checkcount==alarmTime) { // если не нашли, то включаем оповещение
		Notify(2);
		guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО
		guardSound(4); //светим о том, что УСЁ ПРОПАЛО
		Hacked = 1;
	}
}
int guardBlink (int x) //функция светового оповещения
{
	if (x==1) { // первое ожидание для закрытия двери.
		digitalWrite(redLed, HIGH);
		digitalWrite(greenLed, LOW);
		delay(500);
		digitalWrite(redLed, LOW);
		digitalWrite(greenLed, HIGH);
		delay(500);
	}
	if (x==2) { // выключаем сигнализацию и диоды
		digitalWrite(redLed, LOW);
		digitalWrite(greenLed, LOW);
	}
	if (x==3) { // во время ожидания ключа при открытой двери
		digitalWrite(redLed, HIGH);
		delay (250);
		digitalWrite(redLed, LOW);
		delay (250);
	}
	if (x==4) { // просрочено, ахтунг
		digitalWrite(redLed, HIGH);
	}
}
int guardSound (int x)  //функция звукового оповещения
{
	if (x==1) {
		int melody[] = { // музыка при включении сигнализацию
			NOTE_G3, NOTE_G3, NOTE_G3
		};
		int noteDurations[] = {
			4,4,4
		};
		for (int thisNote = 0; thisNote < 3; thisNote++) {
			int noteDuration = 1000/noteDurations[thisNote];
			tone(tonePin, melody[thisNote],noteDuration);
			int pauseBetweenNotes = noteDuration * 1.30;
			delay(pauseBetweenNotes);
			noTone(tonePin);
		}
	}
	if (x==2) { // выключаем сигнализацию
		int melody[] = {
			NOTE_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3
		};
		int noteDurations[] = {
			4, 8, 8, 4,4,4,4,4
		};
		for (int thisNote = 0; thisNote < 8; thisNote++) {
			int noteDuration = 1000/noteDurations[thisNote];
			tone(tonePin, melody[thisNote],noteDuration);
			int pauseBetweenNotes = noteDuration * 1.30;
			delay(pauseBetweenNotes);
			noTone(tonePin);
		}
	}
	if (x==3) { //тон ожидания ключа
		tone(tonePin,NOTE_C4, 100);
	}
	if (x==4) { //тон просроченного ключа
		tone(tonePin,NOTE_E4, 500);
	}
}
int Notify(int x) //функция оповещения в последователньый порт
{
	if (x==0) { // оповещение о постановке на сигнализацию
		Serial.println("0x00");
	}
	if (x==1) { // оповещение о открытии двери
		Serial.println("0x01");
	}
	if (x==2) { // оповещение о взломе квартиры!
		Serial.println("0x02");
	}
	if (x==3) { // оповещение о выключении сигнализации
		Serial.println("0x03");
	}
	if (x==98) { // оповещение о включении ardunio
		Serial.println("9x98");
	}
	if (x==99) { // оповещение о ОШИБКЕ
		Serial.println("9x99");
	}
}
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).

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

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

#!/usr/bin/python
#coding=UTF-8
import serial, os, MySQLdb, time #нужные компоненты
devdb = '/dev/ttyUSB0', '/dev/ttyUSB1' #возможные варианты подключения ардуино
error = 0 #количество ошибок обращения к устройствам (поиск ардуины)
debugMode = 0 #режим 0 - обычный, 1 - подробный (подробное оповещение по смс), хз зачем надо. 
def action(code): #запись в базу данных sql
	print code
	db = MySQLdb.connect("localhost","smart","smart","smart-house" )
	if code=='9x98':
		db.query("insert into sensors (date,sensor,state)values (now(),'Arduino','Arduino ON')")
		db.close()
	elif code=='0x00':
		db.query("insert into sensors (date,sensor,state)values (now(),'Door sensor','Door guard: ON')")
		db.close()
	elif code=='0x01':
		db.query("insert into sensors (date,sensor,state)values (now(),'Door sensor','Door opened')")
		db.close()
	elif code=='0x02':
		db.query("insert into sensors (date,sensor,state)values (now(),'Door sensor','DOOR ALARM')")
		db.close()
	elif code=='0x03':
		db.query("insert into sensors (date,sensor,state)values (now(),'Door sensor','Door guard: OFF')")
		db.close()
	elif code=='1x10':
		db.query("insert into sensors (date,sensor,state)values (now(),'Water sensor','WATER ALARM')")
		db.close()
	elif code=='9x99':
		db.query("insert into sensors (date,sensor,state)values (now(),'Arduino','No connection to Arduino')")
		db.close()
	else:
		db.close()
	
base = { 		#библиотека соответствий код-действие. формат 'BaseCode': 'BaseAction',
'0x00': '', 		# постановка на сигнализацию
'0x01': '',		# открытие двери
'0x02': '/home/bakemono/Dropbox/Scripts/sms/arduino/arduino_alarm_door.sh', # оповещение о взломе по смс
'0x03': '',		# отключение сигнализации
'0x04': '',		# свободно
'0x05': '',		# свободно
'1x10': '/home/bakemono/Dropbox/Scripts/sms/arduino/arduino_alarm_water.sh',# оповещение по смс о затоплении)
'9x98': '', 	# включение ардуино
'9x99': '/home/bakemono/Dropbox/Scripts/sms/arduino/arduino_not_found.sh', 	# ошибка, ардуино не обранужена
}
debugBase = { 		#библиотека для подробного оповещения
'0x00': '', 		# постановка на сигнализацию
'0x01': '',		# открытие двери
'0x02': '/home/bakemono/Dropbox/Scripts/sms/arduino/arduino_alarm_door.sh', # оповещение о взломе по смс
'0x03': '/home/bakemono/Dropbox/Scripts/sms/arduino/arduino_guardOFF_door.sh',		# отключение сигнализации
'0x04': '',		# свободно
'0x05': '',		# свободно
'1x10': '/home/bakemono/Dropbox/Scripts/sms/arduino/arduino_alarm_water.sh',# оповещение по смс о затоплении)
'9x98': '', 	# включение ардуино
'9x99': '/home/bakemono/Dropbox/Scripts/sms/arduino/arduino_not_found.sh', 	# ошибка, ардуино не обранужена
}

for device in devdb: #подцепляемся по очереди списка devdb (вверху)
	try:
		DevCheck = os.path.exists(device) #(проверяем наличие устройства, чтобы в ексепшн не валиться)
		if DevCheck == True:
			print 'work with ', device
			ser = serial.Serial(device, 9600) #открываем порт
			while 1:
				BaseCode = ser.readline().strip()
				BaseAction = base.get(BaseCode) # получаем в переменную BaseAction значение из библиотеки base в соответствии с кодом BaseCode
				action(BaseCode) # вызываем функцию записи в sql
				if debugMode == 0: #работаем в зависимости от режима оповещения
					BaseAction = base.get(BaseCode) #обычной оповещение
					#os.system(BaseAction)
				elif debugMode == 1: 	#подробное оповещение
					BaseAction = debugBase.get(BaseCode)
					#os.system(BaseAction)
	except:
		pass
		#action('9x99')
		#error = error + 1
		#time.sleep(5)
		#os.system('9x99')

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

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

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

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

 

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

не 5 байт а 8

 

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

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

 

char* 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;}
#include <OneWire.h>
#include "pitches.h"
const byte greenLed = 10; //зеленая лампочка
const byte redLed = 11;  //красная лампочка
const byte gerkonPin = 8; //gerkon
const byte iButtonPin = 12; //пин для ibutton
const byte tonePin = 7; // пин для пищалки
const byte waterPin = 9; // пин датчика воды
 
const byte alarmTime = 15; // время, чтобы поднести ключ при разблокировке
const byte startTime = 10; // время на закрытие двери при постановке на сигнализацию
 
OneWire  ds(iButtonPin); //ibutton
byte code1[8] = {0x01, 0xF0, 0x30, 0xB5, 0x00, 0x00, 0x00, 0xDB};  //первый ключ
byte code2[8] = {0x01, 0xCA, 0x4E, 0xA5, 0x00, 0x00, 0x00, 0x0E};  // второй ключ
 
boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде
boolean alarmState = 0; //флаг работающей сигнализации
boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке.
boolean Hacked = 0;
// стандартные коды: 1- включение, 2- выключение, 3- тревога
void setup()
{
    Serial.begin(9600);
    delay(2000); //задержка включения
    pinMode(greenLed, OUTPUT); //задаем режим работы пинов
    pinMode(redLed, OUTPUT);
    pinMode(waterPin, INPUT);
    pinMode(gerkonPin, INPUT);
    Notify(98); // оповещение о включении ардуино (напр. после перезагрузки)
}
void loop()
{
    byte returnedValue = 0;
    if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ
        returnedValue = findKey();
        if (returnedValue == 1)  { // нашли известный ключ
            guardON(); //вкл статус сигнализации
        }
    }
    if(alarmState==1) { // если включена сигнализация, то
        gerkonState = digitalRead(gerkonPin); //смотрим геркон
        // Serial.println(gerkonState, HEX);
        if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана ;)
            Notify(1); // сообщаем компьютеру об открытии двери
            alarmON(); //включаем сигналку
        }
        returnedValue = findKey(); //нужно выключить изнутри квартиры
        if (returnedValue == 1)  { // нашли известный ключ и
            alarmState=0;
            guardOFF();
        }
    }
    returnedValue = 0; //обнуляем для обработки датчиков воды
    //returnedValue = checkWater();
    //if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды
    //  Notify(10); //сообщаем о срабатывании датчика воды
    //}
    delay (500);
}
int checkWater() //функция проверки датчика воды
{
    int WsensorState = analogRead(waterPin);
    Serial.println(WsensorState);
    if (WsensorState == 1 && waterAlarmed == 0){
        waterAlarmed =1;
        return 1;
    }
    return 0;
}
int findKey() // функция поиска ключа
{
    byte i;
    byte addr[8];
    byte checkOK = 0; //счетчик совпадений массива с эталоном
    // Serial.println("searching key...");
    if ( !ds.search(addr)) {  // тут надо сделать нормально сделатЬ!!!
    //    Serial.println("No key connected..."); // сообщаем об этом
        return; // и прерываем программу

        for(int i = 0; i < 8; i++) 
            ds.reset_search(); // сброс ключа
  
            if (addr[i]==code1[i] || addr[i]==code2[i]) {
                checkOK++;
            }
        
        if (checkOK == 5 )
        return 1;
    }
return 0;
}
void guardON() // выполнение действие при на сигнализацию
{
    int j;
    alarmState=1; //включаем статус сигнализации
    guardSound(1); //бибикаем
    for (j=0; j < startTime; j++) {
        guardBlink(1); //моргаем лампочками и ждем время для закрытия двери
    }
    Notify(0);
}
void guardOFF() // выполнение действие при снятии с сигнализации
{
    alarmState=0; // выключаем статус сигнализации
    Hacked = 0; // отменям статус "взломано"
    digitalWrite(greenLed, LOW);
    guardSound(2); //бибикаем
    guardBlink(2); //моргаем лампочками
    Notify(3);
}
int alarmON() // выполнение действий при срабатывании сигнализации
{
    int checkcount=0;
    while (checkcount < alarmTime) { // даем alarmTime секунд для поднесения ключа
        int alarmCancel = findKey(); //ищем ключик
        if (alarmCancel == 1) { // нашли ключ
            guardOFF(); //отключаем сигналку,
            break; // выходим из цикла
        }
        checkcount++;
        guardBlink(3); //пищим о том, что ищем ключ
        guardSound(3); //светим о том, что ищем ключ
    }
    if (checkcount==alarmTime) { // если не нашли, то включаем оповещение
        Notify(2);
        guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО
        guardSound(4); //светим о том, что УСЁ ПРОПАЛО
        Hacked = 1;
    }
}
int guardBlink (int x) //функция светового оповещения
{
    if (x==1) { // первое ожидание для закрытия двери.
        digitalWrite(redLed, HIGH);
        digitalWrite(greenLed, LOW);
        delay(500);
        digitalWrite(redLed, LOW);
        digitalWrite(greenLed, HIGH);
        delay(500);
    }
    if (x==2) { // выключаем сигнализацию и диоды
        digitalWrite(redLed, LOW);
        digitalWrite(greenLed, LOW);
    }
    if (x==3) { // во время ожидания ключа при открытой двери
        digitalWrite(redLed, HIGH);
        delay (250);
        digitalWrite(redLed, LOW);
        delay (250);
    }
    if (x==4) { // просрочено, ахтунг
        digitalWrite(redLed, HIGH);
    }
}
int guardSound (int x)  //функция звукового оповещения
{
    if (x==1) {
        int melody[] = { // музыка при включении сигнализацию
            NOTE_G3, NOTE_G3, NOTE_G3
        };
        int noteDurations[] = {
            4,4,4
        };
        for (int thisNote = 0; thisNote < 3; thisNote++) {
            int noteDuration = 1000/noteDurations[thisNote];
            tone(tonePin, melody[thisNote],noteDuration);
            int pauseBetweenNotes = noteDuration * 1.30;
            delay(pauseBetweenNotes);
            noTone(tonePin);
        }
    }
    if (x==2) { // выключаем сигнализацию
        int melody[] = {
            NOTE_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3
        };
        int noteDurations[] = {
            4, 8, 8, 4,4,4,4,4
        };
        for (int thisNote = 0; thisNote < 8; thisNote++) {
            int noteDuration = 1000/noteDurations[thisNote];
            tone(tonePin, melody[thisNote],noteDuration);
            int pauseBetweenNotes = noteDuration * 1.30;
            delay(pauseBetweenNotes);
            noTone(tonePin);
        }
    }
    if (x==3) { //тон ожидания ключа
        tone(tonePin,NOTE_C4, 100);
    }
    if (x==4) { //тон просроченного ключа
        tone(tonePin,NOTE_E4, 500);
    }
}
int Notify(int x) //функция оповещения в последователньый порт
{
    if (x==0) { // оповещение о постановке на сигнализацию
        Serial.println(RUS("Сигнализация включена"));
    }
    if (x==1) { // оповещение о открытии двери
        Serial.println(RUS("Дверь открыта"));
    }
    if (x==2) { // оповещение о взломе квартиры!
        Serial.println(RUS("Тревога, проникновение"));
    }
    if (x==3) { // оповещение о выключении сигнализации
        Serial.println(RUS("Сигнализация отключена"));
    }
    if (x==98) { // оповещение о включении ardunio
        Serial.println(RUS("Arduino готово к работе"));
    }
    if (x==99) { // оповещение о ОШИБКЕ
        Serial.println(RUS("Error"));
    }
}

 

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

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

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


char* 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;}
#include <OneWire.h>
#include "pitches.h"
const byte greenLed = 10; //зеленая лампочка
const byte redLed = 11;  //красная лампочка
const byte gerkonPin = 8; //gerkon
const byte iButtonPin = 12; //пин для ibutton
const byte tonePin = 7; // пин для пищалки
const byte waterPin = 9; // пин датчика воды
 
const byte alarmTime = 3; // время, чтобы поднести ключ при разблокировке
const byte startTime = 5; // время на закрытие двери при постановке на сигнализацию
 
OneWire  ds(iButtonPin); //ibutton
byte code1[8] = {0x01, 0x9F, 0xDC, 0x02, 0x00, 0x00, 0x96, 0x1C};  //первый ключ

 
boolean waterAlarmed = 0; //флаг сработавшего оповещения о воде
boolean alarmState = 0; //флаг работающей сигнализации
boolean gerkonState = 0; //первично закрытая дверь (1 - закрыто, 0 - открыто), пока на кнопке.
boolean Hacked = 0;
// стандартные коды: 1- включение, 2- выключение, 3- тревога
void setup()
{
    Serial.begin(115200);
    delay(2000); //задержка включения
    pinMode(greenLed, OUTPUT); //задаем режим работы пинов
    pinMode(redLed, OUTPUT);
    pinMode(waterPin, INPUT);
    pinMode(gerkonPin, INPUT);
    Notify(98); // оповещение о включении ардуино (напр. после перезагрузки)
}
void loop()
{
    byte returnedValue = 0;
    if(alarmState==0) { //Сигнализация выключена, ждем пока поднесут ключ для ВКЛЮЧЕНИЯ
        returnedValue = findKey();
        if (returnedValue == 1)  { // нашли известный ключ
            guardON(); //вкл статус сигнализации
        }
    }
    if(alarmState==1) { // если включена сигнализация, то
        gerkonState = digitalRead(gerkonPin); //смотрим геркон
       //  Serial.println(gerkonState, HEX);
        if (gerkonState == 1 && Hacked != 1) { //открылась дверь и квартира не взломана ;)
            Notify(1); // сообщаем компьютеру об открытии двери
            alarmON(); //включаем сигналку
        }
        returnedValue = findKey(); //нужно выключить изнутри квартиры
        if (returnedValue == 1)  { // нашли известный ключ и
            alarmState=0;
            guardOFF();
        }
    }
    returnedValue = 0; //обнуляем для обработки датчиков воды
    //returnedValue = checkWater();
    //if (returnedValue==1) { // запускаем оповещение о срабатывании датчика воды
    //  Notify(10); //сообщаем о срабатывании датчика воды
    //}
    delay (500);
}
int checkWater() //функция проверки датчика воды
{
    int WsensorState = analogRead(waterPin);
    Serial.println(WsensorState);
    if (WsensorState == 1 && waterAlarmed == 0){
        waterAlarmed =1;
        return 1;
    }
    return 0;
}
int findKey() // функция поиска ключа



{
    byte i;
    byte addr[8];
    byte checkOK = 0; //счетчик совпадений массива с эталоном
    //Serial.println("searching key...");
    if (!ds.search(addr)) {  // тут надо сделать нормально сделатЬ!!!
    //Serial.println("No key connected..."); // сообщаем об этом
ds.reset_search();
delay(200);
return; // и прерываем программу

        for(int i = 0; i<8; i++) 
Serial.print(addr[i],HEX);
Serial.print(" ");
}
Serial.println("\n");


for (int i=0; i<8; i++)
  
            if (addr[i]==code1[i]) {
                checkOK++;
            }
        
        if (checkOK == 8 ){
        return 1;
    }
return 0;
}



void guardON() // выполнение действие при на сигнализацию
{
    int j;
    alarmState=1; //включаем статус сигнализации
    guardSound(1); //бибикаем
    for (j=0; j < startTime; j++) {
        guardBlink(1); //моргаем лампочками и ждем время для закрытия двери
    }
    Notify(0);
}
void guardOFF() // выполнение действие при снятии с сигнализации
{
    alarmState=0; // выключаем статус сигнализации
    Hacked = 0; // отменям статус "взломано"
    digitalWrite(greenLed, LOW);
    guardSound(2); //бибикаем
    guardBlink(2); //моргаем лампочками
    Notify(3);
}
int alarmON() // выполнение действий при срабатывании сигнализации
{
    int checkcount=0;
    while (checkcount < alarmTime) { // даем alarmTime секунд для поднесения ключа
        int alarmCancel = findKey(); //ищем ключик
        if (alarmCancel == 1) { // нашли ключ
            guardOFF(); //отключаем сигналку,
            break; // выходим из цикла
        }
        checkcount++;
        guardBlink(3); //пищим о том, что ищем ключ
        guardSound(3); //светим о том, что ищем ключ
    }
    if (checkcount==alarmTime) { // если не нашли, то включаем оповещение
        Notify(2);
        guardBlink(4); //пищим о том, что УСЁ ПРОПАЛО
        guardSound(4); //светим о том, что УСЁ ПРОПАЛО
        Hacked = 1;
    }
}
int guardBlink (int x) //функция светового оповещения
{
    if (x==1) { // первое ожидание для закрытия двери.
        digitalWrite(redLed, HIGH);
        digitalWrite(greenLed, LOW);
        delay(500);
        digitalWrite(redLed, LOW);
        digitalWrite(greenLed, HIGH);
        delay(500);
    }
    if (x==2) { // выключаем сигнализацию и диоды
        digitalWrite(redLed, LOW);
        digitalWrite(greenLed, LOW);
    }
    if (x==3) { // во время ожидания ключа при открытой двери
        digitalWrite(redLed, HIGH);
        delay (250);
        digitalWrite(redLed, LOW);
        delay (250);
    }
    if (x==4) { // просрочено, ахтунг
        digitalWrite(redLed, HIGH);
    }
}
int guardSound (int x)  //функция звукового оповещения
{
    if (x==1) {
        int melody[] = { // музыка при включении сигнализацию
            NOTE_G3, NOTE_G3, NOTE_G3
        };
        int noteDurations[] = {
            4,4,4
        };
        for (int thisNote = 0; thisNote < 3; thisNote++) {
            int noteDuration = 1000/noteDurations[thisNote];
            tone(tonePin, melody[thisNote],noteDuration);
            int pauseBetweenNotes = noteDuration * 1.30;
            delay(pauseBetweenNotes);
            noTone(tonePin);
        }
    }
    if (x==2) { // выключаем сигнализацию
        int melody[] = {
            NOTE_C2, NOTE_G1,NOTE_G2, NOTE_A1, NOTE_G1,0, NOTE_B2, NOTE_C3
        };
        int noteDurations[] = {
            4, 8, 8, 4,4,4,4,4
        };
        for (int thisNote = 0; thisNote < 8; thisNote++) {
            int noteDuration = 1000/noteDurations[thisNote];
            tone(tonePin, melody[thisNote],noteDuration);
            int pauseBetweenNotes = noteDuration * 1.30;
            delay(pauseBetweenNotes);
            noTone(tonePin);
        }
    }
    if (x==3) { //тон ожидания ключа
        tone(tonePin,NOTE_C4, 100);
    }
    if (x==4) { //тон просроченного ключа
        tone(tonePin, 500); //включаем на 500 Гц
        delay(100); //ждем 100 Мс
        tone(tonePin, 1000); //включаем на 1000 Гц
        delay(100); //ждем 100 Мс
    }
}
int Notify(int x) //функция оповещения в последователньый порт
{
    if (x==0) { // оповещение о постановке на сигнализацию
        Serial.println(RUS("Сигнализация включена"));
    }
    if (x==1) { // оповещение о открытии двери
        Serial.println(RUS("Дверь открыта"));
    }
    if (x==2) { // оповещение о взломе квартиры!
        Serial.println(RUS("Тревога, проникновение"));
    }
    if (x==3) { // оповещение о выключении сигнализации
        Serial.println(RUS("Сигнализация отключена"));
    }
    if (x==98) { // оповещение о включении ardunio
        Serial.println(RUS("Устройство готово к работе"));
    }
    if (x==99) { // оповещение о ОШИБКЕ
        Serial.println(RUS("Ошибка"));
    }
}