Система "Умный дом" для загородного дома на Arduino Mega2560, HC-05, SIM900,DHT11,3-х DS18B20,RTC-DS1302
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- …
- следующая ›
- последняя »
- Войдите на сайт для отправки комментариев
Здравствуйте форумчане, хочу поделиться с вами плодами своего труда. Может, кому пригодится то, что я делаю. Если кто сможет помочь в оптимизации программного кода, то я буду очень благодарен. Я далеко не программист, по специальности инженер КИПиА, поэтому программировать учился с нуля. Долго я разбирался, как это делается на ардуино, и резко все стало проясняться после того как я нашел на www.forumhouse.ru пример програмного кода умного дома на меге с экранчиком. Поэтому выкладываю все исходники, проекты в КОМПАСе и все сопутствующие файлы для того, чтобы все всё сразу поняли. Мне для хороших людей ничего не жалко. Буду рад, если и хорошие люди поделятся со мной, например программкой платформе андроида для аналогичного умного дома. Ну, или хотя бы информацией как эту программку написать.
Год назад я переехал в старенький загородный домик, и вот уже полгода я воплощаю в жизнь свою мечту: систему умный дом. Работы веду параллельно с ремонтом дома и работами на участке, поэтому не так все быстро получается. Но стараюсь придерживаться главного правила: сначала прокладываем кабель, устанавливаем датчики, проводим наладку, после этого делаем отделку места. Я зашиваю всё гипсокартоном, сверлить, ломать и перестраивать не боюсь. Самое главное, что жена пока все это безобразие поддерживает.
Дом у меня с водопроводом, электричеством и природным газом. Поэтому в первую очередь система занимается оптимальным расходованием этим ресурсов. Основные объекты автоматизации: насосная станция, дренажная емкость, газовый котел, всё освещение дома и территории.
Ну а поскольку работаю я вахтовым методом в ХМАО, то мне нужен полный дистанционный контроль и управление через GSM. Для этого применяется плата GSM модуль на SIM900. Много есть программок для андроида для посылок команд через СМС. Но мне нравится больше всего эта: GSM Trinket.apk
По месту управление происходит со смартфонов на андроиде по Bluetooth через программку BluetoothSPP.apk
Основные функции умного дома:
Контроль протечки воды;
Охранно-пожарная сигнализация;
Охрана периметра в ночное время;
Управление освещением;
Климат-контроль дома;
Управление всеми электроприемниками дома;
Контроль и сигнализация предельных температур в помещениях и на улице.
Дистанционное управление по GSM и Bluetooth
Голосовой контроль по GSM
В планах:
Голосовое оповещение на микроконтроллере Attiny2313 и SD-карте (плата уже готова);
Контроль утечки газа (нужен датчик газа);
Имитация присутствия хозяев в доме при работе охранной сигналзиации.
Управление с ИК пультов (а надо ли?)
Контроль уровня в канализационной емкости (есть идея сделать самомы из полипропиленовой трубы, магнита и герконов так же как промышленный ПМП-118 )
Вывод показаний в интернет по GPRS. (найти надо сервер или соцсеть)
Файлы к статье:
Программный код для mega2560:
ForumHouseV14_01_2015.ino
Проект в картинках. Прошу прощения, он еще далек от совершенства, так как все мы знаем, что у него нет пределов. Как только доведу его до уровня исполнительной документации, сразу же выложу.
Проект в JPEG от декабрь 2014.rar
Фото шкафа силового и шкафа контроллерного:
Фото силового шкафа:
Фото контроллерного шкафа:
Центр системы arduino Mega2560:
Плата часов реального времени:
Платы опторазвязки:
Плата реле:
Плата голосового оповещения на attiny2313 и SD-карте:
Файлы доступны на яндекс диске
https://yadi.sk/d/iqyRFz1Zdt8W2
001
///////////////////////Программа "умного дома" на основе MEGA2650////////////////////////
002
003
//Автор: Макаров Вячеслав email:chernisheevka@mail.ru
004
005
#include <OneWire.h> // библиотека для DS18B20
006
#include <DallasTemperature.h> // библиотека для DS18B20
007
// <a href="http://compcar.ru/forum/showthread.php?t=8593&page=43" title="http://compcar.ru/forum/showthread.php?t=8593&page=43" rel="nofollow">http://compcar.ru/forum/showthread.php?t=8593&page=43</a> чтение датчиков по адресам
008
// <a href="http://robocraft.ru/blog/arduino/136.html" title="http://robocraft.ru/blog/arduino/136.html" rel="nofollow">http://robocraft.ru/blog/arduino/136.html</a> про датчики DS18S20
009
// <a href="http://mk90.blogspot.ru/2011/04/1-wire.html" title="http://mk90.blogspot.ru/2011/04/1-wire.html" rel="nofollow">http://mk90.blogspot.ru/2011/04/1-wire.html</a> соединение датчиков DS18B20
010
#define ONE_WIRE_BUS 7 // датчики DS18B20 на 7 пин
011
OneWire oneWire(ONE_WIRE_BUS);
012
DallasTemperature ds(&oneWire);
// Везде где встречается ds - это работа с датчиками Dallas DS18B20
013
DeviceAddress ZalC = { 0x28, 0x8C, 0xAE, 0xEA, 0x05, 0x00, 0x00, 0x7F };
// Сетевой адрес датчика DS18B20 в доме (вписывайте адрес вашего датчика)
014
DeviceAddress UlicaC = { 0x28, 0x2B, 0x0F, 0x36, 0x04, 0x00, 0x00, 0xE0 };
// Сетевой адрес датчика DS18B20 на улице (вписывайте адрес вашего датчика)
015
DeviceAddress KuhnyaC = { 0x28, 0xDE, 0x7A, 0xEB, 0x05, 0x00, 0x00, 0xF1 };
// Сетевой адрес датчика DS18B20 в кухне (вписывайте адрес вашего датчика)
016
int
tempC;
// для работы с DS18B20
017
018
int
TempZalC = 15;
// Переменная. Измеренная температура в зале (По умолчанию 15гр.С)
019
int
TempUlicaC = 15;
// Переменная. Измеренная температура на улице (По умолчанию 15гр.С)
020
int
TempKuhnyaC = 15;
// Переменная. Измеренная температура на кухне (По умолчанию 15гр.С)
021
int
TempPodpol = 15;
// Переменная. Измеренная температура в подполе (По умолчанию 15гр.С)
022
int
UlicaS = 15;
// Переменная. Измеренная освещенность на улице (По умолчанию 15%)
023
024
//_______Все для цикла void otoplenie()____________________________________________________________________
025
026
int
tempDust = 25;
// Уставка желаемой температуры в доме (По умолчанию 25гр.С)
027
int
tempDECOust = 15;
// Уставка температуры в доме в режиме "Экономия"(По умолчанию 15гр.С)
028
//#include <EEPROM.h> //библиотека работы с SD-картой
029
// <a href="http://blockduino.blogspot.ca/2013/08/Password-Keypad-w-Sound.html" title="http://blockduino.blogspot.ca/2013/08/Password-Keypad-w-Sound.html" rel="nofollow">http://blockduino.blogspot.ca/2013/08/Password-Keypad-w-Sound.html</a> кодовый замок
030
031
#include <dht11.h> //библиотека датчика DTH11
032
#define DHT11PIN 6 //Датчик DTH11 на pin6
033
dht11 dht;
034
035
// <a href="http://forum.amperka.ru/threads/%D0%A1%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-5v-arduino-%D1%81-3-3v-%D1%87%D0%B0%D1%81%D0%B0%D0%BC%D0%B8-ds1302.378/" rel="nofollow">http://forum.amperka.ru/threads/Сопряжение-5v-arduino-с-3-3v-часами-ds1302.378/</a>
036
// <a href="http://samou4ka.net/page/chasy-realnogo-vremeni-ds1302-i-mikrokontroller-avr" title="http://samou4ka.net/page/chasy-realnogo-vremeni-ds1302-i-mikrokontroller-avr" rel="nofollow">http://samou4ka.net/page/chasy-realnogo-vremeni-ds1302-i-mikrokontroller...</a>
037
#include <DS1302.h> // библиотека работы с часами
038
DS1302 rtc(2, 3, 4);
// Часы на DS1302 2-RST,3-DAT,4-CLK
039
Time t;
040
int
RTCSekunda;
// Переменная "секунда" для суточного таймера цикл RTCtimer()
041
int
RTCChas;
// Переменная "час" для суточного таймера цикл RTCtimer()
042
int
RTCMinuta;
// Переменная "минута" для суточного таймера
043
044
boolean statusKur=
false
;
// Флаг "работа курантов"
045
046
boolean statusDay=
false
;
// Флаг "Режим работы true - дневной, false - ночной"
047
048
boolean SMSDvigenieK=
false
;
// Флаг "Отправлена СМС о движении на кухне"
049
boolean SMSDvigenieV=
false
;
// Флаг "Отправлена СМС о движении в ванной"
050
boolean SMSDvigenieZ=
false
;
// Флаг "Отправлена СМС о движении в зале"
051
boolean SMSDvigenieS=
false
;
// Флаг "Отправлена СМС о входе"
052
boolean SMSVoltOFF=
false
;
// Флаг "Отправлена СМС об отключении питания 220в"
053
boolean SMSVoltON=
false
;
// Флаг "Отправлена СМС о восстановлении питания 220в"
054
boolean SMSBanyaTemp=
false
;
// Флаг "Отправлена СМС о предельной температуре в бане"
055
boolean SMSPodpol=
false
;
// Флаг "Отправлена СМС об затоплении подпола"
056
boolean SMSFireSensor=
false
;
// Флаг "Отправлена СМС о сработке дымового датчика"
057
boolean SMSFireAlarm=
false
;
// Флаг "Отправлена СМС о сработке пожарной сигнализации"
058
boolean SMSDelete=
false
;
// Флаг "Удалены все СМС на SIM900"
059
boolean TimeSMSzapros=
false
;
// Флаг "Отправлена СМС о состоянии дома по таймеру"
060
boolean SMSAlarmTemp=
false
;
// Флаг "Отправлена СМС о критической температуре"
061
//boolean EcoTempDust=false; // Флаг "Экономия отопления"
062
063
int
vlaga=0;
// Значение влажности в цикле ventilyaciya()
064
int
pambilang;
// переменная для цикла sirena()
065
066
int
statushome=0;
// переменная статуса включения умного дома 1 - включен, 0 -выключен
067
int
statusotp=0;
// статус отопления дома 0 - откл , 1- вкл , 2- экономия
068
int
statusrzd=0;
// статус питания розеток дома 0 - откл , 1- вкл
069
int
statusgaraj=0;
// статус питания гаража 0 - откл , 1- вкл
070
int
statusbania=0;
// статус питания бани 0 - откл , 1- вкл
071
int
statusPump=0;
// статус питания станции водоснабжения 0 - откл , 1- вкл
072
int
perimetr=0;
// статус включения охраны периметра 0 - откл , 1- вкл
073
int
statusperimetr=0;
// статус периметра 1 - все двери закрыты , 0 - дверь не закрыта
074
int
statuspoliv=0;
// статус полива 0 - откл , 1- вкл , 2- Таймер
075
int
statusAlarm=0;
// Переменная "Наличие тревоги"
076
int
AlarmTemp=0;
// Переменная "Наличие тревоги по критической температуре"
077
int
statusFireAlarm=0;
// Переменная "Режим работы пож.сигнализации" - 0 - откл , 1- вкл , 2- проверка, 3-в тревоге
078
int
signaliz=0;
// Переменная "Режим работы охр.сигнализации" - 0 - откл , 1- вкл , 2- постановка на охрану, 3-в тревоге
079
int
statusPIK=0;
// статус работы тональной пищалки 0 - откл , 1- вкл
080
081
boolean statusBlock=
false
;
// статус блокировки освещения зала пользователем
082
boolean statusZ=
false
;
// статус блокировки освещения зала по времени суток
083
084
int
intervalPIK = 1000;
// интервал для цикла Pik()
085
int
TonPIK = 2500;
// частота тона пищалки
086
//_________ флаги для таймеров______________________________________
087
boolean Timer1On =
false
;
//Флаг таймера РЕЗЕРВ
088
boolean Timer2On =
false
;
//Флаг таймера постановки на охрану
089
090
//_________ переменные времени для таймеров_________________________
091
unsigned
long
EndPikMillis = 0;
// храним время последнего тона для цикла Pik()
092
unsigned
long
NowTime1 = 0;
// переменная хранения времени таймера №1
093
unsigned
long
StartTime1 = 0;
// переменная хранения времени запуска таймера №1
094
unsigned
long
NowTime2 = 0;
// переменная хранения времени таймера №2
095
unsigned
long
StartTime2 = 0;
// переменная хранения времени запуска таймера №2
096
097
098
//_________ флаги для цикла Kvitirovanie()(сброс звука сирены)______________________________________
099
boolean KvitDI30 =
false
;
//Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 30
100
boolean KvitDI29 =
false
;
//Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 29
101
boolean KvitDI31 =
false
;
//Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 31
102
boolean KvitZalC =
false
;
//Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура зал
103
boolean KvitUlicaC =
false
;
//Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура улицы
104
boolean KvitKuhnyaC =
false
;
//Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура кухни
105
boolean KvitPodpolC=
false
;
//Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура в подполе
106
107
//boolean KvitAI14 = false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход A14
108
109
long
previousMillis = 0;
// храним время последнего замера влажности для цикла izmereniya()
110
long
interval = 120000;
// интервал между замерами параметров для цикла izmereniya() 2 минуты
111
112
//______ Переменные для цикла avtosvet() взято с <a href="http://zelectro.com.ua/PIR_sensor" title="http://zelectro.com.ua/PIR_sensor" rel="nofollow">http://zelectro.com.ua/PIR_sensor</a> ___________________________
113
long
unsigned
int
lowIn_K;
// Время, в которое был принят сигнал отсутствия движения на кухне(LOW)
114
long
unsigned
int
lowIn_V;
// Время, в которое был принят сигнал отсутствия движения в ванной(LOW)
115
long
unsigned
int
lowIn_Z;
// Время, в которое был принят сигнал отсутствия движения в зале(LOW)
116
long
unsigned
int
lowIn_S;
// Время, в которое был принят сигнал отсутствия движения в сенях(LOW)
117
long
unsigned
int
pause_K = 60000;
//Пауза, после которой движение считается оконченным
118
long
unsigned
int
pause_V = 60000;
//Пауза, после которой движение считается оконченным
119
long
unsigned
int
pause_Z = 300000;
//Пауза, после которой движение считается оконченным
120
long
unsigned
int
pause_S = 60000;
//Пауза, после которой движение считается оконченным
121
boolean lockLow_K =
true
;
//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
122
boolean lockLow_V =
true
;
//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
123
boolean lockLow_Z =
true
;
//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
124
boolean lockLow_S =
true
;
//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
125
boolean takeLowTime_K;
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
126
boolean takeLowTime_V;
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
127
boolean takeLowTime_Z;
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
128
boolean takeLowTime_S;
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
129
int
pirPin_K = 26;
//вывод подключения PIR датчика Кухни
130
int
pirPin_V = 24;
//вывод подключения PIR датчика Ванной
131
int
pirPin_Z = 22;
//вывод подключения PIR датчика Зал
132
int
pirPin_S = 28;
//вывод подключения PIR датчика Сени
133
134
//_______Для работы терминала по bluetooth___________________________
135
int
inSize=0;
// Переменная которая будет содержать размер буфера терминала bluetooth
136
char
str[128];
// Так как типа string тут нет, будем использовать массив символов
137
138
//_______Для работы терминала по Sim900______________________________
139
140
String currStr =
""
;
141
boolean isStringMessage =
false
;
// Переменная принимает значение True, если текущая строка является сообщением
142
143
//___________________ Стартовый цикл _________________________________
144
145
void
setup
()
146
147
{
148
ds.begin();
149
ds.setResolution(ZalC, 10);
150
ds.setResolution(UlicaC, 10);
151
ds.setResolution(KuhnyaC, 10);
152
153
pinMode(22, INPUT); digitalWrite(22,HIGH);
// вход датчик движения зал
154
pinMode(24, INPUT); digitalWrite(24,HIGH);
// вход датчик движения ванна
155
pinMode(26, INPUT); digitalWrite(26,HIGH);
// вход датчик движения кухня
156
pinMode(28, INPUT); digitalWrite(28,HIGH);
// вход датчик движения сени
157
pinMode(30, INPUT); digitalWrite(30,HIGH);
// вход сигнализатор "Вода в подполе"
158
pinMode(32, INPUT); digitalWrite(32,HIGH);
// Резерв
159
pinMode(34, INPUT); digitalWrite(34,HIGH);
// Резерв
160
pinMode(36, INPUT); digitalWrite(36,HIGH);
// Резерв
161
162
pinMode(23, INPUT); digitalWrite(23,HIGH);
// вход концевики ворот
163
pinMode(25, INPUT); digitalWrite(25,HIGH);
// вход концевик входной двери
164
pinMode(27, INPUT); digitalWrite(27,HIGH);
// вход концевик двери бани
165
pinMode(29, INPUT); digitalWrite(29,HIGH);
// вход термостат "Баня готова"
166
pinMode(31, INPUT); digitalWrite(31,HIGH);
// вход термостат "Очень высока температура в бане"
167
pinMode(33, INPUT); digitalWrite(33,HIGH);
// Дымовой шлейф №1
168
pinMode(35, INPUT); digitalWrite(35,HIGH);
// Дымовой шлейф №2
169
pinMode(37, INPUT); digitalWrite(37,HIGH);
// Нет напряжения после УЗО
170
171
//pinMode(13, INPUT); digitalWrite(13,HIGH); // вход ИК сигналы от TSOP
172
173
pinMode( 5, OUTPUT);
// Пьезо динамик
174
pinMode(13, OUTPUT);
// Лампа УД включен
175
176
pinMode(38, OUTPUT);
// Свет в Кухня
177
pinMode(40, OUTPUT);
// Свет в Ванна
178
pinMode(42, OUTPUT);
// Свет в Зал
179
pinMode(44, OUTPUT);
// Свет в Сени
180
pinMode(46, OUTPUT);
// Питание насосной станции
181
pinMode(48, OUTPUT);
// Питание дренажного насоса
182
pinMode(50, OUTPUT);
// Питание водонагревателя
183
pinMode(52, OUTPUT);
// Освещение двора
184
185
digitalWrite(38,HIGH);
// Подаем единицы на плату реле (сигнал инвентированный)
186
digitalWrite(40,HIGH);
// Подаем единицы на плату реле (сигнал инвентированный)
187
digitalWrite(42,HIGH);
// Подаем единицы на плату реле (сигнал инвентированный)
188
digitalWrite(44,HIGH);
// Подаем единицы на плату реле (сигнал инвентированный)
189
digitalWrite(46,HIGH);
// Подаем единицы на плату реле (сигнал инвентированный)
190
digitalWrite(48,HIGH);
// Подаем единицы на плату реле (сигнал инвентированный)
191
digitalWrite(50,HIGH);
// Подаем единицы на плату реле (сигнал инвентированный)
192
digitalWrite(52,HIGH);
// Подаем единицы на плату реле (сигнал инвентированный)
193
194
pinMode(39, OUTPUT);
// Питание гаража
195
pinMode(41, OUTPUT);
// Питание бани
196
pinMode(43, OUTPUT);
// Питание розеток дома
197
pinMode(45, OUTPUT);
// Питание вентиляции
198
199
pinMode(47, OUTPUT);
// Клапан полива
200
pinMode(49, OUTPUT);
// Сирены
201
pinMode(51, OUTPUT);
// Номер дома
202
pinMode(53, OUTPUT);
// Управление отоплением
203
204
Serial
.begin(9600);
// Связь по терминалу
205
Serial1.begin(9600);
// HC-05 Bluetooth <a href="http://robocraft.ru/blog/electronics/587.html#comment4652" title="http://robocraft.ru/blog/electronics/587.html#comment4652" rel="nofollow">http://robocraft.ru/blog/electronics/587.html#comment4652</a>
206
Serial2.begin(19200);
// GSM SMS-передача плата SIM900
207
//Serial3.begin(9600); // Плата голосового оповещения на attiny2313 и SD-карте
208
delay(2000);
209
SMSVoltON=
true
;
210
NastroykaGSM();
// Настройка работы с SIM900
211
tone(5, 2000, 200);
// Звук, когда все готово!
212
delay(5000);
213
t = rtc.getTime();
214
RTCChas = t.hour;
// t.hour - запрос часов
215
RTCMinuta = t.min;
// t.min - запрос минут
216
startOneSMS();
217
Serial2.print(
"SmartHome vkluchen-"
);
// дом включен
218
Serial2.print(RTCChas); Serial2.print(
":"
); Serial2.print(RTCMinuta);
// время включения
219
EndSMS();
220
}
221
222
void
loop
()
223
{
224
RTCtimer();
225
izmereniya();
226
alarms();
227
bluetooth();
228
sms_read();
229
osvechenie();
230
//if (statushome==1 && statusDay==false) {avtosvet();} // Автоматическое управление освещением в доме по таймеру
231
if
(!statusFireAlarm==0){FireAlarm();}
// Работа пожарной сигнализации
232
if
(statushome==1 && UlicaS < 15) {avtosvet();}
// Автоматическое управление освещением в доме меньше 15%
233
if
(UlicaS > 10){digitalWrite(52,HIGH);}
// Освещение двора выключить при освещении больше 10% (сигнал инвертированный)
234
if
(UlicaS < 6) {digitalWrite(52,LOW);}
// Освещение двора включить при освещении меньше 6% (сигнал инвертированный)
235
if
(statushome==1){digitalWrite(13,HIGH);}
else
{digitalWrite(13, LOW);}
// Лампа "Умный дом включен"
236
//if (statushome==1){ventilyaciya();} // Управление вентиляцией в ванной по датчику влажности DHT11
237
if
(statusotp==1) {otoplenie();}
else
{digitalWrite(53, LOW);}
// Управление работой газового котла 1 - вкл., 0 - откл.
238
if
(!signaliz==0){signalizSMS();}
// Работа сигнализации сигнализации при режимах 1,2,3
239
if
(statusPIK==1){Pik();}
// Работа тональной пищалки
240
if
(perimetr==1){Operimetr();}
// Охрана периметра участка
241
if
((statusPump==1) && (digitalRead(30)==LOW)) {digitalWrite(46,LOW);}
else
{digitalWrite(46, HIGH);}
// Питание станции водоснабжения (Сигнал инвертированный)
242
if
(statusrzd==1){digitalWrite(43,HIGH);}
else
{digitalWrite(43, LOW);}
// Питание розеток дома
243
if
(statusgaraj==1){digitalWrite(39,HIGH);}
else
{digitalWrite(39, LOW);}
// Питание гаража
244
if
(statusbania==1){digitalWrite(41,HIGH);}
else
{digitalWrite(41, LOW);}
// Питание бани
245
if
(statuspoliv==0) {digitalWrite(47, LOW);}
// Выключение клапана полива
246
if
(statuspoliv==1) {digitalWrite(47, HIGH);}
// Включение клапана полива на постоянку
247
if
(statuspoliv==2) {digitalWrite(47, HIGH); timerPoliv();}
// Клапан полива включен по таймеру
248
if
((perimetr==1 && statusperimetr==0) || statusAlarm==1) { sirena();}
// Работа малой сирены
249
250
//if (analogRead(14)>100) {KvitAI14=false;} // Сброс квитирования при возвращении параметра в норму
251
if
(digitalRead(29)==LOW) {KvitDI29=
false
;}
// Сброс квитирования при возвращении параметра в норму
252
if
(digitalRead(30)==LOW) {KvitDI30=
false
;}
// Сброс квитирования при возвращении параметра в норму
253
if
(digitalRead(31)==LOW) {KvitDI31=
false
;}
// Сброс квитирования при возвращении параметра в норму
254
if
( TempZalC != -127 && TempZalC > 10) {KvitZalC=
false
;}
// Сброс квитирования при возвращении параметра в норму
255
if
( TempZalC != -127 && TempZalC < 35) {KvitZalC=
false
;}
// Сброс квитирования при возвращении параметра в норму
256
if
( TempUlicaC != -127 && TempUlicaC < 50) {KvitUlicaC=
false
;}
// Сброс квитирования при возвращении параметра в норму
257
if
( TempKuhnyaC != -127 && TempKuhnyaC > 10) {KvitKuhnyaC=
false
;}
// Сброс квитирования при возвращении параметра в норму
258
if
( TempKuhnyaC != -127 && TempKuhnyaC < 35) {KvitKuhnyaC=
false
;}
// Сброс квитирования при возвращении параметра в норму
259
if
( TempPodpol > 3 && (TempPodpol < 35)) {KvitPodpolC=
false
;}
// Сброс квитирования при возвращении параметра в норму
260
}
261
262
void
RTCtimer()
// Цикл суточного таймера на RTC модуле DS1302
263
{
264
t = rtc.getTime();
265
//RTCSekunda = t.sec; // t.sec - запрос секунд
266
RTCChas = t.hour;
// t.hour - запрос часов
267
RTCMinuta = t.min;
// t.min - запрос минут
268
if
(RTCChas == 0 && RTCMinuta == 1){statusPump=0;}
//в 0:01 выключить насосную станцию (включение вручную)
269
if
(RTCChas == 0 && RTCMinuta == 30 && digitalRead(25)==LOW){perimetr=1;}
//включение охраны периметра в 0:30
270
if
(RTCChas == 6 && RTCMinuta == 40){perimetr=0;}
//выключение охраны периметра в 6:40
271
if
(RTCChas > 16 && RTCChas < 23 && statushome==1){digitalWrite(48,LOW);}
else
{digitalWrite(48,HIGH);}
//в 16 до 23 Включить дренажный насос
272
if
(RTCChas > 6 && RTCChas < 23 && statushome==1) {digitalWrite(50,LOW);}
else
{digitalWrite(50,HIGH);}
//в 6 до 23 Включить водонагреватель
273
//if(RTCChas > 9 && RTCChas < 16){digitalWrite(52,HIGH);} else {digitalWrite(52,LOW);} //c 16 до 9 утра включить освещение двора
274
if
(RTCChas > 7 && RTCChas < 23 && RTCMinuta == 0 && statusKur==
false
){tone(5, 2500, 200); statusKur=
true
;}
// Ежечасный сигнал (куранты) с 8-00 по 22-00
275
if
(RTCMinuta != 0){statusKur=
false
;}
// сброс флага statusKur
276
if
(RTCChas > 8 && RTCChas < 23){statusDay=
true
;}
else
{statusDay=
false
;}
//c 8 до 23 время суток день
277
if
(RTCChas > 10 && RTCChas < 16){statusZ=
true
;}
else
{statusZ=
false
;}
//c 10 до 16 блокировка света в зале по времени суток
278
279
//if(RTCChas == 8 && RTCMinuta == 30){ sirena(); } // Играет будильник (сирена) в 8-30
280
281
// Добавить ведение лога на SD ежесуточно
282
283
// Ежесуточное СМС о состоянии дома при включенной сигнализации.
284
if
(RTCChas == 12 && RTCMinuta == 0 && TimeSMSzapros==
false
&& signaliz==1){SMSzapros(); TimeSMSzapros=
true
;}
// Когда включена сигнализация, в 12:00 отправляем СМС о состоянии.
285
if
(RTCMinuta != 0){TimeSMSzapros=
false
;}
// сброс флага TimeSMSzapros
286
// Ежесуточно. Боремся с переполнением хранилища СМС от спама.
287
if
(RTCChas == 0 && RTCMinuta == 2 && SMSDelete==
false
){Serial2.print(
"AT+CMGDA=«DEL ALL»\r"
); SMSDelete=
true
;}
// Удаляем в 0:02 все СМС.
288
if
(RTCMinuta != 2){SMSDelete=
false
;}
// сброс флага SMSDelete
289
290
// Добавить снижение температуры дома ночью на 1гр.С
291
}
292
293
void
izmereniya()
// Замер температур с датчиков DS18B20 и влажности с датчика DHT11
294
{
// <a href="http://arduino.ru/tutorials/BlinkWithoutDelay" title="http://arduino.ru/tutorials/BlinkWithoutDelay" rel="nofollow">http://arduino.ru/tutorials/BlinkWithoutDelay</a> на основе
295
unsigned
long
currentMillis = millis();
296
if
(currentMillis - previousMillis > interval) {
// Замеры в интервале
297
dht.read(DHT11PIN);
// Замеры температур с DHT11
298
delay(100);
// Необязательная задержка
299
vlaga = dht.humidity;
// Уровень влажности % с DHT11
300
TempPodpol = dht.temperature;
// Температура в подполе с DHT11
301
ds.requestTemperatures();
// Замеры температур с DS18B20
302
delay(750);
// Необязательная задержка
303
TempZalC = ds.getTempC(ZalC);
// Считываем температуру в зале
304
delay(100);
305
TempUlicaC = ds.getTempC(UlicaC);
// Считываем температуру на улице
306
delay(100);
307
TempKuhnyaC = ds.getTempC(KuhnyaC);
// Считываем температуру в кухне
308
delay(100);
309
UlicaS = analogRead(A15)/10;
// Считываем освещенность на улице
310
previousMillis = currentMillis;}
// Сброс таймера
311
}
312
313
314
void
alarms()
//______________Цикл "тревожные сигналы"____// <a href="http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku" title="http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku" rel="nofollow">http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...</a>
315
{
316
if
(digitalRead(30)==HIGH && KvitDI30==
false
) { statusAlarm=1; statusPump=0; alarmsSMS();}
// Сработка датчика затопления подпола
317
//else if (analogRead(14)<100 && KvitAI14==false) { statusAlarm=1; } // Сработка датчика уровня дренажной емкости
318
else
if
(digitalRead(29)==HIGH && KvitDI29==
false
) { statusAlarm=1; }
// Сработка датчика готовности бани
319
else
if
(digitalRead(31)==HIGH && KvitDI31==
false
) { statusAlarm=1; alarmsSMS();}
// Сработка датчика предельной температуры в бане
320
else
if
( TempZalC != -127 && TempZalC < 10 && KvitZalC==
false
) {statusAlarm=1; AlarmTemp=1;}
// Сигнализация низкой температуры в зале +10
321
else
if
( TempZalC != -127 && TempZalC > 35 && KvitZalC==
false
) {statusAlarm=1; AlarmTemp=1;}
// Сигнализация высокой температуры в зале +35
322
else
if
( TempUlicaC != -127 && TempUlicaC > 50 && KvitUlicaC==
false
) {statusAlarm=1; AlarmTemp=1;}
// Сигнализация высокой температуры на улице +50
323
else
if
( TempKuhnyaC != -127 && TempKuhnyaC < 10 && KvitKuhnyaC==
false
) {statusAlarm=1; AlarmTemp=1;}
// Сигнализация низкой температуры в кухне +10
324
else
if
( TempKuhnyaC != -127 && TempKuhnyaC > 35 && KvitKuhnyaC==
false
) {statusAlarm=1; AlarmTemp=1;}
// Сигнализация высокой температуры в кухне +35
325
else
if
( TempPodpol < 3 && KvitPodpolC==
false
) {statusAlarm=1; AlarmTemp=1;}
// Сигнализация низкой температуры в в подполе +3
326
else
if
( TempPodpol > 35 && KvitPodpolC==
false
) {statusAlarm=1; AlarmTemp=1;}
// Сигнализация высокой температуры в подполе +35
327
else
if
(digitalRead(37)==HIGH && SMSVoltOFF==
false
) { startOneSMS(); Serial2.println(
"Propalo pitanie 220V"
); EndSMS(); SMSVoltOFF=
true
; SMSVoltON=
false
; homeOFF();}
// Отключение питания 220В (выключаются реле)
328
else
if
(digitalRead(37)==LOW && SMSVoltON==
false
) { startOneSMS(); Serial2.println(
"Pitanie 220V vosstanovleno!"
); EndSMS(); SMSVoltON=
true
; SMSVoltOFF=
false
;}
// Восстановление питания 220В
329
else
{statusAlarm=0; AlarmTemp=0;}
330
}
331
332
void
alarmsSMS()
//______Цикл отправки алармов по СМС__________________________________________________
333
{
334
if
(digitalRead(30)==HIGH && SMSPodpol==
false
)
335
{ startOneSMS(); Serial2.println(
"Alarm!Voda v podpole!"
); EndSMS();
336
startTwoSMS(); Serial2.println(
"Alarm!Voda v podpole!"
); EndSMS(); SMSPodpol=
true
;}
337
if
(AlarmTemp==1 && SMSAlarmTemp==
false
)
338
{ startOneSMS(); Serial2.println(
"Alarm!Kriticheskaya temperatura!"
); EndSMS();
339
startTwoSMS(); Serial2.println(
"Alarm!Kriticheskaya temperatura!"
); EndSMS(); SMSAlarmTemp=
true
;}
340
if
(digitalRead(31)==HIGH && SMSBanyaTemp==
false
)
341
{startOneSMS(); Serial2.println(
"Alarm!Predelnaya temperatura v bane!"
); EndSMS(); SMSBanyaTemp=
true
;}
342
}
343
344
void
Kvitirovanie()
// Цикл квитирование (выкл.звука при активной тревоге) до восстановления параметра в норму
345
{
346
if
(digitalRead(30)==HIGH && KvitDI30==
false
) { KvitDI30=
true
;}
//Квитирование сигнала с датчика затопления подпола
347
if
(digitalRead(29)==HIGH && KvitDI29==
false
) { KvitDI29=
true
;}
//Квитирование сигнала с датчика готовности бани
348
if
(digitalRead(31)==HIGH && KvitDI31==
false
) { KvitDI31=
true
;}
//Квитирование сигнала с датчика предельной температуры в бане
349
if
( TempZalC != -127 && TempZalC < 10 && KvitZalC==
false
) {KvitZalC=
true
;}
//Квитирование сигнала низкой температуры в зале +10
350
if
( TempZalC != -127 && TempZalC > 35 && KvitZalC==
false
) {KvitZalC=
true
;}
//Квитирование сигнала высокой температуры в зале +35
351
if
( TempUlicaC != -127 && TempUlicaC > 50 && KvitUlicaC==
false
) {KvitUlicaC=
true
;}
//Квитирование сигнала высокой температуры на улице +50
352
if
( TempKuhnyaC != -127 && TempKuhnyaC < 10 && KvitKuhnyaC==
false
) {KvitKuhnyaC=
true
;}
//Квитирование сигнала низкой температуры в кухне +10
353
if
( TempKuhnyaC != -127 && TempKuhnyaC > 35 && KvitKuhnyaC==
false
) {KvitKuhnyaC=
true
;}
//Квитирование сигнала высокой температуры в кухне +35
354
if
( TempPodpol < 3 && KvitPodpolC==
false
) {KvitPodpolC=
true
;}
//Квитирование сигнала низкой температуры в подполе +3
355
if
( TempPodpol > 35 && KvitPodpolC==
false
) {KvitPodpolC=
true
;}
//Квитирование сигнала высокой температуры в подполе +35
356
//if (analogRead(14)<100 && KvitAI14==false) { KvitAI14=true;} //Квитирование сигнала с датчика уровня дренажной емкости
357
}
358
359
void
bluetooth()
//_________ Контроль и управление умным домом по терминалу НС-05_<a href="http://rezoh.ru/?p=1754" rel="nofollow">http://rezoh.ru/?p=1754</a> взято тут
360
{
361
inSize=0;
// Сбрасываем переменную
362
memset(str,
'\0'
, 128);
// Очищаем массив
363
if
(Serial1.available() > 0)
364
{
365
delay(200);
// Ждем, для того, чтобы пришли все данные
366
inSize = Serial1.available();
// Получаем длину строки и записываем ее в переменую
367
for
(
int
i = 0; i < inSize; i++)
368
{
369
str[i] = Serial1.read();
// Читаем каждый символ, и пишем его в массив
370
}
371
// Сравнять массив с строкой будем используя функцию strcmp
372
373
if
(strcmp(str,
"OTOPLENIE-ON"
) == 0) { statusotp=1; Serial1.println(
"KLIMAT CONTROL - ON"
); tone(5, 2500, 100);}
// Включение климат-контроля дома
374
else
if
(strcmp(str,
"OTOPLENIE-OFF"
) == 0) { statusotp=0; Serial1.println(
"KLIMAT CONTROL - OFF"
); tone(5, 1500, 100);}
// Выключение климат-контроля дома
375
else
if
(strcmp(str,
"OTOPLENIE-ECO"
) == 0) { statusotp=2; Serial1.println(
"KLIMAT CONTROL - ECO"
); tone(5, 2500, 100);}
// Включение климат-контроля в режим экономии
376
377
else
if
(strcmp(str,
"FIREALARM-ON"
) == 0)
// Включение пожарной сигнализации
378
{ statusFireAlarm=1; SMSFireSensor=
false
; SMSFireAlarm=
false
; Serial1.println(
"Pozharnaya signalizaciya - ON"
); statusPIK=0; intervalPIK=1000; tone(5, 2500, 100);}
379
else
if
(strcmp(str,
"FIREALARM-OFF"
) == 0)
// Выключение пожарной сигнализации
380
{ statusFireAlarm=0; SMSFireSensor=
false
; SMSFireAlarm=
false
; Serial1.println(
"Pozharnaya signalizaciya - OFF"
); statusPIK=0; intervalPIK=1000; tone(5, 1500, 100);}
381
else
if
(strcmp(str,
"FIREALARM-TEST"
) == 0)
// Тестирование пожарной сигнализации
382
{ statusFireAlarm=2; SMSFireSensor=
false
; SMSFireAlarm=
false
; Serial1.println(
"Pozharnaya signalizaciya - PROVERKA"
); tone(5, 2500, 100);}
383
384
else
if
(strcmp(str,
"HOME-ON"
) == 0) { homeON(); Serial1.println(
"SISTEMA UMNIY DOM VKLUCHENA"
); tone(5, 2500, 100);}
// Включение системы умный дом
385
else
if
(strcmp(str,
"HOME-OFF"
) == 0) { homeOFF(); Serial1.println(
"SISTEMA UMNIY DOM OTKLUCHENA"
); tone(5, 1500, 100);}
// Выключение системы умный дом
386
387
else
if
(strcmp(str,
"ZAPROS"
) == 0) { zapros(); tone(5, 2500, 100); delay(100);}
// Передача параметров в терминал
388
389
else
if
(strcmp(str,
"KORRECT"
) == 0) { KorrectTime(); tone(5, 2500, 100); delay(100);}
// Корректировка времени часов... вводит 30минут. 0 секунд
390
391
else
if
(strcmp(str,
"STANCIYA-ON"
) == 0) { statusPump=1; Serial1.println(
"Stanciya vkluchena"
); tone(5, 2500, 100); delay(100);}
// Включение станции водоснабжения
392
else
if
(strcmp(str,
"STANCIYA-OFF"
) == 0) { statusPump=0; Serial1.println(
"Stanciya otkluchena"
); tone(5, 1500, 100); delay(100);}
// Выключение станции водоснабжения
393
394
else
if
(strcmp(str,
"BLOCK-ON"
) == 0) { statusBlock=
true
; digitalWrite(42, HIGH); Serial1.println(
"Blokirovka sveta vkluchena"
); tone(5, 2500, 100); delay(100);}
// Включение блокировки света в зале
395
else
if
(strcmp(str,
"BLOCK-OFF"
) == 0) { statusBlock=
false
; digitalWrite(42, LOW); Serial1.println(
"Blokirovka sveta otkluchena"
); tone(5, 1500, 100); delay(100);}
// Выключение блокировки света в зале
396
397
else
if
(strcmp(str,
"MUTE"
) == 0) { Kvitirovanie(); tone(5, 2500, 100); statusPIK=0; intervalPIK=1000; delay(100); }
// Квитирование (сброс тревоги)аварийных параметров
398
399
else
if
(strcmp(str,
"OHRANA-ON"
) == 0) { Serial1.println(
"Signalizaciya vkluchena,u vas 5 minut dlya vihoda"
); tone(5, 2500, 100); Timer2On=
true
; signaliz=2;}
// Включение охранной сигнализации
400
else
if
(strcmp(str,
"OHRANA-OFF"
) == 0) { Serial1.println(
"Signalizaciya otkluchena"
); tone(5, 1500, 100); delay(100); statusPIK=0; intervalPIK=1000; signaliz=0;}
// Выключение охранной сигнализации
401
402
else
if
(strcmp(str,
"PERIMETR-ON"
) == 0) { perimetr=1; delay(100); tone(5, 2500, 100); Serial1.println(
"Ohrana perimetra vkluchena"
);}
// Включение охраны периметра
403
else
if
(strcmp(str,
"PERIMETR-OFF"
) == 0) { perimetr=0; delay(100); tone(5, 1500, 100); Serial1.println(
"Ohrana perimetra otkluchena"
);}
// Выключение охраны периметра
404
405
else
if
(strcmp(str,
"POLIV-ON"
) == 0) { statuspoliv=2; Timer1On =
true
; tone(5, 2500, 100); Serial1.println(
"Poliv vkluchen"
);}
// Включение клапана полива растений
406
else
if
(strcmp(str,
"POLIV-OFF"
) == 0) { statuspoliv=0; delay(100); tone(5, 1500, 100); Serial1.println(
"Poliv otkluchen"
);}
// Выключение клапана полива растений
407
408
else
if
(strcmp(str,
"TEMP+"
) == 0)
// Прибавление желаемой температуры в доме на 1гр.С
409
{ tempDust = (tempDust+1); delay(1000); tone(5, 1500, 100);
410
Serial1.print(
"KLIMAT KONTROL = "
); Serial1.print(tempDust); Serial1.println(
"*C"
);}
411
else
if
(strcmp(str,
"TEMP-"
) == 0)
// Уменьшение желаемой температуры в доме на 1гр.С
412
{ tempDust = (tempDust-1); delay(1000); tone(5, 1500, 100);
413
Serial1.print(
"KLIMAT KONTROL = "
); Serial1.print(tempDust); Serial1.println(
"*C"
);}
414
415
else
if
(strcmp(str,
"START-GSM"
) == 0) { NastroykaGSM(); tone(5, 2500, 100); delay(100); Serial1.println(
"GSM NASTROEN"
);}
// Настройка модуля SIM900
416
417
else
{ Serial1.println(
"Nevernaya comanda!"
);}
418
}
419
}
420
421
void
sms_read()
//_____Цикл чтения входящих СМС-сообщений______________
422
{
423
if
(!Serial2.available())
return
;
424
425
char
currSymb = Serial2.read();
426
if
(
'\r'
== currSymb)
427
{
428
if
(isStringMessage)
429
{
430
//если текущая строка - SMS-сообщение,
431
//отреагируем на него соответствующим образом
432
if
(!currStr.compareTo(
"OTOPLENIE-ON"
)) { statusotp=1; startOneSMS(); Serial2.println(
"KLIMAT CONTROL - ON"
); EndSMS(); }
// Включение климат-контроля дома
433
else
if
(!currStr.compareTo(
"OTOPLENIE-OFF"
)) { statusotp=0; startOneSMS(); Serial2.println(
"KLIMAT CONTROL - OFF"
); EndSMS(); }
// Выключение климат-контроля дома
434
else
if
(!currStr.compareTo(
"OTOPLENIE-ECO"
)) { statusotp=2; startOneSMS(); Serial2.println(
"KLIMAT CONTROL - ECO"
); EndSMS(); }
// Включение климат-контроля в режим экономии
435
436
else
if
(!currStr.compareTo(
"FIREALARM-ON"
)) { statusFireAlarm=1; SMSFireSensor=
false
; statusPIK=0; intervalPIK=1000; SMSFireAlarm=
false
; startOneSMS(); Serial2.println(
"Pozharnaya signalizaciya - ON"
); EndSMS(); }
// Включение пожарной сигнализации
437
else
if
(!currStr.compareTo(
"FIREALARM-OFF"
)) { statusFireAlarm=0; SMSFireSensor=
false
; statusPIK=0; intervalPIK=1000; SMSFireAlarm=
false
; startOneSMS(); Serial2.println(
"Pozharnaya signalizaciya - OFF"
); EndSMS(); }
// Выключение пожарной сигнализации
438
else
if
(!currStr.compareTo(
"FIREALARM-TEST"
)) { statusFireAlarm=2; SMSFireSensor=
false
; SMSFireAlarm=
false
; startOneSMS(); Serial2.println(
"Pozharnaya signalizaciya - PROVERKA"
); EndSMS(); }
// Тестирование пожарной сигнализации
439
440
else
if
(!currStr.compareTo(
"HOME-ON"
)) { homeON(); startOneSMS(); Serial2.println(
"SISTEMA UMNIY DOM VKLUCHENA"
); EndSMS();}
// Включение системы умный дом
441
else
if
(!currStr.compareTo(
"HOME-OFF"
)) { homeOFF(); startOneSMS(); Serial2.println(
"SISTEMA UMNIY DOM OTKLUCHENA"
); EndSMS();}
// Выключение системы умный дом
442
443
else
if
(!currStr.compareTo(
"ZAPROS"
)) { SMSzapros();}
// Передача параметров по СМС
444
445
else
if
(!currStr.compareTo(
"STANCIYA-ON"
)) { statusPump=1; startOneSMS(); Serial2.println(
"Nasosnaya stanciya vkluchena"
); EndSMS();}
// Включение станции водоснабжения
446
else
if
(!currStr.compareTo(
"STANCIYA-OFF"
)) { statusPump=0; startOneSMS(); Serial2.println(
"Nasosnaya stanciya otkluchena"
); EndSMS();}
// Выключение станции водоснабжения
447
448
else
if
(!currStr.compareTo(
"MUTE"
)) { Kvitirovanie(); statusPIK=0; intervalPIK=1000; }
// Квитирование (сброс тревоги)аварийных параметров
449
450
else
if
(!currStr.compareTo(
"ZVONOKS"
)) { ZvonokS(); }
// Включение голосовой связи с хозяином #1
451
else
if
(!currStr.compareTo(
"ZVONOKT"
)) { ZvonokT(); }
// Включение голосовой связи с хозяином #2
452
453
else
if
(!currStr.compareTo(
"OHRANA-ON"
)) { statusPIK=0; intervalPIK=1000; signalizON();}
// Включение охранной сигнализации
454
else
if
(!currStr.compareTo(
"OHRANA-OFF"
)) { statusPIK=0; intervalPIK=1000; signalizOFF();}
// Выключение охранной сигнализации
455
456
else
if
(!currStr.compareTo(
"PERIMETR-ON"
)) { perimetr=1; startOneSMS(); Serial2.println(
"Ohrana perimetra vkluchena"
); EndSMS();}
// Включение охраны периметра
457
else
if
(!currStr.compareTo(
"PERIMETR-OFF"
)) { perimetr=0; startOneSMS(); Serial2.println(
"Ohrana perimetra otkluchena"
); EndSMS();}
// Выключение охраны периметра
458
459
else
if
(!currStr.compareTo(
"POLIV-ON"
)) { statuspoliv=2; Timer1On =
true
; startOneSMS(); Serial2.println(
"Poliv vkluchen"
); EndSMS();}
// Включение клапана полива растений
460
else
if
(!currStr.compareTo(
"POLIV-OFF"
)) { statuspoliv=0; startOneSMS(); Serial2.println(
"Poliv otkluchen"
); EndSMS();}
// Выключение клапана полива растений
461
462
isStringMessage =
false
;
463
}
464
else
{
if
(currStr.startsWith(
"+CMT"
)) { isStringMessage =
true
;}}
//если текущая строка начинается с "+CMT",то следующая строка является сообщением
465
currStr =
""
;
466
}
467
else
if
(
'\n'
!= currSymb) { currStr += String(currSymb);}
468
}
469
void
osvechenie()
470
{
471
//______Ниже для зала______________________________________
472
if
(digitalRead(pirPin_Z) == HIGH && statusBlock==
false
&& statusZ==
false
)
//Если обнаружено движение, нет блокировки, и время суток с 16 до 10 утра
473
{
474
if
(lockLow_Z)
//Если до этого момента еще не включили реле
475
{ lockLow_Z =
false
; digitalWrite(42, LOW); delay(50);}
//Включаем свет.
476
takeLowTime_Z =
true
;
477
}
478
if
(digitalRead(pirPin_Z) == LOW)
//Ели движения нет
479
{
//Если время окончания движения еще не записано
480
if
(takeLowTime_Z){lowIn_Z = millis();takeLowTime_Z =
false
;}
//Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
481
if
(!lockLow_Z && millis() - lowIn_Z > pause_Z)
//Если время без движение превышает паузу => движение окончено
482
{ lockLow_Z =
true
; digitalWrite(42, HIGH); delay(50);}
//Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
483
}
484
}
485
486
void
avtosvet()
//______Цикл управления автоматическим освещением____________________________________
487
{
488
//______Ниже для кухни______________________________________
489
if
(digitalRead(pirPin_K) == HIGH && statusDay==
false
)
//Если обнаружено движение с 23 до 8 включаем подсветку
490
{
491
if
(lockLow_K)
//Если до этого момента еще не включили реле
492
{ lockLow_K =
false
; digitalWrite(38, LOW); delay(50);}
//Включаем свет.
493
takeLowTime_K =
true
;}
494
if
(digitalRead(pirPin_K) == LOW)
//Ели движения нет
495
{
//Если время окончания движения еще не записано
496
if
(takeLowTime_K){lowIn_K = millis();takeLowTime_K =
false
;}
//Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
497
if
(!lockLow_K && millis() - lowIn_K > pause_K)
//Если время без движение превышает паузу => движение окончено
498
{ lockLow_K =
true
; digitalWrite(38, HIGH); delay(50);}
//Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
499
}
500
//______Ниже для ванной комнаты_____________________________
501
if
(digitalRead(pirPin_V) == HIGH)
//Если обнаружено движение
502
{
503
if
(lockLow_V)
//Если до этого момента еще не включили реле
504
{ lockLow_V =
false
; digitalWrite(40, LOW); delay(50);}
//Включаем свет.
505
takeLowTime_V =
true
;}
506
if
(digitalRead(pirPin_V) == LOW)
//Ели движения нет
507
{
//Если время окончания движения еще не записано
508
if
(takeLowTime_V){lowIn_V = millis();takeLowTime_V =
false
;}
//Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
509
if
(!lockLow_V && millis() - lowIn_V > pause_V)
//Если время без движение превышает паузу => движение окончено
510
{ lockLow_V =
true
; digitalWrite(40, HIGH); delay(50);}
//Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
511
}
512
//______Ниже для сеней______________________________________
513
if
(digitalRead(pirPin_S) == HIGH)
//Если обнаружено движение
514
{
515
if
(lockLow_S)
//Если до этого момента еще не включили реле
516
{ lockLow_S =
false
; digitalWrite(44, LOW); delay(50);}
//Включаем свет.
517
takeLowTime_S =
true
;}
518
if
(digitalRead(pirPin_S) == LOW)
//Ели движения нет
519
{
//Если время окончания движения еще не записано
520
if
(takeLowTime_S){lowIn_S = millis();takeLowTime_S =
false
;}
//Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
521
if
(!lockLow_S && millis() - lowIn_S > pause_S)
//Если время без движение превышает паузу => движение окончено
522
{ lockLow_S =
true
; digitalWrite(44, HIGH); delay(50);}
//Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
523
}
524
}
525
526
// void ventilciya()
527
// {
528
// if (vlaga > 60) {digitalWrite(45, HIGH);} // Включение вентилятора при влажности более 60%
529
// if (vlaga < 40) {digitalWrite(45, LOW);} // Выключение вентилятора при влажности менее 40%
530
// }
531
532
void
FireAlarm()
//______Цикл пожарной сигнализации__________________________________________________
533
534
// Переменная statusFireAlarm=0 "Режим работы пож.сигнализации" - 0 - откл , 1- вкл , 2- проверка, 3- тревога
535
{
536
if
(statusFireAlarm==1)
537
{
538
if
(digitalRead(33)==LOW || digitalRead(35)==LOW) { intervalPIK=2000; Pik();}
// 1 шлейф в сработке - режим "пищалка"
539
if
(digitalRead(33)==LOW || digitalRead(35)==LOW && SMSFireSensor==
false
)
540
{ startOneSMS(); Serial2.println(
"Srabotal dimovoy datchik!"
); EndSMS();
541
startTwoSMS(); Serial2.println(
"Srabotal dimovoy datchik!"
); EndSMS(); SMSFireSensor=
true
;}
542
543
if
(digitalRead(33)==LOW && digitalRead(35)==LOW && SMSFireAlarm==
false
)
544
{ startOneSMS(); Serial2.println(
"Srabotala pozharnaya signalizaciya!"
); EndSMS();
545
startTwoSMS(); Serial2.println(
"Srabotala pozharnaya signalizaciya!"
); EndSMS(); SMSFireAlarm=
true
; statusFireAlarm=3;
546
homeOFF();
// выключили автоматику и обесточили электроприборы.
547
}
548
}
549
if
(statusFireAlarm==3)
550
{
551
if
(digitalRead(33)==LOW && digitalRead(35)==LOW) { sirena();}
// Пока есть сработавшие датчики - режим "тревога"
552
if
(digitalRead(33)==HIGH && digitalRead(35)==HIGH) { statusFireAlarm=1;}
// Если нет сработавших датчиков - ставим под охрану
553
}
554
if
(statusFireAlarm==2)
// Режим проверка пож. извещателей
555
{
556
Pik();
557
if
(digitalRead(33)==LOW || digitalRead(35)==LOW) { intervalPIK=600;}
// При сработке 1-го дым шлейфа период 600мс
558
else
if
(digitalRead(33)==LOW && digitalRead(35)==LOW) { intervalPIK=300;}
// При сработке 2-го дым шлейфа период 300мс
559
else
{ intervalPIK=3000;}
// Шлейфы в норме период 3 секунды
560
}
561
}
562
563
void
homeON()
//____________Цикл включения умного дома____________________________________________________
564
{
565
statushome=1;
// статус умного дома 0 - откл , 1- вкл
566
statusotp=1;
// статус отопления дома 0 - откл , 1- вкл
567
statusrzd=1;
// статус питания розеток дома 0 - откл , 1- вкл
568
statusgaraj=1;
// статус питания гаража 0 - откл , 1- вкл
569
statusbania=1;
// статус питания бани 0 - откл , 1- вкл
570
}
571
572
void
homeOFF()
//____________Цикл выключения умного дома________________________
573
{
574
statushome=0;
// статус умного дома 0 - откл , 1- вкл
575
statusotp=2;
// статус отопления дома 0 - откл , 1- вкл , 2- экономия
576
statusrzd=0;
// статус питания розеток дома 0 - откл , 1- вкл
577
statusgaraj=0;
// статус питания гаража 0 - откл , 1- вкл
578
statusbania=0;
// статус питания бани 0 - откл , 1- вкл
579
statusPump=0;
// статус питания станции водоснабжения 0 - откл , 1- вкл
580
perimetr=0;
// статус охраны периметра дома 0 - откл , 1- вкл
581
digitalWrite(38,HIGH);
582
digitalWrite(40,HIGH);
583
digitalWrite(42,HIGH);
584
digitalWrite(44,HIGH);
585
digitalWrite(46,HIGH);
586
digitalWrite(48,HIGH);
587
digitalWrite(50,HIGH);
588
}
589
590
void
KorrectTime()
// Цикл корректировки времени RTC модуля. Корректирует только минуты на 30минут 00 секунд.
591
{
592
rtc.halt(
false
);
593
rtc.writeProtect(
false
);
594
rtc.setTime(RTCChas, 30, 00);
// Установка времени ЧАС(реальное время):30:00
595
delay (2000);
// Задержка на перевод стрелок :-)
596
t = rtc.getTime();
597
Serial1.println(
"Vremya otcorrectirovano-"
);
598
Serial1.print (t.hour, DEC); Serial1.print(
" : "
); Serial1.print (t.min, DEC); Serial1.print(
" : "
); Serial1.println(t.sec, DEC);
599
}
600
601
void
Operimetr()
//______________Цикл "охрана периметра" (только двери и ворота)_________________
602
{
603
if
(digitalRead(25)==HIGH){statusperimetr=0;}
// Сработка концевика входной двери
604
//else if(digitalRead(23)==HIGH){statusperimetr=0;} // Сработка концевика ворот
605
//else if(digitalRead(27)==HIGH){statusperimetr=0;} // Сработка концевика двери бани
606
else
{statusperimetr=1;}
607
}
608
609
void
otoplenie()
// Цикл управления газовым котлом (Сигнал инвертированный!(Особенность подключения к котлу))
610
{
611
if
( statusotp==0)
// Отключено
612
{ digitalWrite(53,HIGH);}
// Отключить отопление
613
614
if
( statusotp==1)
// Климат-контроль
615
{
if
( TempZalC > (tempDust+1)){digitalWrite(53,HIGH);}
// Отключить отопление если температура больше желаемой на 1грС
616
if
( !TempZalC== -127 && (TempZalC < tempDust) ) {digitalWrite(53,LOW);}
// Включить отопление если температура меньше желаемой
617
}
618
if
( statusotp==2)
// Экономия
619
{
if
( TempZalC > (tempDECOust+1)){digitalWrite(53,HIGH);}
// Отключить отопление если температура больше желаемой на 1грС
620
if
( !TempZalC== -127 && (TempZalC < tempDECOust) ) {digitalWrite(53,LOW);}
// Включить отопление если температура меньше желаемой
621
}
622
}
623
624
void
Pik()
// Периодический тон пищалки
625
{
626
unsigned
long
StartPikMillis = millis();
627
if
(StartPikMillis - EndPikMillis > intervalPIK)
// интервал тона
628
{ tone(5, TonPIK, 100); EndPikMillis = StartPikMillis; }
// Сброс таймера
629
}
630
631
void
signalizSMS()
//______________Цикл работы охранной сигнализации______________________
632
{
633
if
(signaliz==1)
// Режим "Под охраной"
634
{
635
if
(digitalRead(24)==HIGH && SMSDvigenieV==
false
)
636
{
637
startOneSMS(); Serial2.println(
"Dvizhenie v vannoy!"
); EndSMS();
638
startTwoSMS(); Serial2.println(
"Dvizhenie v vannoy!"
); EndSMS(); SMSDvigenieV=
true
;
639
}
640
if
(digitalRead(26)==HIGH && SMSDvigenieK==
false
)
641
{
642
startOneSMS(); Serial2.println(
"Dvizhenie na kuhne!"
); EndSMS();
643
startTwoSMS(); Serial2.println(
"Dvizhenie na kuhne!"
); EndSMS(); SMSDvigenieK=
true
;
644
}
645
if
(digitalRead(22)==HIGH && SMSDvigenieZ==
false
)
646
{
647
startOneSMS(); Serial2.println(
"Dvizhenie v zale!"
); EndSMS();
648
startTwoSMS(); Serial2.println(
"Dvizhenie v zale!"
); EndSMS(); SMSDvigenieZ=
true
;
649
}
650
if
(digitalRead(25)==HIGH && SMSDvigenieS==
false
)
651
{
652
startOneSMS(); Serial2.println(
"Otkrita vhodnaya dver!"
); EndSMS();
653
startTwoSMS(); Serial2.println(
"Otkrita vhodnaya dver!"
); EndSMS(); SMSDvigenieS=
true
;
654
}
655
}
656
if
(signaliz==2)
//__Режим постановки на охрану____(Пять минут на выход и закрытие дверей)
657
{
658
NowTime2 = millis();
659
if
(Timer2On ==
true
) { StartTime2 = NowTime2 ; Timer2On =
false
; statusPIK=1;}
660
if
( statusPIK==1 && NowTime2 - StartTime2 == 120000){ intervalPIK=600;}
// после 2 минуты период 600мс
661
if
( statusPIK==1 && NowTime2 - StartTime2 == 180000){ intervalPIK=400;}
// после 3 минуты период 400мс
662
if
( statusPIK==1 && NowTime2 - StartTime2 == 240000){ intervalPIK=200;}
// после 4 минуты период 200мс
663
if
( statusPIK==1 && NowTime2 - StartTime2 > 500000)
// после 5 минут постановка на охрану
664
{ statusPIK=0; intervalPIK=1000; signalizON();}
// Выключаем пикалку,возврашаем интерал,включаем охрану
665
}
666
}
667
668
void
signalizON()
//______________Цикл включения охранной сигнализации_________________
669
{
670
signaliz=1;
671
SMSDvigenieK=
false
;
// Флаг "Отправлена СМС о движении на кухне"
672
SMSDvigenieV=
false
;
// Флаг "Отправлена СМС о движении в ванной"
673
SMSDvigenieZ=
false
;
// Флаг "Отправлена СМС о движении в зале"
674
SMSDvigenieS=
false
;
// Флаг "Отправлена СМС о входе"
675
startOneSMS(); Serial2.println(
"Signalizaciya vkluchena!"
); EndSMS();
676
startTwoSMS(); Serial2.println(
"Signalizaciya vkluchena!"
); EndSMS();
677
}
678
679
void
signalizOFF()
//______________Цикл отключения охранной сигнализации_________________
680
{
681
signaliz=0;
682
SMSDvigenieK=
false
;
// Флаг "Отправлена СМС о движении на кухне"
683
SMSDvigenieV=
false
;
// Флаг "Отправлена СМС о движении в ванной"
684
SMSDvigenieZ=
false
;
// Флаг "Отправлена СМС о движении в зале"
685
SMSDvigenieS=
false
;
// Флаг "Отправлена СМС о входе"
686
startOneSMS(); Serial2.println(
"Signalizaciya otkluchena!"
); EndSMS();
687
startTwoSMS(); Serial2.println(
"Signalizaciya otkluchena!"
); EndSMS();
688
}
689
690
void
sirena()
//_______Сирена х.з. на каком языке
691
// <a href="http://www.element14.com/community/blogs/mirandasoft/2013/01/28/arduino-mini-a-very-annoying-siren-project" title="http://www.element14.com/community/blogs/mirandasoft/2013/01/28/arduino-mini-a-very-annoying-siren-project" rel="nofollow">http://www.element14.com/community/blogs/mirandasoft/2013/01/28/arduino-...</a>
692
{
693
pambilang++;
694
for
(
int
m = 1600; m<=2200; m++){tone (5, m, 75);}
// (пин пищалки,частота,длина тона)
695
for
(
int
m = 2200; m>=1600; m--){tone (5, m, 75);}
696
if
(pambilang==4){noTone(5); pambilang = 0;}
697
}
698
699
void
timerPoliv()
// Таймер клапана полива огорода 0 - откл , 1- вкл , 2- Таймер
700
{
701
702
NowTime1 = millis();
703
if
(Timer1On ==
true
) { StartTime1 = NowTime1 ; Timer1On =
false
; statuspoliv=2;}
704
if
( statuspoliv==2 && NowTime1 - StartTime1 > 900000)
// выдержка 15 минут
705
{ statuspoliv=0; }
// Сброс таймера
706
}
707
708
void
zapros()
//Передача всех параметров в терминал
709
{
710
t = rtc.getTime();
711
Serial1.print (t.date, DEC); Serial1.print(
" "
);
712
Serial1.print (rtc.getMonthStr()); Serial1.print(
" "
);
713
Serial1.print (t.year, DEC); Serial1.print(
" "
);
714
Serial1.print (rtc.getDOWStr()); Serial1.print(
" "
);
715
Serial1.print (t.hour, DEC); Serial1.print(
" : "
);
716
Serial1.print (t.min, DEC); Serial1.print(
" : "
);
717
Serial1.println(t.sec, DEC);
718
Serial1.print(
"SmartHOME = "
);
719
if
(statushome==1){Serial1.println(
"ON"
);}
720
if
(statushome==0){Serial1.println(
"OFF"
);}
721
Serial1.print(
"FireAlarm = "
);
722
if
(statusFireAlarm==1){Serial1.println(
"ON"
);}
723
if
(statusFireAlarm==0){Serial1.println(
"OFF"
);}
724
if
(statusFireAlarm==3){Serial1.println(
"TREVOGA"
);}
725
if
(statusFireAlarm==2){Serial1.println(
"PROVERKA"
);}
726
Serial1.print(
"Klimat kontrol= "
);
727
if
(statusotp==1){Serial1.print(
"ON: "
); Serial1.print(
"Ustavka: "
); Serial1.print(tempDust); Serial1.println(
"*C"
);}
728
if
(statusotp==0){Serial1.println(
"OFF"
);}
729
if
(statusotp==2){Serial1.println(
"ECONOMIA"
);}
730
if
(statusBlock==
true
){Serial1.println(
"Vkluchena blokirovka sveta v zale"
);}
731
732
Serial1.println(
"Parametry:"
);
733
734
int
chk = dht.read(DHT11PIN);
735
switch
(chk)
736
{
737
case
DHTLIB_OK:
break
;
// Serial1.println("DHT-OK");
738
case
DHTLIB_ERROR_CHECKSUM: Serial1.println(
"DHT Checksum error"
);
break
;
739
case
DHTLIB_ERROR_TIMEOUT: Serial1.println(
"DHT Time out error"
);
break
;
740
default
: Serial1.println(
"DHT Unknown error"
);
break
;
741
}
742
Serial1.print(
"Podpol: "
); Serial1.print(dht.humidity); Serial1.print(
" % ;"
); Serial1.print(dht.temperature); Serial1.println(
" *C"
);
743
Serial1.print(
"V zale:"
); Serial1.print(TempZalC); Serial1.println(
" *C"
);
744
Serial1.print(
"Ha ylice:"
); Serial1.print(TempUlicaC); Serial1.print(
" *C ;"
); Serial1.print(UlicaS); Serial1.println(
" %"
);
745
Serial1.print(
"Kuhnya:"
); Serial1.print(TempKuhnyaC); Serial1.println(
" *C"
);
746
//if(digitalRead(23)==HIGH) { Serial1.println("Otkrity vorota");}
747
if
(digitalRead(25)==HIGH) { Serial1.println(
"Otkrita vhodnaya dver'"
);}
748
//if(digitalRead(27)==HIGH) { Serial1.println("Otkrita dver'banya");}
749
if
(digitalRead(30)==HIGH) { Serial1.println(
"Trevoga! Voda v pogrebe!"
);}
750
//if (analogRead(14)<100) { Serial1.println("Vnimanie! Drenaghnaya emkost' perepolnena");}
751
if
(digitalRead(31)==HIGH) { Serial1.println(
"Ochen' visokaya temperatura v bane! Pozhar???"
); }
752
if
(digitalRead(33)==LOW || digitalRead(35)==LOW) { Serial1.println(
"Srabotal dimovoy datchik"
); }
753
if
(digitalRead(29)==HIGH) { Serial1.println(
"Banya gotova"
); }
754
if
(digitalRead(24)==HIGH) { Serial1.println(
"Dvizhenie v vannoy"
); }
755
if
(digitalRead(26)==HIGH) { Serial1.println(
"Dvizhenie na kuhne"
); }
756
if
(digitalRead(22)==HIGH) { Serial1.println(
"Dvizhenie v zale"
); }
757
if
(digitalRead(37)==HIGH) { Serial1.println(
"Net pitaniya 220V"
); }
758
if
(AlarmTemp==1) { Serial1.println(
"Alarm! Kriticheskaya temperatura!"
); }
759
}
760
761
void
SMSzapros()
762
{
763
startOneSMS();
764
Serial2.print(
"SmartHOME = "
);
765
if
(statushome==1){Serial2.println(
"ON"
);}
766
if
(statushome==0){Serial2.println(
"OFF"
);}
767
Serial2.print(
"Ohrana:"
);
768
if
(signaliz==2){Serial2.println(
"START"
);}
769
if
(signaliz==1){Serial2.println(
"ON"
);}
770
if
(signaliz==0){Serial2.println(
"OFF"
);}
771
772
//if(digitalRead(23)==HIGH) { Serial2.println("Otkrity vorota");}
773
if
(digitalRead(25)==HIGH) { Serial2.println(
"Otkrita vhodnaya dver'"
);}
774
//if(digitalRead(27)==HIGH) { Serial2.println("Otkrita dver'banya");}
775
776
Serial2.print(
"Alarm:"
); Serial2.println(statusAlarm);
777
if
(digitalRead(37)==HIGH){Serial2.println(
"no 220V"
);}
778
if
(AlarmTemp==1) { Serial2.println(
"Temperatura!"
); }
779
if
(digitalRead(30)==HIGH){Serial2.println(
"Voda v podpole!"
);}
780
Serial2.print(
"FireAlarm:"
);
781
if
(statusFireAlarm==1){Serial2.println(
"ON"
);}
782
if
(statusFireAlarm==0){Serial2.println(
"OFF"
);}
783
if
(statusFireAlarm==3){Serial2.println(
"TREVOGA"
);}
784
if
(statusFireAlarm==2){Serial2.println(
"PROVERKA"
);}
785
if
(digitalRead(33)==LOW || digitalRead(35)==LOW) { Serial2.println(
"Srabotal shleyf!"
); }
786
Serial2.print(
"K-kontrol="
);
787
if
(statusotp==1){Serial2.print(
"ON-"
); Serial2.print(
"Ustavka:"
); Serial2.print(tempDust); Serial2.println(
"*C"
);}
788
if
(statusotp==0){Serial2.println(
"OFF"
);}
789
if
(statusotp==2){Serial2.println(
"ECO"
);}
790
Serial2.print(
"Podpol:"
); Serial2.print(dht.temperature); Serial2.print(
"*C,"
); Serial2.print(dht.humidity); Serial2.println(
"%"
);
791
Serial2.print(
"Zal:"
); Serial2.print(TempZalC); Serial2.println(
"*C"
);
792
Serial2.print(
"Ylica:"
); Serial2.print(TempUlicaC); Serial2.println(
"*C"
);
793
Serial2.print(
"Kuhnya:"
); Serial2.print(TempKuhnyaC); Serial2.println(
"*C"
);
794
EndSMS();
795
}
796
797
void
NastroykaGSM()
798
{
799
Serial2.print(
"AT+CMGF=1\r"
);
//устанавливает текстовый режим смс-сообщения
800
delay(100);
801
Serial2.print(
"AT+IFC=1, 1\r"
);
//устанавливает программный контроль потоком передачи данных
802
delay(100);
803
Serial2.print(
"AT+CPBS=\"SM\"\r"
);
//открывает доступ к данным телефонной книги SIM-карты
804
delay(100);
805
Serial2.print(
"AT+GSMBUSY=1, 1\r"
);
//запрет всех входящих звонков
806
delay(100);
807
Serial2.print(
"AT+CNMI=1,2,2,1,0\r"
);
//включает оповещение о новых сообщениях
808
delay(300);
809
}
810
811
void
startOneSMS()
//__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
812
{
813
Serial2.print(
"AT+CMGF=1\r"
);
814
delay(100);
815
Serial2.println(
"AT + CMGS = \"+79000000000\""
);
// (+79000000000 сдесь должен быть ваш номер №1)
816
delay(100);
817
}
818
void
startTwoSMS()
//__________________Цикл подготовки модуля к отправке СМС-сообщений по второму номеру
819
{
820
Serial2.print(
"AT+CMGF=1\r"
);
821
delay(100);
822
Serial2.println(
"AT + CMGS = \"+79000000000\""
);
// (+79000000000 сдесь должен быть ваш номер №2)
823
delay(100);
824
}
825
void
EndSMS()
//__________________Цикл окончания и отправки СМС-сообщения_______________________
826
{
827
delay(100);
828
Serial2.println((
char
)26);
// Команда отправки СМС
829
delay(5000);
830
}
831
void
ZvonokS()
//__________________Цикл дозвона абоненту (для аудиоконтроля)___________________
832
{
833
Serial2.println(
"AT+CMIC=0,15"
);
// Команда для установки чувствительности микрофона Поэкспериментировать с цифрой.
834
// 0,- это канал микрофона (1,2,3),15 это уровень см.инструкцию к СИМ900
835
delay(2000);
836
837
Serial2.println(
"ATD+79000000000;"
);
// Набираем номер(+79000000000 сдесь должен быть ваш номер №1)
838
}
839
//Serial2.println("ATH"); // Вешаем трубку
840
841
void
ZvonokT()
//__________________Цикл дозвона абоненту (для аудиоконтроля)___________________
842
{
843
Serial2.println(
"AT+CMIC=0,15"
);
// Команда для установки чувствительности микрофона Поэкспериментировать с цифрой.
844
// 0,- это канал микрофона (1,2,3),15 это уровень см.инструкцию к СИМ900
845
delay(2000);
846
Serial2.println(
"ATD+79000000000;"
);
// Набираем номер (+79000000000 сдесь должен быть ваш номер №2)
847
//Serial2.println("ATH"); // Вешаем трубку
848
}
849
850
851
852
Объем работ, проделанный автором, вызывает искреннее уважение, респект Вам.
Да согласен объем работ вызывает уважение.
Так как я сам КИПовец - то посоветовал бы все платы - преввратить в модули на разъемах. В дальнейшем эксплуатировать и менять в случае неисправности такого модуля - будет намного проще. А вот отпаивать, если возникнет необходимость наладки и замены плат очень и очень "геморно". Наверно ты меня поймешь как КИПовец.
ATkRnr, полностью согласен, коллега! Прошел я уже это, затарился вот такими разъемами с шагом 2,54мм, и все сделал на них, и буду все делать на них. Очень удобно.
Плохо что, плата GSM заточена для arduino UNO. На МЕГу тоже ставится, но делает не доступными пины меги. А так много места в шкафу было бы сэкономлено. Хотя шкафы ЩМП взял на вырост. На avito.ru человек продавал по 1200р за штуку. Взял два, думал в один запихну, но потом понял: гулять, так гулять.
Скоро выложу фото контроллерного шкафа, сейчас там наведен порядок.
Вот это да...
Какая красота в шкафу!
Новый прикол.
01
#include <OneWire.h>
02
03
OneWire ds (4);
04
05
byte
DSaddresses[5][8];
// массив адресов датчиков DS18B20
06
07
void
setup
()
08
{
09
Serial
.begin(19200);
10
Serial
.println(
"Start"
);
11
search_for_dses ();
12
Serial
.println(
"Setup complete"
);
13
}
14
15
void
loop
()
16
{
17
int
a,i;
18
19
for
( a=0; a < 5; a++)
20
{
21
Serial
.print (
"Addr = "
);
22
for
( i = 0; i < 8; i++)
23
{
24
Serial
.print(DSaddresses[a][i], HEX);
25
Serial
.print(
" "
);
26
}
27
Serial
.println (
" "
);
28
}
29
delay (1000);
30
}
31
32
33
void
search_for_dses ()
34
{
35
int
a,b,i;
36
byte
addr[8];
37
Serial
.println (
"Serching for DS"
);
38
while
(ds.search (addr)==1)
39
{
40
for
(b=0; b<8; b++)
41
{
42
DSaddresses[a][b]=addr[b];
43
}
44
//======================================
45
Serial
.print (
"Addr = "
);
46
for
( i = 0; i < 8; i++) {
47
Serial
.print(DSaddresses[a][i], HEX);
48
Serial
.print(
" "
);
49
}
50
Serial
.println (
" "
);
51
//======================================
52
delay (250);
53
a++;
54
}
55
}
Вывод в серийный порт:
01
#include <OneWire.h>
02
03
OneWire ds (4);
04
05
byte
DSaddresses[5][8];
// массив адресов датчиков DS18B20
06
07
void
setup
()
08
{
09
Serial
.begin(19200);
10
Serial
.println(
"Start"
);
11
search_for_dses ();
12
Serial
.println(
"Setup complete"
);
13
}
14
15
void
loop
()
16
{
17
int
a,i;
18
19
for
( a=0; a < 5; a++)
20
{
21
Serial
.print (
"Addr = "
);
22
for
( i = 0; i < 8; i++)
23
{
24
Serial
.print(DSaddresses[a][i], HEX);
25
Serial
.print(
" "
);
26
}
27
Serial
.println (
" "
);
28
}
29
delay (1000);
30
}
31
32
33
void
search_for_dses ()
34
{
35
int
a,b,i;
36
byte
addr[8];
37
Serial
.println (
"Serching for DS"
);
38
while
(ds.search (addr)==1)
39
{
40
for
(b=0; b<8; b++)
41
{
42
DSaddresses[a][b]=addr[b];
43
}
44
//======================================
45
// Serial.print ("Addr = ");
46
// for( i = 0; i < 8; i++) {
47
// Serial.print(DSaddresses[a][i], HEX);
48
// Serial.print(" ");
49
// }
50
// Serial.println (" ");
51
//======================================
52
delay (250);
53
a++;
54
}
55
}
Выводит вот это:
Просто как то это пугает...
Я боюсь, что умный дом будет умнее своего создателя))
Похоже на глюк компилятора. У меня кстановлено: ARDUINO 1.0.6
"Похоже на глюк компилятора. У меня кстановлено: ARDUINO 1.0.6"
А почему ты не хочешь отказаться от сканирование датчиков, и работать с фиксированными адресами?
Насколько я знаю, если датчик пропадает из сети то меняет их порядок очереди, и становится уже непонять кто где. Или тебе география не важна, и все датчики установлены в одном месте?
У меня иногда случается, что дачтик температуры на улице кратковременно пропадает, и и УД выдает температуру на улице -127. Хоть и в Сибири живем, но такого не видали. Так вот кабель до датчика идет 17 метров КСПВ 4х0,5. Не экранированный, и даже не витой. Более того на плюсовой жиле сидит датчик освещенности улицы (делитель из резистора и фотоорезистора) и плюс мигающий светодиод из муляжа купольной камеры, в которой все это установлено. Надеюсь кто нибудь что нибудь понял :) Потом пришлю фото.
Так вот когда приеду с вахты, заменю кабель на экранированную витую пару UTP. Питание "потребителей" сделаю по отдельным жилам. И самое главное я уменьшу номинал резистора 4,7к, который на шину данных идет, на меньший 2,7к хотя бы. А вообще поэкспериментирую.
По РЕН-ТВ показывали с месяц назад как скоро роботы убьют человечество и роботизированные чайники зальют людей кипятком :) может кто видел? Чисто поржать можно.
Так вот вывод! Спали умный дом - спаси человечество :)))
Новый прикол.
01
#include <OneWire.h>
02
03
OneWire ds (4);
04
05
byte
DSaddresses[5][8];
// массив адресов датчиков DS18B20
06
07
void
setup
()
08
{
09
Serial
.begin(19200);
10
Serial
.println(
"Start"
);
11
search_for_dses ();
12
Serial
.println(
"Setup complete"
);
13
}
14
15
void
loop
()
16
{
17
int
a,i;
18
19
for
( a=0; a < 5; a++)
20
{
21
Serial
.print (
"Addr = "
);
22
for
( i = 0; i < 8; i++)
23
{
24
Serial
.print(DSaddresses[a][i], HEX);
25
Serial
.print(
" "
);
26
}
27
Serial
.println (
" "
);
28
}
29
delay (1000);
30
}
31
32
33
void
search_for_dses ()
34
{
35
int
a,b,i;
36
byte
addr[8];
37
Serial
.println (
"Serching for DS"
);
38
while
(ds.search (addr)==1)
39
{
40
for
(b=0; b<8; b++)
41
{
42
DSaddresses[a][b]=addr[b];
43
}
44
//======================================
45
Serial
.print (
"Addr = "
);
46
for
( i = 0; i < 8; i++) {
47
Serial
.print(DSaddresses[a][i], HEX);
48
Serial
.print(
" "
);
49
}
50
Serial
.println (
" "
);
51
//======================================
52
delay (250);
53
a++;
54
}
55
}
Вывод в серийный порт:
01
#include <OneWire.h>
02
03
OneWire ds (4);
04
05
byte
DSaddresses[5][8];
// массив адресов датчиков DS18B20
06
07
void
setup
()
08
{
09
Serial
.begin(19200);
10
Serial
.println(
"Start"
);
11
search_for_dses ();
12
Serial
.println(
"Setup complete"
);
13
}
14
15
void
loop
()
16
{
17
int
a,i;
18
19
for
( a=0; a < 5; a++)
20
{
21
Serial
.print (
"Addr = "
);
22
for
( i = 0; i < 8; i++)
23
{
24
Serial
.print(DSaddresses[a][i], HEX);
25
Serial
.print(
" "
);
26
}
27
Serial
.println (
" "
);
28
}
29
delay (1000);
30
}
31
32
33
void
search_for_dses ()
34
{
35
int
a,b,i;
36
byte
addr[8];
37
Serial
.println (
"Serching for DS"
);
38
while
(ds.search (addr)==1)
39
{
40
for
(b=0; b<8; b++)
41
{
42
DSaddresses[a][b]=addr[b];
43
}
44
//======================================
45
// Serial.print ("Addr = ");
46
// for( i = 0; i < 8; i++) {
47
// Serial.print(DSaddresses[a][i], HEX);
48
// Serial.print(" ");
49
// }
50
// Serial.println (" ");
51
//======================================
52
delay (250);
53
a++;
54
}
55
}
Выводит вот это:
Господа, проблема все таки в вашем компоте с переменными. Если после 35 строки вы поставите a=0; или объявите их как и требуется BYTE, то все сразу заработает. Не поленитесь, посмотрите какие она принимает значения в вашем варианте. Это маленькие, подлые штуки, которые пытаются сами преобразовывать типы по мере надобности.
Датчики будут стоять в 5 комнатах. Пока не знаю какой будет в какой. и какой на улице.
Я не в курсе был, что надо byte... Везде вроде int пользовался раньше.
Я решил весь код переделать, чтобы без компота из чужих ягод. Переделаю на byte вечером. теперь так:
001
#include "DHT.h"
002
#include <OneWire.h>
003
004
#define DHTPIN 5
005
#define DHTTYPE DHT11
006
#define PIRpin 6 // пин датчика движения
007
OneWire ds (4);
008
DHT dht(DHTPIN, DHTTYPE);
009
010
byte
DSaddresses[5][8];
// массив адресов датчиков DS18B20
011
float
Celsius[5];
// массив измерений датчиков DS18B20
012
float
DHThum=0;
// DHT влажность
013
float
DHTtemp=0;
// DHT температура
014
int
minSecsBetweenSMS = 60;
// 1 min
015
long
lastSend = 0;
// Last SMS time;
016
long
delta = minSecsBetweenSMS * 1000;
// inSecsBetweenSMS millisecs
017
018
void
setup
()
019
{
020
Serial
.begin(19200);
021
Serial
.println(
"Start"
);
022
pinMode(PIRpin, INPUT);
// определяем RIRpin как прин ввода
023
Serial
.println(
"Starting DHT"
);
024
dht.begin();
025
search_for_dses ();
026
Serial
.println(
"Setup complete"
);
027
}
028
029
void
loop
()
030
{
031
/* int a,i;
032
033
for( a=0; a < 5; a++)
034
{
035
Serial.print ("Addr = ");
036
for( i = 0; i < 8; i++)
037
{
038
Serial.print(DSaddresses[a][i], HEX);
039
Serial.print(" ");
040
}
041
Serial.println (" ");
042
}
043
*/
044
long
now = millis();
045
if
(PIRcheck (now)==
true
)
046
{
047
Serial
.println(
"RIR ALARM"
);
048
Serial
.println(
"Sending SMS(emeil)"
);
049
}
050
DSmeasure ();
051
DHTmeasure ();
052
delay (1000);
053
}
054
055
056
void
search_for_dses ()
057
{
058
int
a,b,i;
059
byte
addr[8];
060
Serial
.println (
"Serching for DS"
);
061
while
(ds.search (addr)==1)
062
{
063
for
(b=0; b<8; b++)
064
{
065
DSaddresses[a][b]=addr[b];
066
}
067
//======================================
068
Serial
.print (
"Addr = "
);
069
for
( i = 0; i < 8; i++) {
070
Serial
.print(DSaddresses[a][i], HEX);
071
Serial
.print(
" "
);
072
}
073
Serial
.println (
" "
);
074
//======================================
075
delay (250);
076
a++;
077
}
078
}
079
080
void
DSmeasure ()
081
{
082
int
a,b,i;
083
byte
present = 0;
084
byte
data[12];
085
086
Serial
.println (
"Starting measurments"
);
087
ds.reset();
088
ds.write(0xCC);
// select all
089
ds.write(0x44);
// convert T for all devices
090
Serial
.println (
"wait 1000 mSec"
);
091
delay (1000);
092
present = ds.reset();
093
for
(a=0; a<5 ; a++)
094
{
095
present = ds.reset();
096
ds.select(DSaddresses[a]);
097
ds.write(0xBE);
098
for
( i = 0; i < 9; i++)
//Get 9 bytes
099
{
100
data[i] = ds.read();
101
Serial
.print(data[i], HEX);
102
Serial
.print(
" "
);
103
}
104
Serial
.print(
" CRC="
);
105
Serial
.print( OneWire::crc8( data, 8), HEX);
106
107
// convert the data to actual temperature
108
unsigned
int
raw = (data[1] << 8) | data[0];
109
byte
cfg = (data[4] & 0x60);
110
if
(cfg == 0x00) raw = raw << 3;
// 9 bit resolution, 93.75 ms
111
else
if
(cfg == 0x20) raw = raw << 2;
// 10 bit res, 187.5 ms
112
else
if
(cfg == 0x40) raw = raw << 1;
// 11 bit res, 375 ms
113
114
Celsius[a] = (
float
)raw / 16.0;
115
Serial
.print(
" C="
);
116
Serial
.print(Celsius[a]);
117
Serial
.println();
118
}
119
Serial
.println (
"Measurments completed"
);
120
}
121
122
void
DHTmeasure()
123
{
124
// Reading temperature or humidity takes about 250 milliseconds!
125
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
126
DHThum = 0;
127
DHTtemp = 0;
128
DHThum = dht.readHumidity();
129
DHTtemp = dht.readTemperature();
130
Serial
.print(
"Hum="
);
131
Serial
.print(DHThum);
132
Serial
.print(
","
);
133
Serial
.print(
"Temp="
);
134
Serial
.print(DHTtemp);
135
Serial
.println();
136
}
137
138
boolean PIRcheck (
long
TimeOfCheck)
139
{
140
if
(digitalRead(PIRpin) == HIGH)
141
{
142
if
( TimeOfCheck >= (lastSend + delta))
// Check for enough time has passed after last HIGH
143
{
144
Serial
.println(
"MOVEMENT"
);
145
Serial
.println(delta);
146
Serial
.println(lastSend);
147
lastSend = TimeOfCheck;
148
Serial
.println(lastSend);
149
return
true
;
150
}
151
else
152
{
153
Serial
.println(
"SMS canceled cause = too soon"
);
154
return
false
;
155
}
156
}
157
return
false
;
158
}
Пока без sim900 и LCD.))
Здравствуйте Slavyanin55, я здесь новичек, мне очень интересна система Arduino и я бы хотел с вами поговорить об этой системе лично, как нам можно связаться!!! Вот моя почта vladislav178@mail.ru!!!
Ну в шапке программного кода (скетча) я оставил свой email chernisheevka@mail.ru ну вконтактик можно писать http://vk.com/id18126240
Кстати сейчас занимаюсь созданием программки на android для управления моим скетчем. Вот что нашел: онлайн сервис по созданию приложений на андроиде http://ai2.appinventor.mit.edu/#5386187431739392
ну а здесь пример http://arduino-project.net/golosovoe-upravlenie-arduino-android-telefonom/
вообщем за день удалось создать пульт управления по блютус, т.е. тупо отправка команд по блютус. Буду дальше изучать, как показания температур и переменных отображать в приложении.
Здравствуйте,не могли бы Вы поделиться библиотеками использованными в проекте?
Без проблем, выложил на яндекс диске в папку "Библиотеки к проекту"
https://yadi.sk/d/UFkHLq8He6yCz
Спасибо
Столько труда тут. Уважаю.
Да... Вот это полноценный умный дом! Порадовала ардуинка, наглухо прикрученная огромными саморезами!
Спасибо автору.
Буду собирать эту схему для своего частного дома.
Благодарю за отзыв! Собирайте, делитесь опытом! Выкладывайте фото вашего труда. Ну а я могу помочь в программировании, если будут вопросы к моему программному коду.
:) да, люблю когда крепление надежно и разъемно. Видал на алиэкспресе корпуса-боксы для меги... можно её мегу установить в такой корпус.
Хочу сообщить, под шляпками саморезов небольшие отрезки кембрика, они выполняют функцию изолятора + "подпружинивают" корпус меги. Т.е. саморезы не затянуты, а слегка завернуты.
Вообще я сначало думал на двусторонний скотч :) , но не люблю борьбу с клеем от него.
Короче краткий отчет...
Система запущена в ноябре и работает по сей день. Программу постоянно оптимизирую. Добавил много фишек (функций), исправил ошибки, поборол ложные срабатывания от пожарных шлейфов.
Добавил контроль напряжения сети 220В. И по ходу эксплуатации обнаружилось, что во время пурги на улице пошаливает электричество в сети, видимо случаются где то перехлестывания проводов ЛЭП и напряжение "дребезжит" потом вырубается, до восстановления его энергетиками. Так вот Ардуинка успевала за эти мгновения дребезка настряпать в эфир по 4 СМС сообщений. Сделал простую задержку, после первого импульса отключения, и после подачи напряжения. Ну и естественно с временем этого события.
Добавил вольтметр, чтобы контролировать напряжение после ИБП. Полезно, когда дом остался без электричество и арудинка пребывает на аккумуляторе. Ну и когда вот вот каюк ему настанет пошлет СМС. Так же при перезаряде сообщит.
Модернизировал цикл пожарной сигнализации...ничего гениального не придумал, просто сделал тактику работы, как у современных приборов пожарной сигнализции. Сделал режим "проверка" Чтобы, была возможность проверить работоспособность датчиков без тревог и отсылания СМС.
Добавил счетчик отправленных СМС. Так для статистики, чтобы знать куда деньги деваются со счета. Ну и если у вас пакет СМС-ок, то когда он закончится.
Оптимизировал работу с датчиками даллас... теперь, если датчик выдал -127, то система сразу делает переопрос датчиков добавляет в счетчик "косяков" датчиков +1. И вуаля! работать стало хорошо. А косяки потому что я до сих пор не заменил кабель на витую пару и не поменял резистор на шину данных. Ну погоды не было еще, вот сейчас тепло станет, доделаю.
Причесал контроллерный шкаф
В силовом шкафу ничего нового
вообщем жена совсем взяла за горло, делаю ремонт в кухне, умный дом пока на втором месте по приоритету.
Выкладываю последний программный код:
Эт уже не шкафы, это центр управления полетами)))
Выложил последнюю программу на яндекс диск https://yadi.sk/d/9krPQtI4esHWb
И не говори :))) на перспективу!
Вот там за шторкой место есть еще для таких же 2-х шкафов :)
Смотрю и глаз радуется. Автору огромный респект! Красота.
Когда соберу свою систему по вашему примеру, сделаю фото отчет. Но это будет в конце лета, ибо объем большой и делается для сети все красиво и аккаратно :)
А секрет простой, берете большой щит ЩМП, и большой короб ПВХ 25х40. В коробе по бокам дрелью делаются 100500 отверстий, через которые будут протянуты провода. Все собирается, и вся борода проводов прячется в короб. Снаружи красиво, а все страшное внутри. Принцип любого евроремонта :)))
"делается для себя все красиво и аккаратно :)" - во! а вот это самое главное. Для себя же делаем.
Все забываю сделать фотографию чердака. На чердаке у меня сделаны лотки из стоечного и направляющих профилей для гипсокартона. Отдельно силовые лотки, отдельно слаботочные. Так же поставил два дымовых датчика под коньком чердака.
Тоже жду лета, летом строительства на участке будет валом. А так нужно будет подземные кабели кидать до забора, гаража, бани... чтобы датчики и концевики установить. Вот думаю как охрану участка организовать, ИК барьеры от мастер кита чтоли, попробовать.
А вообще летом в выгребную яму буду ставить датчик уровня. Если не сделаю свой из полипропилена и герконов, то просто куплю в кастораме поплавовый выключатель за 320р от насосов.
Подскажите.
pinMode(39, OUTPUT); // Питание гаража
pinMode(41, OUTPUT); // Питание бани
pinMode(43, OUTPUT); // Питание розеток дома
pinMode(45, OUTPUT); // Питание вентиляции
Это выходы на реле?
И интересно как вы снимаете статусы
int statusrzd=0; // статус питания розеток дома 0 - откл , 1- вкл
int statusgaraj=0; // статус питания гаража 0 - откл , 1- вкл
int statusbania=0; // статус питания бани 0 - откл , 1- вкл
int statusPump=0; // статус питания станции водоснабжения 0 - откл , 1- вкл
Спасибо.
1. Да, это выходы реле... в настоящее время, не сделано физически. Куплю пускатели или мощные реле, тогда и доделаю.
2. Ну эти статусы не снимаются. Они как бы задаются. Это такие программные тригеры. Ардуинщики называют их флагами.
Т.е. обратной связи нет, нет контроля напряжения на объектах. Есть только контроль напряжения после УЗО которое обесточивает ряд автоматов на насосы, розетки, баню, граж,... исключение только: холодильник, питание UPS, освещение в доме.
Понял спасибо.
Тоже планиную делать умный дом на Arduino (пока на стадии разработки), правда интересно с беспроводными 433МГц датчиками попробовать.
Спасибо за отличную статью и бесценный опыт.
И да, шкафы у вас шикарные :)
День добрый,
Управление всем светом происходит в этом шкафу ? С каждой люстры идет отдельный 220 в шкаф ? Как та жа люстра взаимодействует с выключателем на стене и с реле в шкафу ?
За что отвечают опторазвязки ?
Ну вообще можно сделать включение света от шкафа (реле) и от выключателя на стене. Как удобно так и включай. Я себе так сделаю.
Да. С каждой люстры, и с каждого двухклавишного комнатного выключателя идут по кабелю ВВГ3х1,5. Сходятся они в шкафу на клеммнике.
Идея такая. Освещение каждой комнаты, запитывается от своего однополюсного автомата. Для того чтобы, освещение всегда было работало, в независимости от работоспособности умного дома. Используется двух клавишный выключатель. Одна клавиша "режим ручной" на ней постоянно фаза. Всегда можно включить свет на постоянку. На второй клавише "режи авто".Фаза на ней появляется после срабатывание реле. Реле включается мгновенно после обнаружения движения датчиком на время установленное в программе и отключается после прекращения движения в комнате.
Если режим авто не нужен просто включается клавиша "ручной режим". Например, когда заходишь в душевую кабину. ИК Датчик тебея уже не видит. Ну а так по мелким делам работает отлично. В зале например у меня ручной режим не используется вообще. Там выдержка в 4 минуты сделана. Если в зале никого нет уже 4 минуты свет отключается. Электроэнергия стала экономиться. Так как ребенок 2 лет, то тут то там, то остался на долго у мамы на кухне. А свет...погорел и сам погас.
Опторазвязки я стараюсь делать где только можно. Оптопары, "убивают двух зайцев" 1. происходит согласование разных напряжений, 2-е гальваническая развязка и помеха защищенность. Мало ли чего бывает. Грозовые разряды, статика... мне нужна надежность. + я не парюсь проводить кабели в близи с "помехами"
Опторазвязки у меня для гальванической изоляции входных и выходных дискретных сигналов.
Вот интересно аналоги развязать возможно?
Дайте пожалуйста ссылку на схему влучшем качестве. Интересно на вашу поглядеть. Просто на этой плохо видны все подписи.
https://yadi.sk/d/uCTDejVSf82H6
Попробуйте вот по этой ссылке, скачайте весь проект. Прошу прощения сразу. Недочертил ещё его. От исполнительной документации он еще далек. Но суть там вся отображена.
Скачал. Большое спасибо.
Скачал. Большое спасибо.
Да на здоровье. Жду ваших идей и реализаций!
Проект выполняется в программе KompasV12 3D. Исходники, всегда пожалуйста.
Где бы мне человечка найти, который на андроиде приложение накидает для моего дома. Кстати нашел сайт http://remotexy.com/ru/editor/code/
Попробую, когда лень и суета отпустят.
Вот это супер! Мне до такого наверное не дойти. Хотя хотелось именно нечто подобного.
Дом стоит пока без штукатурки, но беда в том что я не электрик. А наемные - им как проще. Проходной выключатель, и то нехотя ведут. А если их озадачить чтобы к каждому выключателю и каждой разетки 2 кабеля протащить - сумашедшим сочтут.
Я хотел еще ко всему вышеописанному еще и видеонаблюдение по периметру привентить с мониторингом с телефона. Не думали?
Вот это супер! Мне до такого наверное не дойти. Хотя хотелось именно нечто подобного.
Дом стоит пока без штукатурки, но беда в том что я не электрик. А наемные - им как проще. Проходной выключатель, и то нехотя ведут. А если их озадачить чтобы к каждому выключателю и каждой разетки 2 кабеля протащить - сумашедшим сочтут.
Я хотел еще ко всему вышеописанному еще и видеонаблюдение по периметру привентить с мониторингом с телефона. Не думали?
1. Не подпускайте электриков к своему дому :)) Я как КИПовец их не долюбливаю. Ну это профессиональные особенности. КИПиА. Коллеги поймут. Лучше научитесь сами. Лучше вас никто не сделает. На Ютубе все показывают, как что делается.
"А если их озадачить чтобы к каждому выключателю и каждой разетки 2 кабеля протащить - сумашедшим сочтут." - ну это большая проблема человечества. Отказаться от стереотипов, и зайти за рамки привычного. На этом сайте таких людей нет. Так как, когда рассказываешь человеку, на чем сделан умный дом, то сразу вопрос "а нафига, готовое же все продается? Ну ты маньяк!" ... когда человеку показываешь сколько просят фирмочки за установку готвых систем, больше человек вопросов не задает. Но все равно обычно у таких людей разговоры такие: а пожарная сигнализация зачем, у тебя че пожар будет? А охранная зачем если полиция не приедет? Ну и че, ты на вахте, у тебя там протечка воды случилась... и чЁ, смысл?
Ну начинаешь ему объяснять, что дом не в глухой тайге, кругом люди, соседи. друзья. Что не обязательно дожидаться приезда моего с вахты. А просто попросить соседа(друга,родственника) взять ключ и зайти в дом и проверить. А еще приходится объяснять, что если вода будет бежать неделю(месяц), то будет ущерба больше для жилья, чем если вода будет бежать до прихода соседа(друга,родственника). Ну вообще я шаровый кран на водопровод буду ставить :))))
2. Думали, еще как думали... я уже представляю где будут камеры у меня стоять. В их полезности не сомневаюсь. На данный момент у меня висят 2 муляжа камеры и на входных местах участка большие таблички "внимание видется видеонаблюдение". Пусть думает кто что хочет, но самое главное что алкашы и прочая нечисть участок стороной обходит. Сначало я купил в бауцентре мляж купольной камеры с мигающим светодиодом. Но аборигены не видят его в упор. А вот когда купил муляж серьезной камеры, то вопросов у них нет. Пусть ведут себя прилично. А вообще, уже присматриваюсь что брать. Обязательно хочу с выводом в интернет. Чтобы мог будучи на вахте, посмотреть как дела дома. Мне 4 камер за глаза. Ну а Супруга может за детьми приглядывать, не отходя от плиты. Я считаю, это полезно.
Ты главное кабелей накидай, и штукатурь смело. По ходу дела разберешься. Потому, что жить то в доме надо. Рекомендую сделать нишу, или кладовочку в центре дома. Чтобы были выходы на крышу, чердак. Чтобы была возможность сделать каналы, короба, проходы. Чтобы потом можно было докидывать кабеля. А почему в середине дома. Чтобы геометрически меньше были длины.
Приеду домой, сделаю фото чердака, и как я там сделал лотки кабельные из стоечных профилей гипсокартона.
Тут явно не хватает веб интерфейса. Сильно порадовали саморезы которыми крепится мега :) Если просверлить дырку в проце и туда завернуть такой же саморез, то держаться будет крепче !