Удаленный контроль за домом.

slon0177
Offline
Зарегистрирован: 16.04.2015

Здравствуйте дорогие друзья!

 В 2014 году по совету моего товарища, я решил узнать что такое Ардуино. Тогда я еще не представлял что это такое, не имел никакого понятия что такое программирование и язык программирования. Интерес появился, когда начались эксперименты с bluetooth модулем HC-05/06. Захотелось создать систему удаленного контроля и управления загородным домом через СМС как наиболее простую в реализации и не требующую дополнительных знаний по Андроид программированию (это для удаленного контроля через смартфон в онлайн режиме). Да и интернет в деревне неважный, а вот сигнал сотовой связи вполне устойчивый.
Итак:
Сердце системы - контроллер Arduino Mega 2560, GSM модуль - SIM 900. Куплены в Амперке.
Два восьмиканальных модуля для управлением освещением, насосом отопления и вентиляцией. Куплены на Алиэкспресс.
Контроллер клавиатуры - Arduino Pro mini. Алиэкспресс.
Твердотельное реле HHG1-1/032F-38-20Z. 
Система позволяет управлять отоплением, освещением, вентиляцией и просматривать журнал отключений питания(если отключили свет). Управление отоплением возможно как через СМС так и с кнопок на панели. За температурой на улице и в котле следят датчики DS18B20, в доме и в подвале - DHT22.

Освещение управляется с кнопок на панели, по радиоканалу посредством модуля HC-06 и приложения для управления ардуино через bluetooth (на Playmarket полно бесплатных программ), и в плане установка проходных выключателей. Они нужны для двустороннего управления через смартфон или обычным выключателем. может кто то скажет что это лишнее - мне так захотелось)). 

управление вентиляцией - только с кнопок на панели.
Журнал отключений так же.
Фото прилагаются. Код выложен ниже - может кому пригодится. Повторюсь - я не специалист, поэтому код кому то покажется дилетантским и корявым ... Возможно. Но я продолжаю учиться и вносить улучшения в систему.
Здоровая критика приветствуется.
Спасибо

 #include <EEPROM.h>// запись состояний выходов
#include <DallasTemperature.h>//работа с датчиками температуры
#include <OneWire.h>// однопроводной протокол
#include <LiquidCrystal.h>// ЛСД дисплей 

#include "DHT.h" 

//#define DHTPINa 22     // Считывающий пин с датчика 1
#define DHTPINb 23     // Считывающий пин с датчика 2
#define DHTPINc 24     // Считывающий пин с датчика 3
#define DHTTYPE DHT22   // DHT 22  (AM2302)
#define ONE_WIRE_BUS 25 //датчики DS18B20 

//DHT dhta(DHTPINa, DHTTYPE); // Создаем объект dhta датчик 1
DHT dhtb(DHTPINb, DHTTYPE); // Создаем объект dhtb датчик 2
DHT dhtc(DHTPINb, DHTTYPE); // Создаем объект dhtb датчик 2
OneWire oneWire(ONE_WIRE_BUS); 

DallasTemperature sensors(&oneWire); 

LiquidCrystal lcd(50, 48, 46, 44, 42, 40);

 

int tempC;
int tempC1;//температура в котле
int tempC2;// температура на улице(вместо DHT)
//byte ta;// температура улица
int tb;//температура внутри
byte tc;//температура в подвале
//byte ha;//
byte hb;//
byte hc;// 

String temperature;
String message;
String number;
String number_input;
String part1 = "AT+CMGS=\"\+";
String part3 = "\"";
 

int addr = 0;//адрес для записи значения
int counter;// счетчик отключений системы
int temp;
int ustavka_input;//для полученного по СМС значения температуры
int ustavka=11;//переменная для хранения уставки температуры котла
int regim=1;//переменная для переключения режима
int h2=50; //уставка влажности для дома
int h3=50; //уставка влажности для погреба

 

int flag_1=0; // флаг комната
int flag_2=0; // флаг терасса
int flag_3=0; // флаг чердак
int flag_4=0; // флаг улица
int flag_5=0; // флаг подвал
int flag_6=0; // флаг туалет
int flag_7=0; // флаг баня
int flag_8=0; // флаг водонагревателя в доме
int flag_9=0; // флаг вентилятора дом
int flag_10=0; //флаг вентилятора подвал
int flag_11=0; // флаг насоса для отопления
int flag_12=0; // флаг для включения и выключения модуля управления

int val;

 

long previousMillis = 0;
long interval = 60000; 

DeviceAddress Thermometer1 = {  0x28, 0xFF, 0xCC, 0xAF, 0x6C, 0x14, 0x03, 0x53 };  // адрес датчика котловой температуры DS18B20 28FFCCAF6C140353
DeviceAddress Thermometer2 = {  0x28, 0x89, 0xED, 0x1E, 0x00, 0x00, 0x80, 0xF5 };  // адрес датчика уличной температуры DS18B20 28FFCCAF6C140353


void setup()
{
  Serial.begin(19200); // порт ардуино
  Serial1.begin(19200);// порт GSM модуля
  Serial2.begin(4800);// порт для работы с клавиатурой
  Serial3.begin(9600);//порт для работы с BLUETOOTH модулем 

  lcd.begin(20, 4);//начинаем работать с дисплеем 

  //dhta.begin(); // Инициализируем датчик 1
  dhtb.begin(); // Инициализируем датчик 2
  dhtc.begin(); // Инициализируем датчик 3
  

  pinMode(9, OUTPUT); //пин для включения GSM модуля
  pinMode(26, OUTPUT);// котел ТЭН1
  pinMode(27, OUTPUT);// котел ТЭН2
  pinMode(28, OUTPUT);// котел ТЭН3
  pinMode(29, OUTPUT);// насос отопления
  pinMode(30, OUTPUT);// вентилятор дом
  pinMode(31, OUTPUT);// вентилятор подвал
  pinMode(38, OUTPUT);//звуковой сигнал
  pinMode(39, OUTPUT);//1 комната
  pinMode(41, OUTPUT);//2 терасса
  pinMode(43, OUTPUT);//3 чердак
  pinMode(45, OUTPUT);//4 улица
  pinMode(47, OUTPUT);//5 подвал
  pinMode(49, OUTPUT);//6 туалет
  pinMode(51, OUTPUT);//7 баня 
  pinMode(53, OUTPUT);//водонагреватель в доме

  //digitalWrite(26, HIGH);
  //digitalWrite(27, HIGH);
  digitalWrite(28, HIGH);
  digitalWrite(29, HIGH);
  digitalWrite(30, HIGH);
  digitalWrite(31, HIGH);
  digitalWrite(39, HIGH);
  digitalWrite(41, HIGH);
  digitalWrite(43, HIGH);
  digitalWrite(45, HIGH);
  digitalWrite(47, HIGH);
  digitalWrite(49, HIGH);
  digitalWrite(51, HIGH); 
  digitalWrite(53, HIGH);
  
  digitalWrite(9, HIGH);//подаем высокий сигнал для включения GSM модуля
  delay(3000); //задержка 3 сек.
  digitalWrite(9, LOW);    

   counter=EEPROM.read(0);// чтение из памяти счетчика отключений
   counter=counter+1;  
   EEPROM.write(0, counter);// запись в память счетчика отключений
   flag_1= EEPROM.read(1);   
   
   if(flag_1==1)
     {digitalWrite(39, LOW);}// свет в доме включен
   flag_2= EEPROM.read(2);
   
   if(flag_2==1)
     {digitalWrite(41, LOW);}// свет на терассе включен
   flag_3= EEPROM.read(3);
   
   if(flag_3==1)
     {digitalWrite(43, LOW);}// свет на чердаке включен
   flag_4= EEPROM.read(4);
   
   if(flag_4==1)
     {digitalWrite(45, LOW);}// свет на улице включен
   flag_5= EEPROM.read(5);
   
   if(flag_5==1)
     {digitalWrite(47, LOW);}// свет в подвале включен
   flag_6= EEPROM.read(6);
   
   if(flag_6==1)
     {digitalWrite(49, LOW);}// свет в туалете включен
   flag_7= EEPROM.read(7);
   
   if(flag_7==1)
     {digitalWrite(51, LOW);}// свет в бане включен
   flag_8= EEPROM.read(8);
   
   if(flag_8==1)
     {digitalWrite(53, LOW);}// водонагреватель включен */
   ustavka=EEPROM.read(9);// запись в память уставки температуры
   lcd.setCursor(11,1);//установить курсор в 13 знакоместо 2 строки
   lcd.print(ustavka);
   lcd.setCursor(14,2);// установить курсор в 15 знакоместо 3 строки
   lcd.print(ustavka);
   
   flag_12=EEPROM.read(12);
   if(flag_12==0)
     {}//ничего не делаем
     
   if(flag_12==1)
     {
       BLOCK();
     }  
  
   

    unsigned long currentMillis = millis();// текущее время - время с момента включения МК 
          if(currentMillis - previousMillis > 2000)// если текущее время - предустановленное больше 2 секунд
           {
            previousMillis = currentMillis;// предустановленное становится текущим
            Vremya(); // вызываем функцию опроса времени
           }
  sensors.begin();
  sensors.setResolution(Thermometer1, 9);// устанавливаем разрешение для датчика
  sensors.setResolution(Thermometer2, 9);// устанавливаем разрешение для датчика 

    Serial1.print("AT+IFC=1, 1\r");
    delay(300);
    Serial1.print("AT+CPBS=\"SM\"\r");
    delay(300);
    Serial1.print("AT+CNMI=1,2,2,1,0\r");
    delay(500);   

  //Vremya();
  START(); 
}

void printTemperature(DeviceAddress deviceAddress)
  {
   tempC = sensors.getTempC(deviceAddress);
  // sensors.requestTemperatures();
  //printTemperature(Thermometer1);
 // tempC1=tempC;
  //printTemperature(Thermometer2);
  //tempC2=tempC; 
  }
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false; 

void loop()
{ 
  
    unsigned long currentMillis = millis();// текущее время - время с момента включения МК  
          if(currentMillis - previousMillis > interval && regim==1)// если текущее время - предустановленное, больше 60 секунд...
           {
            previousMillis = currentMillis;// предустановленное становится текущим
            DATCHIKI(); // вызываем функцию опроса датчиков
            Vremya();// вызываем функцию опроса времени
            START();// перерисовываем экран
           }
          
          if(currentMillis - previousMillis > interval && regim !=1)//если режим не равен стартовому...
            {
             previousMillis = currentMillis;// предустановленное становится текущим
             DATCHIKI(); // вызываем функцию опроса датчиков 
            } 
            
  if (Serial1.available())// если есть данные из GSM модуля
   { 
    char currSymb = Serial1.read(); //читаем
    if ('\r' == currSymb)
      {
        if (isStringMessage)
          {    
            if(currStr.startsWith("##start"))// если сообщение начинается с символов "##start"

              {
                message=part1+number_input;
                number=message+part3;
                temperature=currStr.substring(7);//выделяем подстроку с численным значением
                ustavka_input=temperature.toInt();// переводим численное значение в целое.               

                if(ustavka_input>=11 && ustavka_input< 27)//если получено значение температуры больше 10 и меньше 30
                  {
                    START();
                    ustavka=ustavka_input;
                    SendStatus();// отправляем СМС с текущими параметрами                    
                    //lcd.setCursor(11,1);//установить курсор в 13 знакоместо 2 строки
                    //lcd.print(ustavka);
                    //lcd.setCursor(14,2);// установить курсор в 15 знакоместо 3 строки
                    //lcd.print(ustavka);
                    EEPROM.write(9,ustavka);
                  }
                if(ustavka_input> 27)//если получена уставка больше 27
                  {
                   SendTempMessage();//вызываем функцию отправки СМС с критическимим параметрами
                   ustavka=20;//установлено значение температуры по умолчанию = +20 градусов
                   EEPROM.write(9,ustavka);
                  }
              }
            if(currStr.startsWith("##comand"))// если пришло СМС с запросом на команды управления...
              {
               message=part1+number_input;
               number=message+part3;
               SendComand(); //отправляем СМС с управляющими командами               
              }
            if(currStr.startsWith("##stop"))// если пришло СМС с командой ##stop...
              {
                block();// блокируем клавиатуру
                ustavka=11;
                message=part1+number_input;
                number=message+part3;
                //ustavka=11;
                EEPROM.write(9,ustavka);
                SendStopMessage();//отправляем СМС с параметрами дежурного режима
                
              }
            if(currStr.startsWith("##status"))// если пришло СМС с запросом контролируемых параметров...
              {
                message=part1+number_input;
                number=message+part3;
                SendStatus();// отправляем СМС с текущими параметрами
              }

            isStringMessage = false;
        } else
            {
            if (currStr.startsWith("+CMT"))
              {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
                number_input=currStr.substring(8,19);// выделяем из буфера подстроку с номером телефона
            }
        }
        currStr = "";
    }
    else if ('\n' != currSymb)
      {
        currStr += String(currSymb);
    }
}

  if(Serial2.available())//пока есть данные из клавиатуры...
     {
       val=Serial2.read();//считываем значение клавиши
       //char inChar=Serial2.read();
       if(val=='*'&& regim==1)//если пришел символ '*'
         {
           delay(20);
           tone(38,3500,150);            
           MENU();
         } 
       if(val=='0' && regim==1)// если в режиме "Старт" нажать 0...
         {
           delay(20);
           tone(38,3500,150); 
           block();// очищаем экран
         }      
           if(val=='A'&& regim==2)// режим ОСВЕЩЕНИЕ
             {
              delay(20);
              tone(38,3500,150);       
              SVET();
             }     
           if(val=='#' && regim!=1 && regim!=10 )//если нажата клавиша '#' в любом режиме кроме 9....
             {
              delay(10);
              tone(38,3500,150);
              Vremya();// вызываем функцию опроса времени
              START();
              //DATCHIKI(); // вызываем функцию опроса датчиков
             }         
              if(val=='1'&& regim==3&&flag_1==0)// если нажать "1" в режиме освещение, КОМНАТА
                    {
                     delay(10);
                     tone(38,3500,150);
                     digitalWrite(39,!digitalRead(39));                
                     flag_1=1;
                     if(digitalRead(39)==LOW)
                       {
                        EEPROM.write(1,1);
                       }
                     if(digitalRead(39)==HIGH)
                       {
                        EEPROM.write(1,0);
                       }
                     }         
               if(val=='1'&& regim==3&&flag_1==1)// если нажать "1" в режиме освещение, КОМНАТА
                    {         
                     delay(10);                    
                     flag_1=0;
                     }
               if(val=='2'&& regim==3&&flag_2==0)// если нажать "2" в режиме освещение ТЕРАССА
                   {
                     delay(10);
                     tone(38,3500,150);
                     digitalWrite(41,!digitalRead(41));
                     flag_2=1;
                     if(digitalRead(41)==LOW)
                       {
                        EEPROM.write(2,1);
                       }
                     if(digitalRead(41)==HIGH)
                       {
                        EEPROM.write(2,0); 
                       }
                    }
                if(val=='2'&& regim==3&&flag_2==1)// если нажать "2" в режиме освещение, ТЕРАССА
                    {
                     delay(10);
                     flag_2=0;                
                    }
                if(val=='3'&& regim==3&&flag_3==0)// если нажать "3" в режиме освещение ЧЕРДАК
                    {
                     delay(10);
                     tone(38,3500,150);
                     digitalWrite(43,!digitalRead(43));
                     flag_3=1;
                     if(digitalRead(43)==LOW)
                       {
                        EEPROM.write(3,1);
                       }
                     if(digitalRead(43)==HIGH)
                       {
                        EEPROM.write(3,0); 
                        }
                    }
                 if(val=='3'&& regim==3&&flag_3==1)// если нажать "3" в режиме освещение, ЧЕРДАК
                    {
                     delay(10);
                     flag_3=0;               
                    }
                 if(val=='4'&& regim==3&&flag_4==0)// если нажать "4" в режиме освещение УЛИЦА
                    {
                     delay(10);
                     tone(38,3500,150);
                     digitalWrite(45,!digitalRead(45));
                     flag_4=1;
                     if(digitalRead(45)==LOW)
                       {
                        EEPROM.write(4,1);
                       }
                     if(digitalRead(45)==HIGH)
                       {
                        EEPROM.write(4,0);
                       }                

                    } 

                if(val=='4'&& regim==3&&flag_4==1)// если нажать "4" в режиме освещение, УЛИЦА
                    {
                     delay(10);
                     flag_4=0;                   
                    }   
                  if(val=='5'&& regim==3&&flag_5==0)// если нажать "5" в режиме освещение ПОДВАЛ
                    {
                     delay(10);
                     tone(38,3500,150);
                     digitalWrite(47,!digitalRead(47));
                     flag_5=1;
                     if(digitalRead(47)==LOW)
                       {
                        EEPROM.write(5,1); 
                       }
                     if(digitalRead(47)==HIGH)
                       {
                        EEPROM.write(5,0); 
                       }
                    }
                  if(val=='5'&& regim==3&&flag_5==1)// если нажать "5" в режиме освещение, ПОДВАЛ
                    {
                     delay(10);
                     flag_5=0;                  
                    }      
                 if(val=='6'&& regim==3&&flag_6==0)// если нажать "6" в режиме освещение ТУАЛЕТ
                    {
                     delay(10);
                     tone(38,3500,150); 
                     digitalWrite(49,!digitalRead(49));
                     flag_6=1;
                     if(digitalRead(49)==LOW)
                       {
                        EEPROM.write(6,1); 
                       }
                     if(digitalRead(49)==HIGH)
                       {
                        EEPROM.write(6,0); 
                       }
                    }
                  if(val=='6'&& regim==3&&flag_6==1)// если нажать "6" в режиме освещение, ТУАЛЕТ
                    {
                     delay(10);
                     flag_6=0;                
                    }    
                  if(val=='7'&& regim==3&&flag_7==0)// если нажать "7" в режиме освещение БАНЯ
                    {
                     delay(10);
                     tone(38,3500,150); 
                     digitalWrite(51,!digitalRead(51));
                     flag_7=1;
                     if(digitalRead(51)==LOW)
                       {
                        EEPROM.write(7,1); 
                       }
                     if(digitalRead(51)==HIGH)
                       {
                        EEPROM.write(7,0); 
                       }               
                    }
                  if(val=='7'&& regim==3&&flag_7==1)// если нажать "7" в режиме освещение, БАНЯ
                    {
                     delay(10);
                     flag_7=0;                 
                    }           
                 if(val=='8'&& regim==3&&flag_8==0)// если нажать "8" в режиме освещение
                    {
                     delay(10);
                     tone(38,3500,150);
                     digitalWrite(53,!digitalRead(53));
                     flag_8=1;
                     if(digitalRead(53)==LOW)
                       {
                        EEPROM.write(8,1);
                       }
                     if(digitalRead(53)==HIGH)
                       {
                        EEPROM.write(8,0);
                       }
                    }
                  if(val=='8'&& regim==3&&flag_8==1)// если нажать "8" в режиме освещение
                    {
                     delay(10);
                     flag_8=0;                
                    }      
            if(val=='B'&& regim==2)// входим в режим 4 просмотра уставок температуры
              {
               delay(20);
               tone(38,3500,150);
     // РЕЖИМ ОТОПЛЕНИЕ!!!       
               TEPLO();
              }    
           if(val=='*'&& regim==4)//входим в режим 5 настройка температуры
             {
              delay(20);
              tone(38,3500,150);          
// НАСТРОЙКА РЕЖИМА ОТОПЛЕНИЯ
              NASTROIKA_TEPLO();       
             }
           if(val=='6' && regim==5 && ustavka<=27 )//нажимаем "6" увеличиваем уставку температуры в котле
            {     
               delay(20);      
               ustavka++;
               lcd.setCursor(14,2);// установить курсор в 15 знакоместо 3 строки
               lcd.print(ustavka);    
            }
          if(val=='4' && regim==5 && ustavka>=10)//нажимаем "4" уменьшаем уставку температуры в котле
            {
             delay(20);
             ustavka--;        
             lcd.setCursor(14,2);// установить курсор в 15 знакоместо 3 строки
             lcd.print(ustavka);          
            }         
          if(val=='0' && regim==5)//записываем уставку температуры в память
            {
             delay(20);
             tone(38,3500,200);
             EEPROM.write(9,ustavka);//записываем уставку температуры в память   
             lcd.setCursor(0,0);//установить курсор в 1 знакоместо 1 строки
             lcd.print("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20");// чистим строку
             lcd.setCursor(0,1);//установить курсор в 1 знакоместо 2 строки
             lcd.print("\x20\x20\x20\x20\x20\x20\xA9\x63\xBF\x61\xB3\x6B\x61\x20\x20\x20\x20\x20\x20\x20");//печатаем "Уставка"
             lcd.setCursor(0,2);//установить курсор в 1 знакоместо 3 строки
             lcd.print("\x20\x20\x20\x20\x20\xB7\x61\xBE\xB8\x63\x61\xBD\x61\x21\x20\x20\x20\x20\x20\x20");//печатаем "записана"         
             lcd.setCursor(0,3);//установить курсор в 1 знакоместо 4 строки
             lcd.print("\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20");//чистим строку
             delay(800);    
             TEPLO();
             DATCHIKI(); // вызываем функцию опроса датчиков
            }                  
     //РЕЖИМ ВЕНТИЛЯЦИИ!!!     
          if(val=='C' && regim==2)//входим в режим ВЕНТИЛЯЦИИ
            {
             delay(20);
             tone(38,3500,150);         
             Vlazhnost();
            }
             if(val=='1' && regim==6 && flag_9==0)
               {
                 delay(10);
                 tone(38,3500,150); 
                 digitalWrite(30,!digitalRead(30)); // включение вентиляции в доме
                 flag_9=1;
               }
             if(val=='1' && regim==6 && flag_9==1)
               {
                 delay(10);
                 flag_9=0;
               } 
             if(val=='3' && regim==6 && flag_10==0)
               {
                 delay(10);
                 tone(38,3500,150); 
                 digitalWrite(31,!digitalRead(31)); // включение вентиляции в подвале
                 flag_10=1;
               }
             if(val=='3' && regim==6 && flag_10==1)
               {
                 delay(10);
                 flag_10=0;
               }
             if(val=='*' && regim==8)//ручной режим управления вентиляцией
               {
                 delay(10);
                 tone(38,3500,150); 
                 VENTILATION();
               }
              if(val=='1' && regim==8)//нажимаем "1" уменьшаем уставку
               {
                 h2--; //уменьшаем уставку
                 lcd.setCursor(2,1);
                 lcd.print(h2);//печатаем уставку
               }
              if(val=='4' && regim==8)//нажимаем "1" уменьшаем уставку
               {
                 h2++; //увеличиваем уставку
                 lcd.setCursor(2,1);
                 lcd.print(h2);//печатаем уставку
               }
             if(val=='3' && regim==8)//нажимаем "1" уменьшаем уставку
               {
                 h3--; //уменьшаем уставку
                 lcd.setCursor(16,1);
                 lcd.print(h3);//печатаем уставку
               }
              if(val=='6' && regim==8)//нажимаем "1" уменьшаем уставку
               {
                 h3++; //увеличиваем уставку
                 lcd.setCursor(16,1);
                 lcd.print(h3);//печатаем уставку
               }  
       //РЕЖИМ ЖУРНАЛ СОБЫТИЙ
        if(val=='D' && regim==2)// входим в ЖУРНАЛ событий
           {
             delay(20);
             tone(38,3500,150);           
             ZHURNAL();
           }
         if(val=='0' && regim==7)
           {
             counter=0;//обнуляем счетчик отключений
             delay(20);
             tone(38,3500,150);
             EEPROM.write(0, 0);//записываем значение в ЕЕPROM
            // Serial.println(counter);
             lcd.setCursor(15,1);//установить курсор в 1 знакоместо 2 строки
             lcd.print(counter);// печатаем
           }     
         }         

       if(Serial3.available()) // если есть данные через радиоудлинитель...
        {
         val=Serial3.read();//считываем значение
         if(val=='1'&&flag_1==0)// управление освещением в комнате
          {
            delay(10);
            digitalWrite(39,!digitalRead(39));
            flag_1=1;
            if(digitalRead(39)==LOW)
              {
               EEPROM.write(1,1); 
              }
            if(digitalRead(39)==HIGH)
              {
               EEPROM.write(1,0); 
              }
          }
        if(val=='1'&&flag_1==1)
          {         
           delay(10);
           flag_1=0;
          }
        if(val=='2'&&flag_2==0)// управление освещением на терассе
          {
            delay(10);
            digitalWrite(41,!digitalRead(41));
            flag_2=1;
           if(digitalRead(41)==LOW)
              {
               EEPROM.write(2,1);
              }
            if(digitalRead(41)==HIGH)
              {
               EEPROM.write(2,0); 
              }
          }
        if(val=='2'&&flag_2==1)
          {        
           delay(10);
           flag_2=0;
           }
        if(val=='3'&&flag_3==0)// управление освещением на чердаке
          {
            delay(10);
            digitalWrite(43,!digitalRead(43));
            flag_3=1;
            if(digitalRead(43)==LOW)
              {
               EEPROM.write(3,1); 
              }
            if(digitalRead(43)==HIGH)
              {
               EEPROM.write(3,0);
              }
          }
        if(val=='3'&&flag_3==1)
          {
           delay(10);
           flag_3=0;
          }
        if(val=='4'&&flag_4==0)// управление освещением на улице
          {
            delay(10);
            digitalWrite(45,!digitalRead(45));
            flag_4=1;
            if(digitalRead(45)==LOW)
              {
               EEPROM.write(4,1); 
              }
            if(digitalRead(45)==HIGH)
              {
               EEPROM.write(4,0); 
              }
          }
        if(val=='4'&&flag_4==1)
          {
           delay(10);
           flag_4=0;
          }
        if(val=='5'&&flag_5==0)// управление освещением в подвале
          {
            delay(10);
            digitalWrite(47,!digitalRead(47));
            flag_5=1;
            if(digitalRead(47)==LOW)
              {
               EEPROM.write(5,1); 
              }
            if(digitalRead(47)==HIGH)
              {
               EEPROM.write(5,0);
              }
          }
        if(val=='5'&&flag_5==1)
          {
           delay(10);
           flag_5=0;
          }
        if(val=='6'&&flag_6==0)// управление освещением в туалете
          {
            delay(10);
            digitalWrite(49,!digitalRead(49));
            flag_6=1;
            if(digitalRead(49)==LOW)
              {
               EEPROM.write(6,1); 
              }
            if(digitalRead(49)==HIGH)
              {
               EEPROM.write(6,0);
              }
          }
        if(val=='6'&&flag_6==1)
          {
           delay(10);
           flag_6=0;
          }
        if(val=='7'&&flag_7==0)// управление освещением в бане
          {
            delay(10);
            digitalWrite(51,!digitalRead(51));
            flag_7=1;
           if(digitalRead(51)==LOW)
              {
               EEPROM.write(7,1); 
              }
            if(digitalRead(51)==HIGH)
              {
               EEPROM.write(7,0); 
              }
          }
        if(val=='7'&&flag_7==1)
          {
           delay(10);
           flag_7=0;
          }
      if(val=='8' && regim!=10 && flag_12==0 )//заблокировать дисплей
        {
          delay(10);
          BLOCK();
          flag_12=1;
          EEPROM.write(12,1); //записать значение в память
        }
      if(val=='9' && regim==10 && flag_12==1)//разблокировать дисплей
       {
         delay(10);
         START();
         flag_12=0;
         EEPROM.write(12,0);// записать значение в память
       }   
     }
}

void START()
{
     regim=1;  
                 //byte ta = dhta.readTemperature(); // Считываем температуру датчика 1 на улице
                 
                 byte tb = dhtb.readTemperature(); // Считываем температуру датчика 2 в доме
                 byte tc = dhtc.readTemperature(); // Считываем температуру датчика 1 в подвале 
                 lcd.setCursor(0, 0);//устанавливаем курсор в 1 знакоместо 1 строки
                 lcd.print("\x20");// чистим
                 lcd.setCursor(1, 0);//устанавливаем курсор в 2 знакоместо 1 строки
                 lcd.print("20");
                 lcd.setCursor(19, 0);//устанавливаем курсор в 20 знакоместо 1 строки
                 lcd.print("\x20");// чистим
                 lcd.setCursor(11, 0);//устанавливаем курсор в 10 знакоместо 1 строки
                 lcd.print("\x20\x20\x20");// чистим
                 lcd.setCursor(0, 1);//устанавливаем курсор в 1 знакоместо 2 строки
                 lcd.print("\x20\x20\x20\x20\x20\x20\x20");//чистим
                 lcd.setCursor(15, 1);//устанавливаем курсор в 14 знакоместо 2 строки
                 lcd.print("\x20\x20\x20\x20\x20");// чистим
                 lcd.setCursor(0, 2);//устанавливаем курсор в 1 знакоместо 3 строки
                 lcd.print("\x20");//чистим
                 lcd.setCursor(10, 2);//устанавливаем курсор в 9 знакоместо 3 строки
                 lcd.print("\x20");//чистим
                 lcd.setCursor(11, 2);//устанавливаем курсор в 1 знакоместо 3 строки
                 lcd.print("\x20\x20\x20\x20");// чистим
                 lcd.setCursor(0, 3);//устанавливаем курсор в 1 знакоместо 4 строки
                 lcd.print("\x20"); //чистим
                 lcd.setCursor(7,1);//устанавливаем курсор в 4 знакоместо 2 строки
                 lcd.print("\x4D\x45\x48\xB0\x13\x22\x2A\x22");//печатаем надпись "МЕНЮ -> "*""
                 lcd.setCursor(1,2);//устанавливаем курсор в 1 знакоместо 3 строки
                 lcd.print("\x48\x61\x20\x79\xBB\xB8\xE5\x65\x3A");// печатаем надпись "На улице:" 
                 lcd.setCursor(12,2);//устанавливаем курсор в 13 знакоместо 3 строки 
                 //lcd.print(ta);//температура на улице
                 lcd.print(tempC2);//температура на улице
                 lcd.setCursor(15,2);//устанавливаем курсор в 15 знакоместо 3 строки
                 lcd.print("\xEF\x43\x20\x20"); //печатаем "оС"
                 lcd.setCursor(1,3);//устанавливаем курсор в 1 знакоместо 4 строки
                 lcd.print("\x42\x20\xBE\x6F\xBC\x65\xE6\x65\xBD\xB8\xB8\x3A");//печатаем надпись "В помещении:"
                 lcd.setCursor(13,3);//устанавливаем курсор в 12 знакоместо 4 строки
                 lcd.print("\x20");//чистим
                 lcd.setCursor(14,3);//устанавливаем курсор в 12 знакоместо 3 строки              
                 lcd.print(tb);//печатаем температуру в доме
                 lcd.setCursor(16,3);
                 lcd.print("\x20\x20");//чистим
                 lcd.setCursor(18,3);//устанавливаем курсор в 15 знакоместо 4 строки
                 lcd.print("\xEF\x43"); //печатаем "оС"                        
                 Vremya(); // вызываем функцию опроса времени

}

void MENU()
{
regim=2;// режим МЕНЮ
           lcd.clear();
           lcd.setCursor(0, 0);//устанавливаем курсор в 2 знакоместо 1 строки
           lcd.print("\x20\x22\x41\x22\x84\x4F\x63\xB3\x65\xE6\x65\xBD\xB8\x65\x20\x20\x20\x20\x20\x20");//печатаем "А" -Освещение
           lcd.setCursor(0, 1);//устанавливаем курсор в 2 знакоместо 2 строки
           lcd.print("\x20\x22\x42\x22\x84\x4F\xBF\x6F\xBE\xBB\x65\xBD\xB8\x65\x20\x20\x20\x20\x20\x20");//печатаем "B"-Отопление
           lcd.setCursor(0, 2);//устанавливаем курсор в 2 знакоместо 3 строки
           lcd.print("\x20\x22\x43\x22\x84\x42\x65\xBD\xBF\xB8\xBB\xC7\xE5\xB8\xC7\x20\x20\x20\x20\x20");//печатаем "С"-Вентиляция
           lcd.setCursor(0, 3);//устанавливаем курсор в 2 знакоместо 4 строки
           lcd.print("\x20\x22\x44\x22\x84\xA3\x79\x70\xBD\x61\xBB\x20\x22\x23\x22\x20\xE0\x41\x54\x41");//печатаем "D"-Журнал "#" СТАРТ 
}
void SVET()
{
regim=3;  
              lcd.clear();
              lcd.setCursor(0, 0);//устанавливаем курсор в 1 знакоместо 1 строки
              lcd.print("\x31\x20\x6B\x6F\x6D\xBD\x61\xBF\x61\x20\x20\x32\x20\xBF\x65\x70\x61\x63\x63\x61");//печатаем "1-комната 2-терасса"
              lcd.setCursor(0, 1);//устанавливаем курсор в 1 знакоместо 2 строки
              lcd.print("\x33\x20\xC0\x65\x70\xE3\x61\x6B\x20\x20\x20\x34\x20\x79\xBB\xB8\xE5\x61");// печатаем "3 чердак 4 улица"
              lcd.setCursor(0, 2);//устанавливаем курсор в 1 знакоместо 3 строки
              lcd.print("\x35\x20\xBE\x6F\xE3\xB3\x61\xBB\x20\x20\x20\x36\x20\xBF\x79\x61\xBB\x65\xBF\x20");//печатаем "5 подвал 6 туалет"
              lcd.setCursor(0, 3);//устанавливаем курсор в 1 знакоместо 4 строки
              lcd.print("\x37\x20\xB2\x61\xBD\xC7\x20\x20\x20\x20\x23\x20\x42\x4F\xA4\x42\x50\x41\x54\x20");//печатаем "7" баня # ВОЗВРАТ"
}

void TEPLO()
{
regim=4;
               sensors.requestTemperatures();
               printTemperature(Thermometer1);
               tempC1=tempC; 
               lcd.clear();
               int tb = dhtb.readTemperature(); // Считываем температуру датчика 2 в доме
               lcd.setCursor(0,0);//установить курсор в 1 знакоместо 1 строки
               lcd.print("\x20\x74\x20\x6B\x6F\xBF\xB5\xBB\x20\x20\x20\x20");//печатаем надпись "t котел"
               lcd.setCursor(10,0);//установить курсор в 11 знакоместо 1 строки
               lcd.print(tempC1);          
               lcd.setCursor(14,0);//установить курсор в 15 знакоместо 1 строки
               lcd.print("\xEF\x43\x20\x20\x20\x20");//печатаем "оС"
               lcd.setCursor(0,1);//установить курсор в 1 знакоместо 2 строки
               lcd.print("\x20\x74\x20\x79\x63\xBF\x61\xB3\x6B\x61\x20\x20");//печатаем "t уставка"
               lcd.setCursor(11,1);//установить курсор в 13 знакоместо 2 строки
               lcd.print(ustavka);
               lcd.setCursor(13,1);//установить курсор в 15 знакоместо 2 строки
               lcd.print("\x20\xEF\x43\x20\x20\x20\x20");//печатаем "оС" и "*"
               lcd.setCursor(0,2);//установить курсор в 1 знакоместо 3 строки
               lcd.print("\x20\x74\x20\xB3\xBD\x79\xBF\x70\xB8\x20\x20\x20");// печатаем "t внутри"
               lcd.setCursor(10,2);//установить курсор в 11 знакоместо 3 строки
               lcd.print(tb);
               lcd.setCursor(12,2);//установить курсор в 15 знакоместо 3 строки
               lcd.print("\x20\xEF\x43\x20\x20\x20\x20");//печатаем "оС"
               lcd.setCursor(0,3);//установить курсор в 1 знакоместо 4 строки
               lcd.print("\x2A\x20\x48\x61\x63\xBF\x70\x6F\xB8\xBF\xC4\x20\x23\x42\x4F\xA4\x42\x50\x41\x54");// печатаем "* Настроить # ВОЗВРАТ

}

void NASTROIKA_TEPLO()
{
regim=5;
              lcd.clear();
              lcd.setCursor(0,0);//установить курсор в 1 знакоместо 1 строки
              lcd.print("\x20\xA4\x61\xE3\x61\xBF\xC4\x20\xBF\x65\xBC\xBE\x65\x70\x61\xBF\x79\x70\x79\x3A");//печатаем "Задать температуру:"
              lcd.setCursor(0,1);//установить курсор в 1 знакоместо 2 строки
              lcd.print("\x22\x34\x22\x20\x2D\x2D\x20\x20\x20\x20\x20\x20\x79\x63\xBF\x61\xB3\x6B\x61\x3A");//печатаем "4"--  
              lcd.print(ustavka);
              lcd.setCursor(0,2);//установить курсор в 1 знакоместо 2 строки
              lcd.print("\x22\x36\x22\x20\x2B\x2B\x20\x20\x20\x20\x20\x20\x20\x20");//печатаем "6" ++
              lcd.setCursor(16,2);// установить курсор в 11 знакоместо 3 строки
              lcd.print("\x20\xEF\x43\x20");//печатаем "оС"
              lcd.setCursor(14,2);// установить курсор в 15 знакоместо 3 строки
              lcd.print(ustavka);           
              lcd.setCursor(0,3);//установить курсор в 1 знакоместо 4 строки
              lcd.print("\x22\x23\x22\x42\x4F\xA4\x42\x50\x41\x54\x20\x22\x30\x22\xA4\x41\xA8\xA5\x43\x62");// печатаем "#" ВОЗВРАТ "0" ЗАПИСЬ                

}
void VENTILATION()
{
regim=6;  
             byte hb = dhtb.readHumidity(); // Считываем влажность датчика 2 в доме 
             byte tc = dhtc.readTemperature(); // Считываем температуру датчика 3 в подвале  
             byte hc = dhtc.readHumidity(); // Считываем влажность датчика 3 в подвале 
             lcd.clear();
             lcd.setCursor(0,0);//установить курсор в 1 знакоместо 1 строки
             lcd.print("\x20\x20\x50\x65\xB6\xB8\xBC\x20\xB3\x65\xBD\xBF\xB8\xBB\xC7\xE5\xB8\xB8\x20\x20");//печатаем "Режим вентиляции"
             lcd.setCursor(0,1);//установить курсор в 1 знакоместо 2 строки
             lcd.print("\xBE\x6F\xE3\xB3\x61\xBB\x20");//печатаем "подвал" 
             lcd.setCursor(7,1);//установить курсор в 8 знакоместо 2 строки
             lcd.print(hc);//значение влажности в подвале
             lcd.setCursor(9,1);//установить курсор в 10 знакоместо 2 строки
             lcd.print("\x25\x20\x20\xE3\x6F\xBC\x20");//печатаем   "% дом"
             lcd.setCursor(16,1);//установить курсор в 19 знакоместо 2 строки
             lcd.print(hb);//значение влажности в доме
             lcd.setCursor(18,1);//установить курсор в 19 знакоместо 2 строки
             lcd.print("\x25\x20");//
             lcd.setCursor(0,2);//установить курсор в 1 знакоместо 3 строки
             lcd.print("\x22\x31\x22\x4F\x4E\x2F\x4F\x46\x46\x20\x22\x33\x22\x4F\x4E\x2F\x4F\x46\x46\x20");//печатаем  1 ON/OFF 3 ON/OFF
             lcd.setCursor(0,3);//установить курсор в 1 знакоместо 4 строки
             lcd.print('t');
             lcd.setCursor(1,3);//установить курсор в 1 знакоместо 4 строки
             lcd.print("\xBE\x6F\xE3\xB3\x61\xBB");//печатаем "подвал" 
             lcd.setCursor(8,3);
             lcd.print(tc);
             lcd.setCursor(10,3);//установить курсор в 11 знакоместо 4 строки
             lcd.print("\x20\x23\x20\x42\x4F\xA4\x42\x50\x41\x54");//печатаем # ВОЗВРАТ
}
void ZHURNAL()
{
  regim=7;
             lcd.clear();
             lcd.setCursor(0,0);//установить курсор в 1 знакоместо 1 строки
             lcd.print("\x20\x20\xA3\x79\x70\xBD\x61\xBB\x20\x6F\xBF\xBA\xBB\xC6\xC0\x65\xBD\xB8\xB9\x20");// печатаем "Журнал отключений "
             lcd.setCursor(0,1);//установить курсор в 1 знакоместо 2 строки
             lcd.print("\x20\x20\x63\xB8\x63\xBF\x65\xBC\xC3\x3A\x20\x20\x20\x20");// печатаем "системы:"
             lcd.setCursor(15,1);//установить курсор в 1 знакоместо 2 строки
             counter=EEPROM.read(0);// чтение из памяти счетчика отключений
             lcd.print(counter);//                                счетчик отключений системы
             lcd.setCursor(16,1);//установить курсор в 1 знакоместо 2 строки
             lcd.print("\x20\x20\x20\x20");//чистим
             lcd.setCursor(0,2);//установить курсор в 1 знакоместо 3 строки
             lcd.print("\x20\x63\xB2\x70\x6F\x63\x20\x63\xC0\xB5\xBF\xC0\xB8\xBA\x61\x3A\x20\x22\x30\x22");// печатаем "сброс счетчика "0""
             lcd.setCursor(0,3);//установить курсор в 1 знакоместо 4 строки
             lcd.print("\x20\x20\x20\x20\x20\x22\x23\x22\x42\x4F\xA4\x42\x50\x41\x54\x20\x20\x20\x20\x20");//печатаем # ВОЗВРАТ
}
void Vremya()
    {
            Serial1.print("AT+CCLK?\r");//запрос текущего времени
            delay(100);      
            while(Serial1.available())//пока есть данные из GPRS
             { 
              char incomingChar=Serial1.read();//читаем символы...
              message+=incomingChar;//составляем строку
               if(incomingChar=='\n')//если получен символ новой строки...
                {
                 if(regim==1)
                  {         
                   lcd.setCursor(3, 0);//устанавливаем курсор в 2 знакоместо 1 строки
                   lcd.print(message.substring(8,16));//печатаем дату на ЛСД     
                   lcd.setCursor(14, 0);//устанавливаем курсор в 14 знакоместо 2 строки
                   lcd.print(message.substring(17,22));//печатаем время на ЛСД
                   message="";//обнуляем строку
                  }
                }
            }        

    }
 void SendTempMessage()
 {
  Serial1.print("AT+CMGF=1\r"); // установка режима СМС
  delay(100);
  Serial1.println(number);
  delay(100);
  Serial1.println("the temperature value is too high!! Set to +28 °C"); //the content of the message
  delay(100);
  Serial1.print((char)26);//the ASCII code of the ctrl+z is 26 (required according to the datasheet)
  delay(100);
}
void SendComand()
{
 Serial1.print("AT+CMGF=1\r"); // установка режима СМС
delay(100);
Serial1.println(number);//устанавливаем номер для отправки СМС
delay(100);
Serial1.println("##status - parameters of sistem; ##startNUM - start of sistem, NUM- the temperature value; ##stop - stop of sistem, temp inside installed = 11C");//пишем сообщение с командами управления
delay(100);
Serial1.print((char)26);//the ASCII code of the ctrl+z is 26 (required according to the datasheet)
delay(100);
}
void SendStopMessage()
{
Serial1.print("AT+CMGF=1\r"); // установка режима СМС
delay(100);
Serial1.println(number);//устанавливаем номер для отправки СМС
delay(100);
Serial1.println("the system is put into standby mode. setpoint temperature +11 °C");//пишем сообщение с командами управления
Serial1.print("ustavka = ");
Serial1.println(ustavka);
delay(100);
Serial1.print((char)26);//the ASCII code of the ctrl+z is 26 (required according to the datasheet)
delay(100);
}
void SendStatus()
{
sensors.requestTemperatures();
printTemperature(Thermometer1);
tempC1=tempC;  
//byte ta = dhta.readTemperature(); // Считываем температуру датчика 1 на улице
//byte ha = dhta.readHumidity(); // Считываем влажность датчика 1 на улице
int tb = dhtb.readTemperature(); // Считываем температуру датчика 2 в доме
byte hb = dhtb.readHumidity(); // Считываем влажность датчика 2 в доме 
 Serial1.print("AT+CMGF=1\r"); // установка режима СМС
delay(100);
Serial1.println(number);//устанавливаем номер для отправки СМС
delay(100);
Serial1.print("ustavka = ");
Serial1.println(ustavka);
Serial1.print("temp inside = ");//печатаем
Serial1.println(tb);
Serial1.print("humidity inside = ");//печатаем
Serial1.println(hb);
Serial1.print("temp outside =  ");
Serial1.println(tempC2);// температура на улице
//Serial1.print("humidity outside = ");
//Serial1.println(ha);
Serial1.print("temp kotel = ");
Serial1.println(tempC1);
delay(100);
Serial1.print((char)26);//the ASCII code of the ctrl+z is 26 (required according to the datasheet)
delay(100);
}

void DATCHIKI()
{ 
  sensors.requestTemperatures();
  printTemperature(Thermometer1);
  tempC1=tempC;
  printTemperature(Thermometer2);
  tempC2=tempC; 
  //byte ha = dhta.readHumidity(); // Считываем влажность датчика 1 на улице
  byte hb = dhtb.readHumidity(); // Считываем влажность датчика 2 в доме 
  byte hc = dhtc.readHumidity(); // Считываем влажность датчика 3 в подвале 
 // byte ta = dhta.readTemperature(); // Считываем температуру датчика 1 на улице 
  int tb = dhtb.readTemperature(); // Считываем температуру датчика 2 в доме 
  byte tc = dhtc.readTemperature(); // Считываем температуру датчика 3 в подвале  

  if(regim==1)
   {
     lcd.setCursor(12,2);//устанавливаем курсор в 12 знакоместо 3 строки              
     //lcd.print(ta); //печатаем температуру на улице
     lcd.print(tempC2); //печатаем температуру на улице
     lcd.setCursor(14,3);//установить курсор в 15 знакоместо 3 строки
     lcd.print(tb);// печатаем температуру внутри
   }

  if(regim==4)
   {
    lcd.setCursor(10,0);//установить курсор в 11 знакоместо 1 строки             
    lcd.print(tempC1); //печатаем температуру в котле       
    lcd.setCursor(10,2);//установить курсор в 15 знакоместо 3 строки
    lcd.print(tb);// печатаем температуру внутри
   }

  if(regim==6)
   {
    lcd.setCursor(7,1);//установить курсор в 8 знакоместо 2 строки
    lcd.print(hc);//                                     значение датчика влажности подвала  
    lcd.setCursor(16,1);//установить курсор в 17 знакоместо 2 строки
    lcd.print(hb);//                                     печатаем значение датчика влажности для ДОМА
    lcd.setCursor(7,3);//установить курсор в 1 знакоместо 4 строки
    lcd.print(tc);//значение температуры подвал
    lcd.setCursor(9,3);//установить курсор в 10 знакоместо 4 строки
    lcd.print("\x20");
   }
  
   if(ustavka-tb>=1)//если температура в помещении меньше чем уставка на 1 градус или равна 1 градусу... 
   {    
             
            digitalWrite(26, HIGH);// включаем котел первая ступень
             //digitalWrite(27, HIGH);// котел вторая ступень
            digitalWrite(29, LOW);// включаем насос
           
  }
 /* if(tb-ustavka >=2 && ustavka>20)//если температура в помещении больше чем уставка на 2 градуса... - ТРЕВОГА!
     {
       SendStatus();// отправляем СМС сообщение???
     }*/
  else
  {
   digitalWrite(26, LOW);// отключаем котел первая ступень
  //digitalWrite(27, LOW);// котел вторая ступень
   digitalWrite(29, HIGH);// выключаем насос
  }
  
  if(hb-h2>=5)// если влажность в доме больше чем уставка на 5%
    {
      digitalWrite(30,LOW);// включаем вентиляцию в доме
    }
else
  {
    digitalWrite(30,HIGH);// выключаем вентиляцию в доме
  }
if(hc-h3>=5)// если влажность в погребе больше чем уставка на 5%
   {
    digitalWrite(31,LOW);// включаем вентиляцию в погребе
   }
else
   {
    digitalWrite(31,HIGH);// выключаем вентиляцию в погребе
   }
}
void Vlazhnost()
{
regim=8;

  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("\xE3\x6F\xBC\x20\x20\xA9\x43\x54\x41\x42\x4B\xA5\x20\xBE\x6F\xB4\x70\x65\xB2");//дом УСТАВКИ погреб
  lcd.setCursor(2,1);
  lcd.print(h2);//уставка влажность дом
  lcd.setCursor(5,1);
  lcd.print("\xB3\xBB\x61\xB6\xBD\x6F\x63\xBF\xB8");// ПЕЧАТАЕМ: влажности
  lcd.setCursor(16,1);
  lcd.print(h3);//
  lcd.setCursor(0,2);
  lcd.print("\x22\x31\x22\x2D\x2D\x20\x2A\x20\x70\x79\xC0\xBD\x6F\x65\x20\x22\x33\x22\x2D\x2D");//НАДПИСЬ: "1"-- ручное "3"--
  lcd.setCursor(0,3);
  lcd.print("\x22\x34\x22\x2B\x2B\x20\x23\x20\xB3\x6F\xB7\xB3\x70\x20\x20\x22\x36\x22\x2B\x2B");//ПЕЧАТАЕМ: "4"++ #возвр "6"++
}
void block()
{
  regim=9;
  lcd.clear();
}
void BLOCK()
{
  regim=10;
  lcd.clear();
}

 

Marchenko
Marchenko аватар
Offline
Зарегистрирован: 15.12.2014

а хде фото ?

arDubino
Offline
Зарегистрирован: 12.01.2017

фото чего?! ;))

это просто текст .... отчет о том что он смог сам.

 

slon0177
Offline
Зарегистрирован: 16.04.2015

Здравствуйте уважаемый arDubino. Прошу прощения, фото действительно забыл. сейчас исправлю))). Спасибо за критику!))

slon0177
Offline
Зарегистрирован: 16.04.2015

Oleg333
Offline
Зарегистрирован: 18.12.2018

Здравствуйте.

Как развивается ваш проект? Насколько стабильно работает? Мне подходит ваша конфигурация, хочу его повторить. Вот только вместо BT думаю прикрутить ESP8266, сигнализацию на случай проникновения и проходные выключатели тоже были бы очень кстати.

slon0177
Offline
Зарегистрирован: 16.04.2015

Здравствуйте Олег.

Спасибо за проявленный интерес к проекту - система работает как и задумывал. Внес только небольшие изменения: Вместо электрокотла теперь установлен газовый Protherm ягуар(лето 2018 было посвящено прокладке и подключению газопровода и отделке кухни), и соответственно, реле, которое включало насос отопления, теперь замыкает контакты выводов для внешнего термостата. Проходные выключатели пока лежат купленные в мешке - оказалось вполне достаточно управления со смартфона. Но ставить буду обязательно - как только закончу отделку

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

Что касается Ваших задумок - в настоящее время хочу сделать апгрейд. Дисплей nextion 5" уже пришел, интерфейс нарисовал простенький. предусмотрел режим коррекции времени. Жду из Китая ESP 8266. ТОже есть желание сделать управление по wi fi. Еще из плюшек - думаю прикрутить пульт  ИК для управления телеком, кондиционером... но это пока только задумки.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Большой проект

Oleg333
Offline
Зарегистрирован: 18.12.2018

Газ провести - это почти как эверест покорить). Практически подвиг). Мне это не грозит, вероятность минимальная.

У меня электрокотел, как раз трехтеновый. Когда то пробовал погодозависимое управление (PID), но для моих условий эксплуатации дома не подходит. Приезжаю только на выходных зимой, и то не каждый раз. Только система отстроится и уже нужно выключать. Потом опять все по новой.

Что касается ESP. Вот интересная статья 

http://majordomo.smartliving.ru/forum/viewtopic.php?f=23&t=4727

Можно использовать.

Спасибо.

 

Oleg333
Offline
Зарегистрирован: 18.12.2018

Извините, не знаю как к вам обращаться. 

У меня вопрос по скетчу. 

0035 String temperature;
0036 String message;
0037 String number;
0038 String number_input;
0039 String part1 = "AT+CMGS=\"\+";
0040

String part3 = "\"";

Можно об этих строках поподробнее.

Скорость в Serial1 для GSM Shield не многовата? 

 

slon0177
Offline
Зарегистрирован: 16.04.2015

Здравствуйте, меня зовут Василий.

начну в обратной последовательности - экспериментально пробовал менять скорость от 4800 до 38400.

Застрял на 19200 - мне показалось это нормально - во всяком случае проблем с приемом и отправкой данных не было и нет.

Теперь что касается строк 35-39. На тот момент, я еще совсем плохо себе представлял как работать со строковыми переменными, поэтому чтобы не заморачиваться с обьявлением локальных, решил сделать все глобально - разумеется сейчас, обладая более глубокими знаниями о работе  переменных, я бы так делать не стал. Строки 37, 38, 39 - для того, чтобы можно было с любого номера управлять системой. Вообще, строго говоря, скетч требует глубокой переработки и дополнениия - чем я и планирую заняться зимой)

Надеюсь, я ответил на ваши вопросы, уважаемый Oleg333

slon0177
Offline
Зарегистрирован: 16.04.2015

 да! - Спасибо за статью про ESP!)

Oleg333
Offline
Зарегистрирован: 18.12.2018

Василий добрый вечер.

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

У вас все в одном корпусе? Мега, прошка, GSM и реле? Я для управления тэнами котла купил твердотельные реле, они с радиаторами занимают довольно много места и видимо будут вынесены ближе к котлу.

Сегодня залил ваш скетч. Дисплей работает, с GSM shield-ом связи нет. У вас на шильде RX TX на 0,1 или на 7,8?

Скетч контроллера клавиатуры выложите пожалуйста. 

Спасибо.

slon0177
Offline
Зарегистрирован: 16.04.2015

Олег, здравствуйте.

Сейчас вот поздновато залезать в систему - темно на улице.)) По поводу шильда - там есть джамперы. нужно просто перебросить их на другие ноги. Что касается контроллера клавиатуры... я про него совсем забыл когда скетч выкладывал. И программу не помню.... блин

Щас попробую в гугле найти

slon0177
Offline
Зарегистрирован: 16.04.2015

http://www.robots4life.ru/arduino-keypad

вот нашел! Там как раз рабочий пример - оттуда и брал скетч.  

slon0177
Offline
Зарегистрирован: 16.04.2015

И кстати: по поводу удобства управления с любого номера.

 обратите внимание на строки 239, 265, 271, 282 то там прописаны сами команды. В каждую команду я добавил служебные символы ##. Согласитесь, вероятность того, что сообщение от оператора будет начинаться с этих символов, крайне мала. Кроме того, функция  currStr.startsWith  проверяет вхождение всех символов строки сообщения

Oleg333
Offline
Зарегистрирован: 18.12.2018

Ну вобщем да. Два слэша подряд. )

Похоже у моей меги только serial работает, serial1,2,3 мертвые. Грусть печаль.

За ссылку спасибо. То что нужно. 

slon0177
Offline
Зарегистрирован: 16.04.2015

А как вы определили что 1 2 3 Serial мертвые?? Я сейчас вот только что открывал систему  - там джамперы сняты, а со средних пинов идут провода на 18 и 19 пины меги

slon0177
Offline
Зарегистрирован: 16.04.2015

Давно делал, и уже не помню почему такая схема подключения.

На плате есть 6 контактов rx tx, которые переключаются джампером . джампер слева - аппаратный serial. джампер справа - програмный serial. Я снял джамперы совсем, и среднюю пару контактов соединил с 18 и 19 портами меги. Попробуйте сделать - должно работать

Oleg333
Offline
Зарегистрирован: 18.12.2018

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

Информацию принял, буду разбираться. Спасибо огромное за помощь

Oleg333
Offline
Зарегистрирован: 18.12.2018

Все, разобрался. Блок питания не тянул шилд, в момент отправки сообщения ток больше 1 А. Ему не хватало мощности отправить СМС. Все работает.  Спасибо!!

slon0177
Offline
Зарегистрирован: 16.04.2015

Добрый день, Олег.

Очень рад за вас!) Очень приятно чувствовать, что  вам пригодились мои труды)

Oleg333
Offline
Зарегистрирован: 18.12.2018

Здравствуйте Василий.

Еще раз спасибо вам за ваш проект. Собрал вчера на макетке, все работает. Для пробы подключил дисплей 1602, жду с алиэкспресс 2004 и  клавиатуру. Блютуз не подключал, поскольку модуль который есть в наличии (HC-06) не поддерживает IOS, нужен HM-10 и выше. И вообще, как я уже писал хочу управление по wi-fi. Поскольку в семье есть маленькие дети, нужно обязательно дублирование включения света настенными выключателями. Ищу настенные компактные выключатели для слаботочки без фиксации. Что нибудь вроде этого -  https://ru.aliexpress.com/item/433-86/32899224110.html?tt=sns_none&aff_p... но без приемо-передатчиков, которые не нужны. В отечественных интернет магазинах не нашел ничего подобного.

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