Система "Умный дом" для загородного дома на Arduino Mega2560, HC-05, SIM900,DHT11,3-х DS18B20,RTC-DS1302

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

 

Здравствуйте форумчане, хочу поделиться с вами плодами своего труда. Может, кому пригодится то, что я делаю. Если кто сможет помочь в оптимизации программного кода, то я буду очень благодарен. Я далеко не программист, по специальности инженер КИПиА, поэтому программировать учился с нуля. Долго я разбирался, как это делается на ардуино, и резко все стало проясняться после того как я нашел на 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-карте:

 

 

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Файлы доступны на яндекс диске

https://yadi.sk/d/iqyRFz1Zdt8W2

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014
001///////////////////////Программа "умного дома" на основе MEGA2650////////////////////////
002 
003//Автор: Макаров Вячеслав email:chernisheevka@mail.ru
004 
005#include <OneWire.h> // библиотека для DS18B20
006#include <DallasTemperature.h> // библиотека для DS18B20
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 пин
011OneWire oneWire(ONE_WIRE_BUS);
012DallasTemperature ds(&oneWire);  // Везде где встречается ds - это работа с датчиками Dallas DS18B20
013DeviceAddress ZalC =    { 0x28, 0x8C, 0xAE, 0xEA, 0x05, 0x00, 0x00, 0x7F }; // Сетевой адрес датчика DS18B20 в доме (вписывайте адрес вашего датчика)
014DeviceAddress UlicaC =  { 0x28, 0x2B, 0x0F, 0x36, 0x04, 0x00, 0x00, 0xE0 }; // Сетевой адрес датчика DS18B20 на улице (вписывайте адрес вашего датчика)
015DeviceAddress KuhnyaC = { 0x28, 0xDE, 0x7A, 0xEB, 0x05, 0x00, 0x00, 0xF1 }; // Сетевой адрес датчика DS18B20 в кухне (вписывайте адрес вашего датчика)
016int tempC; // для работы с DS18B20
017 
018int  TempZalC    = 15;  // Переменная. Измеренная температура в зале    (По умолчанию 15гр.С)
019int  TempUlicaC  = 15;  // Переменная. Измеренная температура на улице  (По умолчанию 15гр.С)
020int  TempKuhnyaC = 15;  // Переменная. Измеренная температура на кухне  (По умолчанию 15гр.С)
021int  TempPodpol  = 15;  // Переменная. Измеренная температура в подполе (По умолчанию 15гр.С)
022int  UlicaS      = 15;  // Переменная. Измеренная освещенность на улице (По умолчанию 15%)
023 
024//_______Все для цикла void otoplenie()____________________________________________________________________
025 
026int tempDust = 25;     // Уставка желаемой температуры в доме (По умолчанию 25гр.С)
027int tempDECOust = 15;  // Уставка температуры в доме в режиме "Экономия"(По умолчанию 15гр.С)
028//#include <EEPROM.h>  //библиотека работы с SD-картой
030 
031#include <dht11.h>     //библиотека датчика DTH11
032#define DHT11PIN 6     //Датчик DTH11 на pin6
033dht11 dht;
034 
037#include <DS1302.h>          // библиотека работы с часами
038DS1302 rtc(2, 3, 4);         // Часы на DS1302 2-RST,3-DAT,4-CLK
039Time t;
040int RTCSekunda;              // Переменная "секунда" для суточного таймера цикл RTCtimer()
041int RTCChas;                 // Переменная "час" для суточного таймера цикл RTCtimer()
042int RTCMinuta;               // Переменная "минута" для суточного таймера
043 
044boolean statusKur=false;     // Флаг "работа курантов"
045 
046boolean statusDay=false;     // Флаг "Режим работы true - дневной, false - ночной"
047 
048boolean SMSDvigenieK=false// Флаг "Отправлена СМС о движении на кухне"
049boolean SMSDvigenieV=false// Флаг "Отправлена СМС о движении в ванной"
050boolean SMSDvigenieZ=false// Флаг "Отправлена СМС о движении в зале"
051boolean SMSDvigenieS=false// Флаг "Отправлена СМС о входе"
052boolean SMSVoltOFF=false;    // Флаг "Отправлена СМС об отключении питания 220в"
053boolean SMSVoltON=false;     // Флаг "Отправлена СМС о восстановлении питания 220в"
054boolean SMSBanyaTemp=false// Флаг "Отправлена СМС о предельной температуре в бане"
055boolean SMSPodpol=false;     // Флаг "Отправлена СМС об затоплении подпола"
056boolean SMSFireSensor=false; // Флаг "Отправлена СМС о сработке дымового датчика"
057boolean SMSFireAlarm=false// Флаг "Отправлена СМС о сработке пожарной сигнализации"
058boolean SMSDelete=false;     // Флаг "Удалены все СМС на SIM900"
059boolean TimeSMSzapros=false; // Флаг "Отправлена СМС о состоянии дома по таймеру"
060boolean SMSAlarmTemp=false// Флаг "Отправлена СМС о критической температуре"
061//boolean EcoTempDust=false;   // Флаг "Экономия отопления"
062 
063int   vlaga=0; // Значение влажности в цикле ventilyaciya()
064int pambilang;         // переменная для цикла sirena()
065 
066int statushome=0;      // переменная статуса включения умного дома 1 - включен, 0 -выключен
067int statusotp=0;       // статус отопления дома                0 - откл , 1- вкл , 2- экономия
068int statusrzd=0;       // статус питания розеток дома          0 - откл , 1- вкл
069int statusgaraj=0;     // статус питания гаража                0 - откл , 1- вкл
070int statusbania=0;     // статус питания бани                  0 - откл , 1- вкл
071int statusPump=0;      // статус питания станции водоснабжения 0 - откл , 1- вкл
072int perimetr=0;        // статус включения охраны периметра    0 - откл , 1- вкл
073int statusperimetr=0;  // статус периметра        1 - все двери закрыты , 0 - дверь не закрыта
074int statuspoliv=0;     // статус полива                        0 - откл , 1- вкл , 2- Таймер
075int statusAlarm=0;     // Переменная "Наличие тревоги"
076int AlarmTemp=0;       // Переменная "Наличие тревоги по критической температуре"
077int statusFireAlarm=0; // Переменная "Режим работы пож.сигнализации" - 0 - откл , 1- вкл , 2- проверка, 3-в тревоге
078int signaliz=0;        // Переменная "Режим работы охр.сигнализации" - 0 - откл , 1- вкл , 2- постановка на охрану, 3-в тревоге
079int statusPIK=0;       // статус работы тональной пищалки              0 - откл , 1- вкл
080 
081boolean statusBlock=false// статус блокировки освещения зала пользователем
082boolean statusZ=false;      // статус блокировки освещения зала по времени суток
083 
084int intervalPIK = 1000;//  интервал для цикла Pik()
085int TonPIK = 2500;     //  частота тона пищалки
086//_________ флаги для таймеров______________________________________
087boolean Timer1On = false//Флаг таймера РЕЗЕРВ
088boolean Timer2On = false//Флаг таймера постановки на охрану
089 
090//_________ переменные времени для таймеров_________________________
091unsigned long EndPikMillis = 0; // храним время последнего тона для цикла Pik()
092unsigned long NowTime1 = 0;         // переменная хранения времени таймера №1
093unsigned long StartTime1 = 0;       // переменная хранения времени запуска таймера №1
094unsigned long NowTime2 = 0;         // переменная хранения времени таймера №2
095unsigned long StartTime2 = 0;       // переменная хранения времени запуска таймера №2
096 
097 
098//_________ флаги для цикла Kvitirovanie()(сброс звука сирены)______________________________________
099boolean KvitDI30 = false;     //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 30
100boolean KvitDI29 = false;     //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 29
101boolean KvitDI31 = false;     //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 31
102boolean KvitZalC = false;     //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура зал
103boolean KvitUlicaC = false;   //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура улицы
104boolean KvitKuhnyaC = false//Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура кухни
105boolean KvitPodpolC=false;    //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура в подполе 
106 
107//boolean KvitAI14 = false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход A14
108 
109long previousMillis = 0;    // храним время последнего замера влажности для цикла izmereniya()
110long 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> ___________________________
113long unsigned int lowIn_K;  // Время, в которое был принят сигнал отсутствия движения на кухне(LOW)
114long unsigned int lowIn_V;  // Время, в которое был принят сигнал отсутствия движения в ванной(LOW)
115long unsigned int lowIn_Z;  // Время, в которое был принят сигнал отсутствия движения в зале(LOW)
116long unsigned int lowIn_S;  // Время, в которое был принят сигнал отсутствия движения в сенях(LOW)
117long unsigned int pause_K = 60000; //Пауза, после которой движение считается оконченным
118long unsigned int pause_V = 60000; //Пауза, после которой движение считается оконченным
119long unsigned int pause_Z = 300000; //Пауза, после которой движение считается оконченным
120long unsigned int pause_S = 60000; //Пауза, после которой движение считается оконченным
121boolean lockLow_K = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
122boolean lockLow_V = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
123boolean lockLow_Z = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
124boolean lockLow_S = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
125boolean takeLowTime_K; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
126boolean takeLowTime_V; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
127boolean takeLowTime_Z; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
128boolean takeLowTime_S; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
129int pirPin_K = 26;    //вывод подключения PIR датчика Кухни
130int pirPin_V = 24;    //вывод подключения PIR датчика Ванной
131int pirPin_Z = 22;    //вывод подключения PIR датчика Зал
132int pirPin_S = 28;    //вывод подключения PIR датчика Сени
133 
134//_______Для работы терминала по  bluetooth___________________________
135int inSize=0;  // Переменная которая будет содержать размер буфера терминала bluetooth
136char str[128]; // Так как типа string тут нет, будем использовать массив символов
137 
138//_______Для работы терминала по  Sim900______________________________
139 
140String currStr = "";
141boolean isStringMessage = false// Переменная принимает значение True, если текущая строка является сообщением
142 
143//___________________ Стартовый цикл _________________________________
144 
145void 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 
222void 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 
262void RTCtimer()  // Цикл суточного таймера на RTC модуле DS1302
263{
264t = rtc.getTime();
265//RTCSekunda = t.sec; // t.sec  - запрос секунд
266RTCChas = t.hour;   // t.hour - запрос часов
267RTCMinuta = t.min;  // t.min  - запрос минут
268if(RTCChas == 0 && RTCMinuta == 1){statusPump=0;}    //в 0:01 выключить насосную станцию (включение вручную)
269if(RTCChas == 0 && RTCMinuta == 30 && digitalRead(25)==LOW){perimetr=1;}     //включение охраны периметра в 0:30
270if(RTCChas == 6 && RTCMinuta == 40){perimetr=0;}                             //выключение охраны периметра в 6:40
271if(RTCChas > 16 && RTCChas < 23 && statushome==1){digitalWrite(48,LOW);} else {digitalWrite(48,HIGH);}    //в 16 до 23 Включить дренажный насос
272if(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 утра включить освещение двора
274if(RTCChas > 7 && RTCChas < 23 && RTCMinuta == 0 && statusKur==false){tone(5, 2500, 200); statusKur=true;} // Ежечасный сигнал (куранты) с 8-00 по 22-00
275if(RTCMinuta != 0){statusKur=false;} // сброс флага statusKur
276if(RTCChas > 8 && RTCChas < 23){statusDay=true;} else {statusDay=false;}     //c 8 до 23 время суток день
277if(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// Ежесуточное СМС о состоянии дома при включенной сигнализации.
284if(RTCChas == 12 && RTCMinuta == 0 && TimeSMSzapros==false && signaliz==1){SMSzapros(); TimeSMSzapros=true;} // Когда включена сигнализация, в 12:00 отправляем СМС о состоянии.
285if(RTCMinuta != 0){TimeSMSzapros=false;} // сброс флага TimeSMSzapros
286// Ежесуточно. Боремся с переполнением хранилища СМС от спама. 
287if(RTCChas == 0 && RTCMinuta == 2 && SMSDelete==false){Serial2.print("AT+CMGDA=«DEL ALL»\r"); SMSDelete=true;} // Удаляем в 0:02 все СМС.
288if(RTCMinuta != 2){SMSDelete=false;} // сброс флага SMSDelete
289 
290// Добавить снижение температуры дома ночью на 1гр.С
291}
292 
293void izmereniya()   //  Замер температур с датчиков DS18B20 и влажности с датчика DHT11
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 
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 
332void 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 
344void Kvitirovanie() // Цикл квитирование (выкл.звука при активной тревоге) до восстановления параметра в норму
345{
346if (digitalRead(30)==HIGH && KvitDI30==false) { KvitDI30=true;}                            //Квитирование сигнала с датчика затопления подпола
347if (digitalRead(29)==HIGH && KvitDI29==false) { KvitDI29=true;}                            //Квитирование сигнала с датчика готовности бани
348if (digitalRead(31)==HIGH && KvitDI31==false) { KvitDI31=true;}                            //Квитирование сигнала с датчика предельной температуры в бане
349if ( TempZalC != -127    && TempZalC < 10 && KvitZalC==false )  {KvitZalC=true;}         //Квитирование сигнала низкой температуры в зале +10
350if ( TempZalC != -127    && TempZalC > 35 && KvitZalC==false )  {KvitZalC=true;}         //Квитирование сигнала высокой температуры в зале +35
351if ( TempUlicaC != -127  && TempUlicaC > 50 && KvitUlicaC==false )  {KvitUlicaC=true;}   //Квитирование сигнала высокой температуры на улице +50
352if ( TempKuhnyaC != -127 && TempKuhnyaC < 10 && KvitKuhnyaC==false ) {KvitKuhnyaC=true;}  //Квитирование сигнала низкой температуры в кухне +10
353if ( TempKuhnyaC != -127 && TempKuhnyaC > 35 && KvitKuhnyaC==false ) {KvitKuhnyaC=true;}  //Квитирование сигнала высокой температуры в кухне +35
354if ( TempPodpol < 3 && KvitPodpolC==false ) {KvitPodpolC=true;}                            //Квитирование сигнала низкой температуры в подполе +3
355if ( TempPodpol > 35 && KvitPodpolC==false) {KvitPodpolC=true;}                            //Квитирование сигнала высокой температуры в подполе +35
356//if (analogRead(14)<100     && KvitAI14==false) { KvitAI14=true;}                         //Квитирование сигнала с датчика уровня дренажной емкости
357}
358 
359void bluetooth() //_________ Контроль и управление умным домом по терминалу НС-05_<a href="http://rezoh.ru/?p=1754" rel="nofollow">http://rezoh.ru/?p=1754</a> взято тут
360{
361inSize=0; // Сбрасываем переменную
362memset(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 
421void 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}
469void 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   
486void 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 
532void 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 
563void 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 
572void 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 
590void 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 
601void 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;} // Сработка концевика двери бани
606else {statusperimetr=1;}
607}
608 
609void 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 
624void Pik() // Периодический тон пищалки
625{
626   unsigned long StartPikMillis = millis();
627   if(StartPikMillis - EndPikMillis > intervalPIK) // интервал тона
628   { tone(5, TonPIK, 100); EndPikMillis = StartPikMillis; } // Сброс таймера
629}
630 
631void 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 
668void 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 
679void 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 
690void sirena() //_______Сирена х.з. на каком языке
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 
699void 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 
708void 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 
761void 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 
797void 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 
811void startOneSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
812{
813      Serial2.print("AT+CMGF=1\r");
814      delay(100);
815      Serial2.println("AT + CMGS = \"+79000000000\""); // (+79000000000 сдесь должен быть ваш номер №1)
816      delay(100);
817}     
818void startTwoSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму номеру
819{
820      Serial2.print("AT+CMGF=1\r");
821      delay(100);
822      Serial2.println("AT + CMGS = \"+79000000000\""); // (+79000000000 сдесь должен быть ваш номер №2)
823      delay(100);
824}   
825void EndSMS() //__________________Цикл окончания и отправки СМС-сообщения_______________________
826{
827   delay(100);
828   Serial2.println((char)26);                       // Команда отправки СМС
829   delay(5000);
830}
831void ZvonokS() //__________________Цикл дозвона абоненту (для аудиоконтроля)___________________
832{
833Serial2.println("AT+CMIC=0,15");    // Команда для установки чувствительности микрофона Поэкспериментировать с цифрой.
834// 0,- это канал микрофона (1,2,3),15 это уровень см.инструкцию к СИМ900
835delay(2000);
836 
837Serial2.println("ATD+79000000000;");  // Набираем номер(+79000000000 сдесь должен быть ваш номер №1)
838}
839//Serial2.println("ATH"); // Вешаем трубку
840 
841void ZvonokT() //__________________Цикл дозвона абоненту (для аудиоконтроля)___________________
842{
843Serial2.println("AT+CMIC=0,15");    // Команда для установки чувствительности микрофона Поэкспериментировать с цифрой.
844// 0,- это канал микрофона (1,2,3),15 это уровень см.инструкцию к СИМ900
845delay(2000);
846Serial2.println("ATD+79000000000;");  // Набираем номер (+79000000000 сдесь должен быть ваш номер №2)
847//Serial2.println("ATH"); // Вешаем трубку
848}
849 
850 
851 
852  

 

Araris
Offline
Зарегистрирован: 09.11.2012

Объем работ, проделанный автором, вызывает искреннее уважение, респект Вам.

ATkRnr
Offline
Зарегистрирован: 22.10.2013

Да согласен объем работ вызывает уважение.

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

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

 ATkRnr, полностью согласен, коллега! Прошел я уже это, затарился вот такими разъемами с шагом 2,54мм, и все сделал на них, и буду все делать на них. Очень удобно. 

Плохо что, плата GSM заточена для arduino UNO. На МЕГу тоже ставится, но делает не доступными пины меги. А так много места в шкафу было бы сэкономлено. Хотя шкафы ЩМП взял на вырост. На avito.ru человек продавал по 1200р за штуку. Взял два, думал в один запихну, но потом понял: гулять, так гулять.

Скоро выложу фото контроллерного шкафа, сейчас там наведен порядок.

dimontie
Offline
Зарегистрирован: 11.01.2015

Вот это да...

Какая красота в шкафу!

dimontie
Offline
Зарегистрирован: 11.01.2015

Новый прикол.

01#include <OneWire.h>
02 
03OneWire ds (4);
04 
05byte DSaddresses[5][8]; // массив адресов датчиков DS18B20
06 
07void setup()
08{
09  Serial.begin(19200); 
10  Serial.println("Start");
11  search_for_dses ();
12  Serial.println("Setup complete");
13}
14 
15void 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 
33void 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}

Вывод в серийный порт:

Start
Serching for DS
Addr = 28 FF 88 8 62 14 3 7E  
Addr = 28 FF 24 61 63 14 2 9A  
Addr = 28 FF 9C 1B 63 14 2 58  
Addr = 28 FF 8E 50 62 14 3 26  
Addr = 28 FF 39 63 63 14 2 D  
Setup complete
Addr = 28 FF 88 8 62 14 3 7E  
Addr = 28 FF 24 61 63 14 2 9A  
Addr = 28 FF 9C 1B 63 14 2 58  
Addr = 28 FF 8E 50 62 14 3 26  
Addr = 28 FF 39 63 63 14 2 D  
Addr = 28 FF 88 8 62 14 3 7E  
Addr = 28 FF 24 61 63 14 2 9A  
Addr = 28 FF 9C 1B 63 14 2 58  
 
Все хорошо.
 
Однако:
 
01#include <OneWire.h>
02 
03OneWire ds (4);
04 
05byte DSaddresses[5][8]; // массив адресов датчиков DS18B20
06 
07void setup()
08{
09  Serial.begin(19200); 
10  Serial.println("Start");
11  search_for_dses ();
12  Serial.println("Setup complete");
13}
14 
15void 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 
33void 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}

Выводит вот это:

Start
Serching for DS
Setup complete
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
 

 

dimontie
Offline
Зарегистрирован: 11.01.2015

Просто как то это пугает...

Я боюсь, что умный дом будет умнее своего создателя)) 

dimontie
Offline
Зарегистрирован: 11.01.2015

Похоже на глюк компилятора. У меня кстановлено: ARDUINO 1.0.6

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

"Похоже на глюк компилятора. У меня кстановлено: ARDUINO 1.0.6"

А почему ты не хочешь отказаться от сканирование датчиков, и работать с фиксированными адресами?

Насколько я знаю, если датчик пропадает из сети то меняет их порядок очереди, и становится уже непонять кто где. Или тебе география не важна, и все датчики установлены в одном месте?

У меня иногда случается, что дачтик температуры на улице кратковременно пропадает, и и УД выдает температуру на улице -127. Хоть и в Сибири живем, но такого не видали. Так вот кабель до датчика идет 17 метров КСПВ 4х0,5. Не экранированный, и даже не витой. Более того на плюсовой жиле сидит датчик освещенности улицы (делитель из резистора и фотоорезистора) и плюс мигающий светодиод из муляжа купольной камеры, в которой все это установлено. Надеюсь кто нибудь что нибудь понял :) Потом пришлю фото.

Так вот когда приеду с вахты, заменю кабель на экранированную витую пару UTP. Питание "потребителей" сделаю по отдельным жилам. И самое главное я уменьшу номинал резистора 4,7к, который на шину данных идет, на меньший 2,7к хотя бы. А вообще поэкспериментирую.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

По РЕН-ТВ показывали с месяц назад как скоро роботы убьют человечество и роботизированные чайники зальют людей кипятком :) может кто видел? Чисто поржать можно.

Так вот вывод! Спали умный дом - спаси человечество :)))

bwn
Offline
Зарегистрирован: 25.08.2014

dimontie пишет:

Новый прикол.

01#include <OneWire.h>
02 
03OneWire ds (4);
04 
05byte DSaddresses[5][8]; // массив адресов датчиков DS18B20
06 
07void setup()
08{
09  Serial.begin(19200); 
10  Serial.println("Start");
11  search_for_dses ();
12  Serial.println("Setup complete");
13}
14 
15void 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 
33void 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}

Вывод в серийный порт:

Start
Serching for DS
Addr = 28 FF 88 8 62 14 3 7E  
Addr = 28 FF 24 61 63 14 2 9A  
Addr = 28 FF 9C 1B 63 14 2 58  
Addr = 28 FF 8E 50 62 14 3 26  
Addr = 28 FF 39 63 63 14 2 D  
Setup complete
Addr = 28 FF 88 8 62 14 3 7E  
Addr = 28 FF 24 61 63 14 2 9A  
Addr = 28 FF 9C 1B 63 14 2 58  
Addr = 28 FF 8E 50 62 14 3 26  
Addr = 28 FF 39 63 63 14 2 D  
Addr = 28 FF 88 8 62 14 3 7E  
Addr = 28 FF 24 61 63 14 2 9A  
Addr = 28 FF 9C 1B 63 14 2 58  
 
Все хорошо.
 
Однако:
 
01#include <OneWire.h>
02 
03OneWire ds (4);
04 
05byte DSaddresses[5][8]; // массив адресов датчиков DS18B20
06 
07void setup()
08{
09  Serial.begin(19200); 
10  Serial.println("Start");
11  search_for_dses ();
12  Serial.println("Setup complete");
13}
14 
15void 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 
33void 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}

Выводит вот это:

Start
Serching for DS
Setup complete
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
Addr = 0 0 0 0 0 0 0 0  
 

 

Господа, проблема все таки в вашем компоте с переменными. Если после 35 строки вы поставите a=0; или объявите их как и требуется BYTE, то все сразу заработает. Не поленитесь, посмотрите какие она принимает значения в вашем варианте. Это маленькие, подлые штуки, которые пытаются сами преобразовывать типы по мере надобности.

dimontie
Offline
Зарегистрирован: 11.01.2015

Датчики будут стоять в 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 // пин датчика движения
007OneWire ds (4);
008DHT dht(DHTPIN, DHTTYPE);
009 
010byte DSaddresses[5][8]; // массив адресов датчиков DS18B20
011float Celsius[5]; // массив измерений датчиков DS18B20
012float DHThum=0; // DHT влажность
013float DHTtemp=0; // DHT температура
014int minSecsBetweenSMS = 60; // 1 min
015long lastSend = 0; // Last SMS time;
016long delta = minSecsBetweenSMS * 1000; // inSecsBetweenSMS millisecs
017 
018void 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 
029void 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 
056void 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 
080void 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 
122void 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 
138boolean 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.))

vlad45
Offline
Зарегистрирован: 12.01.2015

Здравствуйте Slavyanin55, я здесь новичек, мне очень интересна система Arduino и я бы хотел с вами поговорить об этой системе лично, как нам можно связаться!!! Вот моя почта vladislav178@mail.ru!!!

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Ну в шапке программного кода (скетча) я оставил свой email chernisheevka@mail.ru  ну вконтактик можно писать http://vk.com/id18126240

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Кстати сейчас занимаюсь созданием программки на android для управления моим скетчем. Вот что нашел: онлайн сервис по созданию приложений на андроиде http://ai2.appinventor.mit.edu/#5386187431739392

ну а здесь пример http://arduino-project.net/golosovoe-upravlenie-arduino-android-telefonom/

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

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014


 

vovanxp
vovanxp аватар
Offline
Зарегистрирован: 19.10.2014

Здравствуйте,не могли бы Вы поделиться библиотеками использованными в проекте?

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Без проблем, выложил на яндекс диске в папку "Библиотеки к проекту"

https://yadi.sk/d/UFkHLq8He6yCz

vovanxp
vovanxp аватар
Offline
Зарегистрирован: 19.10.2014

Спасибо

art100
Offline
Зарегистрирован: 09.03.2014

Столько труда тут. Уважаю.

 

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Да... Вот это полноценный умный дом! Порадовала ардуинка, наглухо прикрученная огромными саморезами!

krik
Offline
Зарегистрирован: 23.02.2015

Спасибо автору.

Буду собирать эту схему для своего частного дома.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

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

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

:) да, люблю когда крепление надежно и разъемно. Видал на алиэкспресе корпуса-боксы для меги... можно её мегу установить в такой корпус. 

Хочу сообщить, под шляпками саморезов небольшие отрезки кембрика, они выполняют функцию изолятора + "подпружинивают" корпус меги. Т.е. саморезы не затянуты, а слегка завернуты.

Вообще я сначало думал на двусторонний скотч :) , но не люблю борьбу с клеем от него.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Короче краткий отчет...

Система запущена в ноябре и работает по сей день. Программу постоянно оптимизирую. Добавил много фишек (функций), исправил ошибки, поборол ложные срабатывания от пожарных шлейфов.

Добавил контроль напряжения сети 220В. И по ходу эксплуатации обнаружилось, что во время пурги на улице пошаливает электричество в сети, видимо случаются где то перехлестывания проводов ЛЭП и напряжение "дребезжит" потом вырубается, до восстановления его энергетиками. Так вот Ардуинка успевала за эти мгновения дребезка настряпать в эфир по 4 СМС сообщений. Сделал простую задержку, после первого импульса отключения, и после подачи напряжения. Ну и естественно с временем этого события.

Добавил вольтметр, чтобы контролировать напряжение после ИБП. Полезно, когда дом остался без электричество и арудинка пребывает на аккумуляторе. Ну и когда вот вот каюк ему настанет пошлет СМС. Так же при перезаряде сообщит.

Модернизировал цикл пожарной сигнализации...ничего гениального не придумал, просто сделал тактику работы, как у современных приборов пожарной сигнализции. Сделал режим "проверка" Чтобы, была возможность проверить работоспособность датчиков без тревог и отсылания СМС.

Добавил счетчик отправленных СМС. Так для статистики, чтобы знать куда деньги деваются со счета. Ну и если у вас пакет СМС-ок, то когда он закончится.

Оптимизировал работу с датчиками даллас... теперь, если датчик выдал -127, то система сразу делает переопрос датчиков добавляет в счетчик "косяков" датчиков +1. И вуаля! работать стало хорошо. А косяки потому что я до сих пор не заменил кабель на витую пару и не поменял резистор на шину данных. Ну погоды не было еще, вот сейчас тепло станет, доделаю.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Причесал контроллерный шкаф

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

В силовом шкафу ничего нового

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

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

Выкладываю последний программный код:

 

 
 
///////////////////////Программа "умного дома" на основе MEGA2650////////////////////////
 
//Автор: Макаров Вячеслав email:chernisheevka@mail.ru
 
#include <OneWire.h> // библиотека для DS18B20
#include <DallasTemperature.h> // библиотека для DS18B20
// http://compcar.ru/forum/showthread.php?t=8593&page=43 чтение датчиков по адресам
// http://robocraft.ru/blog/arduino/136.html про датчики DS18S20
// http://mk90.blogspot.ru/2011/04/1-wire.html  соединение датчиков DS18B20
#define ONE_WIRE_BUS 7  // датчики DS18B20 на 7 пин
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature ds(&oneWire);  // Везде где встречается ds - это работа с датчиками Dallas DS18B20
DeviceAddress ZalC =    { 0x28, 0x8C, 0xAE, 0xEA, 0x05, 0x00, 0x00, 0x7F }; // Сетевой адрес датчика DS18B20 в доме
DeviceAddress UlicaC =  { 0x28, 0x2B, 0x0F, 0x36, 0x04, 0x00, 0x00, 0xE0 }; // Сетевой адрес датчика DS18B20 на улице
DeviceAddress KuhnyaC = { 0x28, 0xDE, 0x7A, 0xEB, 0x05, 0x00, 0x00, 0xF1 }; // Сетевой адрес датчика DS18B20 в кухне
int tempC; // для работы с DS18B20
 
int  TempZalC    = 15;  // Переменная. Измеренная температура в зале    (По умолчанию 15гр.С)
int  TempUlicaC  = 15;  // Переменная. Измеренная температура на улице  (По умолчанию 15гр.С)
int  TempKuhnyaC = 15;  // Переменная. Измеренная температура на кухне  (По умолчанию 15гр.С)
int  TempPodpol  = 15;  // Переменная. Измеренная температура в подполе (По умолчанию 15гр.С)
int  UlicaS      = 15;  // Переменная. Измеренная освещенность на улице (По умолчанию 15%)
 
//_______Все для цикла void irremote()____________________________________________________________________
 
#include <IRremote.h>
//как исправить косяк с конфликтом таймеров при работе библиотеки IRremote и функции Tone
 
IRrecv irrecv(8);
decode_results results;
 
//_______Все для цикла void otoplenie()____________________________________________________________________
 
int tempDust = 25;     // Уставка желаемой температуры в доме (По умолчанию 25гр.С)
int tempDECOust = 15;  // Уставка температуры в доме в режиме "Экономия"(По умолчанию 15гр.С)
//#include <EEPROM.h>  //библиотека работы с SD-картой
 
#include <dht11.h>     //библиотека датчика DTH11
#define DHT11PIN 6     //Датчик DTH11 на pin6
dht11 dht;
 
#include <DS1302.h>          // библиотека работы с часами
DS1302 rtc(2, 3, 4);         // Часы на DS1302 2-RST,3-DAT,4-CLK 
Time t;
int RTCSekunda;              // Переменная "секунда" для суточного таймера цикл RTCtimer()
int RTCChas;                 // Переменная "час" для суточного таймера цикл RTCtimer()
int RTCMinuta;               // Переменная "минута" для суточного таймера
 
boolean statusKur=false;     // Флаг "работа курантов" 
 
boolean statusDay=false;     // Флаг "Режим работы true - дневной, false - ночной"
 
boolean SMSDvigenieK=false;  // Флаг "Отправлена СМС о движении на кухне"
boolean SMSDvigenieV=false;  // Флаг "Отправлена СМС о движении в ванной"
boolean SMSDvigenieZ=false;  // Флаг "Отправлена СМС о движении в зале"
boolean SMSDvigenieS=false;  // Флаг "Отправлена СМС о входе"
boolean SMSVoltOFF=false;    // Флаг "Отправлена СМС об отключении питания 220в"
boolean SMSVoltON=false;     // Флаг "Отправлена СМС о восстановлении питания 220в"
boolean SMSBanyaTemp=false;  // Флаг "Отправлена СМС о предельной температуре в бане"
boolean SMSPodpol=false;     // Флаг "Отправлена СМС об затоплении подпола"
boolean SMSFireSensor=false; // Флаг "Отправлена СМС о сработке дымового датчика"
boolean SMSFireAlarm=false;  // Флаг "Отправлена СМС о сработке пожарной сигнализации"
boolean SMSDelete=false;     // Флаг "Удалены все СМС на SIM900"
boolean TimeSMSzapros=false; // Флаг "Отправлена СМС о состоянии дома по таймеру"
boolean SMSAlarmTemp=false;  // Флаг "Отправлена СМС о критической температуре"
boolean SMSVoltIBP=false;    // Флаг "Отправлена СМС о низком заряде аккумулятора"
//boolean EcoTempDust=false;   // Флаг "Экономия отопления"
int SMSschet=0;        // Подсчет кол-ва отправленных смс
int Fireschet=0;       // Подсчет кол-ва срабатываний пож.шлейфа
int dsshet=0;          // Подсчет кол-ва ошибок DS18B20
 
int   vlaga=0;         // Значение влажности в цикле ventilyaciya()
int pambilang;         // переменная для цикла sirena()
 
//_______Все для цикла void voltmetr()
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
int volt = 0;          // Напряжение на входе АЦП
 
int statushome=0;      // переменная статуса включения умного дома 1 - включен, 0 -выключен
int statusotp=0;       // статус отопления дома                0 - откл , 1- вкл , 2- экономия
int statusrzd=0;       // статус питания розеток дома          0 - откл , 1- вкл
int statusgaraj=0;     // статус питания гаража                0 - откл , 1- вкл
int statusbania=0;     // статус питания бани                  0 - откл , 1- вкл
int statusPump=0;      // статус питания станции водоснабжения 0 - откл , 1- вкл
int perimetr=0;        // статус включения охраны периметра    0 - откл , 1- вкл
int statusperimetr=0;  // статус периметра        1 - все двери закрыты , 0 - дверь не закрыта
int statuspoliv=0;     // статус полива                        0 - откл , 1- вкл , 2- Таймер
int statusAlarm=0;     // Переменная "Наличие тревоги"
int AlarmTemp=0;       // Переменная "Наличие тревоги по критической температуре"
int statusFireAlarm=0; // Переменная "Режим работы пож.сигнализации" - 0 - откл , 1- вкл , 2- проверка, 3-в тревоге
int signaliz=0;        // Переменная "Режим работы охр.сигнализации" - 0 - откл , 1- вкл , 2- постановка на охрану, 3-в тревоге
int statusPIK=0;       // статус работы тональной пищалки              0 - откл , 1- вкл
 
boolean statusBlock=false;  // статус блокировки освещения зала пользователем
 
int intervalPIK = 1000;//  интервал для цикла Pik()
int TonPIK = 2500;     //  частота тона пищалки
//_________ флаги для таймеров______________________________________
boolean Timer1On = false;  //Флаг таймера РЕЗЕРВ
boolean Timer2On = false;  //Флаг таймера постановки на охрану
 
//_________ переменные времени для таймеров_________________________
unsigned long EndPikMillis = 0; // храним время последнего тона для цикла Pik()
unsigned long NowTime1 = 0;         // переменная хранения времени таймера №1 
unsigned long StartTime1 = 0;       // переменная хранения времени запуска таймера №1 
unsigned long NowTime2 = 0;         // переменная хранения времени таймера №2 
unsigned long StartTime2 = 0;       // переменная хранения времени запуска таймера №2 
 
 
//_________ флаги для цикла Kvitirovanie()(сброс звука сирены)______________________________________
boolean KvitDI30 = false;     //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 30
boolean KvitDI29 = false;     //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 29
boolean KvitDI31 = false;     //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 31
boolean KvitZalC = false;     //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура зал
boolean KvitUlicaC = false;   //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура улицы
boolean KvitKuhnyaC = false;  //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура кухни
boolean KvitPodpolC=false;    //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура в подполе  
 
//boolean KvitAI14 = false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход A14
 
long previousMillis = 0;    // храним время последнего замера влажности для цикла izmereniya()
long interval = 120000;     // интервал между замерами параметров для цикла  izmereniya() 2 минуты 
 
//______ Переменные для цикла avtosvet() взято с http://zelectro.com.ua/PIR_sensor ___________________________
long unsigned int lowIn_K;  // Время, в которое был принят сигнал отсутствия движения на кухне(LOW)
long unsigned int lowIn_V;  // Время, в которое был принят сигнал отсутствия движения в ванной(LOW)
long unsigned int lowIn_Z;  // Время, в которое был принят сигнал отсутствия движения в зале(LOW)
long unsigned int lowIn_S;  // Время, в которое был принят сигнал отсутствия движения в сенях(LOW)
long unsigned int pause_K = 30000; //Пауза, после которой движение считается оконченным (30сек)
long unsigned int pause_V = 30000; //Пауза, после которой движение считается оконченным (30сек)
long unsigned int pause_Z = 240000; //Пауза, после которой движение считается оконченным (4 мин)
long unsigned int pause_S = 30000; //Пауза, после которой движение считается оконченным (30сек)
boolean lockLow_K = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow_V = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow_Z = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow_S = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean takeLowTime_K; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime_V; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime_Z; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime_S; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
int pirPin_K = 26;    //вывод подключения PIR датчика Кухни
int pirPin_V = 24;    //вывод подключения PIR датчика Ванной
int pirPin_Z = 22;    //вывод подключения PIR датчика Зал
int pirPin_S = 28;    //вывод подключения PIR датчика Сени
 
//_______Для работы терминала по  bluetooth___________________________
int inSize=0;  // Переменная которая будет содержать размер буфера терминала bluetooth
char str[128]; // Так как типа string тут нет, будем использовать массив символов
 
//_______Для работы терминала по  Sim900______________________________
 
String currStr = "";
boolean isStringMessage = false;  // Переменная принимает значение True, если текущая строка является сообщением
 
//___________________ Стартовый цикл _________________________________
 
void setup()
 
{
  ds.begin();
  ds.setResolution(ZalC, 10);   
  ds.setResolution(UlicaC, 10); 
  ds.setResolution(KuhnyaC, 10); 
  
  pinMode(22, INPUT); digitalWrite(22,HIGH);    // вход датчик движения зал
  pinMode(24, INPUT); digitalWrite(24,HIGH);    // вход датчик движения ванна
  pinMode(26, INPUT); digitalWrite(26,HIGH);    // вход датчик движения кухня
  pinMode(28, INPUT); digitalWrite(28,HIGH);    // вход датчик движения сени
  pinMode(30, INPUT); digitalWrite(30,HIGH);    // вход сигнализатор "Вода в подполе"
  pinMode(32, INPUT); digitalWrite(32,HIGH);    // Резерв
  pinMode(34, INPUT); digitalWrite(34,HIGH);    // Резерв
  pinMode(36, INPUT); digitalWrite(36,HIGH);    // Резерв
  
  pinMode(23, INPUT); digitalWrite(23,HIGH);    // вход концевики ворот
  pinMode(25, INPUT); digitalWrite(25,HIGH);    // вход концевик входной двери
  pinMode(27, INPUT); digitalWrite(27,HIGH);    // вход концевик двери бани
  pinMode(29, INPUT); digitalWrite(29,HIGH);    // вход термостат "Баня готова"
  pinMode(31, INPUT); digitalWrite(31,HIGH);    // вход термостат "Очень высока температура в бане"
  pinMode(33, INPUT); digitalWrite(33,HIGH);    // Дымовой шлейф №1
  pinMode(35, INPUT); digitalWrite(35,HIGH);    // Дымовой шлейф №2
  pinMode(37, INPUT); digitalWrite(37,HIGH);    // Нет напряжения после УЗО
    
  pinMode( 5, OUTPUT);     // Пьезо динамик
  pinMode(13, OUTPUT);     // Лампа УД включен
  
  pinMode(38, OUTPUT);     // Свет в Кухня
  pinMode(40, OUTPUT);     // Свет в Ванна
  pinMode(42, OUTPUT);     // Свет в Зал
  pinMode(44, OUTPUT);     // Свет в Сени
  pinMode(46, OUTPUT);     // Питание насосной станции
  pinMode(48, OUTPUT);     // Питание дренажного насоса
  pinMode(50, OUTPUT);     // Питание водонагревателя
  pinMode(52, OUTPUT);     // Освещение двора
  
  digitalWrite(38,HIGH);   // Подаем единицы на плату реле (сигнал инвентированный)
  digitalWrite(40,HIGH);   // Подаем единицы на плату реле (сигнал инвентированный)
  digitalWrite(42,HIGH);   // Подаем единицы на плату реле (сигнал инвентированный)
  digitalWrite(44,HIGH);   // Подаем единицы на плату реле (сигнал инвентированный)
  digitalWrite(46,HIGH);   // Подаем единицы на плату реле (сигнал инвентированный)
  digitalWrite(48,HIGH);   // Подаем единицы на плату реле (сигнал инвентированный)
  digitalWrite(50,HIGH);   // Подаем единицы на плату реле (сигнал инвентированный)
  digitalWrite(52,HIGH);   // Подаем единицы на плату реле (сигнал инвентированный)
  
  pinMode(39, OUTPUT);     // Питание гаража
  pinMode(41, OUTPUT);     // Питание бани
  pinMode(43, OUTPUT);     // Питание розеток дома 
  pinMode(45, OUTPUT);     // Питание вентиляции
  
  pinMode(47, OUTPUT);     // Клапан полива
  pinMode(49, OUTPUT);     // Сирены
  pinMode(51, OUTPUT);     // Номер дома
  pinMode(53, OUTPUT);     // Управление отоплением
  
  Serial.begin(9600);      // Связь по терминалу
  Serial1.begin(9600);     // HC-05 Bluetooth http://robocraft.ru/blog/electronics/587.html#comment4652
  Serial2.begin(19200);     // GSM SMS-передача плата SIM900
  //Serial3.begin(9600);    // Плата голосового оповещения на attiny2313 и SD-карте
  delay(2000);
  SMSVoltON=true;
  NastroykaGSM();           // Настройка работы с SIM900
  irrecv.enableIRIn();      // Запуск ИК-приемника
  tone(5, 2000, 200);       // Звук, когда все готово!
  delay(5000);
  t = rtc.getTime();
  RTCChas = t.hour;   // t.hour - запрос часов
  RTCMinuta = t.min;  // t.min  - запрос минут
  startOneSMS();
  Serial2.print("SmartHome vkluchen - "); // дом включен
  Serial2.print(RTCChas); Serial2.print(":"); Serial2.print(RTCMinuta); // время включения
  EndSMS();
}
 
void loop()
{
   RTCtimer();
   izmereniya();
   alarms();
   irremote();
   bluetooth();
   sms_read();
   osvechenie(); // Управление освещением во дворе
   if (!statusFireAlarm==0){FireAlarm();}                                     // Работа пожарной сигнализации
   if (statushome==1) {avtosvet();}                                           // Автоматическое управление освещением в доме меньше 11%
   if (statushome==1){digitalWrite(13,HIGH);}   else {digitalWrite(13, LOW);} // Лампа "Умный дом включен"
   //if (statushome==1){ventilyaciya();}                                      // Управление вентиляцией в подполе по датчику влажности DHT11 
   if (statusotp==1) {otoplenie();} else {digitalWrite(53, LOW);}             // Управление работой газового котла 1 - вкл., 0 - откл.
   if (!signaliz==0){signalizSMS();}                                          // Работа сигнализации сигнализации при режимах 1,2,3
   if (statusPIK==1){Pik();}                                                  // Работа тональной пищалки
   if (perimetr==1){Operimetr();}                                             // Охрана периметра участка
   if ((statusPump==1) && (digitalRead(30)==LOW)) {digitalWrite(46,LOW);} else {digitalWrite(46, HIGH);} // Питание станции водоснабжения (Сигнал инвертированный)
   if (statusrzd==1){digitalWrite(43,HIGH);}    else {digitalWrite(43, LOW);} // Питание розеток дома 
   if (statusgaraj==1){digitalWrite(39,HIGH);}  else {digitalWrite(39, LOW);} // Питание гаража
   if (statusbania==1){digitalWrite(41,HIGH);}  else {digitalWrite(41, LOW);} // Питание бани
   if (statuspoliv==0) {digitalWrite(47, LOW);}                               // Выключение клапана полива
   if (statuspoliv==1) {digitalWrite(47, HIGH);}                              // Включение клапана полива на постоянку
   if (statuspoliv==2) {digitalWrite(47, HIGH); timerPoliv();}                // Клапан полива включен по таймеру
   if ((perimetr==1 && statusperimetr==0) || statusAlarm==1) { sirena();}     // Работа малой сирены
   
   //if (analogRead(14)>100)    {KvitAI14=false;}                       // Сброс квитирования при возвращении параметра в норму
   if (digitalRead(29)==LOW)  {KvitDI29=false;}                         // Сброс квитирования при возвращении параметра в норму
   if (digitalRead(30)==LOW)  {KvitDI30=false;}                         // Сброс квитирования при возвращении параметра в норму
   if (digitalRead(31)==LOW)  {KvitDI31=false;}                         // Сброс квитирования при возвращении параметра в норму
   if ( TempZalC != -127    && TempZalC > 10)  {KvitZalC=false;}        // Сброс квитирования при возвращении параметра в норму
   if ( TempZalC != -127    && TempZalC < 35)  {KvitZalC=false;}        // Сброс квитирования при возвращении параметра в норму
   if ( TempUlicaC != -127  && TempUlicaC < 50)  {KvitUlicaC=false;}    // Сброс квитирования при возвращении параметра в норму
   if ( TempKuhnyaC != -127 && TempKuhnyaC > 10) {KvitKuhnyaC=false;}   // Сброс квитирования при возвращении параметра в норму
   if ( TempKuhnyaC != -127 && TempKuhnyaC < 35) {KvitKuhnyaC=false;}   // Сброс квитирования при возвращении параметра в норму
   if ( TempPodpol > 3 && (TempPodpol < 35)) {KvitPodpolC=false;}       // Сброс квитирования при возвращении параметра в норму
}
 
void RTCtimer()  // Цикл суточного таймера на RTC модуле DS1302
{
t = rtc.getTime();
//RTCSekunda = t.sec; // t.sec  - запрос секунд
RTCChas = t.hour;   // t.hour - запрос часов
RTCMinuta = t.min;  // t.min  - запрос минут
if(RTCChas == 0 && RTCMinuta == 1){statusPump=0;}    //в 0:01 выключить насосную станцию (включение вручную)
if(statushome==1 && RTCChas == 0 && RTCMinuta == 30 && digitalRead(25)==LOW){perimetr=1;}     //включение охраны периметра в 0:30
if(RTCChas == 6 && RTCMinuta == 40){perimetr=0;}                                             //выключение охраны периметра в 6:40
if(RTCChas > 16 && RTCChas < 23 && statushome==1){digitalWrite(48,LOW);} else {digitalWrite(48,HIGH);}    //в 16 до 23 Включить дренажный насос
if(RTCChas > 6 && RTCChas < 23 && statushome==1) {digitalWrite(50,LOW);} else {digitalWrite(50,HIGH);}    //в 6 до 23 Включить водонагреватель
if(RTCChas > 7 && RTCChas < 23 && RTCMinuta == 0 && statusKur==false){tone(5, 2500, 200); statusKur=true;} // Ежечасный сигнал (куранты) с 8-00 по 22-00
if(RTCMinuta != 0){statusKur=false;} // сброс флага statusKur
if(RTCChas > 8 && RTCChas < 23){statusDay=true;} else {statusDay=false;}     //c 8 до 23 время суток день
 
// Добавить ведение лога на SD ежесуточно
 
if(RTCChas == 12 && RTCMinuta == 0 && TimeSMSzapros==false && signaliz==1){SMSzapros(); TimeSMSzapros=true;} // Когда включена сигнализация, в 12:00 отправляем СМС о состоянии.
if(RTCMinuta != 0){TimeSMSzapros=false;} // сброс флага TimeSMSzapros
// Ежесуточно. Боремся с переполнением хранилища СМС от спама.  
if(RTCChas == 0 && RTCMinuta == 2 && SMSDelete==false){Serial2.print("AT+CMGDA=«DEL ALL»\r"); SMSDelete=true;} // Удаляем в 0:02 все СМС. 
if(RTCMinuta != 2){SMSDelete=false;} // сброс флага SMSDelete
 
// Добавить снижение температуры дома ночью на 1гр.С
}
 
void izmereniya()   //  Замер температур с датчиков DS18B20 и влажности с датчика DHT11 
   unsigned long currentMillis = millis();
   if(currentMillis - previousMillis > interval) { // Замеры в интервале 
     dht.read(DHT11PIN);                  // Замеры температур с DHT11
     delay(100);                          // Необязательная задержка
     vlaga = dht.humidity;                // Уровень влажности % с DHT11
     TempPodpol = dht.temperature;        // Температура в подполе  с DHT11
     ds.requestTemperatures();            // Замеры температур с DS18B20
     delay(750);                          // Необязательная задержка
     TempZalC    = ds.getTempC(ZalC);     // Считываем температуру в зале
     delay(100);
     TempUlicaC  = ds.getTempC(UlicaC);   // Считываем температуру на улице
     delay(100);
     TempKuhnyaC = ds.getTempC(KuhnyaC);  // Считываем температуру в кухне
     delay(100);
     if(TempZalC== -127 || TempUlicaC== -127 || TempKuhnyaC== -127) // Перезапрос при ошибке датчика
     {
       ds.requestTemperatures(); delay(750); dsshet++ ; // +1 к счетчику ошибок DS18B20
       TempZalC    = ds.getTempC(ZalC);     // Считываем температуру в зале
       delay(100);
       TempUlicaC  = ds.getTempC(UlicaC);   // Считываем температуру на улице
       delay(100);
       TempKuhnyaC = ds.getTempC(KuhnyaC);  // Считываем температуру в кухне
       delay(100);
      }
     UlicaS = analogRead(A15)/10;           // Считываем освещенность на улице
     voltmetr();                            // Считываем напряжения на выходе ИБП (норма 13,5в)
     previousMillis = currentMillis;}       // Сброс таймера
}
 
void voltmetr()  //____________Цикл "Вольтметр"__измерение напряжения на выходе ИБП
{
   volt = analogRead(A0);                       // А0 аналоговый вход вольтметра
   vout = (volt * 5.0) / 1024.0;             
   Vpit = vout / (10000.0/(100000.0+10000.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09) { Vpit=0.0;}                  // Округление до нуля 
}
 
void alarms()  //______________Цикл "тревожные сигналы"____// http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
{
       if (digitalRead(30)==HIGH && KvitDI30==false) { statusAlarm=1; statusPump=0; alarmsSMS();}           // Сработка датчика затопления подпола
  //else if (analogRead(14)<100    && KvitAI14==false) { statusAlarm=1; }                                   // Сработка датчика уровня дренажной емкости
  else if (digitalRead(29)==HIGH && KvitDI29==false) { statusAlarm=1; }                                     // Сработка датчика готовности бани
  else if (digitalRead(31)==HIGH && KvitDI31==false) { statusAlarm=1; alarmsSMS();}                         // Сработка датчика предельной температуры в бане
  else if ( TempZalC != -127    && TempZalC < 10    && KvitZalC==false )    {statusAlarm=1; AlarmTemp=1; alarmsSMS();}  // Сигнализация низкой температуры в зале +10
  else if ( TempZalC != -127    && TempZalC > 35    && KvitZalC==false )    {statusAlarm=1; AlarmTemp=1; alarmsSMS();}  // Сигнализация высокой температуры в зале +35
  else if ( TempUlicaC != -127  && TempUlicaC > 50  && KvitUlicaC==false )  {statusAlarm=1; AlarmTemp=1; alarmsSMS();}  // Сигнализация высокой температуры на улице +50
  else if ( TempKuhnyaC != -127 && TempKuhnyaC < 10 && KvitKuhnyaC==false ) {statusAlarm=1; AlarmTemp=1; alarmsSMS();}  // Сигнализация низкой температуры в кухне +10
  else if ( TempKuhnyaC != -127 && TempKuhnyaC > 35 && KvitKuhnyaC==false ) {statusAlarm=1; AlarmTemp=1; alarmsSMS();}  // Сигнализация высокой температуры в кухне +35
  else if (  TempPodpol < 3  && KvitPodpolC==false ) {statusAlarm=1; AlarmTemp=1; alarmsSMS();}  // Сигнализация низкой температуры в в подполе +3
  else if (  TempPodpol > 35 && KvitPodpolC==false ) {statusAlarm=1; AlarmTemp=1; alarmsSMS();}  // Сигнализация высокой температуры в подполе +35
 
  else if (digitalRead(37)==HIGH && SMSVoltOFF==false){ delay(2000); //(Задержка -защита от дребезга сети 220в)
           if (digitalRead(37)==HIGH && SMSVoltOFF==false){ startOneSMS(); Serial2.println("Propalo pitanie 220V! - ");
           Serial2.print(RTCChas); Serial2.print(":"); Serial2.print(RTCMinuta); // время отключения
           EndSMS(); SMSVoltOFF=true; SMSVoltON=false; homeOFF();} // Отключение питания 220В (выключаются реле)
             }
  else if (digitalRead(37)==LOW  && SMSVoltON==false){ delay(10000);  //(Задержка 10 сек -защита от дребезга сети 220в)
           if (digitalRead(37)==LOW  && SMSVoltON==false){ startOneSMS(); Serial2.println("Pitanie 220V vosstanovleno! - ");
           Serial2.print(RTCChas); Serial2.print(":"); Serial2.print(RTCMinuta); // время включения
           EndSMS(); SMSVoltON=true; SMSVoltOFF=false;}     // Восстановление питания 220В
             }
 
//  else if (Vpit<=12.0 && SMSVoltIBP==false)             { startOneSMS(); Serial2.println("Alarm! Min zaryad akkumulyatora IBP!"); EndSMS(); SMSVoltIBP=true;}             // Низкий заряд аккумулятора
//  else if (Vpit>=14.0 && SMSVoltIBP==false)             { startOneSMS(); Serial2.println("Alarm! Max zaryad akkumulyatora IBP!"); EndSMS(); SMSVoltIBP=true;}             // Перезаряд аккумулятора
  else {statusAlarm=0; AlarmTemp=0;}
}
 
void alarmsSMS()    //______Цикл отправки алармов по СМС__________________________________________________
{      
  if (digitalRead(30)==HIGH && SMSPodpol==false) //Отправка СМС о затоплении подпола
     { startOneSMS(); Serial2.println("Alarm!Voda v podpole!"); EndSMS(); 
       startTwoSMS(); Serial2.println("Alarm!Voda v podpole!"); EndSMS(); SMSPodpol=true;}
 
  if (AlarmTemp==1 && SMSAlarmTemp==false) //Отправка СМС о критической температуре
     { startOneSMS();
     Serial2.println("Alarm!Temperatura!");
     Serial2.print("Podpol:");  Serial2.print(TempPodpol);  Serial2.print("*C,");
     Serial2.print("Zal:");     Serial2.print(TempZalC);    Serial2.println("*C");
     Serial2.print("Ylica:");   Serial2.print(TempUlicaC);  Serial2.println("*C");
     Serial2.print("Kuhnya:");  Serial2.print(TempKuhnyaC); Serial2.println("*C");
     EndSMS();
       startTwoSMS();
     Serial2.println("Alarm!Temperatura!");
     Serial2.print("Podpol:");  Serial2.print(TempPodpol);  Serial2.print("*C,");
     Serial2.print("Zal:");     Serial2.print(TempZalC);    Serial2.println("*C");
     Serial2.print("Ylica:");   Serial2.print(TempUlicaC);  Serial2.println("*C");
     Serial2.print("Kuhnya:");  Serial2.print(TempKuhnyaC); Serial2.println("*C");
     EndSMS(); SMSAlarmTemp=true;}
 
  if (digitalRead(31)==HIGH && SMSBanyaTemp==false) //Отправка СМС о критической температуре в бане
     {startOneSMS(); Serial2.println("Alarm!Predelnaya temperatura v bane!"); EndSMS(); SMSBanyaTemp=true;}
}
 
void Kvitirovanie() // Цикл квитирование (выкл.звука при активной тревоге) до восстановления параметра в норму
{
statusAlarm=0; //Выключение тревоги 
if (digitalRead(30)==HIGH && KvitDI30==false) { KvitDI30=true; }                            //Квитирование сигнала с датчика затопления подпола
if (digitalRead(29)==HIGH && KvitDI29==false) { KvitDI29=true; }                            //Квитирование сигнала с датчика готовности бани
if (digitalRead(31)==HIGH && KvitDI31==false) { KvitDI31=true; }                            //Квитирование сигнала с датчика предельной температуры в бане
if ( TempZalC != -127    && TempZalC < 10 && KvitZalC==false )  {KvitZalC=true; }           //Квитирование сигнала низкой температуры в зале +10
if ( TempZalC != -127    && TempZalC > 35 && KvitZalC==false )  {KvitZalC=true; }           //Квитирование сигнала высокой температуры в зале +35
if ( TempUlicaC != -127  && TempUlicaC > 50 && KvitUlicaC==false )  {KvitUlicaC=true; }     //Квитирование сигнала высокой температуры на улице +50
if ( TempKuhnyaC != -127 && TempKuhnyaC < 10 && KvitKuhnyaC==false ) {KvitKuhnyaC=true; }   //Квитирование сигнала низкой температуры в кухне +10
if ( TempKuhnyaC != -127 && TempKuhnyaC > 35 && KvitKuhnyaC==false ) {KvitKuhnyaC=true; }   //Квитирование сигнала высокой температуры в кухне +35
if ( TempPodpol < 3 && KvitPodpolC==false ) {KvitPodpolC=true; }                            //Квитирование сигнала низкой температуры в подполе +3
if ( TempPodpol > 35 && KvitPodpolC==false) {KvitPodpolC=true; }                            //Квитирование сигнала высокой температуры в подполе +35
//if (analogRead(14)<100     && KvitAI14==false) { KvitAI14=true; }                         //Квитирование сигнала с датчика уровня дренажной емкости
}
 
void irremote() //_________ Управление умным домом по ИК-пульту________________________________________________________________
{
   if (irrecv.decode(&results)) {
 
            if (results.value == 0x61D6F00F) // кнопка SOURSE - пож.сигнализация
            {      if (statusFireAlarm==0)
                      { tone(5, 2500, 100); statusFireAlarm=1; SMSFireSensor=false; SMSFireAlarm=false; statusPIK=0; intervalPIK=1000;}
              else if (statusFireAlarm==1)
                      { tone(5, 2500, 100); statusFireAlarm=4; SMSFireSensor=false; SMSFireAlarm=false;}
              else if (statusFireAlarm==2 || statusFireAlarm==3 || statusFireAlarm==4) //выключение пож.сигнализации
                      { tone(5, 1500, 100); statusFireAlarm=0; SMSFireSensor=false; SMSFireAlarm=false; statusPIK=0; intervalPIK=1000;}
            }
 
       else if (results.value == 0x61D628D7) // кнопка TIME SHIFT  - охранная сигнализация 
            {      if ( signaliz==0 )  { tone(5, 2500, 100); Timer2On=true; signaliz=2;} // Включение
              else if ( signaliz==1 || signaliz==2 )
                      { tone(5, 1500, 100); delay(100); statusPIK=0; intervalPIK=1000; signaliz=0;} // Выключение
            }         
 
       else if (results.value == 0x61D608F7) // кнопка MUTE  - квитирование тревоги 
         { Kvitirovanie(); tone(5, 2500, 100);  statusPIK=0; intervalPIK=1000; }
 
       else if (results.value == 0x61D648B7) // кнопка POWER  - питание дома 
            {      if (statushome==1){ tone(5, 1500, 100); homeOFF();} // Выключение
              else if (statushome==0){ tone(5, 2500, 100); homeON(); } // Включение
            }
 
       else if (results.value == 0x61D6C837) // кнопка PREV.CH  - вентиляция
            {      if ( digitalRead(45)==LOW ) { tone(5, 1500, 100); digitalWrite(45,HIGH);} // Выключение
              else if ( digitalRead(45)==HIGH ){ tone(5, 2500, 100); digitalWrite(45,LOW); } // Включение
            }
 
       else if (results.value == 0x61D6E817) // кнопка SIZE  - охрана периметра дома
            {      if ( perimetr==0 ){ tone(5, 2500, 100); perimetr=1; delay(100);} // Включение
              else if ( perimetr==1 ){ tone(5, 1500, 100); perimetr=0; delay(100);} // Выключение
            }
 
       else if (results.value == 0x61D68877) // кнопка STOP  - блокировки света в зале
            {      if ( statusBlock==false ){ tone(5, 2500, 100); statusBlock=true;}  // Включение блокировки
              else if ( statusBlock==true  ){ tone(5, 1500, 100); statusBlock=false;} // Выключение блокировки
            }
 
       else if (results.value == 0x61D6807F) // кнопка 1  - освещение  на кухне
            {      if ( digitalRead(26)==LOW ) { tone(5, 1500, 100); digitalWrite(26,HIGH);} // Выключение
              else if ( digitalRead(26)==HIGH ){ tone(5, 2500, 100); digitalWrite(26,LOW); } // Включение
            }
 
       else if (results.value == 0x61D640BF) // кнопка 2  - освещение в ванне
            {      if ( digitalRead(24)==LOW ) { tone(5, 1500, 100); digitalWrite(24,HIGH);} // Выключение
              else if ( digitalRead(24)==HIGH ){ tone(5, 2500, 100); digitalWrite(24,LOW); } // Включение
            }
 
       else if (results.value == 0x61D6C03F) // кнопка 3  - освещение в зале
            {      if ( digitalRead(22)==LOW ) { tone(5, 1500, 100); digitalWrite(22,HIGH);} // Выключение
              else if ( digitalRead(22)==HIGH ){ tone(5, 2500, 100); digitalWrite(22,LOW); } // Включение
            }
 
       else if (results.value == 0x61D620DF) // кнопка 4  - освещение в сенях
            {      if ( digitalRead(28)==LOW ) { tone(5, 1500, 100); digitalWrite(28,HIGH);} // Выключение
              else if ( digitalRead(28)==HIGH ){ tone(5, 2500, 100); digitalWrite(28,LOW); } // Включение
            }
 
       else if (results.value == 0x61D6A05F) // кнопка 5  - насосная станция
            {      if ( statusPump==0 ){ statusPump=1; tone(5, 2500, 100); } // Включение
              else if ( statusPump==1 ){ statusPump=0; tone(5, 1500, 100); } // Выключение
            }
       else if (results.value == 0x61D6609F) // кнопка 6  - дренажный насос
            {      if ( digitalRead(48)==LOW ) { digitalWrite(48,HIGH); tone(5, 2500, 100); } // Включение
              else if ( digitalRead(48)==HIGH ){ digitalWrite(48,LOW);  tone(5, 1500, 100); } // Выключение
            }
 
       else if (results.value == 0x61D6E01F) // кнопка 7  - водонагреватель
            {      if ( digitalRead(50)==LOW ) { digitalWrite(50,HIGH); tone(5, 2500, 100); } // Включение
              else if ( digitalRead(50)==HIGH ){ digitalWrite(50,LOW);  tone(5, 1500, 100); } // Выключение
            }
 
       else if (results.value == 0x61D610EF) // кнопка 8  - уличное освещение
            {      if ( digitalRead(52)==LOW ) { digitalWrite(52,HIGH); tone(5, 2500, 100); } // Включение 
              else if ( digitalRead(52)==HIGH ){ digitalWrite(52,LOW);  tone(5, 1500, 100); } // Выключение 
            }
 
       else if (results.value == 0x61D6906F) // кнопка 9  - питание в гараже 
            {      if ( digitalRead(39)==LOW ) { digitalWrite(39,HIGH); tone(5, 2500, 100); } // Включение 
              else if ( digitalRead(39)==HIGH ){ digitalWrite(39,LOW);  tone(5, 1500, 100); } // Выключение 
            }
 
       else if (results.value == 0x61D600FF) // кнопка 0  - питание в бане
            {      if ( digitalRead(41)==LOW ) { digitalWrite(41,HIGH); tone(5, 2500, 100); } // Включение
              else if ( digitalRead(41)==HIGH ){ digitalWrite(41,LOW);  tone(5, 1500, 100); } // Выключение
            }
 
       else if (results.value == 0x61D630CF) // кнопка CH.SURF  - сброс климат контроля отопления на 25гр.С
            { tempDust=25; tone(5, 2500, 100); } // уставка на 25гр.С
 
       else if (results.value == 0x61D6D827) // кнопка VOLUME.ВВЕРХ  - +1гр. климат контроля отопления
            { tempDust = (tempDust+1); delay(100); tone(5, 1500, 100); } //Прибавление желаемой температуры в доме на 1гр.С
 
       else if (results.value == 0x61D6F807) // кнопка VOLUME.ВНИЗ  - -1гр. климат контроля отопления
            { tempDust = (tempDust-1); delay(100); tone(5, 1500, 100); } //Убавление желаемой температуры в доме на 1гр.С
 
       else if (results.value == 0x61D66897) // кнопка REC  - звонок телефонному номеру №1 (тревожная кнопка)
            { ZvonokS();} // Запуск цикла дозвона до абонента №1
 
       else if (results.value == 0x61D618E7) // кнопка SNAP  - звонок телефонному номеру №2 (тревожная кнопка)
            { ZvonokT();} // Запуск цикла дозвона до абонента №2
 
      irrecv.resume(); // Получить слудующее значение
    }
}
 
 
void bluetooth() //_________ Контроль и управление умным домом по терминалу НС-05_http://rezoh.ru/?p=1754 взято тут
inSize=0; // Сбрасываем переменную
memset(str, '\0', 128); // Очищаем массив
 if(Serial1.available() > 0)
 {
   delay(200); // Ждем, для того, чтобы пришли все данные
   inSize = Serial1.available(); // Получаем длину строки и записываем ее в переменую
   for (int i = 0; i < inSize; i++)
   {
     str[i] = Serial1.read(); // Читаем каждый символ, и пишем его в массив
   }
   // Сравнять массив с строкой будем используя функцию strcmp
    
         if (strcmp(str, "OTOPLENIE-ON") == 0)  { statusotp=1; tone(5, 2500, 100);} // Включение  климат-контроля дома
    else if (strcmp(str, "OTOPLENIE-OFF") == 0) { statusotp=0; tone(5, 1500, 100);} // Выключение климат-контроля дома
    else if (strcmp(str, "OTOPLENIE-ECO") == 0) { statusotp=2; tone(5, 2500, 100);} // Включение  климат-контроля в режим экономии
    
    else if (strcmp(str, "OTOPLENIE") == 0) // Переключение режимов отопления одной кнопкой
           {      if ( statusotp==0 )  { statusotp=1; Serial1.println("KLIMAT CONTROL - ON");  tone(5, 2500, 100); } // Включение климат-контроля дома
             else if ( statusotp==1 )  { statusotp=2; Serial1.println("KLIMAT CONTROL - ECO"); tone(5, 2500, 100); } // Включение климат-контроля в режим экономии
             else if ( statusotp==2 )  { statusotp=0; Serial1.println("KLIMAT CONTROL - OFF"); tone(5, 1500, 100); } // Выключение климат-контроля дома  
           }
           
    else if (strcmp(str, "FIREALARM") == 0) // Переключение режимов пожарной сигнализации одной кнопкой
           {
                 if ( statusFireAlarm==0 )  { statusFireAlarm=1; SMSFireSensor=false; SMSFireAlarm=false; Serial1.println("Pozharnaya signalizaciya - ON");  statusPIK=0; intervalPIK=1000; tone(5, 2500, 100); }
            else if ( statusFireAlarm==1 )  { statusFireAlarm=4; SMSFireSensor=false; SMSFireAlarm=false; Serial1.println("Pozharnaya signalizaciya - PROVERKA"); tone(5, 2500, 100); }
            else if ( statusFireAlarm==2 || statusFireAlarm==3 || statusFireAlarm==4 )
               { statusFireAlarm=0; SMSFireSensor=false; SMSFireAlarm=false; Serial1.println("Pozharnaya signalizaciya - OFF");  statusPIK=0; intervalPIK=1000; tone(5, 1500, 100); }
           }
           
    else if (strcmp(str, "FIREALARM-ON") == 0) // Включение пожарной сигнализации
    { statusFireAlarm=1; SMSFireSensor=false; SMSFireAlarm=false; statusPIK=0; intervalPIK=1000; tone(5, 2500, 100);}
    else if (strcmp(str, "FIREALARM-OFF") == 0) // Выключение пожарной сигнализации
    { statusFireAlarm=0; SMSFireSensor=false; SMSFireAlarm=false; statusPIK=0; intervalPIK=1000; tone(5, 1500, 100);}
    else if (strcmp(str, "FIREALARM-TEST") == 0) // Тестирование пожарной сигнализации
    { statusFireAlarm=4; SMSFireSensor=false; SMSFireAlarm=false; tone(5, 2500, 100);}
 
    else if (strcmp(str, "HOME") == 0) // Переключение режимов питания дома
                {
                      if (statushome== 0) { homeON();  Serial1.println("SISTEMA UMNIY DOM VKLUCHENA");  tone(5, 2500, 100);} // Включение системы умный дом
                 else if (statushome== 1) { homeOFF(); Serial1.println("SISTEMA UMNIY DOM OTKLUCHENA"); tone(5, 1500, 100);} // Выключение системы умный дом
                }
 
    else if (strcmp(str, "HOME-ON") == 0)  { homeON();  tone(5, 2500, 100);} // Включение питания дома
    else if (strcmp(str, "HOME-OFF") == 0) { homeOFF(); tone(5, 1500, 100);} // Выключение питания дома
        
    else if (strcmp(str, "ZAPROS") == 0) {  zapros(); tone(5, 2500, 100); delay(100);} // Передача параметров в терминал
    
    else if (strcmp(str, "KORRECT") == 0) { KorrectTime(); tone(5, 2500, 100); delay(100);} // Корректировка времени часов... вводит 30минут. 0 секунд
 
    else if (strcmp(str, "STANCIYA") == 0) // Включение и выключение насосной станции одной кнопкой
            {      if ( statusPump==0 ){ statusPump=1; Serial1.println("Stanciya vkluchena");  tone(5, 2500, 100); } // Включение станции водоснабжения
              else if ( statusPump==1 ){ statusPump=0; Serial1.println("Stanciya otkluchena"); tone(5, 1500, 100); } // Выключение станции водоснабжения
            }
    else if (strcmp(str, "STANCIYA-ON") == 0)  { statusPump=1; tone(5, 2500, 100); } // Включение станции водоснабжения 
    else if (strcmp(str, "STANCIYA-OFF") == 0) { statusPump=0; tone(5, 1500, 100); } // Выключение станции водоснабжения
 
    else if (strcmp(str, "BLOCK") == 0) // Включение и выключение блокировки света одной кнопкой
            {      if ( statusBlock==true )  { statusBlock=false; digitalWrite(42, LOW); Serial1.println("Blokirovka sveta otkluchena"); tone(5, 1500, 100); }  // Выключение блокировки света в зале
              else if ( statusBlock==false ) { statusBlock=true; digitalWrite(42, HIGH); Serial1.println("Blokirovka sveta vkluchena");  tone(5, 2500, 100); }  // Включение блокировки света в зале
            }                
    else if (strcmp(str, "BLOCK-ON") == 0)  { statusBlock=true; digitalWrite(42, HIGH); tone(5, 2500, 100); }  // Включение блокировки света в зале
    else if (strcmp(str, "BLOCK-OFF") == 0) { statusBlock=false; digitalWrite(42, LOW); tone(5, 1500, 100); }  // Выключение блокировки света в зале
   
    else if (strcmp(str, "MUTE") == 0) { Kvitirovanie(); tone(5, 2500, 100);  statusPIK=0; intervalPIK=1000; } // Квитирование (сброс тревоги)аварийных параметров
    
    else if (strcmp(str, "OHRANA") == 0) // Переключение режимов охранной сигнализации дома
            {      if ( signaliz==0 )  { Serial1.println("Signalizaciya vkluchena,u vas 5 minut dlya vihoda"); tone(5, 2500, 100); Timer2On=true; signaliz=2;} // Включение охранной сигнализации
              else if ( signaliz==1 || signaliz==2 ) { Serial1.println("Signalizaciya otkluchena"); tone(5, 1500, 100); delay(100); statusPIK=0; intervalPIK=1000; signaliz=0;} // Выключение охранной сигнализации
            }         
 
    else if (strcmp(str, "OHRANA-ON") == 0)  { tone(5, 2500, 100); Timer2On=true; signaliz=2;} // Включение охранной сигнализации
    else if (strcmp(str, "OHRANA-OFF") == 0) { tone(5, 1500, 100); delay(100); statusPIK=0; intervalPIK=1000; signaliz=0;} // Выключение охранной сигнализации
 
    else if (strcmp(str, "PERIMETR") == 0) // Включение и выключение охраны периметра одной кнопкой
            {      if ( perimetr==0 )  { perimetr=1; delay(100); tone(5, 2500, 100); Serial1.println("Ohrana perimetra vkluchena"); } // Включение охраны периметра
              else if ( perimetr==1 )  { perimetr=0; delay(100); tone(5, 1500, 100); Serial1.println("Ohrana perimetra otkluchena"); } // Выключение охраны периметра 
            }
    else if (strcmp(str, "PERIMETR-ON") == 0)  { perimetr=1; delay(100); tone(5, 2500, 100); } // Включение охраны периметра
    else if (strcmp(str, "PERIMETR-OFF") == 0) { perimetr=0; delay(100); tone(5, 1500, 100); } // Выключение охраны периметра
    
    else if (strcmp(str, "POLIV") == 0) // Переключение режимов полива растений
            {      if ( statuspoliv==0 )  { statuspoliv=2; Timer1On = true; tone(5, 2500, 100); Serial1.println("Poliv vkluchen");} // Включение таймера клапана полива растений
              else if ( statuspoliv==2 )  { statuspoliv=0; delay(100); tone(5, 1500, 100); Serial1.println("Poliv otkluchen");} // Выключение клапана полива растений
            }
 
    else if (strcmp(str, "POLIV-ON") == 0)  { statuspoliv=2; Timer1On = true; tone(5, 2500, 100); } // Включение клапана полива растений
    else if (strcmp(str, "POLIV-OFF") == 0) { statuspoliv=0; tone(5, 1500, 100); } // Выключение клапана полива растений
    
    else if (strcmp(str, "TEMP+") == 0) // Прибавление желаемой температуры в доме на 1гр.С
    { tempDust = (tempDust+1); delay(100); tone(5, 1500, 100);
    Serial1.print("KLIMAT KONTROL = "); Serial1.print(tempDust); Serial1.println("*C");}
 
    else if (strcmp(str, "TEMP-") == 0) // Уменьшение желаемой температуры в доме на 1гр.С
    { tempDust = (tempDust-1); delay(100); tone(5, 1500, 100);
    Serial1.print("KLIMAT KONTROL = "); Serial1.print(tempDust); Serial1.println("*C");}
   
    else if (strcmp(str, "START-GSM") == 0) { NastroykaGSM(); tone(5, 2500, 100); delay(100); Serial1.println("GSM NASTROEN");}// Настройка модуля SIM900
   
    else{ Serial1.println("Nevernaya comanda!");} 
  }          
}
 
void sms_read() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!Serial2.available()) return;
 
    char currSymb = Serial2.read();    
    if ('\r' == currSymb)
       {
         if (isStringMessage)
           {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
                   if (!currStr.compareTo("OTOPLENIE-ON"))   { statusotp=1; startOneSMS(); Serial2.println("KLIMAT CONTROL - ON");  EndSMS(); } // Включение климат-контроля дома
              else if (!currStr.compareTo("OTOPLENIE-OFF"))  { statusotp=0; startOneSMS(); Serial2.println("KLIMAT CONTROL - OFF"); EndSMS(); } // Выключение климат-контроля дома
              else if (!currStr.compareTo("OTOPLENIE-ECO"))  { statusotp=2; startOneSMS(); Serial2.println("KLIMAT CONTROL - ECO"); EndSMS(); } // Включение климат-контроля в режим экономии
            
              else if (!currStr.compareTo("FIREALARM-ON"))   { statusFireAlarm=1; SMSFireSensor=false;  statusPIK=0; intervalPIK=1000; SMSFireAlarm=false; startOneSMS(); Serial2.println("Pozharnaya signalizaciya - ON");       EndSMS(); } // Включение пожарной сигнализации
              else if (!currStr.compareTo("FIREALARM-OFF"))  { statusFireAlarm=0; SMSFireSensor=false;  statusPIK=0; intervalPIK=1000; SMSFireAlarm=false; startOneSMS(); Serial2.println("Pozharnaya signalizaciya - OFF");      EndSMS(); } // Выключение пожарной сигнализации
              else if (!currStr.compareTo("FIREALARM-TEST")) { statusFireAlarm=4; SMSFireSensor=false; SMSFireAlarm=false; startOneSMS(); Serial2.println("Pozharnaya signalizaciya - PROVERKA"); EndSMS(); } // Тестирование пожарной сигнализации
 
              else if (!currStr.compareTo("HOME-ON"))  { homeON();  startOneSMS(); Serial2.println("SISTEMA UMNIY DOM VKLUCHENA");  EndSMS();}  // Включение системы умный дом
              else if (!currStr.compareTo("HOME-OFF")) { homeOFF(); startOneSMS(); Serial2.println("SISTEMA UMNIY DOM OTKLUCHENA"); EndSMS();}  // Выключение системы умный дом
 
              else if (!currStr.compareTo("ZAPROS"))   { SMSzapros();} // Передача параметров по СМС
    
              else if (!currStr.compareTo("STANCIYA-ON"))  { statusPump=1; startOneSMS(); Serial2.println("Nasosnaya stanciya vkluchena"); EndSMS();}  // Включение станции водоснабжения
              else if (!currStr.compareTo("STANCIYA-OFF")) { statusPump=0; startOneSMS(); Serial2.println("Nasosnaya stanciya otkluchena"); EndSMS();} // Выключение станции водоснабжения
            
              else if (!currStr.compareTo("MUTE")) { Kvitirovanie();  statusPIK=0; intervalPIK=1000; }     // Квитирование (сброс тревоги)аварийных параметров
              
              else if (!currStr.compareTo("ZVONOKS")) { ZvonokS(); }        // Включение голосовой связи с хозяином #1
              else if (!currStr.compareTo("ZVONOKT")) { ZvonokT(); }        // Включение голосовой связи с хозяином #2
            
              else if (!currStr.compareTo("OHRANA-ON")) {  statusPIK=0; intervalPIK=1000; signalizON();}   // Включение охранной сигнализации
              else if (!currStr.compareTo("OHRANA-OFF")) {  statusPIK=0; intervalPIK=1000; signalizOFF();} // Выключение охранной сигнализации
 
              else if (!currStr.compareTo("PERIMETR-ON"))  { perimetr=1; startOneSMS(); Serial2.println("Ohrana perimetra vkluchena");  EndSMS();} // Включение охраны периметра
              else if (!currStr.compareTo("PERIMETR-OFF")) { perimetr=0; startOneSMS(); Serial2.println("Ohrana perimetra otkluchena"); EndSMS();} // Выключение охраны периметра
 
              else if (!currStr.compareTo("POLIV-ON"))  { statuspoliv=2; Timer1On = true; startOneSMS(); Serial2.println("Poliv vkluchen"); EndSMS();} // Включение клапана полива растений
              else if (!currStr.compareTo("POLIV-OFF")) { statuspoliv=0; startOneSMS(); Serial2.println("Poliv otkluchen"); EndSMS();}                 // Выключение клапана полива растений
 
            isStringMessage = false;
           }
         else { if (currStr.startsWith("+CMT")) { isStringMessage = true;}} //если текущая строка начинается с "+CMT",то следующая строка является сообщением
        currStr = "";
      } 
    else if ('\n' != currSymb) { currStr += String(currSymb);}
}
void osvechenie()
{
   if (UlicaS > 8){digitalWrite(52,HIGH);}  // Освещение двора выключить при освещении больше 8%  (сигнал инвертированный)
   if (UlicaS < 4) {digitalWrite(52,LOW);}  // Освещение двора включить при освещении меньше 4% (сигнал инвертированный)
}
  
void avtosvet()   //______Цикл управления автоматическим освещением____________________________________
{
 
  //______Ниже для зала______________________________________
  if(digitalRead(pirPin_Z) == HIGH && statusBlock==false && UlicaS < 30) //Если обнаружено движение, нет блокировки, и освещенность улицы меньше 20%
  {    
    if(lockLow_Z) //Если до этого момента еще не включили реле
    { lockLow_Z = false; digitalWrite(42, LOW); delay(50);}     //Включаем свет.     
    takeLowTime_Z = true;
  }  
  if(digitalRead(pirPin_Z) == LOW) //Ели движения нет
  { //Если время окончания движения еще не записано     
    if(takeLowTime_Z){lowIn_Z = millis();takeLowTime_Z = false;} //Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
    if(!lockLow_Z && millis() - lowIn_Z > pause_Z)               //Если время без движение превышает паузу => движение окончено
    { lockLow_Z = true; digitalWrite(42, HIGH); delay(50);}      //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения                
  } 
  if (statushome==1 && UlicaS > 35) {digitalWrite(42,HIGH);}     // Отключение реле управления освещением больше 35%
 
  //______Ниже для кухни______________________________________
  if(digitalRead(pirPin_K) == HIGH && statusDay==false && UlicaS < 30) //Если обнаружено движение с 23 до 8 включаем подсветку
  {    
    if(lockLow_K) //Если до этого момента еще не включили реле
    { lockLow_K = false; digitalWrite(38, LOW); delay(50);}   //Включаем свет.     
    takeLowTime_K = true;}  
  if(digitalRead(pirPin_K) == LOW) //Ели движения нет
  { //Если время окончания движения еще не записано     
    if(takeLowTime_K){lowIn_K = millis();takeLowTime_K = false;} //Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
    if(!lockLow_K && millis() - lowIn_K > pause_K)               //Если время без движение превышает паузу => движение окончено
    { lockLow_K = true; digitalWrite(38, HIGH); delay(50);}       //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения                
  }
  if (statushome==1 && UlicaS > 35) {digitalWrite(38,HIGH);}     // Отключение реле управления освещением больше 20%
 
  //______Ниже для ванной комнаты_____________________________
  if(digitalRead(pirPin_V) == HIGH && UlicaS < 30) //Если обнаружено движение
  {    
    if(lockLow_V) //Если до этого момента еще не включили реле
    { lockLow_V = false; digitalWrite(40, LOW); delay(50);}     //Включаем свет.     
    takeLowTime_V = true;}  
  if(digitalRead(pirPin_V) == LOW) //Ели движения нет
  { //Если время окончания движения еще не записано     
    if(takeLowTime_V){lowIn_V = millis();takeLowTime_V = false;} //Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
    if(!lockLow_V && millis() - lowIn_V > pause_V)               //Если время без движение превышает паузу => движение окончено
    { lockLow_V = true; digitalWrite(40, HIGH); delay(50);}       //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения                
  }
  if (statushome==1 && UlicaS > 35) {digitalWrite(40,HIGH);}     // Отключение реле управления освещением больше 35%
 
  //______Ниже для сеней______________________________________
  if(digitalRead(pirPin_S) == HIGH && UlicaS < 16) //Если обнаружено движение
  {    
    if(lockLow_S) //Если до этого момента еще не включили реле
    { lockLow_S = false; digitalWrite(44, LOW); delay(50);}     //Включаем свет.     
    takeLowTime_S = true;}  
  if(digitalRead(pirPin_S) == LOW) //Ели движения нет
  { //Если время окончания движения еще не записано     
    if(takeLowTime_S){lowIn_S = millis();takeLowTime_S = false;} //Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
    if(!lockLow_S && millis() - lowIn_S > pause_S)               //Если время без движение превышает паузу => движение окончено
    { lockLow_S = true; digitalWrite(44, HIGH); delay(50);}      //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения                
  }
  if (statushome==1 && UlicaS > 20) {digitalWrite(44,HIGH);}     // Отключение реле управления освещением больше 20%
}
 
//   void ventilciya()
//     {
//   if (vlaga > 60) {digitalWrite(45, HIGH);} // Включение вентилятора при влажности более 60%
//   if (vlaga < 40) {digitalWrite(45, LOW);}  // Выключение вентилятора при влажности менее 40%
//   }
 
void FireAlarm()   //______Цикл пожарной сигнализации__________________________________________________
 
// Переменная statusFireAlarm=0 "Режим работы пож.сигнализации" - 0 - откл , 1- вкл , 2- внимание, 3- тревога, 4- проверка
{
 
   if(statusFireAlarm==1)  // Режим "включена"
     {
       if(digitalRead(33)==LOW || digitalRead(35)==LOW)
         { 
           Fireschet++ ; // +1 в счетчик срабатываний пож.шлейфов
           delay(3000); // задержка 3 сек (защита от случайных импульсов)
           if(digitalRead(33)==LOW || digitalRead(35)==LOW) { statusFireAlarm=2; } // переход в режим внимание
         }
     }
 
   if(statusFireAlarm==2) // Режим "внимание"
     {
       if(digitalRead(33)==LOW || digitalRead(35)==LOW) { intervalPIK=2000; Pik();} // 1 шлейф в сработке - режим "пищалка"
       if(digitalRead(33)==LOW || digitalRead(35)==LOW && SMSFireSensor==false)
         {   startOneSMS(); Serial2.println("Srabotal dimovoy datchik!"); EndSMS();
             startTwoSMS(); Serial2.println("Srabotal dimovoy datchik!"); EndSMS(); SMSFireSensor=true;}
 
      if(digitalRead(33)==LOW  && digitalRead(35)==LOW && SMSFireAlarm==false)
         {   startOneSMS(); Serial2.println("Srabotala pozharnaya signalizaciya!"); EndSMS();
             startTwoSMS(); Serial2.println("Srabotala pozharnaya signalizaciya!"); EndSMS(); SMSFireAlarm=true; statusFireAlarm=3; 
             homeOFF(); // выключили автоматику и обесточили электроприборы.
         }
      if(digitalRead(33)==HIGH && digitalRead(35)==HIGH) { statusFireAlarm=1;} // Если нет сработавших датчиков - ставим под охрану
     }
 
   if(statusFireAlarm==3)  // Режим "тревога"
     {
      if(digitalRead(33)==LOW  && digitalRead(35)==LOW) { sirena();} // Пока есть сработавшие датчики - режим "тревога"
      if(digitalRead(33)==HIGH && digitalRead(35)==HIGH) { statusFireAlarm=1;} // Если нет сработавших датчиков - ставим под охрану
     }
 
   if(statusFireAlarm==4) // Режим "тестирование"
     {
      Pik();
      if(digitalRead(33)==LOW  || digitalRead(35)==LOW)      { intervalPIK=600;} // При сработке 1-го дым шлейфа период 600мс
      else if(digitalRead(33)==LOW  && digitalRead(35)==LOW) { intervalPIK=300;} // При сработке 2-го дым шлейфа период 300мс
      else { intervalPIK=3000;}                                                  // Шлейфы в норме период 3 секунды
     }
}
 
void homeON() //____________Цикл включения умного дома____________________________________________________
{
  statushome=1;      // статус умного дома                   0 - откл , 1- вкл
//  statusotp=1;       // статус отопления дома                0 - откл , 1- вкл
  statusrzd=1;       // статус питания розеток дома          0 - откл , 1- вкл
//  statusgaraj=1;     // статус питания гаража                0 - откл , 1- вкл
//  statusbania=1;     // статус питания бани                  0 - откл , 1- вкл    
}
 
void homeOFF() //____________Цикл выключения умного дома________________________
{
  statushome=0;      // статус питания дома                  0 - откл , 1- вкл
  statusrzd=0;       // статус питания розеток дома          0 - откл , 1- вкл
  statusgaraj=0;     // статус питания гаража                0 - откл , 1- вкл
  statusbania=0;     // статус питания бани                  0 - откл , 1- вкл
  statusPump=0;      // статус питания станции водоснабжения 0 - откл , 1- вкл
  digitalWrite(38,HIGH); // выключение реле (сигнал инвертированный)
  digitalWrite(40,HIGH); // выключение реле (сигнал инвертированный)
  digitalWrite(42,HIGH); // выключение реле (сигнал инвертированный)
  digitalWrite(44,HIGH); // выключение реле (сигнал инвертированный)  
  digitalWrite(46,HIGH); // выключение реле (сигнал инвертированный)
  digitalWrite(48,HIGH); // выключение реле (сигнал инвертированный)  
  digitalWrite(50,HIGH); // выключение реле (сигнал инвертированный)    
  SMSAlarmTemp=false;   // сброс флага отправки СМС о критической темпертуры
  SMSBanyaTemp=false;   // сброс флага отправки СМС о критической темпертуры в бане
  SMSPodpol=false;      // сброс флага отправки СМС о воде в подполе
}
 
void KorrectTime() // Цикл корректировки времени RTC модуля. Корректирует только минуты на 30минут 00 секунд.
{
  rtc.halt(false);
  rtc.writeProtect(false);
  rtc.setTime(RTCChas, 30, 00);    // Установка времени ЧАС(реальное время):30:00 
  delay (2000);                    // Задержка на перевод стрелок :-) 
  t = rtc.getTime(); 
  Serial1.print("Vremya otcorrectirovano - "); 
  Serial1.print  (t.hour, DEC); Serial1.print(" : "); Serial1.print  (t.min, DEC); Serial1.print(" : "); Serial1.println(t.sec, DEC);
}
 
void Operimetr() //______________Цикл "охрана периметра" (только двери и ворота)_________________
{
       if(digitalRead(25)==HIGH){statusperimetr=0;} // Сработка концевика входной двери
//else if(digitalRead(23)==HIGH){statusperimetr=0;} // Сработка концевика ворот
//else if(digitalRead(27)==HIGH){statusperimetr=0;} // Сработка концевика двери бани
else {statusperimetr=1;}
}
 
void otoplenie() // Цикл управления газовым котлом (Сигнал инвертированный!(Особенность подключения к котлу))
{
  if ( statusotp==0) // Отключено
     {  digitalWrite(53,HIGH);} // Отключить отопление
  
  if ( statusotp==1) // Климат-контроль
     {  if ( TempZalC > (tempDust+1)){digitalWrite(53,HIGH);} // Отключить отопление если температура больше желаемой на 1грС
        if ( !TempZalC== -127 && (TempZalC < tempDust) )   {digitalWrite(53,LOW);}  // Включить отопление если температура меньше желаемой
     }
  if ( statusotp==2) // Экономия
     {  if ( TempZalC > (tempDECOust+1)){digitalWrite(53,HIGH);} // Отключить отопление если температура больше желаемой на 1грС
        if ( !TempZalC== -127 && (TempZalC < tempDECOust) )   {digitalWrite(53,LOW);}  // Включить отопление если температура меньше желаемой
     }
}  
 
void Pik() // Периодический тон пищалки
{
   unsigned long StartPikMillis = millis();
   if(StartPikMillis - EndPikMillis > intervalPIK) // интервал тона
   { tone(5, TonPIK, 100); EndPikMillis = StartPikMillis; } // Сброс таймера
}
 
void signalizSMS() //______________Цикл работы охранной сигнализации______________________      
{
 if (signaliz==1) // Режим "Под охраной"
  {
   if(digitalRead(24)==HIGH && SMSDvigenieV==false)
   {
    startOneSMS(); Serial2.println("Dvizhenie v vannoy!");    EndSMS();
    startTwoSMS(); Serial2.println("Dvizhenie v vannoy!");    EndSMS(); SMSDvigenieV=true;
   }
   if(digitalRead(26)==HIGH && SMSDvigenieK==false)
   {
    startOneSMS(); Serial2.println("Dvizhenie na kuhne!");    EndSMS(); 
    startTwoSMS(); Serial2.println("Dvizhenie na kuhne!");    EndSMS(); SMSDvigenieK=true;
   }
   if(digitalRead(22)==HIGH && SMSDvigenieZ==false)
   {
    startOneSMS(); Serial2.println("Dvizhenie v zale!");      EndSMS();
    startTwoSMS(); Serial2.println("Dvizhenie v zale!");      EndSMS(); SMSDvigenieZ=true;
   }
   if(digitalRead(25)==HIGH && SMSDvigenieS==false)
   {
    startOneSMS(); Serial2.println("Otkrita vhodnaya dver!"); EndSMS();
    startTwoSMS(); Serial2.println("Otkrita vhodnaya dver!"); EndSMS(); SMSDvigenieS=true;
   }
  }  
 if (signaliz==2) //__Режим постановки на охрану____(Пять минут на выход и закрытие дверей)
    {
     NowTime2 = millis();
     if (Timer2On == true) { StartTime2 = NowTime2 ; Timer2On = false; statusPIK=1;}
     if( statusPIK==1 && NowTime2 - StartTime2 == 120000){ intervalPIK=600;} // после 2 минуты период 600мс
     if( statusPIK==1 && NowTime2 - StartTime2 == 180000){ intervalPIK=400;} // после 3 минуты период 400мс
     if( statusPIK==1 && NowTime2 - StartTime2 == 240000){ intervalPIK=200;} // после 4 минуты период 200мс
     if( statusPIK==1 && NowTime2 - StartTime2 >  500000)                    // после 5 минут постановка на охрану
       { statusPIK=0; intervalPIK=1000; signalizON();}                       // Выключаем пикалку,возврашаем интервал,включаем охрану
    }
}
 
void signalizON() //______________Цикл включения охранной сигнализации_________________
  signaliz=1;
  SMSDvigenieK=false; // Флаг "Отправлена СМС о движении на кухне"
  SMSDvigenieV=false; // Флаг "Отправлена СМС о движении в ванной"
  SMSDvigenieZ=false; // Флаг "Отправлена СМС о движении в зале"
  SMSDvigenieS=false; // Флаг "Отправлена СМС о входе"
  statusotp=2;        // отопление дома в режим экономии
  homeOFF();          // выключается питание дома
  perimetr=0;         // выключение охраны периметра дома
  startOneSMS(); Serial2.print("Signalizaciya vkluchena!_");
  Serial2.print(RTCChas); Serial2.print(":"); Serial2.print(RTCMinuta); EndSMS(); // время включения 
  startTwoSMS(); Serial2.print("Signalizaciya vkluchena!_");
  Serial2.print(RTCChas); Serial2.print(":"); Serial2.print(RTCMinuta); EndSMS(); // время включения 
}
 
void signalizOFF()  //______________Цикл отключения охранной сигнализации_________________
  signaliz=0;
  SMSDvigenieK=false; // Флаг "Отправлена СМС о движении на кухне"
  SMSDvigenieV=false; // Флаг "Отправлена СМС о движении в ванной"
  SMSDvigenieZ=false; // Флаг "Отправлена СМС о движении в зале"
  SMSDvigenieS=false; // Флаг "Отправлена СМС о входе"
  statusotp=1;        // статус отопления дома                0 - откл , 1- вкл , 2- экономия
  homeON();           // включается питание дома
  startOneSMS(); Serial2.print("Signalizaciya otkluchena!_"); 
  Serial2.print(RTCChas); Serial2.print(":"); Serial2.print(RTCMinuta); EndSMS(); // время выключения 
  startTwoSMS(); Serial2.print("Signalizaciya otkluchena!_");
  Serial2.print(RTCChas); Serial2.print(":"); Serial2.print(RTCMinuta); EndSMS(); // время выключения 
}
 
void sirena() //_______Сирена х.з. на каком языке
{
  pambilang++;
  for (int m = 1600; m<=2200; m++){tone (5, m, 75);} // (пин пищалки,частота,длина тона)
  for (int m = 2200; m>=1600; m--){tone (5, m, 75);}
  if(pambilang==4){noTone(5); pambilang = 0;}
}
 
void timerPoliv()    // Таймер клапана полива огорода 0 - откл , 1- вкл , 2- Таймер
{
 
  NowTime1 = millis();
  if(Timer1On == true) { StartTime1 = NowTime1 ; Timer1On = false; statuspoliv=2;}
  if( statuspoliv==2 && NowTime1 - StartTime1 > 900000) // выдержка 15 минут
    { statuspoliv=0; } // Сброс таймера
}
 
void zapros()  //Передача всех параметров в терминал
{
  t = rtc.getTime();
  Serial1.print  (t.date, DEC);       Serial1.print(" ");
  Serial1.print  (rtc.getMonthStr()); Serial1.print(" ");
  Serial1.print  (t.year, DEC);       Serial1.print(" ");
  Serial1.print  (rtc.getDOWStr());   Serial1.print(" ");
  Serial1.print  (t.hour, DEC);       Serial1.print(" : ");
  Serial1.print  (t.min, DEC);        Serial1.print(" : ");
  Serial1.println(t.sec, DEC);
  Serial1.print("SmartHOME = ");
  if (statushome==1){Serial1.println("ON");}
  if (statushome==0){Serial1.println("OFF");}
  Serial1.print("FireAlarm = ");
  if (statusFireAlarm==1){Serial1.println("ON");}
  if (statusFireAlarm==0){Serial1.println("OFF");}
  if (statusFireAlarm==2){Serial1.println("VNIMANIE");} 
  if (statusFireAlarm==3){Serial1.println("TREVOGA");} 
  if (statusFireAlarm==4){Serial1.println("PROVERKA");}
  Serial1.print("Klimat kontrol= ");
  if (statusotp==1){Serial1.print("ON: "); Serial1.print("Ustavka: "); Serial1.print(tempDust); Serial1.println("*C");}
  if (statusotp==0){Serial1.println("OFF");}
  if (statusotp==2){Serial1.println("ECONOMIA");}
  if (statusBlock==true){Serial1.println("Vkluchena blokirovka sveta v zale");}
  
  Serial1.println("Parametry:");
    
  int chk = dht.read(DHT11PIN);
  switch (chk)
  {
    case DHTLIB_OK: break; // Serial1.println("DHT-OK"); 
    case DHTLIB_ERROR_CHECKSUM: Serial1.println("DHT Checksum error"); break;
    case DHTLIB_ERROR_TIMEOUT:  Serial1.println("DHT Time out error"); break;
    default: Serial1.println("DHT Unknown error"); break;
  }
  Serial1.print("Podpol: ");  Serial1.print(dht.humidity); Serial1.print(" % ;"); Serial1.print(dht.temperature); Serial1.println(" *C");
  Serial1.print("V zale:");   Serial1.print(TempZalC);     Serial1.println(" *C");
  Serial1.print("Ha ylice:"); Serial1.print(TempUlicaC);   Serial1.print(" *C ;"); Serial1.print(UlicaS);  Serial1.println(" %");
  Serial1.print("Kuhnya:");   Serial1.print(TempKuhnyaC);  Serial1.println(" *C");
  Serial1.print("IBP:+");     Serial1.print(Vpit);         Serial1.println(" V");
  if (Vpit<=12.0)   { Serial1.println("Alarm! Min zaryad akkumulyatora IBP!"); }
  if (Vpit>=14.0)   { Serial1.println("Alarm! Max zaryad akkumulyatora IBP!"); }
  Serial1.print("SMS:");     Serial1.println(SMSschet);
  Serial1.print("Fireschet:");     Serial1.println(Fireschet);
  Serial1.print("DS18B20 ERROR:"); Serial1.println(dsshet);
   //if(digitalRead(23)==HIGH)  { Serial1.println("Otkrity vorota");} 
  if(digitalRead(25)==HIGH)  { Serial1.println("Otkrita vhodnaya dver'");}
  //if(digitalRead(27)==HIGH)  { Serial1.println("Otkrita dver'banya");}
  if (digitalRead(30)==HIGH)  { Serial1.println("Trevoga! Voda v pogrebe!");}
  //if (analogRead(14)<100)    { Serial1.println("Vnimanie! Drenaghnaya emkost' perepolnena");}
  if (digitalRead(31)==HIGH) { Serial1.println("Ochen' visokaya temperatura v bane! Pozhar???"); }
  if (digitalRead(33)==LOW || digitalRead(35)==LOW)  { Serial1.println("Srabotal dimovoy datchik"); }
  if (digitalRead(29)==HIGH) { Serial1.println("Banya gotova"); }
  if (digitalRead(24)==HIGH) { Serial1.println("Dvizhenie v vannoy"); } 
  if (digitalRead(26)==HIGH) { Serial1.println("Dvizhenie na kuhne"); } 
  if (digitalRead(22)==HIGH) { Serial1.println("Dvizhenie v zale"); }
  if (digitalRead(37)==HIGH) { Serial1.println("Net pitaniya 220V"); }
  if (AlarmTemp==1) { Serial1.println("Alarm! Kriticheskaya temperatura!"); }
}
 
void SMSzapros()
{
    startOneSMS();
    Serial2.print("HOME=");
    if (statushome==1){Serial2.println("ON");}
    if (statushome==0){Serial2.println("OFF");}
    Serial2.print("Ohrana:");
    if (signaliz==2){Serial2.println("START");}
    if (signaliz==1){Serial2.println("ON");}
    if (signaliz==0){Serial2.println("OFF");}
    
    //if(digitalRead(23)==HIGH)  { Serial2.println("Otkrity vorota");} 
    if(digitalRead(25)==HIGH)  { Serial2.println("Otkrita vhodnaya dver'");}
    //if(digitalRead(27)==HIGH)  { Serial2.println("Otkrita dver'banya");}
  
    Serial2.print("Alarm:"); Serial2.println(statusAlarm);
    if (digitalRead(37)==HIGH){Serial2.println("no 220V");}
    if (AlarmTemp==1) { Serial2.println("Temperatura!"); }    
    if (digitalRead(30)==HIGH){Serial2.println("Voda v podpole!");}
    Serial2.print("FireAlarm:");
    if (statusFireAlarm==0){Serial2.println("OFF");}
    if (statusFireAlarm==1){Serial2.println("ON");}
    if (statusFireAlarm==2){Serial2.println("VNIMANIE");}
    if (statusFireAlarm==3){Serial2.println("TREVOGA");} 
    if (statusFireAlarm==4){Serial2.println("TEST");}
    if (digitalRead(33)==LOW || digitalRead(35)==LOW)  { Serial2.println("Srabotal shleyf!"); }
    Serial2.print("KK=");
    if (statusotp==1){Serial2.print("ON:"); Serial2.print(tempDust); Serial2.println("*C");}
    if (statusotp==0){Serial2.println("OFF");}
    if (statusotp==2){Serial2.println("ECO");}
    Serial2.print("Podpol:");  Serial2.print(dht.temperature); Serial2.print("*C,"); Serial2.print(dht.humidity); Serial2.println("%");
    Serial2.print("Zal:");     Serial2.print(TempZalC);        Serial2.println("*C");
    Serial2.print("Ylica:");   Serial2.print(TempUlicaC);      Serial2.println("*C");
    Serial2.print("Kuhnya:");  Serial2.print(TempKuhnyaC);     Serial2.println("*C");
    Serial2.print("IBP:+");    Serial2.print(Vpit);            Serial2.println(" V");
    EndSMS();                                 
}
 
void NastroykaGSM()
{
  Serial2.print("AT+CMGF=1\r");         //устанавливает текстовый режим смс-сообщения
    delay(100);
  Serial2.print("AT+IFC=1, 1\r");       //устанавливает программный контроль потоком передачи данных
    delay(100);
  Serial2.print("AT+CPBS=\"SM\"\r");    //открывает доступ к данным телефонной книги SIM-карты
    delay(100);
  Serial2.print("AT+GSMBUSY=1, 1\r");   //запрет всех входящих звонков
    delay(100);
  Serial2.print("AT+CNMI=1,2,2,1,0\r"); //включает оповещение о новых сообщениях
    delay(300);
}
 
void startOneSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
      Serial2.print("AT+CMGF=1\r");
      delay(100);
      Serial2.println("AT + CMGS = \"+79XXXXXXXXX\""); 
      delay(100);
}      
void startTwoSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму номеру
{
      Serial2.print("AT+CMGF=1\r");
      delay(100);
      Serial2.println("AT + CMGS = \"+79XXXXXXXXX\""); 
      delay(100);
}    
void EndSMS() //__________________Цикл окончания и отправки СМС-сообщения_______________________
{
   delay(100);
   Serial2.println((char)26);    // Команда отправки СМС
   SMSschet++;                   // +1 к отправленным СМС
   delay(5000);
}
void ZvonokS() //__________________Цикл дозвона абоненту (для аудиоконтроля)___________________
{
Serial2.println("AT+CMIC=0,15");    // Команда для установки чувствительности микрофона Поэкспериментировать с цифрой.
// 0,- это канал микрофона (1,2,3),15 это уровень см.инструкцию к СИМ900
delay(2000);
 
Serial2.println("ATD+79XXXXXXXXX;");  // Набираем номер
}
//Serial2.println("ATH"); // Вешаем трубку
 
void ZvonokT() //__________________Цикл дозвона абоненту (для аудиоконтроля)___________________
{
Serial2.println("AT+CMIC=0,15");    // Команда для установки чувствительности микрофона Поэкспериментировать с цифрой.
// 0,- это канал микрофона (1,2,3),15 это уровень см.инструкцию к СИМ900
delay(2000);
Serial2.println("ATD+79XXXXXXXXX;");  // Набираем номер
//Serial2.println("ATH"); // Вешаем трубку
}
 
 
 
  
 
bwn
Offline
Зарегистрирован: 25.08.2014

Эт уже не шкафы, это центр управления полетами)))

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Выложил последнюю программу на яндекс диск    https://yadi.sk/d/9krPQtI4esHWb

ForumHouseV14_02_2015.ino

 

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

И не говори :)))  на перспективу!

Вот там за шторкой место есть еще для таких же 2-х шкафов :) 

krik
Offline
Зарегистрирован: 23.02.2015

Смотрю и глаз радуется. Автору огромный респект! Красота.

Когда соберу свою систему по вашему примеру, сделаю фото отчет. Но это будет в конце лета, ибо объем большой и делается для сети все красиво и аккаратно :)

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

А секрет простой, берете большой щит ЩМП, и большой короб ПВХ 25х40. В коробе по бокам дрелью делаются 100500 отверстий, через которые будут протянуты провода. Все собирается, и вся борода проводов прячется в короб. Снаружи красиво, а все страшное внутри. Принцип любого евроремонта :))) 

 "делается для себя все красиво и аккаратно :)" - во! а вот это самое главное. Для себя же делаем.

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

Тоже жду лета, летом строительства  на участке будет валом. А так нужно будет подземные кабели кидать до забора, гаража, бани... чтобы датчики и концевики установить. Вот думаю как охрану участка организовать, ИК барьеры от мастер кита чтоли, попробовать.

А вообще летом в выгребную яму буду ставить датчик уровня. Если не сделаю свой из полипропилена и герконов, то просто куплю в кастораме поплавовый выключатель за 320р от насосов.

krik
Offline
Зарегистрирован: 23.02.2015

Подскажите.

  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- вкл

Спасибо.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

1. Да, это выходы реле... в настоящее время, не сделано физически. Куплю пускатели или мощные реле, тогда и доделаю.

2. Ну эти статусы не снимаются. Они как бы задаются. Это такие программные тригеры. Ардуинщики называют их флагами.

Т.е. обратной связи нет, нет контроля напряжения на объектах. Есть только контроль напряжения после УЗО которое обесточивает ряд автоматов на насосы, розетки, баню, граж,... исключение только: холодильник, питание UPS, освещение в доме. 

krik
Offline
Зарегистрирован: 23.02.2015

Понял спасибо.

Nedd
Offline
Зарегистрирован: 03.03.2015

Тоже планиную делать умный дом на Arduino (пока на стадии разработки), правда интересно с беспроводными 433МГц датчиками попробовать.

Спасибо за отличную статью и бесценный опыт.

И да, шкафы у вас шикарные :)

IKIF
Offline
Зарегистрирован: 06.03.2015

День добрый,
Управление всем светом происходит в этом шкафу ? С каждой люстры идет отдельный 220 в шкаф ? Как та жа люстра взаимодействует с выключателем на стене и с реле в шкафу ?

За что отвечают опторазвязки ? 

 

 

krik
Offline
Зарегистрирован: 23.02.2015

Ну вообще можно сделать включение света от шкафа (реле) и от выключателя на стене. Как удобно так и включай. Я себе так сделаю.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Да. С каждой люстры, и с каждого двухклавишного комнатного выключателя идут по кабелю ВВГ3х1,5. Сходятся они в шкафу на клеммнике.

Идея такая. Освещение каждой комнаты, запитывается от своего однополюсного автомата. Для того чтобы, освещение всегда было работало, в независимости от работоспособности умного дома. Используется двух клавишный выключатель. Одна клавиша "режим ручной" на ней постоянно фаза. Всегда можно включить свет на постоянку. На второй клавише "режи авто".Фаза на ней появляется после срабатывание реле. Реле включается мгновенно после обнаружения движения датчиком на время установленное в программе и отключается после прекращения движения в комнате.

Если режим авто не нужен просто включается клавиша "ручной режим". Например, когда заходишь в душевую кабину. ИК Датчик тебея уже не видит. Ну а так по мелким делам работает отлично. В зале например у меня ручной режим не используется вообще. Там выдержка в 4 минуты сделана. Если в зале никого нет уже 4 минуты свет отключается. Электроэнергия стала экономиться. Так как ребенок 2 лет, то тут то там, то остался на долго у мамы на кухне. А свет...погорел и сам погас.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Опторазвязки я стараюсь делать где только можно. Оптопары, "убивают двух зайцев" 1. происходит согласование разных напряжений, 2-е гальваническая развязка и помеха защищенность. Мало ли чего бывает. Грозовые разряды, статика...  мне нужна надежность. + я не парюсь проводить кабели в близи с "помехами"

Опторазвязки у меня для гальванической изоляции входных и выходных дискретных сигналов. 

Вот интересно аналоги развязать возможно?

krik
Offline
Зарегистрирован: 23.02.2015

Дайте пожалуйста ссылку на схему влучшем качестве. Интересно на вашу поглядеть. Просто на этой плохо видны все подписи.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

https://yadi.sk/d/uCTDejVSf82H6

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

krik
Offline
Зарегистрирован: 23.02.2015

Скачал. Большое спасибо.

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

krik пишет:

Скачал. Большое спасибо.

Да на здоровье.  Жду ваших идей и реализаций!

Проект выполняется в программе KompasV12 3D. Исходники, всегда пожалуйста.

Где бы мне человечка найти, который на андроиде приложение накидает для моего дома. Кстати нашел сайт http://remotexy.com/ru/editor/code/

Попробую, когда лень и суета отпустят.

Nemo
Offline
Зарегистрирован: 07.03.2015

Вот это супер! Мне до такого наверное не дойти. Хотя хотелось именно нечто подобного.

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

Я хотел еще ко всему вышеописанному еще и видеонаблюдение по периметру привентить с мониторингом с телефона. Не думали?

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Nemo пишет:

Вот это супер! Мне до такого наверное не дойти. Хотя хотелось именно нечто подобного.

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

Я хотел еще ко всему вышеописанному еще и видеонаблюдение по периметру привентить с мониторингом с телефона. Не думали?

1. Не подпускайте электриков к своему дому :)) Я как КИПовец их не долюбливаю. Ну это профессиональные особенности. КИПиА. Коллеги поймут. Лучше научитесь сами. Лучше вас никто не сделает. На Ютубе все показывают, как что делается. 

"А если их озадачить чтобы к каждому выключателю и каждой разетки 2 кабеля протащить - сумашедшим сочтут." - ну это большая проблема человечества. Отказаться от стереотипов, и зайти за рамки привычного. На этом сайте таких людей нет. Так как, когда рассказываешь человеку, на чем сделан умный дом, то сразу вопрос "а нафига, готовое же все продается? Ну ты маньяк!" ... когда человеку показываешь сколько просят фирмочки за установку готвых систем, больше человек вопросов не задает. Но все равно обычно у таких людей разговоры такие: а пожарная сигнализация зачем, у тебя че пожар будет? А охранная зачем если полиция не приедет? Ну и че, ты на вахте, у тебя там протечка воды случилась... и чЁ, смысл?    

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

2. Думали, еще как думали... я уже представляю где будут камеры у меня стоять. В их полезности не сомневаюсь. На данный момент у меня висят 2 муляжа камеры и на входных местах участка большие таблички "внимание видется видеонаблюдение". Пусть думает кто что хочет, но самое главное что алкашы и прочая нечисть участок стороной обходит. Сначало я купил в бауцентре мляж купольной камеры с мигающим светодиодом. Но аборигены не видят его в упор. А вот когда купил муляж серьезной камеры, то вопросов у них нет. Пусть ведут себя прилично. А вообще, уже присматриваюсь что брать. Обязательно хочу с выводом в интернет. Чтобы мог будучи на вахте, посмотреть как дела дома. Мне 4 камер за глаза. Ну а Супруга может за детьми приглядывать, не отходя от плиты. Я считаю, это полезно. 

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

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

Приеду домой, сделаю фото чердака, и как я там сделал лотки кабельные из стоечных профилей гипсокартона.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Тут явно не хватает веб интерфейса. Сильно порадовали саморезы которыми крепится мега :) Если просверлить дырку в проце и туда завернуть такой же саморез, то держаться будет крепче !