Система "Умный дом" для загородного дома на 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


///////////////////////Программа "умного дома" на основе 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 otoplenie()____________________________________________________________________

int tempDust = 25;     // Уставка желаемой температуры в доме (По умолчанию 25гр.С)
int tempDECOust = 15;  // Уставка температуры в доме в режиме "Экономия"(По умолчанию 15гр.С)
//#include <EEPROM.h>  //библиотека работы с SD-картой
// http://blockduino.blogspot.ca/2013/08/Password-Keypad-w-Sound.html кодовый замок

#include <dht11.h>     //библиотека датчика DTH11
#define DHT11PIN 6     //Датчик DTH11 на pin6
dht11 dht;

// http://forum.amperka.ru/threads/Сопряжение-5v-arduino-с-3-3v-часами-ds1302.378/
// http://samou4ka.net/page/chasy-realnogo-vremeni-ds1302-i-mikrokontroller...
#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 EcoTempDust=false;   // Флаг "Экономия отопления"

int   vlaga=0; // Значение влажности в цикле ventilyaciya()
int pambilang;         // переменная для цикла sirena()

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;  // статус блокировки освещения зала пользователем
boolean statusZ=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 = 60000; //Пауза, после которой движение считается оконченным
long unsigned int pause_V = 60000; //Пауза, после которой движение считается оконченным
long unsigned int pause_Z = 300000; //Пауза, после которой движение считается оконченным
long unsigned int pause_S = 60000; //Пауза, после которой движение считается оконченным
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(13, INPUT); digitalWrite(13,HIGH);    // вход ИК сигналы от TSOP
  
  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
  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();
   bluetooth();
   sms_read();
   osvechenie();
   //if (statushome==1 && statusDay==false) {avtosvet();}                        // Автоматическое управление освещением в доме по таймеру  
   if (!statusFireAlarm==0){FireAlarm();}                                     // Работа пожарной сигнализации
   if (statushome==1 && UlicaS < 15) {avtosvet();}                             // Автоматическое управление освещением в доме меньше 15%
   if (UlicaS > 10){digitalWrite(52,HIGH);}                                    // Освещение двора выключить при освещении больше 10%  (сигнал инвертированный)
   if (UlicaS < 6) {digitalWrite(52,LOW);}                                     // Освещение двора включить при освещении меньше 6% (сигнал инвертированный)
   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(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 > 9 && RTCChas < 16){digitalWrite(52,HIGH);} else {digitalWrite(52,LOW);}     //c 16 до 9 утра включить освещение двора
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 время суток день
if(RTCChas > 10 && RTCChas < 16){statusZ=true;} else {statusZ=false;}        //c 10 до 16 блокировка света в зале по времени суток

//if(RTCChas == 8 && RTCMinuta == 30){ sirena(); } // Играет будильник (сирена) в 8-30

// Добавить ведение лога на 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 
{  // http://arduino.ru/tutorials/BlinkWithoutDelay на основе
   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);
     UlicaS = analogRead(A15)/10;         // Считываем освещенность на улице
   previousMillis = currentMillis;}       // Сброс таймера
}


void alarms()  //______________Цикл "тревожные сигналы"____// http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
{
       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;}  // Сигнализация низкой температуры в зале +10
  else if ( TempZalC != -127    && TempZalC > 35    && KvitZalC==false )    {statusAlarm=1; AlarmTemp=1;}  // Сигнализация высокой температуры в зале +35
  else if ( TempUlicaC != -127  && TempUlicaC > 50  && KvitUlicaC==false )  {statusAlarm=1; AlarmTemp=1;}  // Сигнализация высокой температуры на улице +50
  else if ( TempKuhnyaC != -127 && TempKuhnyaC < 10 && KvitKuhnyaC==false ) {statusAlarm=1; AlarmTemp=1;}  // Сигнализация низкой температуры в кухне +10
  else if ( TempKuhnyaC != -127 && TempKuhnyaC > 35 && KvitKuhnyaC==false ) {statusAlarm=1; AlarmTemp=1;}  // Сигнализация высокой температуры в кухне +35
  else if (  TempPodpol < 3  && KvitPodpolC==false ) {statusAlarm=1; AlarmTemp=1;}  // Сигнализация низкой температуры в в подполе +3
  else if (  TempPodpol > 35 && KvitPodpolC==false ) {statusAlarm=1; AlarmTemp=1;}  // Сигнализация высокой температуры в подполе +35
  else if (digitalRead(37)==HIGH && SMSVoltOFF==false)  { startOneSMS(); Serial2.println("Propalo pitanie 220V"); EndSMS(); SMSVoltOFF=true; SMSVoltON=false; homeOFF();}      // Отключение питания 220В (выключаются реле)
  else if (digitalRead(37)==LOW  && SMSVoltON==false)   { startOneSMS(); Serial2.println("Pitanie 220V vosstanovleno!"); EndSMS(); SMSVoltON=true; SMSVoltOFF=false;}  // Восстановление питания 220В
  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!Kriticheskaya temperatura!"); EndSMS();
       startTwoSMS(); Serial2.println("Alarm!Kriticheskaya temperatura!"); EndSMS(); SMSAlarmTemp=true;}
  if (digitalRead(31)==HIGH && SMSBanyaTemp==false)
     {startOneSMS(); Serial2.println("Alarm!Predelnaya temperatura v bane!"); EndSMS(); SMSBanyaTemp=true;}
}

void Kvitirovanie() // Цикл квитирование (выкл.звука при активной тревоге) до восстановления параметра в норму
{
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 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; Serial1.println("KLIMAT CONTROL - ON");  tone(5, 2500, 100);} // Включение климат-контроля дома
    else if (strcmp(str, "OTOPLENIE-OFF") == 0) { statusotp=0; Serial1.println("KLIMAT CONTROL - OFF"); tone(5, 1500, 100);} // Выключение климат-контроля дома
    else if (strcmp(str, "OTOPLENIE-ECO") == 0) { statusotp=2; Serial1.println("KLIMAT CONTROL - ECO"); tone(5, 2500, 100);} // Включение климат-контроля в режим экономии

    else if (strcmp(str, "FIREALARM-ON") == 0) // Включение пожарной сигнализации
    { statusFireAlarm=1; SMSFireSensor=false; SMSFireAlarm=false; Serial1.println("Pozharnaya signalizaciya - ON");  statusPIK=0; intervalPIK=1000; tone(5, 2500, 100);}
    else if (strcmp(str, "FIREALARM-OFF") == 0) // Выключение пожарной сигнализации
    { statusFireAlarm=0; SMSFireSensor=false; SMSFireAlarm=false; Serial1.println("Pozharnaya signalizaciya - OFF");  statusPIK=0; intervalPIK=1000; tone(5, 1500, 100);}
    else if (strcmp(str, "FIREALARM-TEST") == 0) // Тестирование пожарной сигнализации
    { statusFireAlarm=2; SMSFireSensor=false; SMSFireAlarm=false; Serial1.println("Pozharnaya signalizaciya - PROVERKA"); tone(5, 2500, 100);}
        
    else if (strcmp(str, "HOME-ON") == 0) { homeON(); Serial1.println("SISTEMA UMNIY DOM VKLUCHENA"); tone(5, 2500, 100);} // Включение системы умный дом
    else if (strcmp(str, "HOME-OFF") == 0) { homeOFF(); Serial1.println("SISTEMA UMNIY DOM OTKLUCHENA"); 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-ON") == 0)  { statusPump=1; Serial1.println("Stanciya vkluchena");  tone(5, 2500, 100); delay(100);} // Включение станции водоснабжения 
    else if (strcmp(str, "STANCIYA-OFF") == 0) { statusPump=0; Serial1.println("Stanciya otkluchena"); tone(5, 1500, 100); delay(100);} // Выключение станции водоснабжения

    else if (strcmp(str, "BLOCK-ON") == 0)  { statusBlock=true; digitalWrite(42, HIGH); Serial1.println("Blokirovka sveta vkluchena");  tone(5, 2500, 100); delay(100);}  // Включение блокировки света в зале
    else if (strcmp(str, "BLOCK-OFF") == 0) { statusBlock=false; digitalWrite(42, LOW); Serial1.println("Blokirovka sveta otkluchena"); tone(5, 1500, 100); delay(100);}  // Выключение блокировки света в зале
   
    else if (strcmp(str, "MUTE") == 0) { Kvitirovanie(); tone(5, 2500, 100);  statusPIK=0; intervalPIK=1000; delay(100); } // Квитирование (сброс тревоги)аварийных параметров
    
    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;} // Включение охранной сигнализации
    else if (strcmp(str, "OHRANA-OFF") == 0) { Serial1.println("Signalizaciya otkluchena"); tone(5, 1500, 100); delay(100); statusPIK=0; intervalPIK=1000; signaliz=0;} // Выключение охранной сигнализации
    
    else if (strcmp(str, "PERIMETR-ON") == 0)  { perimetr=1; delay(100); tone(5, 2500, 100); Serial1.println("Ohrana perimetra vkluchena");} // Включение охраны периметра
    else if (strcmp(str, "PERIMETR-OFF") == 0) { perimetr=0; delay(100); tone(5, 1500, 100); Serial1.println("Ohrana perimetra otkluchena");} // Выключение охраны периметра
    
    else if (strcmp(str, "POLIV-ON") == 0) { statuspoliv=2; Timer1On = true; tone(5, 2500, 100); Serial1.println("Poliv vkluchen");} // Включение клапана полива растений
    else if (strcmp(str, "POLIV-OFF") == 0) { statuspoliv=0; delay(100); tone(5, 1500, 100); Serial1.println("Poliv otkluchen");} // Выключение клапана полива растений
    
    else if (strcmp(str, "TEMP+") == 0) // Прибавление желаемой температуры в доме на 1гр.С
    { tempDust = (tempDust+1); delay(1000); 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(1000); 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=2; 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(digitalRead(pirPin_Z) == HIGH && statusBlock==false && statusZ==false) //Если обнаружено движение, нет блокировки, и время суток с 16 до 10 утра
  {    
    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);}      //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения                
  } 
}  
  
void avtosvet()   //______Цикл управления автоматическим освещением____________________________________
{
  //______Ниже для кухни______________________________________
  if(digitalRead(pirPin_K) == HIGH && statusDay==false) //Если обнаружено движение с 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(digitalRead(pirPin_V) == HIGH) //Если обнаружено движение
  {    
    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(digitalRead(pirPin_S) == HIGH) //Если обнаружено движение
  {    
    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);}       //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения                
  }
}

//   void ventilciya()
//     {
//   if (vlaga > 60) {digitalWrite(45, HIGH);} // Включение вентилятора при влажности более 60%
//   if (vlaga < 40) {digitalWrite(45, LOW);}  // Выключение вентилятора при влажности менее 40%
//   }

void FireAlarm()   //______Цикл пожарной сигнализации__________________________________________________

// Переменная statusFireAlarm=0 "Режим работы пож.сигнализации" - 0 - откл , 1- вкл , 2- проверка, 3- тревога 
{
   if(statusFireAlarm==1)
     {
       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(statusFireAlarm==3)
     {
      if(digitalRead(33)==LOW  && digitalRead(35)==LOW) { sirena();} // Пока есть сработавшие датчики - режим "тревога"
      if(digitalRead(33)==HIGH && digitalRead(35)==HIGH) { statusFireAlarm=1;} // Если нет сработавших датчиков - ставим под охрану
     }
   if(statusFireAlarm==2) // Режим проверка пож. извещателей
     {
      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- вкл
  statusotp=2;       // статус отопления дома                0 - откл , 1- вкл , 2- экономия
  statusrzd=0;       // статус питания розеток дома          0 - откл , 1- вкл
  statusgaraj=0;     // статус питания гаража                0 - откл , 1- вкл
  statusbania=0;     // статус питания бани                  0 - откл , 1- вкл
  statusPump=0;      // статус питания станции водоснабжения 0 - откл , 1- вкл
  perimetr=0;        // статус охраны периметра дома         0 - откл , 1- вкл
  digitalWrite(38,HIGH);
  digitalWrite(40,HIGH);
  digitalWrite(42,HIGH);
  digitalWrite(44,HIGH);  
  digitalWrite(46,HIGH);
  digitalWrite(48,HIGH);  
  digitalWrite(50,HIGH);    
}

void KorrectTime() // Цикл корректировки времени RTC модуля. Корректирует только минуты на 30минут 00 секунд.
{
  rtc.halt(false);
  rtc.writeProtect(false);
  rtc.setTime(RTCChas, 30, 00);    // Установка времени ЧАС(реальное время):30:00 
  delay (2000);                    // Задержка на перевод стрелок :-) 
  t = rtc.getTime(); 
  Serial1.println("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; // Флаг "Отправлена СМС о входе"
  startOneSMS(); Serial2.println("Signalizaciya vkluchena!"); EndSMS();
  startTwoSMS(); Serial2.println("Signalizaciya vkluchena!"); EndSMS();
}

void signalizOFF()  //______________Цикл отключения охранной сигнализации_________________
{ 
  signaliz=0;
  SMSDvigenieK=false; // Флаг "Отправлена СМС о движении на кухне"
  SMSDvigenieV=false; // Флаг "Отправлена СМС о движении в ванной"
  SMSDvigenieZ=false; // Флаг "Отправлена СМС о движении в зале"
  SMSDvigenieS=false; // Флаг "Отправлена СМС о входе"
  startOneSMS(); Serial2.println("Signalizaciya otkluchena!"); EndSMS();
  startTwoSMS(); Serial2.println("Signalizaciya otkluchena!"); EndSMS();
}

void sirena() //_______Сирена х.з. на каком языке
 // http://www.element14.com/community/blogs/mirandasoft/2013/01/28/arduino-...
{
  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==3){Serial1.println("TREVOGA");} 
  if (statusFireAlarm==2){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");
    //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("SmartHOME = ");
    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==1){Serial2.println("ON");}
    if (statusFireAlarm==0){Serial2.println("OFF");}
    if (statusFireAlarm==3){Serial2.println("TREVOGA");} 
    if (statusFireAlarm==2){Serial2.println("PROVERKA");}
    if (digitalRead(33)==LOW || digitalRead(35)==LOW)  { Serial2.println("Srabotal shleyf!"); }
    Serial2.print("K-kontrol=");
    if (statusotp==1){Serial2.print("ON-"); Serial2.print("Ustavka:"); 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");
    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 = \"+79000000000\""); // (+79000000000 сдесь должен быть ваш номер №1)
      delay(100);
}      
void startTwoSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму номеру
{
      Serial2.print("AT+CMGF=1\r");
      delay(100);
      Serial2.println("AT + CMGS = \"+79000000000\""); // (+79000000000 сдесь должен быть ваш номер №2)
      delay(100);
}    
void EndSMS() //__________________Цикл окончания и отправки СМС-сообщения_______________________
{
   delay(100);
   Serial2.println((char)26);                       // Команда отправки СМС
   delay(5000);
}
void ZvonokS() //__________________Цикл дозвона абоненту (для аудиоконтроля)___________________
{
Serial2.println("AT+CMIC=0,15");    // Команда для установки чувствительности микрофона Поэкспериментировать с цифрой.
// 0,- это канал микрофона (1,2,3),15 это уровень см.инструкцию к СИМ900
delay(2000);

Serial2.println("ATD+79000000000;");  // Набираем номер(+79000000000 сдесь должен быть ваш номер №1)
}
//Serial2.println("ATH"); // Вешаем трубку

void ZvonokT() //__________________Цикл дозвона абоненту (для аудиоконтроля)___________________
{
Serial2.println("AT+CMIC=0,15");    // Команда для установки чувствительности микрофона Поэкспериментировать с цифрой.
// 0,- это канал микрофона (1,2,3),15 это уровень см.инструкцию к СИМ900
delay(2000);
Serial2.println("ATD+79000000000;");  // Набираем номер (+79000000000 сдесь должен быть ваш номер №2)
//Serial2.println("ATH"); // Вешаем трубку
}



  

 

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

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

#include <OneWire.h>

OneWire ds (4);

byte DSaddresses[5][8]; // массив адресов датчиков DS18B20

void setup()
{
  Serial.begin(19200);  
  Serial.println("Start");
  search_for_dses ();
  Serial.println("Setup complete");
}

void loop()
{
  int a,i;
  
  for( a=0; a < 5; a++)
  {
    Serial.print ("Addr = ");
    for( i = 0; i < 8; i++)
    {
      Serial.print(DSaddresses[a][i], HEX);
      Serial.print(" ");
    }
    Serial.println (" ");
  }
  delay (1000);
}


void search_for_dses () 
{
  int a,b,i;
  byte addr[8];
  Serial.println ("Serching for DS");
  while (ds.search  (addr)==1) 
  {
    for (b=0; b<8; b++) 
    {
      DSaddresses[a][b]=addr[b];
    }
    //======================================
    Serial.print ("Addr = ");
    for( i = 0; i < 8; i++) {
      Serial.print(DSaddresses[a][i], HEX);
      Serial.print(" ");
    }
    Serial.println (" ");
    //======================================
    delay  (250);
    a++;
  }
}

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

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  
 
Все хорошо.
 
Однако:
 
#include <OneWire.h>

OneWire ds (4);

byte DSaddresses[5][8]; // массив адресов датчиков DS18B20

void setup()
{
  Serial.begin(19200);  
  Serial.println("Start");
  search_for_dses ();
  Serial.println("Setup complete");
}

void loop()
{
  int a,i;
  
  for( a=0; a < 5; a++)
  {
    Serial.print ("Addr = ");
    for( i = 0; i < 8; i++)
    {
      Serial.print(DSaddresses[a][i], HEX);
      Serial.print(" ");
    }
    Serial.println (" ");
  }
  delay (1000);
}


void search_for_dses () 
{
  int a,b,i;
  byte addr[8];
  Serial.println ("Serching for DS");
  while (ds.search  (addr)==1) 
  {
    for (b=0; b<8; b++) 
    {
      DSaddresses[a][b]=addr[b];
    }
    //======================================
//    Serial.print ("Addr = ");
//    for( i = 0; i < 8; i++) {
//      Serial.print(DSaddresses[a][i], HEX);
//      Serial.print(" ");
//    }
//    Serial.println (" ");
    //======================================
    delay  (250);
    a++;
  }
}

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

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 пишет:

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

#include <OneWire.h>

OneWire ds (4);

byte DSaddresses[5][8]; // массив адресов датчиков DS18B20

void setup()
{
  Serial.begin(19200);  
  Serial.println("Start");
  search_for_dses ();
  Serial.println("Setup complete");
}

void loop()
{
  int a,i;
  
  for( a=0; a < 5; a++)
  {
    Serial.print ("Addr = ");
    for( i = 0; i < 8; i++)
    {
      Serial.print(DSaddresses[a][i], HEX);
      Serial.print(" ");
    }
    Serial.println (" ");
  }
  delay (1000);
}


void search_for_dses () 
{
  int a,b,i;
  byte addr[8];
  Serial.println ("Serching for DS");
  while (ds.search  (addr)==1) 
  {
    for (b=0; b<8; b++) 
    {
      DSaddresses[a][b]=addr[b];
    }
    //======================================
    Serial.print ("Addr = ");
    for( i = 0; i < 8; i++) {
      Serial.print(DSaddresses[a][i], HEX);
      Serial.print(" ");
    }
    Serial.println (" ");
    //======================================
    delay  (250);
    a++;
  }
}

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

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  
 
Все хорошо.
 
Однако:
 
#include <OneWire.h>

OneWire ds (4);

byte DSaddresses[5][8]; // массив адресов датчиков DS18B20

void setup()
{
  Serial.begin(19200);  
  Serial.println("Start");
  search_for_dses ();
  Serial.println("Setup complete");
}

void loop()
{
  int a,i;
  
  for( a=0; a < 5; a++)
  {
    Serial.print ("Addr = ");
    for( i = 0; i < 8; i++)
    {
      Serial.print(DSaddresses[a][i], HEX);
      Serial.print(" ");
    }
    Serial.println (" ");
  }
  delay (1000);
}


void search_for_dses () 
{
  int a,b,i;
  byte addr[8];
  Serial.println ("Serching for DS");
  while (ds.search  (addr)==1) 
  {
    for (b=0; b<8; b++) 
    {
      DSaddresses[a][b]=addr[b];
    }
    //======================================
//    Serial.print ("Addr = ");
//    for( i = 0; i < 8; i++) {
//      Serial.print(DSaddresses[a][i], HEX);
//      Serial.print(" ");
//    }
//    Serial.println (" ");
    //======================================
    delay  (250);
    a++;
  }
}

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

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 вечером. теперь так:

#include "DHT.h"
#include <OneWire.h>

#define DHTPIN 5
#define DHTTYPE DHT11
#define PIRpin 6 // пин датчика движения
OneWire ds (4);
DHT dht(DHTPIN, DHTTYPE);

byte DSaddresses[5][8]; // массив адресов датчиков DS18B20
float Celsius[5]; // массив измерений датчиков DS18B20
float DHThum=0; // DHT влажность
float DHTtemp=0; // DHT температура
int minSecsBetweenSMS = 60; // 1 min
long lastSend = 0; // Last SMS time;
long delta = minSecsBetweenSMS * 1000; // inSecsBetweenSMS millisecs

void setup()
{
  Serial.begin(19200);  
  Serial.println("Start");
  pinMode(PIRpin, INPUT); // определяем RIRpin как прин ввода
  Serial.println("Starting DHT");
  dht.begin();
  search_for_dses ();
  Serial.println("Setup complete");
}

void loop()
{
/*  int a,i;
  
  for( a=0; a < 5; a++)
  {
    Serial.print ("Addr = ");
    for( i = 0; i < 8; i++)
    {
      Serial.print(DSaddresses[a][i], HEX);
      Serial.print(" ");
    }
    Serial.println (" ");
  }
*/
  long now = millis();
  if (PIRcheck (now)==true)
  {
    Serial.println("RIR ALARM");
    Serial.println("Sending SMS(emeil)");
  }
  DSmeasure ();
  DHTmeasure ();
  delay (1000);
}


void search_for_dses () 
{
  int a,b,i;
  byte addr[8];
  Serial.println ("Serching for DS");
  while (ds.search  (addr)==1) 
  {
    for (b=0; b<8; b++) 
    {
      DSaddresses[a][b]=addr[b];
    }
    //======================================
    Serial.print ("Addr = ");
    for( i = 0; i < 8; i++) {
      Serial.print(DSaddresses[a][i], HEX);
      Serial.print(" ");
    }
    Serial.println (" ");
    //======================================
    delay  (250);
    a++;
  }
}

void DSmeasure ()
{
  int a,b,i;
  byte present = 0;
  byte data[12];
  
  Serial.println ("Starting measurments");
  ds.reset();
  ds.write(0xCC); // select all
  ds.write(0x44); // convert T for all devices
  Serial.println ("wait 1000 mSec");
  delay (1000);
  present = ds.reset();
  for (a=0; a<5 ; a++)
  {
    present = ds.reset();
    ds.select(DSaddresses[a]);
    ds.write(0xBE);
    for ( i = 0; i < 9; i++) //Get 9 bytes
    {           
      data[i] = ds.read();
      Serial.print(data[i], HEX);
      Serial.print(" ");
    }
     Serial.print(" CRC=");
     Serial.print( OneWire::crc8( data, 8), HEX);
     
     // convert the data to actual temperature
     unsigned int raw =  (data[1] << 8) | data[0];
     byte cfg =  (data[4] & 0x60);
     if  (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
     else if  (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
     else if  (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
     
     Celsius[a] =  (float)raw / 16.0;
     Serial.print(" C=");
     Serial.print(Celsius[a]);
     Serial.println();
  }
  Serial.println ("Measurments completed");
}

void DHTmeasure()
{
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  DHThum = 0;
  DHTtemp = 0;
  DHThum = dht.readHumidity();
  DHTtemp = dht.readTemperature();
  Serial.print("Hum=");
  Serial.print(DHThum);
  Serial.print(",");
  Serial.print("Temp=");
  Serial.print(DHTtemp);
  Serial.println();
}

boolean PIRcheck (long TimeOfCheck)
{
  if (digitalRead(PIRpin) == HIGH)
  {
    if ( TimeOfCheck >= (lastSend + delta)) // Check for enough time has passed after last HIGH
    {
      Serial.println("MOVEMENT");
      Serial.println(delta);
      Serial.println(lastSend);
      lastSend = TimeOfCheck;
      Serial.println(lastSend);
      return true;
    }
    else
    {
      Serial.println("SMS canceled cause = too soon");
      return false;
    }
  }
  return false;
}

Пока без 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

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