GSM устройство управления котлами Webasto и не только

MaksVV
Offline
Зарегистрирован: 06.08.2015

Я вникал в ардуино как раз с этой темы. http://arduino.ru/forum/programmirovanie/nuzhen-sketch-zapuska-kotla-webasto-s-dop-kanala-signalizatsii-cherez-dunyu Смешно щас читать) 

Короче устройство закончено, работает у двух человек, но чето они не делятся как оно работает, есть ли косяки.

Может кто соберёт. Поделиться впечатлениями. Так то вещь хорошая. Современные котлы вебасто EVO запускаются только по цифре. К тому же сняли с производства круглые таймеры 1533 (они стоили около 3тыс.). Сейчас таймеры которые идут, стоят 6 тыс. вроде и функционал скуден и впаятся к кнопке сложнее гораздо.

Смысл моего устройства такой. Модуль работает по одному из трёх алгоритмов управления котлами:

1. Запуск котла минусовым импульсом 1 сек. (Данный вариант подключения можно применять когда уже есть штатный таймер вебасто, впаяться паралельно кнопке включения)

2. Запуск котла по цифровой шине W-BUS. (Данный вариант применим к управлению котлами Webasto EVO, напрямую без штатных устройств управления)

3. Запуск котла потенциалом 12В. Т.е. пока есть напряжение 12В - котел включен, иначе - выключен. (данный вариант применим для запуска аналоговых котлов Webasto Termo Top C , E)

Режим выбирается посредством посылкой SMS с соответствующей командой и хранится в еепром.  Имеется обратная связь по успешности запуска котла даже для аналоговых webasto. Имеется выбор времени работы котла (также хранится в еепром). 

Также к данному устройству выгодно подключать сигнализацию старлайн или другую. По сути расширяется функционал сигнализации до GSM. Функции для старлайн:

1. Включение и выключение котла с допканалов сигнализации (отдельный канал - вкл и отдельный - выкл)

2. Запуск/останов ДВС средствами старлайна, но по GSM команде от данного устройва. 

3. Вывод состояния зажигания, работы ДВС, состояния охраны, тревоги в данное устройство для оповещения по GSM.

Себестоимость устройства около 1 тыс. рублей. Польза очевидна. 

Фото изготовления и плата в layout https://yadi.sk/d/MZHB6ouG3NNqz4

Скетч 

#include <EEPROM.h>
// для GSM модуля 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(14, 15); //Rx, Tx
String currStr = "";
int isStringMessage = 0; 
int KTOzapros = 0;
int KTOreport = 1;

int Protocol = 1; // протокол, по которому будет происходить выход на запуск котла: 1 - импульсный минусовой выход (на впайку в таймер вебасто например)
                  // 2 - по протоколу W-BUS ( котлы TermoTOP EVO)
                  // 3 - по подаче потенциала 12В, т.е. пока висит +12В - котел включен (котлы по аналогу - TermoTOP C,E)

                  
//_______Все для цикла void voltmetr()
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
  int volt = 0;        // Напряжение на входе АЦП

// входы выходы на соостветствующие пины
#define DopOn 4      // сюда доп канал от сигналки на включение вебасто
#define DopOff  5    // сюда доп канал от сигналки на выключение вебасто
#define VyhodWebasto  12     // это импульсный минусовой выход вкл/выкл вебасто к таймеру. 
#define VyhodWebastoAnalog  3  // это потенциальный плюсовой выход вкл/выкл вебасто (напрямую к котлу без таймера). 
#define Sost  9      // Сюда состояние вебасто (+12В когда работает)

#define Ohrana  6      // Сюда состояние охраны сигналки
#define Trevoga  7      // Сюда состояние тревоги
#define StartEng 8   // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define IGN 10       // Сюда состояние зажигания
#define Eng 11       // Сюда состояние работы ДВС




// для шины 1-wire и датчиков DS18B20

#include <OneWire.h> // библиотека для DS18B20
OneWire ds(2); // датчики DS18B20 на 2 пин

byte VyhlopC[8] ={0x28, 0xFF, 0xE6, 0x14, 0x90, 0x15, 0x04, 0x62}; // тут ставим свои адреса датчиков 
byte EngineC[8] ={0x28, 0xFF, 0x06, 0x15, 0x90, 0x15, 0x04, 0x37}; 
byte UlicaC[8] ={0x28, 0xFF, 0x43, 0x42, 0xA8, 0x15, 0x03, 0x2A};  
byte SalonC[8] ={0x28, 0xFF, 0xE0, 0x19, 0xA8, 0x15, 0x01, 0xA7};  
volatile int  TempVyhlopC = 20;
volatile int  TempEngineC = 20;
volatile int  TempUlicaC = 20;
volatile int  TempSalonC = 20;


byte Zapusk20[5] = {0xF4,0x03, 0x20, 0x3B, 0xEC} ;
byte Zapusk21[5] = {0xF4,0x03, 0x21, 0x3B, 0xED} ;
byte Stop[4] = {0xF4,0x02, 0x10, 0xE6} ;

bool flagStartPresent = 1;               //флаг что отправляем в момент периодического поддержания связи W-Bus status или start
int StartMessageRepeat = 0;              //количество отправленных сообщений на старт котла
int StopMessageRepeat = 0;               //количество отправленных сообщений на остановку котла

unsigned long TimeWebasto = 1800000;   //время работы котла, 1800000 = 30мин
unsigned long EndReportMillis = 0;     //переменная для таймера отправки отчета об успешности запуска котла
unsigned long EndReportEngine = 0;     //переменная для таймера отправки отчета об успешности запуска ДВС
unsigned long Prev_PeriodW_BusMessage = 0;     //переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus 
unsigned long Prev_PeriodW_BusStartStop = 0;       //переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus 

//для таймера  - активация котла - импульс массы 0,8 сек на провод, впаянный в таймер вебасто)
unsigned long time, timer=0;
bool timerenabled=false;
#define TIMEREXPIRED (time-timer)>800


//для таймера  - старт двигателя - импульс +5В на оптопару, в итоге минусовой импульс 1 сек на вход событий сигналки для запуска ДВС)
unsigned long TimeStartEng, timerStartEng=0;
bool timerenabledStartEng=false;
#define TIMEREXPIRED_StartEng (TimeStartEng-timerStartEng)>2000


//для таймера  - старт котла по W-BUS )
unsigned long TimeStart_W_BUS, timerStart_W_BUS=0;
bool timerenabledStart_W_BUS=false;
#define TIMEREXPIRED_Start_W_BUS (TimeStart_W_BUS-timerStart_W_BUS)> TimeWebasto 


bool webasto = 0;            // состояние команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool startWebasto_OK = 0;    // состояние успешного запуска котла
bool report = false;      // состояние нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false;// состояние нужности отправки отчета false - не нужно отправлять, true - нужно отправлять

bool engine =0;    //флаг работает ли ДВС или нет
bool ignition=0;   //флаг включено ли зажигание или нет
bool ohrana=0;     //флаг включена ли охрана или нет
bool trevoga=0;    //флаг включена ли тревога или нет
bool alarmSMS = 0; //флаг отправлена ли смс о тревоге или нет





// СТАРТОВЫЙ ЦИКЛ
void setup() 
{
 delay (2500);
  WDTCSR=(1<<WDCE)|(1<<WDE); //для датчиков DS18B20
 // WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // для датчиков DS18B20 (разрешение прерывания + выдержка 1 секунда)
  WDTCSR=(1<<WDIE)| (1<<WDP3)|(1<<WDP0); // для датчиков DS18B20 (разрешение прерывания + выдержка 8 секунд)
  pinMode (DopOn,  INPUT);   digitalWrite (DopOn,  HIGH);
  pinMode (DopOff, INPUT);   digitalWrite (DopOff, HIGH);
  pinMode (Sost,   INPUT);   digitalWrite (Sost,   HIGH);
  pinMode (VyhodWebasto,  OUTPUT);  digitalWrite (VyhodWebasto,  HIGH);
  pinMode (VyhodWebastoAnalog,  OUTPUT);  digitalWrite (VyhodWebastoAnalog,  LOW);
  pinMode (StartEng,  OUTPUT);  digitalWrite (StartEng,  LOW);
  pinMode (13,     OUTPUT);  digitalWrite (13,     LOW);

  pinMode (Ohrana, INPUT);  digitalWrite (Ohrana,  HIGH);
  pinMode (Trevoga, INPUT);  digitalWrite (Trevoga,  HIGH);
  pinMode (IGN, INPUT);  digitalWrite (IGN,  HIGH);
  pinMode (Eng, INPUT);  digitalWrite (Eng,  HIGH);
  



   
  
Serial.begin (2400, SERIAL_8E1); // сериал соединение протокол W-Bus
mySerial.begin(19200);           // сериал соединение для gsm модуля
    delay(2000);
  NastroykaGSM ();
TimeWebasto = EEPROM.read(1)*60000UL;
Protocol = EEPROM.read(2);
  
}








void loop() {

if (Protocol==1||Protocol==3) {webasto = !digitalRead (Sost);
    if (TempVyhlopC - TempUlicaC > 15) startWebasto_OK = 1;
    else startWebasto_OK = 0;}


if (Protocol==2)W_Bus();
//ниже для таймера старта котла по W-BUS и аналогу 
  TimeStart_W_BUS = millis();
  if (timerenabledStart_W_BUS){
   if (TIMEREXPIRED_Start_W_BUS) {
    digitalWrite (VyhodWebastoAnalog,LOW); webasto=0; timerenabledStart_W_BUS = false;}}

//ниже для таймера создания импульса на старт ДВС 
TimeStartEng = millis();
if (timerenabledStartEng) {
if (TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=false;}}
    
 engine =  !digitalRead (Eng);
 ignition= !digitalRead (IGN); 
 ohrana=   !digitalRead (Ohrana);  
 trevoga=  !digitalRead (Trevoga);
  
if (webasto && report) timerReport ();
if (reportEngine) timerReportEngine ();
if (trevoga && !alarmSMS) AlarmSMS ();
if (!ohrana) alarmSMS = false;





readSMS();
voltmetr();
WebastoOprosImpulse ();





}

void voltmetr()  //____________Цикл "Вольтметр"__измерение напряжения на выходе ИБП
// Взято с http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html
{
   volt = analogRead(A7);                       // А7 аналоговый вход вольтметра
   vout = (volt * 4.92) / 1024;             
   Vpit = vout / (9950.0/(98600.0+9950.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09)  Vpit=0.0;                  // Округление до нуля 
}



void NastroykaGSM () {
      mySerial.print("AT+CMGF=1\r");         //устанавливает текстовый режим смс-сообщения
    delay(200);
  mySerial.print("AT+IFC=1, 1\r");       //устанавливает программный контроль потоком передачи данных
    delay(200);
  mySerial.print("AT+CPBS=\"SM\"\r");    //открывает доступ к данным телефонной книги SIM-карты
    delay(200);
  mySerial.print("AT+GSMBUSY=1\r");   //запрет всех входящих звонков
    delay(300);
  mySerial.print("AT+CNMI=1,2,2,1,0\r"); //включает оповещение о новых сообщениях
    delay(300);
  mySerial.print("AT+CMGDA=\"DEL ALL\"\r"); // удаляем все смс, ки
   delay(2000);
}

void startSegaSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
      mySerial.print("AT+CMGF=1\r");
      delay(200);
      mySerial.println("AT+CMGS=\"+79000000000\""); // (+79000000000 сдесь должен быть ваш номер №1)
      delay(500);
}

void startSega_2SMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму  номеру
{
      mySerial.print("AT+CMGF=1\r");
      delay(100);
      mySerial.println("AT+CMGS=\"+7900000000\""); // (+79000000000 сдесь должен быть ваш номер №2)
      delay(100);
}

void EndSMS ()
{
  delay(200);
   mySerial.println((char)26);                       // Команда отправки СМС
   delay(4000);
   mySerial.print("AT+CMGDA=\"DEL ALL\"\r"); // удаляем все смс, ки
   delay(2000);
}


void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!mySerial.available()) return;
    char currSymb = mySerial.read();
 // Serial.print (currSymb);
    if ('\r' == currSymb)
       {
         if (isStringMessage!=0) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}               // Передача параметров по СМС
else if (!currStr.compareTo("Webasto-ON"))  { if (!webasto)  {StartWebasto (); report = true; EndReportMillis = millis(); // если получили команду на включение и вебаста в настоящий момент выключена - включаем
                                                                              if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto Vkluchena"); EndSMS(); KTOreport = 1;}
                                                                         else if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto Vkluchena"); EndSMS(); KTOreport = 2;}}
                                                                       
                                                   else                     {if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto uzhe vkluchena"); EndSMS();}
                                                                        else if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto uzhe vkluchena"); EndSMS();}}}

                                                            
               else if (!currStr.compareTo("Webasto-OFF"))   {if (webasto){StopWebasto (); report = false; // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
                                                                              if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto Otkluchena"); EndSMS();}
                                                                        else  if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto Otkluchena"); EndSMS();}}


                                                     else                    {if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto uzhe otkluchena"); EndSMS();}
                                                                         else if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto uzhe otkluchena"); EndSMS();}}
                                                     }          


                else if (!currStr.compareTo("Engine-ON"))  {if (!engine)  { digitalWrite (StartEng, HIGH);  timerStartEng=TimeStartEng; timerenabledStartEng=true; reportEngine = true; EndReportEngine = millis(); // если получили команду на включение ДВС и он в настоящий момент выключен - включаем
                                                                              if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Engine Start"); EndSMS(); KTOreport = 1;}
                                                                         else if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Engine Start"); EndSMS(); KTOreport = 2;}}
                                                                       
                                                   else                     {if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Dvigatel uzhe rabotaet"); EndSMS();}
                                                                        else if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Dvigatel uzhe rabotaet"); EndSMS();}}
                                                                       
                                                   }         
               else if (!currStr.compareTo("Engine-OFF"))   {if (engine){ digitalWrite (StartEng, HIGH);  timerStartEng=TimeStartEng; timerenabledStartEng=true; reportEngine = false; // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
                                                                              if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto Otkluchena"); EndSMS();}
                                                                        else  if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto Otkluchena"); EndSMS();}}


                                                     else                    {if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto uzhe otkluchena"); EndSMS();}
                                                                         else if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto uzhe otkluchena"); EndSMS();}}
                                                     }          
                                                    

               else if (!currStr.compareTo("Impulse"))   {Protocol = 1;  EEPROM.write(2,Protocol);     if (isStringMessage = 1) {startSegaSMS(); mySerial.println("zapusk GND_impulse"); EndSMS();}
                                                                        else  if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("zapusk GND_impulse"); EndSMS();}}                                                               

               else if (!currStr.compareTo("W-BUS"))   {Protocol = 2; EEPROM.write(2,Protocol);  webasto = 0;  if (isStringMessage = 1) {startSegaSMS(); mySerial.println("zapusk W-BUS"); EndSMS();}
                                                                        else  if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("zapusk W_BUS"); EndSMS();}}

               else if (!currStr.compareTo("Potenzial"))   {Protocol = 3; EEPROM.write(2,Protocol);   if (isStringMessage = 1) {startSegaSMS(); mySerial.println("zapusk +12V Potencial"); EndSMS();}
                                                                        else  if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("zapusk +12V Potencial"); EndSMS();}} 
               
               else if (!currStr.compareTo("Webasto20min"))   {TimeWebasto = 1200000; EEPROM.write(1,TimeWebasto/60000UL);if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto time 20min"); EndSMS();}
                                                                        else  if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto time 20min"); EndSMS();}}  
               
               else if (!currStr.compareTo("Webasto30min"))   {TimeWebasto = 1800000; EEPROM.write(1,TimeWebasto/60000UL); if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto time 30min"); EndSMS();}
                                                                        else  if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto time 30min"); EndSMS();}}

               else if (!currStr.compareTo("Webasto40min"))   {TimeWebasto = 2400000; EEPROM.write(1,TimeWebasto/60000UL); if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto time 40min"); EndSMS();}
                                                                        else  if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto time 40min"); EndSMS();}}

               else if (!currStr.compareTo("Webasto50min"))   {TimeWebasto = 3000000; EEPROM.write(1,TimeWebasto/60000UL); if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto time 50min"); EndSMS();}
                                                                        else  if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto time 50min"); EndSMS();}}

               else if (!currStr.compareTo("Webasto60min"))   {TimeWebasto = 3480000; EEPROM.write(1,TimeWebasto/60000UL); if (isStringMessage = 1) {startSegaSMS(); mySerial.println("Webasto time 60min"); EndSMS();}
                                                                        else  if (isStringMessage = 2) {startSega_2SMS(); mySerial.println("Webasto time 60min"); EndSMS();}}

                                                     
               else if (!currStr.compareTo("Balance"))    SMSbalance();
            isStringMessage = 0;
                }
         else {      if (currStr.startsWith("+CMT: \"+70000000000")) { isStringMessage = 1; KTOzapros = 1;}      //если текущая строка начинается с "+CMT",то следующая строка является сообщением
                else if (currStr.startsWith("+CMT: \"+79000000000")) { isStringMessage = 2; KTOzapros = 2;}  
                else if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                       if (KTOzapros == 1) startSegaSMS();
                  else if (KTOzapros == 2) startSega_2SMS();
                  mySerial.print (currStr);
                  EndSMS();
                  }    
              } 
               
        currStr = "";
      } 
 
    else if ('\n' != currSymb) { currStr += String(currSymb);}
}


void SMSzapros()
{
       if (isStringMessage == 1) { startSegaSMS();}
  else if (isStringMessage == 2) { startSega_2SMS();}
  else if (isStringMessage == 0) {if  (KTOreport == 1) startSegaSMS();
                             else if  (KTOreport == 2) startSega_2SMS();}
       if (webasto) { mySerial.println ("Webasto ON");
           if (startWebasto_OK) mySerial.println ("StartWebasto OK");
           else mySerial.println ("StartWebasto FAIL");}
     else mySerial.println ("Webasto OFF");  

     if (engine)  mySerial.println ("Engine ON");
     else mySerial.println ("Engine OFF");  

     if (ignition)  mySerial.println ("IGN ON");
     else mySerial.println ("IGN OFF");  

     if (ohrana)  mySerial.println ("OHRANA ON");
     else mySerial.println ("OHRANA OFF");  

     if (trevoga)  mySerial.println ("Vnimanie!!! Trevoga!!! Sirena Vkl!");
     
  mySerial.print("Battery: "); mySerial.print (Vpit); mySerial.println("V");
  mySerial.print("Engine: "); mySerial.print (TempEngineC); mySerial.println("*C");
  mySerial.print("Vyhlop: "); mySerial.print (TempVyhlopC); mySerial.println("*C");
  mySerial.print("Ulica: "); mySerial.print (TempUlicaC); mySerial.println("*C");
  mySerial.print("Salon: "); mySerial.print (TempSalonC); mySerial.println("*C");  
  mySerial.print("Protocol: ");
       if (Protocol==1) mySerial.println("GND Impulse");
  else if (Protocol==2) mySerial.println("W-BUS");
  else if (Protocol==3) mySerial.println("+12V Potencial");
  mySerial.print("Webasto Time: "); mySerial.print (TimeWebasto/60000UL); mySerial.println("min");
   EndSMS();                                 
}

void SMSbalance() {
  mySerial.print("AT+CMGF=1\r");
      delay(200);

mySerial.println ("AT+CUSD=1,\"#100#\"");
    
//mySerial.println("AT+CMGS=\"#100#\"");
//      mySerial.println("ATD#100#");
      //mySerial.println("AT + CMGS = \"111\""); // (+79000000000 сдесь должен быть ваш номер №1)
      delay(2000);                              // команда на замену на транслит *111*6*2#
      //mySerial.println ("11");
      //EndSMS();
}


void AlarmSMS() {
 startSegaSMS();
mySerial.println ("Vnimanie!!! Trevoga!!! Sirena Vkl!");
 EndSMS();      
 startSega_2SMS();
mySerial.println ("Vnimanie!!! Trevoga!!! Sirena Vkl!");
 EndSMS();      
 alarmSMS = true;
  
}







                    


void StartWebasto()
{
 if (Protocol==1){ digitalWrite (VyhodWebasto, LOW); 
  timer=time; 
  timerenabled=true;}

 else if (Protocol==2||Protocol==3){
  StartMessageRepeat = 0;
  webasto = 1; digitalWrite (VyhodWebastoAnalog, HIGH);
  timerStart_W_BUS=TimeStart_W_BUS;
  timerenabledStart_W_BUS = true;}
}

void StopWebasto()
{
 if (Protocol==1){ digitalWrite (VyhodWebasto, LOW); 
  timer=time; 
  timerenabled=true;}

 else if (Protocol==2||Protocol==3){
  StopMessageRepeat = 0;
  webasto = 0; digitalWrite (VyhodWebastoAnalog, LOW);
  timerenabledStart_W_BUS = false;}
}




void WebastoOprosImpulse (){

// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла 
  time = millis();
  if (timerenabled) {if (TIMEREXPIRED) {digitalWrite (VyhodWebasto, HIGH); timerenabled=false;}}
  else  {if (!digitalRead (DopOn)  && !webasto) {StartWebasto(); report = true; EndReportMillis = millis(); KTOreport = 1;}
         if (!digitalRead (DopOff) && webasto) {StopWebasto(); report = false;}}}


// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
void timerReport () {
   if(millis() - EndReportMillis > 360000UL) 
   {EndReportMillis = millis(); report = false; SMSzapros();  }} 

// цикл таймера отправки отчета об успешности запуска ДВС  (отчёт через 30сек после старта)                       
void timerReportEngine () {
   if(millis() - EndReportEngine > 30000) 
   {EndReportEngine = millis(); reportEngine = false; SMSzapros();}} 



   void W_Bus (){
if (webasto) {
    if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){

 for (int i = 0; i<5; i++) Serial.write (Zapusk21[i]); 
  StartMessageRepeat++; 
  Prev_PeriodW_BusStartStop = millis();
  
    }
  if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>5000)  {
    //делаем периодическое поддержание связи W-BUS
    // наверное сканает отправка сообщения о состоянии котла
    // т.е. ,например, отправляем периодически запрос на показания датчиков
    // состоянием работы котла будет наличие или отсутствие пламени
if (flagStartPresent) {for (int i = 0; i<5; i++) Serial.write (Zapusk21[i]); }
//else {for (int i = 0; i<5; i++) Serial.write (StateMessage[i]);}
flagStartPresent = !flagStartPresent;
StopMessageRepeat = 0;
    
    Prev_PeriodW_BusMessage = millis();
    }}}





else if (StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
  for (int i = 0; i<4; i++) Serial.write (Stop[i]); 
StopMessageRepeat++; 
StartMessageRepeat = 0;
   Prev_PeriodW_BusStartStop = millis();
  
  
  }

}


// Вектор прерывания для Dallas DS18B20
ISR (WDT_vect){ //вектор прерывания WD
static boolean n=0; // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset();  // сброс шины
        ds.write(0xCC);//обращение ко всем датчикам
        ds.write(0x44);// начать преобразование (без паразитного питания)  
       }
else   {ds.reset();
        ds.select(VyhlopC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempVyhlopC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта       
        TempVyhlopC = TempVyhlopC / 16;
        // получение с 2-го датчика
        ds.reset();
        ds.select(EngineC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempEngineC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта  
        TempEngineC = TempEngineC/16;
        ds.reset();
        ds.select(UlicaC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempUlicaC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта       
        TempUlicaC = TempUlicaC / 16;
        // получение с 2-го датчика
        ds.reset();
        ds.select(SalonC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempSalonC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта  
        TempSalonC = TempSalonC/16 ;
}}

Помогите допилить три вещи. 

1. Запись номера телефона пользователя по смс, ну или по звонку. 

2. Наверняка GSM модуль будет зависать. Нужно сделать проверку его "зависания" и при необходимости рестарт

3. Научить всё это дело засыпать, чтоб поменьше кушало энергии. замерял вроде где-то 25...30 мА. Многовато, если учесть ещё потребление сигнализации старлайн.  

Если кто будет собирать, спрашивайте что не понятно. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

АКТУАЛЬНАЯ ИНФОРМАЦИЯ ПО ПРОЕКТУ В СООБЩЕНИИ #5 !!!

НИЖЕ ПОСТ , КОНЕЧНО, МОЖНО ПОЧИТАТЬ, ТАК ДЛЯ ИСТОРИИ

Также осуществляется мониторинг 4 -х температур :  ДВС, Салон, улица, выхлоп вебасто и напряжения АКБ

Фото изготовления и плата v3

перед заливкой основного скетча чистим еепром этим скетчем и (заливаем и ждём пока LED13 загорится)!!!!!


#include <EEPROM.h>

void setup() {
 
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  
  EEPROM.write(1, 30);
  EEPROM.write(2, 1);
  EEPROM.write(0, 0);
  for (int i = 3 ; i < EEPROM.length() ; i++) EEPROM.write(i, '0');  

  
  digitalWrite(13, HIGH);
}

void loop() {}

Во время сборки устройства, до установки GSM модуля нужно не забыть настроить правильное напряжение на DС-DC преобразователе, Я выставил 4.1В под нагрузкой может немного просесть до 4.0 - это не страшно. Потом лучше залить эпоксидкой или ещё чем подстроечник. или вообще запаять постоянный резистор вместо него. 

Следующий абзац выполняем до запайки деталей LM393 и её обвязки. Для корректной работы контроля бортового напряжения, необходимо подстроить в основном скетче значение сопротивлений плеч делителя напряжения (строка 198 скетча v2.1), контролируя реальное напряжение более менее точным вольтметром и сравнивая с измеряемым. Для удобства пользуемся этим скетчем.

#define analogInput A7
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // сопротивление R1 (100K)
float R2 = 10000.0; // сопротивление R2 (10K)
int value = 0;
void setup(){
   pinMode(analogInput, INPUT);
   Serial.begin (9600);
}
void loop(){
   // считывание аналогового значения
   value = analogRead(analogInput);
   vout = (value * 5.0) / 1024.0;
   vin = vout / (R2/(R1+R2)); 
   if (vin<0.09) vin=0.0;// обнуляем нежелательное значение
Serial.print("INPUT V= ");
Serial.println(vin);
delay(500);
}

далее собираем остальное и заливаем прошивку V2.1 (если LM393 уже запаяна, скетч грузится только после вытаскивания ардуино из посадочного места платы):

Скетч v2.1.

#include <EEPROM.h>
// для GSM модуля *********************
#include <SoftwareSerial.h>
SoftwareSerial mySerial(14, 15); //Rx, Tx
String currStr = "";

String TelNumber1 = "000000000000";

String TelNumber2 = "000000000000";

String BufferNumber = "000000000000";

bool SaveNumber2 = 0;  // флаг когда необходима запись номера#2, он true

int isStringMessage = 0; 
int KTOzapros = 0;
int KTOreport = 1;
//************************


int Protocol = 1; // протокол, по которому будет происходить выход на запуск котла: 1 - импульсный минусовой выход (на впайку в таймер вебасто например)
                  // 2 - по протоколу W-BUS ( котлы TermoTOP EVO)
                  // 3 - по подаче потенциала 12В, т.е. пока висит +12В - котел включен (котлы по аналогу - TermoTOP C,E)

                  
//_______Все для цикла void voltmetr()*************
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
  int volt = 0;        // Напряжение на входе АЦП

// входы выходы на соостветствующие пины **************
#define DopOn 4      // сюда доп канал от сигналки на включение вебасто
#define DopOff  5    // сюда доп канал от сигналки на выключение вебасто
#define VyhodWebasto  12     // это импульсный минусовой выход вкл/выкл вебасто к таймеру. 
#define VyhodWebastoAnalog  3  // это потенциальный плюсовой выход вкл/выкл вебасто (напрямую к котлу без таймера). 
#define Sost  9      // Сюда состояние вебасто (+12В когда работает)

#define Ohrana  6      // Сюда состояние охраны сигналки
#define Trevoga  7      // Сюда состояние тревоги
#define StartEng 8   // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define IGN 10       // Сюда состояние зажигания
#define Eng 11       // Сюда состояние работы ДВС




// для шины 1-wire и датчиков DS18B20****************

#include <OneWire.h> // библиотека для DS18B20
OneWire ds(2); // датчики DS18B20 на 2 пин

byte VyhlopC[8] ={0x28, 0xFF, 0xE6, 0x14, 0x90, 0x15, 0x04, 0x62}; 
byte EngineC[8] ={0x28, 0xFF, 0x06, 0x15, 0x90, 0x15, 0x04, 0x37}; 
byte UlicaC[8] ={0x28, 0xFF, 0x43, 0x42, 0xA8, 0x15, 0x03, 0x2A};  
byte SalonC[8] ={0x28, 0xFF, 0xE0, 0x19, 0xA8, 0x15, 0x01, 0xA7};  
volatile int  TempVyhlopC = 20;
volatile int  TempEngineC = 20;
volatile int  TempUlicaC = 20;
volatile int  TempSalonC = 20;

// для организации W-BUS и различные таймеры********************
byte Zapusk20[5] = {0xF4,0x03, 0x20, 0x3B, 0xEC} ;
byte Zapusk21[5] = {0xF4,0x03, 0x21, 0x3B, 0xED} ;
byte Stop[4] = {0xF4,0x02, 0x10, 0xE6} ;

bool flagStartPresent = 1;               //флаг что отправляем в момент периодического поддержания связи W-Bus status или start
int StartMessageRepeat = 0;              //количество отправленных сообщений на старт котла
int StopMessageRepeat = 0;               //количество отправленных сообщений на остановку котла

unsigned long TimeWebasto = 1800000;   //время работы котла, 1800000 = 30мин
unsigned long EndReportMillis = 0;     //переменная для таймера отправки отчета об успешности запуска котла
unsigned long EndReportEngine = 0;     //переменная для таймера отправки отчета об успешности запуска ДВС
unsigned long Prev_PeriodW_BusMessage = 0;     //переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus 
unsigned long Prev_PeriodW_BusStartStop = 0;       //переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus 

//для таймера  - активация котла - импульс массы 0,8 сек на провод, впаянный в таймер вебасто)
unsigned long time, timer=0;
bool timerenabled=false;
#define TIMEREXPIRED (time-timer)>800


//для таймера  - старт двигателя - импульс +5В на оптопару, в итоге минусовой импульс 1 сек на вход событий сигналки для запуска ДВС)
unsigned long TimeStartEng, timerStartEng=0;
bool timerenabledStartEng=false;
#define TIMEREXPIRED_StartEng (TimeStartEng-timerStartEng)>2000


//для таймера  - старт котла по W-BUS )
unsigned long TimeStart_W_BUS, timerStart_W_BUS=0;
bool timerenabledStart_W_BUS=false;
#define TIMEREXPIRED_Start_W_BUS (TimeStart_W_BUS-timerStart_W_BUS)> TimeWebasto 

//**************************


//Основные переменные  
bool webasto = 0;            // состояние команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool startWebasto_OK = 0;    // состояние успешного запуска котла
bool report = false;      // состояние нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false;// состояние нужности отправки отчета false - не нужно отправлять, true - нужно отправлять

bool engine =0;    //флаг работает ли ДВС или нет
bool ignition=0;   //флаг включено ли зажигание или нет
bool ohrana=0;     //флаг включена ли охрана или нет
bool trevoga=0;    //флаг включена ли тревога или нет
bool alarmSMS = 0; //флаг отправлена ли смс о тревоге или нет





// СТАРТОВЫЙ ЦИКЛ
void setup() 
{
 delay (2500);
  WDTCSR=(1<<WDCE)|(1<<WDE); //для датчиков DS18B20
 // WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // для датчиков DS18B20 (разрешение прерывания + выдержка 1 секунда)
  WDTCSR=(1<<WDIE)| (1<<WDP3)|(1<<WDP0); // для датчиков DS18B20 (разрешение прерывания + выдержка 8 секунд)
  pinMode (DopOn,  INPUT);   digitalWrite (DopOn,  HIGH);
  pinMode (DopOff, INPUT);   digitalWrite (DopOff, HIGH);
  pinMode (Sost,   INPUT);   digitalWrite (Sost,   HIGH);
  pinMode (VyhodWebasto,  OUTPUT);  digitalWrite (VyhodWebasto,  HIGH);
  pinMode (VyhodWebastoAnalog,  OUTPUT);  digitalWrite (VyhodWebastoAnalog,  LOW);
  pinMode (StartEng,  OUTPUT);  digitalWrite (StartEng,  LOW);
  pinMode (13,     OUTPUT);  digitalWrite (13,     LOW);

  pinMode (Ohrana, INPUT);  digitalWrite (Ohrana,  HIGH);
  pinMode (Trevoga, INPUT);  digitalWrite (Trevoga,  HIGH);
  pinMode (IGN, INPUT);  digitalWrite (IGN,  HIGH);
  pinMode (Eng, INPUT);  digitalWrite (Eng,  HIGH);
  



   
  
Serial.begin (2400, SERIAL_8E1); // сериал соединение протокол W-Bus
mySerial.begin(19200);           // сериал соединение для gsm модуля
    delay(2000);
  NastroykaGSM ();

TimeWebasto = EEPROM.read(1)*60000UL;
Protocol = EEPROM.read(2);

for (int i=0; i<12; i++) TelNumber1[i] = EEPROM.read (i+10);
for (int i=0; i<12; i++) TelNumber2[i] = EEPROM.read (i+30);
  
}








void loop() {

if (Protocol==1||Protocol==3) {webasto = !digitalRead (Sost);
    if (TempVyhlopC - TempUlicaC > 20) startWebasto_OK = 1;
    else startWebasto_OK = 0;}


if (Protocol==2)W_Bus();
//ниже для таймера старта котла по W-BUS и аналогу 
  TimeStart_W_BUS = millis();
  if (timerenabledStart_W_BUS){
   if (TIMEREXPIRED_Start_W_BUS) {
    digitalWrite (VyhodWebastoAnalog,LOW); webasto=0; timerenabledStart_W_BUS = false;}}

//ниже для таймера создания импульса на старт ДВС 
TimeStartEng = millis();
if (timerenabledStartEng) {
if (TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=false;}}
    
 engine =  !digitalRead (Eng);
 ignition= !digitalRead (IGN); 
 ohrana=   !digitalRead (Ohrana);  
 trevoga=  !digitalRead (Trevoga);
  
if (webasto && report) timerReport ();
if (reportEngine) timerReportEngine ();
if (trevoga && !alarmSMS) AlarmSMS ();
if (!ohrana) alarmSMS = false;

readSMS();
voltmetr();
WebastoOprosImpulse ();


}

void voltmetr()  //____________Цикл "Вольтметр"__измерение напряжения на выходе ИБП

{
   volt = analogRead(A7);                       // А7 аналоговый вход вольтметра
   vout = (volt * 4.92) / 1024;             
   Vpit = vout / (9950.0/(98930.0+9950.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09)  Vpit=0.0;                  // Округление до нуля 
}






// Вектор прерывания для Dallas DS18B20
ISR (WDT_vect){ //вектор прерывания WD
static boolean n=0; // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset();  // сброс шины
        ds.write(0xCC);//обращение ко всем датчикам
        ds.write(0x44);// начать преобразование (без паразитного питания)  
       }
else   {ds.reset();
        ds.select(VyhlopC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempVyhlopC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта       
        TempVyhlopC = TempVyhlopC / 16;
        // получение с 2-го датчика
        ds.reset();
        ds.select(EngineC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempEngineC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта  
        TempEngineC = TempEngineC/16;
        ds.reset();
        ds.select(UlicaC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempUlicaC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта       
        TempUlicaC = TempUlicaC / 16;
        // получение с 2-го датчика
        ds.reset();
        ds.select(SalonC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempSalonC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта  
        TempSalonC = TempSalonC/16 ;
}}




                    


void StartWebasto()
{
 if (Protocol==1){ digitalWrite (VyhodWebasto, LOW); 
  timer=time; 
  timerenabled=true;}

 else if (Protocol==2||Protocol==3){
  StartMessageRepeat = 0;
  webasto = 1; digitalWrite (VyhodWebastoAnalog, HIGH);
  timerStart_W_BUS=TimeStart_W_BUS;
  timerenabledStart_W_BUS = true;}
}

void StopWebasto()
{
 if (Protocol==1){ digitalWrite (VyhodWebasto, LOW); 
  timer=time; 
  timerenabled=true;}

 else if (Protocol==2||Protocol==3){
  StopMessageRepeat = 0;
  webasto = 0; digitalWrite (VyhodWebastoAnalog, LOW);
  timerenabledStart_W_BUS = false;}
}




void WebastoOprosImpulse (){

// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла 
  time = millis();
  if (timerenabled) {if (TIMEREXPIRED) {digitalWrite (VyhodWebasto, HIGH); timerenabled=false;}}
  else  {if (!digitalRead (DopOn)  && !webasto) {StartWebasto(); report = true; EndReportMillis = millis(); KTOreport = 1;}
         if (!digitalRead (DopOff) && webasto) {StopWebasto(); report = false;}}}


// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
void timerReport () {
   if(millis() - EndReportMillis > 360000UL) 
   {EndReportMillis = millis(); report = false; SMSzapros();  }} 

// цикл таймера отправки отчета об успешности запуска ДВС  (отчёт через 30сек после старта)                       
void timerReportEngine () {
   if(millis() - EndReportEngine > 30000) 
   {EndReportEngine = millis(); reportEngine = false; SMSzapros();}} 





   void NastroykaGSM () {
      mySerial.print(F("AT+CMGF=1\r"));         //устанавливает текстовый режим смс-сообщения
    delay(200);
  mySerial.print(F("+IFC=1, 1\r"));       //устанавливает программный контроль потоком передачи данных
    delay(200);
  mySerial.print(F("AT+CPBS=\"SM\"\r"));    //открывает доступ к данным телефонной книги SIM-карты
    delay(200);
  mySerial.print(F("AT+GSMBUSY=1\r"));   //запрет всех входящих звонков
    delay(300);
  mySerial.print(F("AT+CNMI=1,2,2,1,0\r")); //включает оповещение о новых сообщениях
    delay(300);
  mySerial.print(F("AT+CMGDA=\"DEL ALL\"\r")); // удаляем все смс, ки
   delay(2000);
}

void startNumber1SMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
      mySerial.print(F("AT+CMGF=1\r"));
      delay(200);
  mySerial.print(F("AT+CMGS=\"")); mySerial.print(TelNumber1); mySerial.println("\""); 
      delay(400);
}

void startNumber2SMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму  номеру
{
      mySerial.print(F("AT+CMGF=1\r"));
      delay(200);
      mySerial.print(F("AT+CMGS=\"")); mySerial.print(TelNumber2); mySerial.println(F("\"")); 
      delay(400);
}

void startBufferNumberSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму  номеру
{
      mySerial.print(F("AT+CMGF=1\r"));
      delay(200);
      mySerial.print(F("AT+CMGS=\"")); mySerial.print(BufferNumber); mySerial.println(F("\"")); 
      delay(400);
}

void WriteNubmer1() {
  
  
  
  
  }


void EndSMS ()
{
   mySerial.println((char)26);                       // Команда отправки СМС
   delay(3000);
   mySerial.print(F("AT+CMGDA=\"DEL ALL\"\r")); // удаляем все смс, ки
   delay(1500);
}


void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!mySerial.available()) return;
    char currSymb = mySerial.read();
//  Serial.print (currSymb);
    if ('\r' == currSymb)
       {
         if (isStringMessage!=0&&isStringMessage!=10) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}               // Передача параметров по СМС
else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС



else if (!currStr.compareTo("Webasto-ON"))  { if (!webasto)  {StartWebasto (); report = true; EndReportMillis = millis(); // если получили команду на включение и вебаста в настоящий момент выключена - включаем
                                                                              if (isStringMessage == 1) {startNumber1SMS(); KTOreport = 1;}
                                                                         else if (isStringMessage == 2) {startNumber2SMS();  KTOreport = 2;}
                                                                         mySerial.println(F("Webasto Vkluchena")); EndSMS();}
                                                                       
                                                   else                     {if (isStringMessage == 1) startNumber1SMS(); 
                                                                        else if (isStringMessage == 2) startNumber2SMS(); 
                                                                        mySerial.println(F("Webasto uzhe vkluchena")); EndSMS();}}

                                                            
               else if (!currStr.compareTo("Webasto-OFF"))   {if (webasto){StopWebasto (); report = false; // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
                                                                              if (isStringMessage == 1) startNumber1SMS(); 
                                                                        else  if (isStringMessage == 2) startNumber2SMS();
                                                                        mySerial.println(F("Webasto Otkluchena")); EndSMS();}


                                                     else                    {if (isStringMessage == 1) startNumber1SMS(); 
                                                                         else if (isStringMessage == 2) startNumber2SMS(); 
                                                                         mySerial.println(F("Webasto uzhe otkluchena")); EndSMS();}}          


                else if (!currStr.compareTo("Engine-ON"))  {if (!engine)  { digitalWrite (StartEng, HIGH);  timerStartEng=TimeStartEng; timerenabledStartEng=true; reportEngine = true; EndReportEngine = millis(); // если получили команду на включение ДВС и он в настоящий момент выключен - включаем
                                                                              if (isStringMessage == 1) {startNumber1SMS();  KTOreport = 1;}
                                                                         else if (isStringMessage == 2) {startNumber2SMS();  KTOreport = 2;}
                                                                         mySerial.println(F("Engine Start")); EndSMS();}
                                                                       
                                                   else                     {if (isStringMessage == 1) startNumber1SMS(); 
                                                                        else if (isStringMessage == 2) startNumber2SMS();
                                                                        mySerial.println(F("Dvigatel uzhe rabotaet")); EndSMS();}}
                                                                                 
               else if (!currStr.compareTo("Engine-OFF"))   {if (engine){ digitalWrite (StartEng, HIGH);  timerStartEng=TimeStartEng; timerenabledStartEng=true; reportEngine = false; // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
                                                                              if (isStringMessage == 1) startNumber1SMS();
                                                                        else  if (isStringMessage == 2) startNumber2SMS();
                                                                        mySerial.println(F("Dvigatel ostanovlen")); EndSMS();}


                                                     else                    {if (isStringMessage == 1) startNumber1SMS(); 
                                                                         else if (isStringMessage == 2) startNumber2SMS();
                                                                         mySerial.println(F("dvigatel uzhe ostanovlen")); EndSMS(); }}          
                                                    

               else if (!currStr.compareTo("Impulse"))   {Protocol = 1;  EEPROM.write(2,Protocol);     if (isStringMessage == 1) {startNumber1SMS(); mySerial.println(F("zapusk GND_impulse")); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println(F("zapusk GND_impulse")); EndSMS();}}                                                               

               else if (!currStr.compareTo("W-BUS"))   {Protocol = 2; EEPROM.write(2,Protocol);  webasto = 0;  if (isStringMessage == 1) {startNumber1SMS(); mySerial.println(F("zapusk W-BUS")); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println(F("zapusk W_BUS")); EndSMS();}}

               else if (!currStr.compareTo("Potenzial"))   {Protocol = 3; EEPROM.write(2,Protocol);   if (isStringMessage == 1) {startNumber1SMS(); mySerial.println(F("zapusk +12V Potencial")); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println(F("zapusk +12V Potencial")); EndSMS();}} 

               
                else if (currStr.endsWith("min"))   {TimeWebasto = currStr.toInt()*60000UL; // для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
               if (TimeWebasto>3540000UL) TimeWebasto = 3540000UL;
               if (TimeWebasto<=600000UL) TimeWebasto = 600000UL;
               EEPROM.write(1,TimeWebasto/60000UL);
                     if (isStringMessage == 1)startNumber1SMS(); 
               else  if (isStringMessage == 2) startNumber2SMS(); 
               mySerial.print(F("Webasto time: ")); mySerial.print(TimeWebasto/60000UL); mySerial.print(F("min")); EndSMS();}
               

               else if (!currStr.compareTo("ResetNumbers"))   {if (isStringMessage == 1) {startNumber1SMS(); mySerial.println(F("Phone numbers are erased")); EndSMS(); 
                                                                     
             TelNumber1 = "000000000000"; TelNumber2 = "000000000000"; for (int i=0; i<12; i++) {EEPROM.write (i+10,  TelNumber1[i]); EEPROM.write (i+30,  TelNumber2[i]); }}}

              else if (!currStr.compareTo("WriteNumber2")&& isStringMessage == 1)   { 
                SaveNumber2 = 1; startNumber1SMS(); mySerial.println(F("Otpravte lyuboye SMS s nomera2 dlya sochraneniya nomera")); EndSMS();} 

                                                                        

                                                     
               else if (!currStr.compareTo("Balance"))    SMSbalance();
            isStringMessage = 0;
                }
              else if (isStringMessage==10){ if (!currStr.compareTo("WriteNumber1"))   { TelNumber1 = BufferNumber; for (int i=0; i<12; i++) {EEPROM.write (i+10, BufferNumber[i]);}
              startNumber1SMS(); mySerial.println(F("Tel Number#1 is saving in memory"));  mySerial.print("Tel#1: ");  mySerial.println (TelNumber1); EndSMS();
              } 
                                             else if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}   
                                             else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС            
               isStringMessage = 0;
              
              }           



                
         else if (isStringMessage==0) {  if (TelNumber1!="000000000000" && !SaveNumber2 && TelNumber1!="яяяяяяяяяяяя"){
         
                     if (currStr.startsWith("+CMT: \""+TelNumber1)) { isStringMessage = 1; KTOzapros = 1; }   
                else if (currStr.startsWith("+CMT: \""+TelNumber2)) { isStringMessage = 2; KTOzapros = 2; }   
                else if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                       if (KTOzapros == 1) startNumber1SMS();
                  else if (KTOzapros == 2) startNumber2SMS();
                  mySerial.print (currStr);
                  EndSMS();
                  }    
                                                }

                else if    (currStr.startsWith("+CMT:") && !SaveNumber2) { isStringMessage = 10; for (int i =0; i<12; i++) {BufferNumber[i]=currStr[i+7];}}
                else if    (currStr.startsWith("+CMT:") && SaveNumber2) { for (int i =0; i<12; i++) {BufferNumber[i]=currStr[i+7];} TelNumber2 = BufferNumber; for (int i=0; i<12; i++) {EEPROM.write (i+30, BufferNumber[i]);}
              startNumber2SMS(); mySerial.println(F("Vash nomer sochranyon kak Number#2 v pamyati!")); 
              mySerial.print(F("Tel1: ")); mySerial.println(TelNumber1); mySerial.print(F("Tel#2: "));  mySerial.println (TelNumber2); EndSMS(); SaveNumber2 = 0; } 
              
              } 
               
        currStr = "";
      } 
 
    else if ('\n' != currSymb) { currStr += String(currSymb);}
}


void SMSzapros()
{   if (isStringMessage == 10){
 startBufferNumberSMS();

 mySerial.println (F("Tel.number#1 is not has been saving in memory!"));
 mySerial.println (F("For save Tel1 send SMS command \"WriteNumber1\""));
  mySerial.print(F("Tel1: ")); mySerial.println(TelNumber1);
  mySerial.print(F("Tel2: ")); mySerial.println(TelNumber2); 
  }
  
  
  
  else {
  
  if (isStringMessage == 1) { startNumber1SMS();}
  else if (isStringMessage == 2) { startNumber2SMS();}
  else if (isStringMessage == 0) {if  (KTOreport == 1) startNumber1SMS();
                             else if  (KTOreport == 2) startNumber2SMS();}
        if (webasto) { mySerial.println (F("Webasto ON"));
           if (startWebasto_OK) mySerial.println (F("StartWebasto OK"));
           else mySerial.println (F("StartWebasto FAIL"));}
     else mySerial.println (F("Webasto OFF"));  

     if (engine)  mySerial.println (F("Engine ON"));
     else mySerial.println (F("Engine OFF"));  

     if (ignition)  mySerial.println (F("IGN ON"));
     else mySerial.println (F("IGN OFF"));  

     if (ohrana)  mySerial.println (F("OHRANA ON"));
     else mySerial.println (F("OHRANA OFF"));  

     if (trevoga)  mySerial.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
     
  mySerial.print(F("Battery: ")); mySerial.print (Vpit); mySerial.println(F("V"));
  mySerial.print(F("Engine: ")); mySerial.print (TempEngineC); mySerial.println(F("*C"));
  mySerial.print(F("Vyhlop: ")); mySerial.print (TempVyhlopC); mySerial.println(F("*C"));
  mySerial.print(F("Ulica: ")); mySerial.print (TempUlicaC); mySerial.println(F("*C"));
  mySerial.print(F("Salon: ")); mySerial.print (TempSalonC); mySerial.println(F("*C"));  
  mySerial.print(F("Protocol: "));
       if (Protocol==1) mySerial.println(F("GND Impulse"));
  else if (Protocol==2) mySerial.println(F("W-BUS"));
  else if (Protocol==3) mySerial.println(F("+12V Potencial"));
  mySerial.print(F("Webasto Time: ")); mySerial.print (TimeWebasto/60000UL); mySerial.println(F("min"));
 
  }  
   EndSMS();                                 
}

void SMSzaprosTEL(){
  if (isStringMessage == 1) { startNumber1SMS();}
  else if (isStringMessage == 2) { startNumber2SMS();}
  else if (isStringMessage == 10) { startBufferNumberSMS();}
  
  
  mySerial.print(F("Tel1: ")); mySerial.println(TelNumber1);
  mySerial.print(F("Tel2: ")); mySerial.println(TelNumber2); 
  if (TelNumber1!="000000000000" && TelNumber1!="яяяяяяяяяяяя"){
  mySerial.print(F("Protocol: "));
  if (Protocol==1) mySerial.println(F("GND Impulse"));
  else if (Protocol==2) mySerial.println(F("W-BUS"));
  else if (Protocol==3) mySerial.println(F("+12V Potencial"));
  mySerial.print(F("Webasto Time: ")); mySerial.print (TimeWebasto/60000UL); mySerial.println(F("min"));}
  EndSMS();                                 
  }


void SMSbalance() {
  mySerial.print(F("AT+CMGF=1\r"));
      delay(200);

mySerial.println (F("AT+CUSD=1,\"#100#\""));
    
//mySerial.println("AT+CMGS=\"#100#\"");
//      mySerial.println("ATD#100#");
      //mySerial.println("AT + CMGS = \"111\""); // 
      delay(2000);                              // команда на замену на транслит *111*6*2#
      //mySerial.println ("11");
      //EndSMS();
}


void AlarmSMS() {
 startNumber1SMS();
mySerial.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
 EndSMS();      
 startNumber2SMS();
mySerial.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
 EndSMS();      
 alarmSMS = true;
  
}void W_Bus (){
if (webasto) {
    if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){

 for (int i = 0; i<5; i++) Serial.write (Zapusk21[i]); 
  StartMessageRepeat++; 
  Prev_PeriodW_BusStartStop = millis();
  
    }
  if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>5000)  {
    //делаем периодическое поддержание связи W-BUS
    // наверное сканает отправка сообщения о состоянии котла
    // т.е. ,например, отправляем периодически запрос на показания датчиков
    // состоянием работы котла будет наличие или отсутствие пламени
if (flagStartPresent) {for (int i = 0; i<5; i++) Serial.write (Zapusk21[i]); }
//else {for (int i = 0; i<5; i++) Serial.write (StateMessage[i]);}
flagStartPresent = !flagStartPresent;
StopMessageRepeat = 0;
    
    Prev_PeriodW_BusMessage = millis();
    }}}





else if (StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
  for (int i = 0; i<4; i++) Serial.write (Stop[i]); 
StopMessageRepeat++; 
StartMessageRepeat = 0;
   Prev_PeriodW_BusStartStop = millis();
  
  
  }

}

Инструкция пользователя

Управление устройством осуществляется при помощи СМС и возможно только с номеров телефонов, сохранённых в памяти. Изначально в памяти устройства не записаны номера телефонов пользователей. Устройство при этом отвечает только на три СМС команды (писать без кавычек):
1. «ZAPROS» - проверка работоспособности устройства.
2. «ZAPROSTEL» - запрос номеров телефонов, записанных в память устройства. 
Если в ответной СМС на этот запрос номера телефонов будут вида «000000000000» или «яяяяяяяяяяяя», то номера телефонов не записаны в память устройства. 
3. «WriteNumber1» - после посылки СМС с таким текстом на устройство, происходит запись номера телефона (с которого это СМС отправлено) в память как номер #1. 
После записи номера #1 в память, на этот телефон приходит подтверждающее СМС.
	Как только произведена запись номера #1 в память, становится возможным управление устройством в полном функционале. 
Для записи номера #2 необходимо с номера #1 отправить СМС с текстом «WriteNumber2».
После отправки данной команды приходит подтверждающее СМС, в котором указано, что нужно отправить СМС с любым текстом с номера#2 для его сохранения в память. 
Теперь, если отправлено любое СМС с номера #2, он сохраняется в памяти, приходит подтверждающее СМС. 
Управление с номера #2 полностью аналогично управлению с номера #1, за исключением того, что удаление номеров из памяти и запись номера #2 возможно лишь с номера #1.

Список СМС команд управления устройством  (текст команд должен строго соответствовать – пробелы, тире, регистр букв (заглавная или прописная) и т.д. – команду писать без кавычек ): 
1.	«ZAPROS»  - запрос на предоставление текущего состояния всех параметров устройства .
2.	«ZAPROSTEL»  - запрос на предоставление телефонных номеров пользователей, сохранённых в памяти. 
3.	«Webasto-ON»  - включение котла Webasto
4.	«Webasto-OFF»  - выключение котла Webasto
5.	«Engine-ON»  - команда на запуск двигателя сигнализацией Starline
6.	«Engine-OFF»  - команда на остановку двигателя сигнализацией Starline
7.	«Balance» - запрос баланса симкарты. 

Ниже идёт выбор протокола, по которому будет осуществляться управление  котлом:
8.	«Impulse»  - запуск котла осуществляется 1 сек импульсом «массы» на бело-синем проводе. 
9.	«W-Bus»  - запуск котла осуществляется цифровым сигналом по шине W-Bus (зелёный провод устройства)
10.	«Potenzial» - запуск котла осуществляется потенциалом +12В (вывод 3 Ардуино)

Ниже идет сохранение в память времени цикла работы Webasto (используется для запуска по протоколу W-Bus и Potenzial)
11.	«45 min» - 45 – это время работы котла, цифру 45 нужно поставить свою, в зависимости от того, какое время работы вы хотите установить, далее пробел и min. 

Ниже  - процесс удаления номеров пользователей из памяти устройства (это возможно только с номера #1)
12.	«ResetNumbers» - после отправки данной команды номера стираются из памяти.

После отправки команды «Webasto-ON» приходит оповещение, что команда принята, а через 6 мин приходит отчет – удачно ли произошел старт котла. 
После отправки команды «Engine-ON» приходит оповещение, что команда принята, а через 50 сек приходит отчет – удачно ли произошел старт двигателя. 
Если система Старлайн на охране и включилась тревога (сирена кричит) – приходит соответствующее СМС на оба номера.
Номера телефонов, время работы котла и протокол запуска котла хранятся в энергонезависомой памяти устройства и сохраняются после перевключения питания. 
Для удобства управления устройством при помощи СМС команд (чтобы каждый раз не вводить команды) необходимо скачать с PlayMarket приложение «GSM Trinket». Скачиваем файл настроек брелка, идущий в комплекте с устройством, на телефон. Открываем приложение – настройки – настройки брелков – справа вверху кнопка восстановление настроек брелка – выбираем скаченный файл настроек брелка. Выходим в общий вид программы. Листая вправо-влево, выбираем созданный только что брелок. Нажимаем на название брелка, Заходим в настройки, убираем галочку «Отчет о доставке», заходим в настройки брелков, выбираем наш брелок – «правка» - "Номер телефона" - Вводим правильный номер симкарты, которая в GSM модуле, формата "+79120000000", далее "входящие сообщения"- убираем галочку (если установлена) «Перехватывать входящие сообщения». Программа готова к работе. Подключение датчиков температуры DS18B20 производить параллельно. Необходимо заранее узнать адрес каждого вашего датчика из примера библиотеки работы с датчиками даллас, используя  сериал монитор. Далее вписать адреса датчиков в соответствующие места в скетче устройства (ДВС, улица, выхлоп котла или салон), также необходимо естественно пометить каждый датчик куда он будет установлен  - ДВС, улица, выхлоп котла или салон. 

Для удобства отправки СМС команд рекомендую использовать приложение для Андройид GSM Trinket. (качается в playMarket). Файл настроек брелка для программы GSM Trinket. Подробности читаем в инструкции к моему устройству.

Список радиодеталей

Резисторы SMD типо-размер вроде 1206:
360R -1 шт. 
10К – 1шт. 
2К – 1шт. 
Резисторы обычные 0,125 Вт:
360R - 1шт.
10К – 5шт.
2К – 2шт. 
1К – 2шт. 
1,2К – 1шт.
100К – 1шт. 
3.9К – 2шт. 
4,7К - 1шт.
Конденсаторы электролиты: 
22uF (емкость можно больше ) 16В – 2шт.
220 uF (емкость можно больше ) 10В – 1шт
Неполярные керамика:
Любой От 0,1 uF  до  2,0 uF    до 50В – 3шт. 
Стабилизатор питания на 5В: 
78L05 – 1шт. 
Оптроны:   PC817 – 3шт. 
Микросхема для организации K-line (W-BUS) – LM393N в DIP корпусе  1шт. 
GSM модуль    SIM800L  -1 шт. 
Плата МК:   ардуино NANO – 1шт. 
Преобразователь питания DC12V to DC4V - 1шт. 
Защитный диод TVS (супрессор):   1N5908 или 1N1673G или ICTE5-E3/54 (я не нашел такой в радиомагазинах) пришлось SMD ставить (например SD05.TCT ), а он громоздкий, Да его можно и не ставить, делитель напряжения должен нормально делать свое дело. 
Панельки для GSM модуля и Ардуино нано

Принципиальная схема варианта с реле и тактовой кнопкой

Схема подключения тынц

В таблице программирования AF сигнализации Starline необходимо запрограммировать следующие функции (помечены красными галочками): Это всё справедливо для сигнализаций B94, D94, E90, E91. Для A94 будет немного отличаться, надо корректировать номера доп.каналов. 

Далее на доп.каналы настраиваем следующие события включения и задержки: 

CH-1:   T1-0;  T2-999; T3-0;  T4-0;  ЗП-06;  УО-0;  ОС-07;  УО-0;  dy-OF; db-On

CH-2:   T1-0;  T2-001; T3-0;  T4-0;  ЗП-01;  УО-0;  ОС-00;  УО-0;  dy-OF; db-ОF

CH-4:   T1-0;  T2-999; T3-0;  T4-0;  ЗП-13;  УО-0;  ОС-18;  УО-0;  dy-OF; db-On

CH-5:   T1-0;  T2-001; T3-0;  T4-0;  ЗП-01;  УО-0;  ОС-00;  УО-0;  dy-OF; db-ОF

CH-6:   T1-0;  T2-999; T3-0;  T4-0;  ЗП-10;  УО-0;  ОС-03;  УО-0;  dy-On; db-On

ссылки на али : 

GSM SIM800L

Антенна для GSM

DC преобразователь из 12В в 4В для питания GSM модуля

Датчики температуры DS18B20

Панельки под GSM и NANO

MaksVV
Offline
Зарегистрирован: 06.08.2015

Пол дня просидел, чтобы сделать запись номеров пользователей не через скетч, а при помощи отправки СМС. Но оно того стоило. Самое главное, не пришлось на корню менять конструкцию парсинга данных с GSM модуля. Доволен как слон. Номера хранятся в еепром. Если номера не запрограммированы, модуль принимает только две команды "ZAPROS" и "ZAPROSTEL" . И сообщает в ответной смс какую смс (команда "WriteNumber1") отправить для сохранения номера #1. Если мы отправили такую команду номер сохраняется, приходит соответствующее подтверждение о записи номера #1. Теперь можно управлять модулем. Запись номера #2 возможна только в случае записанного номера #1 и только с номера #1.

Есть также команда для удаления обоих номеров из еепром и памяти ("NumbersReset"). После чего модуль опять начинает реагировать только на две команды. "ZAPROS" и "ZAPROSTEL"

скетч v.2.0

#include <EEPROM.h>
// для GSM модуля *********************
#include <SoftwareSerial.h>
SoftwareSerial mySerial(14, 15); //Rx, Tx
String currStr = "";

String TelNumber1 = "000000000000";

String TelNumber2 = "000000000000";

String BufferNumber = "000000000000";

bool SaveNumber2 = 0;  // флаг когда необходима запись номера#2, он true

int isStringMessage = 0; 
int KTOzapros = 0;
int KTOreport = 1;
//************************


int Protocol = 1; // протокол, по которому будет происходить выход на запуск котла: 1 - импульсный минусовой выход (на впайку в таймер вебасто например)
                  // 2 - по протоколу W-BUS ( котлы TermoTOP EVO)
                  // 3 - по подаче потенциала 12В, т.е. пока висит +12В - котел включен (котлы по аналогу - TermoTOP C,E)

                  
//_______Все для цикла void voltmetr()*************
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
  int volt = 0;        // Напряжение на входе АЦП

// входы выходы на соостветствующие пины **************
#define DopOn 4      // сюда доп канал от сигналки на включение вебасто
#define DopOff  5    // сюда доп канал от сигналки на выключение вебасто
#define VyhodWebasto  12     // это импульсный минусовой выход вкл/выкл вебасто к таймеру. 
#define VyhodWebastoAnalog  3  // это потенциальный плюсовой выход вкл/выкл вебасто (напрямую к котлу без таймера). 
#define Sost  9      // Сюда состояние вебасто (+12В когда работает)

#define Ohrana  6      // Сюда состояние охраны сигналки
#define Trevoga  7      // Сюда состояние тревоги
#define StartEng 8   // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define IGN 10       // Сюда состояние зажигания
#define Eng 11       // Сюда состояние работы ДВС




// для шины 1-wire и датчиков DS18B20****************

#include <OneWire.h> // библиотека для DS18B20
OneWire ds(2); // датчики DS18B20 на 2 пин

byte VyhlopC[8] ={0x28, 0xFF, 0xE6, 0x14, 0x90, 0x15, 0x04, 0x62}; 
byte EngineC[8] ={0x28, 0xFF, 0x06, 0x15, 0x90, 0x15, 0x04, 0x37}; 
byte UlicaC[8] ={0x28, 0xFF, 0x43, 0x42, 0xA8, 0x15, 0x03, 0x2A};  
byte SalonC[8] ={0x28, 0xFF, 0xE0, 0x19, 0xA8, 0x15, 0x01, 0xA7};  
volatile int  TempVyhlopC = 20;
volatile int  TempEngineC = 20;
volatile int  TempUlicaC = 20;
volatile int  TempSalonC = 20;

// для организации W-BUS и различные таймеры********************
byte Zapusk20[5] = {0xF4,0x03, 0x20, 0x3B, 0xEC} ;
byte Zapusk21[5] = {0xF4,0x03, 0x21, 0x3B, 0xED} ;
byte Stop[4] = {0xF4,0x02, 0x10, 0xE6} ;

bool flagStartPresent = 1;               //флаг что отправляем в момент периодического поддержания связи W-Bus status или start
int StartMessageRepeat = 0;              //количество отправленных сообщений на старт котла
int StopMessageRepeat = 0;               //количество отправленных сообщений на остановку котла

unsigned long TimeWebasto = 1800000;   //время работы котла, 1800000 = 30мин
unsigned long EndReportMillis = 0;     //переменная для таймера отправки отчета об успешности запуска котла
unsigned long EndReportEngine = 0;     //переменная для таймера отправки отчета об успешности запуска ДВС
unsigned long Prev_PeriodW_BusMessage = 0;     //переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus 
unsigned long Prev_PeriodW_BusStartStop = 0;       //переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus 

//для таймера  - активация котла - импульс массы 0,8 сек на провод, впаянный в таймер вебасто)
unsigned long time, timer=0;
bool timerenabled=false;
#define TIMEREXPIRED (time-timer)>800


//для таймера  - старт двигателя - импульс +5В на оптопару, в итоге минусовой импульс 1 сек на вход событий сигналки для запуска ДВС)
unsigned long TimeStartEng, timerStartEng=0;
bool timerenabledStartEng=false;
#define TIMEREXPIRED_StartEng (TimeStartEng-timerStartEng)>2000


//для таймера  - старт котла по W-BUS )
unsigned long TimeStart_W_BUS, timerStart_W_BUS=0;
bool timerenabledStart_W_BUS=false;
#define TIMEREXPIRED_Start_W_BUS (TimeStart_W_BUS-timerStart_W_BUS)> TimeWebasto 

//**************************


//Основные переменные  
bool webasto = 0;            // состояние команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool startWebasto_OK = 0;    // состояние успешного запуска котла
bool report = false;      // состояние нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false;// состояние нужности отправки отчета false - не нужно отправлять, true - нужно отправлять

bool engine =0;    //флаг работает ли ДВС или нет
bool ignition=0;   //флаг включено ли зажигание или нет
bool ohrana=0;     //флаг включена ли охрана или нет
bool trevoga=0;    //флаг включена ли тревога или нет
bool alarmSMS = 0; //флаг отправлена ли смс о тревоге или нет





// СТАРТОВЫЙ ЦИКЛ
void setup() 
{
 delay (2500);
  WDTCSR=(1<<WDCE)|(1<<WDE); //для датчиков DS18B20
 // WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // для датчиков DS18B20 (разрешение прерывания + выдержка 1 секунда)
  WDTCSR=(1<<WDIE)| (1<<WDP3)|(1<<WDP0); // для датчиков DS18B20 (разрешение прерывания + выдержка 8 секунд)
  pinMode (DopOn,  INPUT);   digitalWrite (DopOn,  HIGH);
  pinMode (DopOff, INPUT);   digitalWrite (DopOff, HIGH);
  pinMode (Sost,   INPUT);   digitalWrite (Sost,   HIGH);
  pinMode (VyhodWebasto,  OUTPUT);  digitalWrite (VyhodWebasto,  HIGH);
  pinMode (VyhodWebastoAnalog,  OUTPUT);  digitalWrite (VyhodWebastoAnalog,  LOW);
  pinMode (StartEng,  OUTPUT);  digitalWrite (StartEng,  LOW);
  pinMode (13,     OUTPUT);  digitalWrite (13,     LOW);

  pinMode (Ohrana, INPUT);  digitalWrite (Ohrana,  HIGH);
  pinMode (Trevoga, INPUT);  digitalWrite (Trevoga,  HIGH);
  pinMode (IGN, INPUT);  digitalWrite (IGN,  HIGH);
  pinMode (Eng, INPUT);  digitalWrite (Eng,  HIGH);
  



   
  
Serial.begin (2400, SERIAL_8E1); // сериал соединение протокол W-Bus
mySerial.begin(19200);           // сериал соединение для gsm модуля
    delay(2000);
  NastroykaGSM ();

TimeWebasto = EEPROM.read(1)*60000UL;
Protocol = EEPROM.read(2);

for (int i=0; i<12; i++) TelNumber1[i] = EEPROM.read (i+10);
for (int i=0; i<12; i++) TelNumber2[i] = EEPROM.read (i+30);
  
}








void loop() {

if (Protocol==1||Protocol==3) {webasto = !digitalRead (Sost);
    if (TempVyhlopC - TempUlicaC > 20) startWebasto_OK = 1;
    else startWebasto_OK = 0;}


if (Protocol==2)W_Bus();
//ниже для таймера старта котла по W-BUS и аналогу 
  TimeStart_W_BUS = millis();
  if (timerenabledStart_W_BUS){
   if (TIMEREXPIRED_Start_W_BUS) {
    digitalWrite (VyhodWebastoAnalog,LOW); webasto=0; timerenabledStart_W_BUS = false;}}

//ниже для таймера создания импульса на старт ДВС 
TimeStartEng = millis();
if (timerenabledStartEng) {
if (TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=false;}}
    
 engine =  !digitalRead (Eng);
 ignition= !digitalRead (IGN); 
 ohrana=   !digitalRead (Ohrana);  
 trevoga=  !digitalRead (Trevoga);
  
if (webasto && report) timerReport ();
if (reportEngine) timerReportEngine ();
if (trevoga && !alarmSMS) AlarmSMS ();
if (!ohrana) alarmSMS = false;

readSMS();
voltmetr();
WebastoOprosImpulse ();


}

void voltmetr()  //____________Цикл "Вольтметр"__измерение напряжения на выходе ИБП
// Взято с <a href="<a href="http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html" rel="nofollow">http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html</a>" rel="nofollow"><a href="http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html" rel="nofollow">http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html</a></a>
{
   volt = analogRead(A7);                       // А7 аналоговый вход вольтметра
   vout = (volt * 4.92) / 1024;             
   Vpit = vout / (9950.0/(98930.0+9950.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09)  Vpit=0.0;                  // Округление до нуля 
}






// Вектор прерывания для Dallas DS18B20
ISR (WDT_vect){ //вектор прерывания WD
static boolean n=0; // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset();  // сброс шины
        ds.write(0xCC);//обращение ко всем датчикам
        ds.write(0x44);// начать преобразование (без паразитного питания)  
       }
else   {ds.reset();
        ds.select(VyhlopC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempVyhlopC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта       
        TempVyhlopC = TempVyhlopC / 16;
        // получение с 2-го датчика
        ds.reset();
        ds.select(EngineC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempEngineC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта  
        TempEngineC = TempEngineC/16;
        ds.reset();
        ds.select(UlicaC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempUlicaC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта       
        TempUlicaC = TempUlicaC / 16;
        // получение с 2-го датчика
        ds.reset();
        ds.select(SalonC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempSalonC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта  
        TempSalonC = TempSalonC/16 ;
}}




                    


void StartWebasto()
{
 if (Protocol==1){ digitalWrite (VyhodWebasto, LOW); 
  timer=time; 
  timerenabled=true;}

 else if (Protocol==2||Protocol==3){
  StartMessageRepeat = 0;
  webasto = 1; digitalWrite (VyhodWebastoAnalog, HIGH);
  timerStart_W_BUS=TimeStart_W_BUS;
  timerenabledStart_W_BUS = true;}
}

void StopWebasto()
{
 if (Protocol==1){ digitalWrite (VyhodWebasto, LOW); 
  timer=time; 
  timerenabled=true;}

 else if (Protocol==2||Protocol==3){
  StopMessageRepeat = 0;
  webasto = 0; digitalWrite (VyhodWebastoAnalog, LOW);
  timerenabledStart_W_BUS = false;}
}




void WebastoOprosImpulse (){

// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла 
  time = millis();
  if (timerenabled) {if (TIMEREXPIRED) {digitalWrite (VyhodWebasto, HIGH); timerenabled=false;}}
  else  {if (!digitalRead (DopOn)  && !webasto) {StartWebasto(); report = true; EndReportMillis = millis(); KTOreport = 1;}
         if (!digitalRead (DopOff) && webasto) {StopWebasto(); report = false;}}}


// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
void timerReport () {
   if(millis() - EndReportMillis > 360000UL) 
   {EndReportMillis = millis(); report = false; SMSzapros();  }} 

// цикл таймера отправки отчета об успешности запуска ДВС  (отчёт через 30сек после старта)                       
void timerReportEngine () {
   if(millis() - EndReportEngine > 30000) 
   {EndReportEngine = millis(); reportEngine = false; SMSzapros();}} 





   void NastroykaGSM () {
      mySerial.print("AT+CMGF=1\r");         //устанавливает текстовый режим смс-сообщения
    delay(200);
  mySerial.print("AT+IFC=1, 1\r");       //устанавливает программный контроль потоком передачи данных
    delay(200);
  mySerial.print("AT+CPBS=\"SM\"\r");    //открывает доступ к данным телефонной книги SIM-карты
    delay(200);
  mySerial.print("AT+GSMBUSY=1\r");   //запрет всех входящих звонков
    delay(300);
  mySerial.print("AT+CNMI=1,2,2,1,0\r"); //включает оповещение о новых сообщениях
    delay(300);
  mySerial.print("AT+CMGDA=\"DEL ALL\"\r"); // удаляем все смс, ки
   delay(2000);
}

void startNumber1SMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
      mySerial.print("AT+CMGF=1\r");
      delay(200);
  mySerial.print("AT+CMGS=\""); mySerial.print(TelNumber1); mySerial.println("\""); 
      delay(400);
}

void startNumber2SMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму  номеру
{
      mySerial.print("AT+CMGF=1\r");
      delay(200);
      mySerial.print("AT+CMGS=\""); mySerial.print(TelNumber2); mySerial.println("\""); 
      delay(400);
}

void startBufferNumberSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму  номеру
{
      mySerial.print("AT+CMGF=1\r");
      delay(200);
      mySerial.print("AT+CMGS=\""); mySerial.print(BufferNumber); mySerial.println("\""); 
      delay(400);
}

void WriteNubmer1() {
  
  
  
  
  }


void EndSMS ()
{
   mySerial.println((char)26);                       // Команда отправки СМС
   delay(3000);
   mySerial.print("AT+CMGDA=\"DEL ALL\"\r"); // удаляем все смс, ки
   delay(1500);
}


void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!mySerial.available()) return;
    char currSymb = mySerial.read();
//  Serial.print (currSymb);
    if ('\r' == currSymb)
       {
         if (isStringMessage!=0&&isStringMessage!=10) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}               // Передача параметров по СМС
else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС



else if (!currStr.compareTo("Webasto-ON"))  { if (!webasto)  {StartWebasto (); report = true; EndReportMillis = millis(); // если получили команду на включение и вебаста в настоящий момент выключена - включаем
                                                                              if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto Vkluchena"); EndSMS(); KTOreport = 1;}
                                                                         else if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto Vkluchena"); EndSMS(); KTOreport = 2;}}
                                                                       
                                                   else                     {if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto uzhe vkluchena"); EndSMS();}
                                                                        else if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto uzhe vkluchena"); EndSMS();}}}

                                                            
               else if (!currStr.compareTo("Webasto-OFF"))   {if (webasto){StopWebasto (); report = false; // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
                                                                              if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto Otkluchena"); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto Otkluchena"); EndSMS();}}


                                                     else                    {if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto uzhe otkluchena"); EndSMS();}
                                                                         else if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto uzhe otkluchena"); EndSMS();}}
                                                     }          


                else if (!currStr.compareTo("Engine-ON"))  {if (!engine)  { digitalWrite (StartEng, HIGH);  timerStartEng=TimeStartEng; timerenabledStartEng=true; reportEngine = true; EndReportEngine = millis(); // если получили команду на включение ДВС и он в настоящий момент выключен - включаем
                                                                              if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Engine Start"); EndSMS(); KTOreport = 1;}
                                                                         else if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Engine Start"); EndSMS(); KTOreport = 2;}}
                                                                       
                                                   else                     {if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Dvigatel uzhe rabotaet"); EndSMS();}
                                                                        else if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Dvigatel uzhe rabotaet"); EndSMS();}}
                                                                       
                                                   }         
               else if (!currStr.compareTo("Engine-OFF"))   {if (engine){ digitalWrite (StartEng, HIGH);  timerStartEng=TimeStartEng; timerenabledStartEng=true; reportEngine = false; // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
                                                                              if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto Otkluchena"); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto Otkluchena"); EndSMS();}}


                                                     else                    {if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto uzhe otkluchena"); EndSMS();}
                                                                         else if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto uzhe otkluchena"); EndSMS();}}
                                                     }          
                                                    

               else if (!currStr.compareTo("Impulse"))   {Protocol = 1;  EEPROM.write(2,Protocol);     if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("zapusk GND_impulse"); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("zapusk GND_impulse"); EndSMS();}}                                                               

               else if (!currStr.compareTo("W-BUS"))   {Protocol = 2; EEPROM.write(2,Protocol);  webasto = 0;  if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("zapusk W-BUS"); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("zapusk W_BUS"); EndSMS();}}

               else if (!currStr.compareTo("Potenzial"))   {Protocol = 3; EEPROM.write(2,Protocol);   if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("zapusk +12V Potencial"); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("zapusk +12V Potencial"); EndSMS();}} 
               
               else if (!currStr.compareTo("Webasto20min"))   {TimeWebasto = 1200000; EEPROM.write(1,TimeWebasto/60000UL);if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto time 20min"); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto time 20min"); EndSMS();}}  
               
               else if (!currStr.compareTo("Webasto30min"))   {TimeWebasto = 1800000; EEPROM.write(1,TimeWebasto/60000UL); if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto time 30min"); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto time 30min"); EndSMS();}}

               else if (!currStr.compareTo("Webasto40min"))   {TimeWebasto = 2400000; EEPROM.write(1,TimeWebasto/60000UL); if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto time 40min"); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto time 40min"); EndSMS();}}

               else if (!currStr.compareTo("Webasto50min"))   {TimeWebasto = 3000000; EEPROM.write(1,TimeWebasto/60000UL); if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto time 50min"); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto time 50min"); EndSMS();}}

               else if (!currStr.compareTo("Webasto60min"))   {TimeWebasto = 3480000; EEPROM.write(1,TimeWebasto/60000UL); if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Webasto time 60min"); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Webasto time 60min"); EndSMS();}}

               else if (!currStr.compareTo("ResetNumbers"))   {if (isStringMessage == 1) {startNumber1SMS(); mySerial.println("Phone numbers are erased"); EndSMS();} 
                                                         else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println("Phone numbers are erased"); EndSMS();}            
             TelNumber1 = "000000000000"; TelNumber2 = "000000000000"; for (int i=0; i<12; i++) {EEPROM.write (i+10,  TelNumber1[i]); EEPROM.write (i+30,  TelNumber2[i]); }}

              else if (!currStr.compareTo("WriteNumber2")&& isStringMessage == 1)   { SaveNumber2 = 1; startNumber1SMS(); mySerial.println("Otpravte lyuboye SMS s nomera2 dlya sochraneniya nomera"); EndSMS();} 

                                                                        

                                                     
               else if (!currStr.compareTo("Balance"))    SMSbalance();
            isStringMessage = 0;
                }
              else if (isStringMessage==10){ if (!currStr.compareTo("WriteNumber1"))   { TelNumber1 = BufferNumber; for (int i=0; i<12; i++) {EEPROM.write (i+10, BufferNumber[i]);}
              startNumber1SMS(); mySerial.println("Tel Number#1 is saving in memory");  mySerial.print("Tel#1: ");  mySerial.println (TelNumber1); EndSMS();
              } 
                                             else if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}   
                                             else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС            
               isStringMessage = 0;
              
              }           



                
         else if (isStringMessage==0) {  if (TelNumber1!="000000000000" && !SaveNumber2 && TelNumber1!="яяяяяяяяяяяя"){
         
                     if (currStr.startsWith("+CMT: \""+TelNumber1)) { isStringMessage = 1; KTOzapros = 1; }   
                else if (currStr.startsWith("+CMT: \""+TelNumber2)) { isStringMessage = 2; KTOzapros = 2; }   
                else if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                       if (KTOzapros == 1) startNumber1SMS();
                  else if (KTOzapros == 2) startNumber2SMS();
                  mySerial.print (currStr);
                  EndSMS();
                  }    
                                                }

                else if    (currStr.startsWith("+CMT:") && !SaveNumber2) { isStringMessage = 10; for (int i =0; i<12; i++) {BufferNumber[i]=currStr[i+7];}}
                else if    (currStr.startsWith("+CMT:") && SaveNumber2) { for (int i =0; i<12; i++) {BufferNumber[i]=currStr[i+7];} TelNumber2 = BufferNumber; for (int i=0; i<12; i++) {EEPROM.write (i+30, BufferNumber[i]);}
              startNumber2SMS(); mySerial.println("Vash nomer sochranyen kak Number#2 v pamyati!"); 
              mySerial.print("Tel1: "); mySerial.println(TelNumber1); mySerial.print("Tel#2: ");  mySerial.println (TelNumber2); EndSMS(); SaveNumber2 = 0; } 
              
              } 
               
        currStr = "";
      } 
 
    else if ('\n' != currSymb) { currStr += String(currSymb);}
}


void SMSzapros()
{   if (isStringMessage == 10){
 startBufferNumberSMS();

 mySerial.println ("Tel.number#1 is not has been saving in memory!");
 mySerial.println ("For save Tel1 send SMS command \"WriteNumber1\"");
  mySerial.print("Tel1: "); mySerial.println(TelNumber1);
  mySerial.print("Tel2: "); mySerial.println(TelNumber2); 
  }
  
  
  
  else {
  
  if (isStringMessage == 1) { startNumber1SMS();}
  else if (isStringMessage == 2) { startNumber2SMS();}
  else if (isStringMessage == 0) {if  (KTOreport == 1) startNumber1SMS();
                             else if  (KTOreport == 2) startNumber2SMS();}
        if (webasto) { mySerial.println ("Webasto ON");
           if (startWebasto_OK) mySerial.println ("StartWebasto OK");
           else mySerial.println ("StartWebasto FAIL");}
     else mySerial.println ("Webasto OFF");  

     if (engine)  mySerial.println ("Engine ON");
     else mySerial.println ("Engine OFF");  

     if (ignition)  mySerial.println ("IGN ON");
     else mySerial.println ("IGN OFF");  

     if (ohrana)  mySerial.println ("OHRANA ON");
     else mySerial.println ("OHRANA OFF");  

     if (trevoga)  mySerial.println ("Vnimanie!!! Trevoga!!! Sirena Vkl!");
     
  mySerial.print("Battery: "); mySerial.print (Vpit); mySerial.println("V");
  mySerial.print("Engine: "); mySerial.print (TempEngineC); mySerial.println("*C");
  mySerial.print("Vyhlop: "); mySerial.print (TempVyhlopC); mySerial.println("*C");
  mySerial.print("Ulica: "); mySerial.print (TempUlicaC); mySerial.println("*C");
  mySerial.print("Salon: "); mySerial.print (TempSalonC); mySerial.println("*C");  
  mySerial.print("Protocol: ");
       if (Protocol==1) mySerial.println("GND Impulse");
  else if (Protocol==2) mySerial.println("W-BUS");
  else if (Protocol==3) mySerial.println("+12V Potencial");
  mySerial.print("Webasto Time: "); mySerial.print (TimeWebasto/60000UL); mySerial.println("min");
 
  }  
   EndSMS();                                 
}

void SMSzaprosTEL(){
  if (isStringMessage == 1) { startNumber1SMS();}
  else if (isStringMessage == 2) { startNumber2SMS();}
  else if (isStringMessage == 10) { startBufferNumberSMS();}
  
  
  mySerial.print("Tel1: "); mySerial.println(TelNumber1);
  mySerial.print("Tel2: "); mySerial.println(TelNumber2); 
  if (TelNumber1!="000000000000" && TelNumber1!="яяяяяяяяяяяя"){
  mySerial.print("Protocol: ");
  if (Protocol==1) mySerial.println("GND Impulse");
  else if (Protocol==2) mySerial.println("W-BUS");
  else if (Protocol==3) mySerial.println("+12V Potencial");
  mySerial.print("Webasto Time: "); mySerial.print (TimeWebasto/60000UL); mySerial.println("min");}
  EndSMS();                                 
  }


void SMSbalance() {
  mySerial.print("AT+CMGF=1\r");
      delay(200);

mySerial.println ("AT+CUSD=1,\"#100#\"");
    
//mySerial.println("AT+CMGS=\"#100#\"");
//      mySerial.println("ATD#100#");
      //mySerial.println("AT + CMGS = \"111\""); // 
      delay(2000);                              // команда на замену на транслит *111*6*2#
      //mySerial.println ("11");
      //EndSMS();
}


void AlarmSMS() {
 startNumber1SMS();
mySerial.println ("Vnimanie!!! Trevoga!!! Sirena Vkl!");
 EndSMS();      
 startNumber2SMS();
mySerial.println ("Vnimanie!!! Trevoga!!! Sirena Vkl!");
 EndSMS();      
 alarmSMS = true;
  
}void W_Bus (){
if (webasto) {
    if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){

 for (int i = 0; i<5; i++) Serial.write (Zapusk21[i]); 
  StartMessageRepeat++; 
  Prev_PeriodW_BusStartStop = millis();
  
    }
  if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>5000)  {
    //делаем периодическое поддержание связи W-BUS
    // наверное сканает отправка сообщения о состоянии котла
    // т.е. ,например, отправляем периодически запрос на показания датчиков
    // состоянием работы котла будет наличие или отсутствие пламени
if (flagStartPresent) {for (int i = 0; i<5; i++) Serial.write (Zapusk21[i]); }
//else {for (int i = 0; i<5; i++) Serial.write (StateMessage[i]);}
flagStartPresent = !flagStartPresent;
StopMessageRepeat = 0;
    
    Prev_PeriodW_BusMessage = millis();
    }}}





else if (StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
  for (int i = 0; i<4; i++) Serial.write (Stop[i]); 
StopMessageRepeat++; 
StartMessageRepeat = 0;
   Prev_PeriodW_BusStartStop = millis();
  
  
  }

}

Осталось две фичи реализовать  - энергосбережение и контроль зависания и перезагрузки GSM. Всем спасибо, так активно помогаете.

Pingui
Pingui аватар
Offline
Зарегистрирован: 30.05.2017

Режим выбирается посредством посылкой SMS с соответствующей командой и хранится в еепром.  Имеется обратная связь по успешности запуска котла даже для аналоговых webasto. Имеется выбор времени работы котла (также хранится в еепром). 

Slaiterx
Offline
Зарегистрирован: 05.05.2016

а нельзя ли схемму глянуть а то элементов много а схеммы нет хочу себе собрать

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Актуальная версия платы

 - Актуальный скетч подготовки еепром и основной скетч - смотрим в этой папке последнюю версию. В скетче еепром делаем предварительные настройки (в комментах всё подробно там).  Сначала заливаем скетч еепром, дожидаемся пока загорится встроенный светодиод LED 13. Потом заливаем основной скетч. Там же в папке актуальная инструкция пользователя. 

список деталей и рассыпухи для заказа

- корпус девайса на 3д принтере

- Для удобства отправки СМС команд рекомендую использовать приложение для Андройид GSM Trinket. (качается в playMarket). Файл настроек брелка для программы GSM Trinket. Подробности читаем в инструкции к моему устройству. Но когда появился MQTT это уже лишнее, хотя как резервный вариант всетаки лучше иметь, чтобы не вспоминать команды управления, в случае отказа облачного сервиса MQTT.

- Настройка MQTT на смартфоне тут. MQTT для тех кто не знает - это текстовый протокол взаимодействия, в нашем случае управление по интернет соединению, т.к. через облачный сервер. Работает почти в реальном времени, т.е. мгновенный отклик и дешевле СМС. В месяц трафик не более 10 Мб. 

- Для тех кто будет подключать сигнализацию старлайн: 

В таблице программирования AF сигнализации Starline необходимо запрограммировать следующие функции (помечены красными галочками): Это всё справедливо для сигнализаций B94, D94, E90, E91. Для A94 будет немного отличаться, надо корректировать номера доп.каналов. 

Далее на доп.каналы настраиваем следующие события включения и задержки: 

CH-1:   T1-0;  T2-999; T3-0;  T4-0;  ЗП-06;  УО-0;  ОС-07;  УО-0;  dy-OF; db-On

CH-2:   T1-0;  T2-001; T3-0;  T4-0;  ЗП-01;  УО-0;  ОС-00;  УО-0;  dy-OF; db-ОF

CH-4:   T1-0;  T2-999; T3-0;  T4-0;  ЗП-13;  УО-0;  ОС-18;  УО-0;  dy-OF; db-On

CH-5:   T1-0;  T2-001; T3-0;  T4-0;  ЗП-01;  УО-0;  ОС-00;  УО-0;  dy-OF; db-ОF

CH-6:   T1-0;  T2-999; T3-0;  T4-0;  ЗП-10;  УО-0;  ОС-03;  УО-0;  dy-On; db-On

Для старлайн А94.                        Вкл. котёл - "1" допканал,   выкл. котёл - "4" допканал

Для старлайн A93, B94, E90, E91   Вкл. котёл - "2" допканал,   выкл. котёл - "5" допканал

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

чуть оптимизировал скетч.  Для установки время работы webasto. Отправить смс с текстом "45 min". Где 45 соответственно время работы.

v2.1.

#include <EEPROM.h>
// для GSM модуля *********************
#include <SoftwareSerial.h>
SoftwareSerial mySerial(14, 15); //Rx, Tx
String currStr = "";

String TelNumber1 = "000000000000";

String TelNumber2 = "000000000000";

String BufferNumber = "000000000000";

bool SaveNumber2 = 0;  // флаг когда необходима запись номера#2, он true

int isStringMessage = 0; 
int KTOzapros = 0;
int KTOreport = 1;
//************************


int Protocol = 1; // протокол, по которому будет происходить выход на запуск котла: 1 - импульсный минусовой выход (на впайку в таймер вебасто например)
                  // 2 - по протоколу W-BUS ( котлы TermoTOP EVO)
                  // 3 - по подаче потенциала 12В, т.е. пока висит +12В - котел включен (котлы по аналогу - TermoTOP C,E)

                  
//_______Все для цикла void voltmetr()*************
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
  int volt = 0;        // Напряжение на входе АЦП

// входы выходы на соостветствующие пины **************
#define DopOn 4      // сюда доп канал от сигналки на включение вебасто
#define DopOff  5    // сюда доп канал от сигналки на выключение вебасто
#define VyhodWebasto  12     // это импульсный минусовой выход вкл/выкл вебасто к таймеру. 
#define VyhodWebastoAnalog  3  // это потенциальный плюсовой выход вкл/выкл вебасто (напрямую к котлу без таймера). 
#define Sost  9      // Сюда состояние вебасто (+12В когда работает)

#define Ohrana  6      // Сюда состояние охраны сигналки
#define Trevoga  7      // Сюда состояние тревоги
#define StartEng 8   // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define IGN 10       // Сюда состояние зажигания
#define Eng 11       // Сюда состояние работы ДВС




// для шины 1-wire и датчиков DS18B20****************

#include <OneWire.h> // библиотека для DS18B20
OneWire ds(2); // датчики DS18B20 на 2 пин

byte VyhlopC[8] ={0x28, 0xFF, 0xE6, 0x14, 0x90, 0x15, 0x04, 0x62}; 
byte EngineC[8] ={0x28, 0xFF, 0x06, 0x15, 0x90, 0x15, 0x04, 0x37}; 
byte UlicaC[8] ={0x28, 0xFF, 0x43, 0x42, 0xA8, 0x15, 0x03, 0x2A};  
byte SalonC[8] ={0x28, 0xFF, 0xE0, 0x19, 0xA8, 0x15, 0x01, 0xA7};  
volatile int  TempVyhlopC = 20;
volatile int  TempEngineC = 20;
volatile int  TempUlicaC = 20;
volatile int  TempSalonC = 20;

// для организации W-BUS и различные таймеры********************
byte Zapusk20[5] = {0xF4,0x03, 0x20, 0x3B, 0xEC} ;
byte Zapusk21[5] = {0xF4,0x03, 0x21, 0x3B, 0xED} ;
byte Stop[4] = {0xF4,0x02, 0x10, 0xE6} ;

bool flagStartPresent = 1;               //флаг что отправляем в момент периодического поддержания связи W-Bus status или start
int StartMessageRepeat = 0;              //количество отправленных сообщений на старт котла
int StopMessageRepeat = 0;               //количество отправленных сообщений на остановку котла

unsigned long TimeWebasto = 1800000;   //время работы котла, 1800000 = 30мин
unsigned long EndReportMillis = 0;     //переменная для таймера отправки отчета об успешности запуска котла
unsigned long EndReportEngine = 0;     //переменная для таймера отправки отчета об успешности запуска ДВС
unsigned long Prev_PeriodW_BusMessage = 0;     //переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus 
unsigned long Prev_PeriodW_BusStartStop = 0;       //переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus 

//для таймера  - активация котла - импульс массы 0,8 сек на провод, впаянный в таймер вебасто)
unsigned long time, timer=0;
bool timerenabled=false;
#define TIMEREXPIRED (time-timer)>800


//для таймера  - старт двигателя - импульс +5В на оптопару, в итоге минусовой импульс 1 сек на вход событий сигналки для запуска ДВС)
unsigned long TimeStartEng, timerStartEng=0;
bool timerenabledStartEng=false;
#define TIMEREXPIRED_StartEng (TimeStartEng-timerStartEng)>2000


//для таймера  - старт котла по W-BUS )
unsigned long TimeStart_W_BUS, timerStart_W_BUS=0;
bool timerenabledStart_W_BUS=false;
#define TIMEREXPIRED_Start_W_BUS (TimeStart_W_BUS-timerStart_W_BUS)> TimeWebasto 

//**************************


//Основные переменные  
bool webasto = 0;            // состояние команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool startWebasto_OK = 0;    // состояние успешного запуска котла
bool report = false;      // состояние нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false;// состояние нужности отправки отчета false - не нужно отправлять, true - нужно отправлять

bool engine =0;    //флаг работает ли ДВС или нет
bool ignition=0;   //флаг включено ли зажигание или нет
bool ohrana=0;     //флаг включена ли охрана или нет
bool trevoga=0;    //флаг включена ли тревога или нет
bool alarmSMS = 0; //флаг отправлена ли смс о тревоге или нет





// СТАРТОВЫЙ ЦИКЛ
void setup() 
{
 delay (2500);
  WDTCSR=(1<<WDCE)|(1<<WDE); //для датчиков DS18B20
 // WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // для датчиков DS18B20 (разрешение прерывания + выдержка 1 секунда)
  WDTCSR=(1<<WDIE)| (1<<WDP3)|(1<<WDP0); // для датчиков DS18B20 (разрешение прерывания + выдержка 8 секунд)
  pinMode (DopOn,  INPUT);   digitalWrite (DopOn,  HIGH);
  pinMode (DopOff, INPUT);   digitalWrite (DopOff, HIGH);
  pinMode (Sost,   INPUT);   digitalWrite (Sost,   HIGH);
  pinMode (VyhodWebasto,  OUTPUT);  digitalWrite (VyhodWebasto,  HIGH);
  pinMode (VyhodWebastoAnalog,  OUTPUT);  digitalWrite (VyhodWebastoAnalog,  LOW);
  pinMode (StartEng,  OUTPUT);  digitalWrite (StartEng,  LOW);
  pinMode (13,     OUTPUT);  digitalWrite (13,     LOW);

  pinMode (Ohrana, INPUT);  digitalWrite (Ohrana,  HIGH);
  pinMode (Trevoga, INPUT);  digitalWrite (Trevoga,  HIGH);
  pinMode (IGN, INPUT);  digitalWrite (IGN,  HIGH);
  pinMode (Eng, INPUT);  digitalWrite (Eng,  HIGH);
  



   
  
Serial.begin (2400, SERIAL_8E1); // сериал соединение протокол W-Bus
mySerial.begin(19200);           // сериал соединение для gsm модуля
    delay(2000);
  NastroykaGSM ();

TimeWebasto = EEPROM.read(1)*60000UL;
Protocol = EEPROM.read(2);

for (int i=0; i<12; i++) TelNumber1[i] = EEPROM.read (i+10);
for (int i=0; i<12; i++) TelNumber2[i] = EEPROM.read (i+30);
  
}








void loop() {

if (Protocol==1||Protocol==3) {webasto = !digitalRead (Sost);
    if (TempVyhlopC - TempUlicaC > 20) startWebasto_OK = 1;
    else startWebasto_OK = 0;}


if (Protocol==2)W_Bus();
//ниже для таймера старта котла по W-BUS и аналогу 
  TimeStart_W_BUS = millis();
  if (timerenabledStart_W_BUS){
   if (TIMEREXPIRED_Start_W_BUS) {
    digitalWrite (VyhodWebastoAnalog,LOW); webasto=0; timerenabledStart_W_BUS = false;}}

//ниже для таймера создания импульса на старт ДВС 
TimeStartEng = millis();
if (timerenabledStartEng) {
if (TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=false;}}
    
 engine =  !digitalRead (Eng);
 ignition= !digitalRead (IGN); 
 ohrana=   !digitalRead (Ohrana);  
 trevoga=  !digitalRead (Trevoga);
  
if (webasto && report) timerReport ();
if (reportEngine) timerReportEngine ();
if (trevoga && !alarmSMS) AlarmSMS ();
if (!ohrana) alarmSMS = false;

readSMS();
voltmetr();
WebastoOprosImpulse ();


}

void voltmetr()  //____________Цикл "Вольтметр"__измерение напряжения на выходе ИБП
// Взято с <a href="<a href="http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html" rel="nofollow">http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html</a>" rel="nofollow"><a href="http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html" rel="nofollow">http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html</a></a>
{
   volt = analogRead(A7);                       // А7 аналоговый вход вольтметра
   vout = (volt * 4.92) / 1024;             
   Vpit = vout / (9950.0/(98930.0+9950.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09)  Vpit=0.0;                  // Округление до нуля 
}






// Вектор прерывания для Dallas DS18B20
ISR (WDT_vect){ //вектор прерывания WD
static boolean n=0; // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset();  // сброс шины
        ds.write(0xCC);//обращение ко всем датчикам
        ds.write(0x44);// начать преобразование (без паразитного питания)  
       }
else   {ds.reset();
        ds.select(VyhlopC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempVyhlopC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта       
        TempVyhlopC = TempVyhlopC / 16;
        // получение с 2-го датчика
        ds.reset();
        ds.select(EngineC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempEngineC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта  
        TempEngineC = TempEngineC/16;
        ds.reset();
        ds.select(UlicaC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempUlicaC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта       
        TempUlicaC = TempUlicaC / 16;
        // получение с 2-го датчика
        ds.reset();
        ds.select(SalonC);    
        ds.write(0xBE); // Read Scratchpad (чтение регистров)  
        TempSalonC =  ds.read() | (ds.read()<<8); //прочитаны 2 байта  
        TempSalonC = TempSalonC/16 ;
}}




                    


void StartWebasto()
{
 if (Protocol==1){ digitalWrite (VyhodWebasto, LOW); 
  timer=time; 
  timerenabled=true;}

 else if (Protocol==2||Protocol==3){
  StartMessageRepeat = 0;
  webasto = 1; digitalWrite (VyhodWebastoAnalog, HIGH);
  timerStart_W_BUS=TimeStart_W_BUS;
  timerenabledStart_W_BUS = true;}
}

void StopWebasto()
{
 if (Protocol==1){ digitalWrite (VyhodWebasto, LOW); 
  timer=time; 
  timerenabled=true;}

 else if (Protocol==2||Protocol==3){
  StopMessageRepeat = 0;
  webasto = 0; digitalWrite (VyhodWebastoAnalog, LOW);
  timerenabledStart_W_BUS = false;}
}




void WebastoOprosImpulse (){

// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла 
  time = millis();
  if (timerenabled) {if (TIMEREXPIRED) {digitalWrite (VyhodWebasto, HIGH); timerenabled=false;}}
  else  {if (!digitalRead (DopOn)  && !webasto) {StartWebasto(); report = true; EndReportMillis = millis(); KTOreport = 1;}
         if (!digitalRead (DopOff) && webasto) {StopWebasto(); report = false;}}}


// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
void timerReport () {
   if(millis() - EndReportMillis > 360000UL) 
   {EndReportMillis = millis(); report = false; SMSzapros();  }} 

// цикл таймера отправки отчета об успешности запуска ДВС  (отчёт через 30сек после старта)                       
void timerReportEngine () {
   if(millis() - EndReportEngine > 30000) 
   {EndReportEngine = millis(); reportEngine = false; SMSzapros();}} 





   void NastroykaGSM () {
      mySerial.print(F("AT+CMGF=1\r"));         //устанавливает текстовый режим смс-сообщения
    delay(200);
  mySerial.print(F("+IFC=1, 1\r"));       //устанавливает программный контроль потоком передачи данных
    delay(200);
  mySerial.print(F("AT+CPBS=\"SM\"\r"));    //открывает доступ к данным телефонной книги SIM-карты
    delay(200);
  mySerial.print(F("AT+GSMBUSY=1\r"));   //запрет всех входящих звонков
    delay(300);
  mySerial.print(F("AT+CNMI=1,2,2,1,0\r")); //включает оповещение о новых сообщениях
    delay(300);
  mySerial.print(F("AT+CMGDA=\"DEL ALL\"\r")); // удаляем все смс, ки
   delay(2000);
}

void startNumber1SMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
      mySerial.print(F("AT+CMGF=1\r"));
      delay(200);
  mySerial.print(F("AT+CMGS=\"")); mySerial.print(TelNumber1); mySerial.println("\""); 
      delay(400);
}

void startNumber2SMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму  номеру
{
      mySerial.print(F("AT+CMGF=1\r"));
      delay(200);
      mySerial.print(F("AT+CMGS=\"")); mySerial.print(TelNumber2); mySerial.println(F("\"")); 
      delay(400);
}

void startBufferNumberSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму  номеру
{
      mySerial.print(F("AT+CMGF=1\r"));
      delay(200);
      mySerial.print(F("AT+CMGS=\"")); mySerial.print(BufferNumber); mySerial.println(F("\"")); 
      delay(400);
}

void WriteNubmer1() {
  
  
  
  
  }


void EndSMS ()
{
   mySerial.println((char)26);                       // Команда отправки СМС
   delay(3000);
   mySerial.print(F("AT+CMGDA=\"DEL ALL\"\r")); // удаляем все смс, ки
   delay(1500);
}


void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!mySerial.available()) return;
    char currSymb = mySerial.read();
//  Serial.print (currSymb);
    if ('\r' == currSymb)
       {
         if (isStringMessage!=0&&isStringMessage!=10) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}               // Передача параметров по СМС
else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС



else if (!currStr.compareTo("Webasto-ON"))  { if (!webasto)  {StartWebasto (); report = true; EndReportMillis = millis(); // если получили команду на включение и вебаста в настоящий момент выключена - включаем
                                                                              if (isStringMessage == 1) {startNumber1SMS(); KTOreport = 1;}
                                                                         else if (isStringMessage == 2) {startNumber2SMS();  KTOreport = 2;}
                                                                         mySerial.println(F("Webasto Vkluchena")); EndSMS();}
                                                                       
                                                   else                     {if (isStringMessage == 1) startNumber1SMS(); 
                                                                        else if (isStringMessage == 2) startNumber2SMS(); 
                                                                        mySerial.println(F("Webasto uzhe vkluchena")); EndSMS();}}

                                                            
               else if (!currStr.compareTo("Webasto-OFF"))   {if (webasto){StopWebasto (); report = false; // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
                                                                              if (isStringMessage == 1) startNumber1SMS(); 
                                                                        else  if (isStringMessage == 2) startNumber2SMS();
                                                                        mySerial.println(F("Webasto Otkluchena")); EndSMS();}


                                                     else                    {if (isStringMessage == 1) startNumber1SMS(); 
                                                                         else if (isStringMessage == 2) startNumber2SMS(); 
                                                                         mySerial.println(F("Webasto uzhe otkluchena")); EndSMS();}}          


                else if (!currStr.compareTo("Engine-ON"))  {if (!engine)  { digitalWrite (StartEng, HIGH);  timerStartEng=TimeStartEng; timerenabledStartEng=true; reportEngine = true; EndReportEngine = millis(); // если получили команду на включение ДВС и он в настоящий момент выключен - включаем
                                                                              if (isStringMessage == 1) {startNumber1SMS();  KTOreport = 1;}
                                                                         else if (isStringMessage == 2) {startNumber2SMS();  KTOreport = 2;}
                                                                         mySerial.println(F("Engine Start")); EndSMS();}
                                                                       
                                                   else                     {if (isStringMessage == 1) startNumber1SMS(); 
                                                                        else if (isStringMessage == 2) startNumber2SMS();
                                                                        mySerial.println(F("Dvigatel uzhe rabotaet")); EndSMS();}}
                                                                                 
               else if (!currStr.compareTo("Engine-OFF"))   {if (engine){ digitalWrite (StartEng, HIGH);  timerStartEng=TimeStartEng; timerenabledStartEng=true; reportEngine = false; // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
                                                                              if (isStringMessage == 1) startNumber1SMS();
                                                                        else  if (isStringMessage == 2) startNumber2SMS();
                                                                        mySerial.println(F("Dvigatel ostanovlen")); EndSMS();}


                                                     else                    {if (isStringMessage == 1) startNumber1SMS(); 
                                                                         else if (isStringMessage == 2) startNumber2SMS();
                                                                         mySerial.println(F("dvigatel uzhe ostanovlen")); EndSMS(); }}          
                                                    

               else if (!currStr.compareTo("Impulse"))   {Protocol = 1;  EEPROM.write(2,Protocol);     if (isStringMessage == 1) {startNumber1SMS(); mySerial.println(F("zapusk GND_impulse")); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println(F("zapusk GND_impulse")); EndSMS();}}                                                               

               else if (!currStr.compareTo("W-BUS"))   {Protocol = 2; EEPROM.write(2,Protocol);  webasto = 0;  if (isStringMessage == 1) {startNumber1SMS(); mySerial.println(F("zapusk W-BUS")); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println(F("zapusk W_BUS")); EndSMS();}}

               else if (!currStr.compareTo("Potenzial"))   {Protocol = 3; EEPROM.write(2,Protocol);   if (isStringMessage == 1) {startNumber1SMS(); mySerial.println(F("zapusk +12V Potencial")); EndSMS();}
                                                                        else  if (isStringMessage == 2) {startNumber2SMS(); mySerial.println(F("zapusk +12V Potencial")); EndSMS();}} 

               
                else if (currStr.endsWith("min"))   {TimeWebasto = currStr.toInt()*60000UL; // для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
               if (TimeWebasto>3540000UL) TimeWebasto = 3540000UL;
               if (TimeWebasto<=600000UL) TimeWebasto = 600000UL;
               EEPROM.write(1,TimeWebasto/60000UL);
                     if (isStringMessage == 1)startNumber1SMS(); 
               else  if (isStringMessage == 2) startNumber2SMS(); 
               mySerial.print(F("Webasto time: ")); mySerial.print(TimeWebasto/60000UL); mySerial.print(F("min")); EndSMS();}
               

               else if (!currStr.compareTo("ResetNumbers"))   {if (isStringMessage == 1) {startNumber1SMS(); mySerial.println(F("Phone numbers are erased")); EndSMS(); 
                                                                     
             TelNumber1 = "000000000000"; TelNumber2 = "000000000000"; for (int i=0; i<12; i++) {EEPROM.write (i+10,  TelNumber1[i]); EEPROM.write (i+30,  TelNumber2[i]); }}}

              else if (!currStr.compareTo("WriteNumber2")&& isStringMessage == 1)   { 
                SaveNumber2 = 1; startNumber1SMS(); mySerial.println(F("Otpravte lyuboye SMS s nomera2 dlya sochraneniya nomera")); EndSMS();} 

                                                                        

                                                     
               else if (!currStr.compareTo("Balance"))    SMSbalance();
            isStringMessage = 0;
                }
              else if (isStringMessage==10){ if (!currStr.compareTo("WriteNumber1"))   { TelNumber1 = BufferNumber; for (int i=0; i<12; i++) {EEPROM.write (i+10, BufferNumber[i]);}
              startNumber1SMS(); mySerial.println(F("Tel Number#1 is saving in memory"));  mySerial.print("Tel#1: ");  mySerial.println (TelNumber1); EndSMS();
              } 
                                             else if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}   
                                             else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС            
               isStringMessage = 0;
              
              }           



                
         else if (isStringMessage==0) {  if (TelNumber1!="000000000000" && !SaveNumber2 && TelNumber1!="яяяяяяяяяяяя"){
         
                     if (currStr.startsWith("+CMT: \""+TelNumber1)) { isStringMessage = 1; KTOzapros = 1; }   
                else if (currStr.startsWith("+CMT: \""+TelNumber2)) { isStringMessage = 2; KTOzapros = 2; }   
                else if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                       if (KTOzapros == 1) startNumber1SMS();
                  else if (KTOzapros == 2) startNumber2SMS();
                  mySerial.print (currStr);
                  EndSMS();
                  }    
                                                }

                else if    (currStr.startsWith("+CMT:") && !SaveNumber2) { isStringMessage = 10; for (int i =0; i<12; i++) {BufferNumber[i]=currStr[i+7];}}
                else if    (currStr.startsWith("+CMT:") && SaveNumber2) { for (int i =0; i<12; i++) {BufferNumber[i]=currStr[i+7];} TelNumber2 = BufferNumber; for (int i=0; i<12; i++) {EEPROM.write (i+30, BufferNumber[i]);}
              startNumber2SMS(); mySerial.println(F("Vash nomer sochranyon kak Number#2 v pamyati!")); 
              mySerial.print(F("Tel1: ")); mySerial.println(TelNumber1); mySerial.print(F("Tel#2: "));  mySerial.println (TelNumber2); EndSMS(); SaveNumber2 = 0; } 
              
              } 
               
        currStr = "";
      } 
 
    else if ('\n' != currSymb) { currStr += String(currSymb);}
}


void SMSzapros()
{   if (isStringMessage == 10){
 startBufferNumberSMS();

 mySerial.println (F("Tel.number#1 is not has been saving in memory!"));
 mySerial.println (F("For save Tel1 send SMS command \"WriteNumber1\""));
  mySerial.print(F("Tel1: ")); mySerial.println(TelNumber1);
  mySerial.print(F("Tel2: ")); mySerial.println(TelNumber2); 
  }
  
  
  
  else {
  
  if (isStringMessage == 1) { startNumber1SMS();}
  else if (isStringMessage == 2) { startNumber2SMS();}
  else if (isStringMessage == 0) {if  (KTOreport == 1) startNumber1SMS();
                             else if  (KTOreport == 2) startNumber2SMS();}
        if (webasto) { mySerial.println (F("Webasto ON"));
           if (startWebasto_OK) mySerial.println (F("StartWebasto OK"));
           else mySerial.println (F("StartWebasto FAIL"));}
     else mySerial.println (F("Webasto OFF"));  

     if (engine)  mySerial.println (F("Engine ON"));
     else mySerial.println (F("Engine OFF"));  

     if (ignition)  mySerial.println (F("IGN ON"));
     else mySerial.println (F("IGN OFF"));  

     if (ohrana)  mySerial.println (F("OHRANA ON"));
     else mySerial.println (F("OHRANA OFF"));  

     if (trevoga)  mySerial.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
     
  mySerial.print(F("Battery: ")); mySerial.print (Vpit); mySerial.println(F("V"));
  mySerial.print(F("Engine: ")); mySerial.print (TempEngineC); mySerial.println(F("*C"));
  mySerial.print(F("Vyhlop: ")); mySerial.print (TempVyhlopC); mySerial.println(F("*C"));
  mySerial.print(F("Ulica: ")); mySerial.print (TempUlicaC); mySerial.println(F("*C"));
  mySerial.print(F("Salon: ")); mySerial.print (TempSalonC); mySerial.println(F("*C"));  
  mySerial.print(F("Protocol: "));
       if (Protocol==1) mySerial.println(F("GND Impulse"));
  else if (Protocol==2) mySerial.println(F("W-BUS"));
  else if (Protocol==3) mySerial.println(F("+12V Potencial"));
  mySerial.print(F("Webasto Time: ")); mySerial.print (TimeWebasto/60000UL); mySerial.println(F("min"));
 
  }  
   EndSMS();                                 
}

void SMSzaprosTEL(){
  if (isStringMessage == 1) { startNumber1SMS();}
  else if (isStringMessage == 2) { startNumber2SMS();}
  else if (isStringMessage == 10) { startBufferNumberSMS();}
  
  
  mySerial.print(F("Tel1: ")); mySerial.println(TelNumber1);
  mySerial.print(F("Tel2: ")); mySerial.println(TelNumber2); 
  if (TelNumber1!="000000000000" && TelNumber1!="яяяяяяяяяяяя"){
  mySerial.print(F("Protocol: "));
  if (Protocol==1) mySerial.println(F("GND Impulse"));
  else if (Protocol==2) mySerial.println(F("W-BUS"));
  else if (Protocol==3) mySerial.println(F("+12V Potencial"));
  mySerial.print(F("Webasto Time: ")); mySerial.print (TimeWebasto/60000UL); mySerial.println(F("min"));}
  EndSMS();                                 
  }


void SMSbalance() {
  mySerial.print(F("AT+CMGF=1\r"));
      delay(200);

mySerial.println (F("AT+CUSD=1,\"#100#\""));
    
//mySerial.println("AT+CMGS=\"#100#\"");
//      mySerial.println("ATD#100#");
      //mySerial.println("AT + CMGS = \"111\""); // 
      delay(2000);                              // команда на замену на транслит *111*6*2#
      //mySerial.println ("11");
      //EndSMS();
}


void AlarmSMS() {
 startNumber1SMS();
mySerial.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
 EndSMS();      
 startNumber2SMS();
mySerial.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
 EndSMS();      
 alarmSMS = true;
  
}void W_Bus (){
if (webasto) {
    if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){

 for (int i = 0; i<5; i++) Serial.write (Zapusk21[i]); 
  StartMessageRepeat++; 
  Prev_PeriodW_BusStartStop = millis();
  
    }
  if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>5000)  {
    //делаем периодическое поддержание связи W-BUS
    // наверное сканает отправка сообщения о состоянии котла
    // т.е. ,например, отправляем периодически запрос на показания датчиков
    // состоянием работы котла будет наличие или отсутствие пламени
if (flagStartPresent) {for (int i = 0; i<5; i++) Serial.write (Zapusk21[i]); }
//else {for (int i = 0; i<5; i++) Serial.write (StateMessage[i]);}
flagStartPresent = !flagStartPresent;
StopMessageRepeat = 0;
    
    Prev_PeriodW_BusMessage = millis();
    }}}





else if (StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
  for (int i = 0; i<4; i++) Serial.write (Stop[i]); 
StopMessageRepeat++; 
StartMessageRepeat = 0;
   Prev_PeriodW_BusStartStop = millis();
  
  
  }

}

 

defed
Offline
Зарегистрирован: 27.10.2015

Всем привет. У кого данное устройство на Sim 800 отработали зиму? Как ведет себя в мороз? У самого стоит подобное работает два месяца, пока без нареканий.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Я один не понял как заодится двигатель? В обход сигнашки? Т.е. врезаетесь после сигнашки на замок зажигания по сути? Сначала думал что реализовали протокол штатного GSM модуля, но потом вспомнил что такая халява кончилась со времен старлайна Б9.

Если завести в обход сигнашки, то она и сработает. Даже если на штатный иммобилайзер закрыть и завести со старлайна то сработает штатный иммобилайзер. Хотя может для тазиков и нормально.

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:
Запуск/останов ДВС средствами старлайна, но по GSM команде от данного устройва.

Внимательно читаем эту фразу. У сигнализации старлайн есть провод-вход событий. Оранжево-синий. Его можно запрограммировать, чтобы если подается импульс GND на этот провод, сигнализация запускает ДВС, если ещё раз подать импульс - заглушит ДВС

MaksVV
Offline
Зарегистрирован: 06.08.2015

defed пишет:
Всем привет. У кого данное устройство на Sim 800 отработали зиму? Как ведет себя в мороз? У самого стоит подобное работает два месяца, пока без нареканий.

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

ПС. потребление тока около 35мА, многовато конечно, учитывая, что сигналка ещё также где-то ест, в итоге получаем около 70мА. Но хороший АКБ решает. Режимы засыпания трудно сделать с моим уровнем программирования и нехваткой времени. 

bizzon
Offline
Зарегистрирован: 29.03.2016

70 ма- привет аккумулятору зимой дней через 10. Надо как-то уменьшать. Схемку соединений бы - не всё понятно по скетчу и фото. Набралось несколько желаюших повторить и потестировать- зима на носу..

MaksVV
Offline
Зарегистрирован: 06.08.2015
настройки доп.каналов  при подключении девайса к сигналке старлайн
 
для B94, D94, E90, E91: 
 
CH-1 жел-черн: T1-0;  T2-999; T3-0;  T4-0;  ЗП-06;  УО-0;  ОС-07;  УО-0;  dy-OF; db-On   зажигание
 
CH-2 жел-кр:    T1-0;  T2-001; T3-0;  T4-0;  ЗП-01;  УО-0;  ОС-00;  УО-0;  dy-OF; db-ОF   имп 1сек запуск котла
 
CH-4 жел-син:  T1-0;  T2-999; T3-0;  T4-0;  ЗП-13;  УО-0;  ОС-18;  УО-0;  dy-OF; db-On   работа двс
 
CH-5 черн-бел: T1-0;  T2-001; T3-0;  T4-0;  ЗП-01;  УО-0;  ОС-00;  УО-0;  dy-OF; db-ОF   имп 1сек стоп котла
 
CH-6 жел-ор:    T1-0;  T2-999; T3-0;  T4-0;  ЗП-10;  УО-0;  ОС-03;  УО-0;  dy-On; db-On  тревога
 
 
для A94: 
 
CH-0 жел-черн: T1-0;  T2-999; T3-0;  T4-0;  ЗП-06;  УО-0;  ОС-07;  УО-0;  dy-OF; db-On  зажигание
 
CH-1 жел-кр:    T1-0;  T2-001; T3-0;  T4-0;  ЗП-01;  УО-0;  ОС-00;  УО-0;  dy-OF; db-ОF  имп 1сек запуск котла
 
CH-2 жел-бел:  T1-0;  T2-999; T3-0;  T4-0;  ЗП-10;  УО-0;  ОС-03;  УО-0;  dy-On; db-On  тревога
 
CH-3 жел-син:  T1-0;  T2-999; T3-0;  T4-0;  ЗП-13;  УО-0;  ОС-18;  УО-0;  dy-OF; db-On  работа двс
 
CH-4 черн-бел: T1-0;  T2-001; T3-0;  T4-0;  ЗП-01;  УО-0;  ОС-00;  УО-0;  dy-OF; db-ОF  имп 1сек стоп котла
 
MaksVV
Offline
Зарегистрирован: 06.08.2015

схему попробую нарисовать

MaksVV
Offline
Зарегистрирован: 06.08.2015

bizzon пишет:
не всё понятно по скетчу и фото.

конкретнее

MaksVV
Offline
Зарегистрирован: 06.08.2015

инструкция пользователя 

Управление устройством осуществляется при помощи СМС и возможно только с номеров телефонов, сохранённых в памяти. Изначально в памяти устройства не записаны номера телефонов пользователей. Устройство при этом отвечает только на три СМС команды (писать без кавычек):
1. «ZAPROS» - проверка работоспособности устройства.
2. «ZAPROSTEL» - запрос номеров телефонов, записанных в память устройства. 
Если в ответной СМС на этот запрос номера телефонов будут вида «000000000000» или «яяяяяяяяяяяя», то номера телефонов не записаны в память устройства. 
3. «WriteNumber1» - после посылки СМС с таким текстом на устройство, происходит запись номера телефона (с которого это СМС отправлено) в память как номер #1. 
После записи номера #1 в память, на этот телефон приходит подтверждающее СМС.
	Как только произведена запись номера #1 в память, становится возможным управление устройством в полном функционале. 
Для записи номера #2 необходимо с номера #1 отправить СМС с текстом «WriteNumber2».
После отправки данной команды приходит подтверждающее СМС, в котором указано, что нужно отправить СМС с любым текстом с номера#2 для его сохранения в память. 
Теперь, если отправлено любое СМС с номера #2, он сохраняется в памяти, приходит подтверждающее СМС. 
Управление с номера #2 полностью аналогично управлению с номера #1, за исключением того, что удаление номеров из памяти и запись номера #2 возможно лишь с номера #1.

Список СМС команд управления устройством  (текст команд должен строго соответствовать – пробелы, тире, регистр букв (заглавная или прописная) и т.д. – команду писать без кавычек ): 
1.	«ZAPROS»  - запрос на предоставление текущего состояния всех параметров устройства .
2.	«ZAPROSTEL»  - запрос на предоставление телефонных номеров пользователей, сохранённых в памяти. 
3.	«Webasto-ON»  - включение котла Webasto
4.	«Webasto-OFF»  - выключение котла Webasto
5.	«Engine-ON»  - команда на запуск двигателя сигнализацией Starline
6.	«Engine-OFF»  - команда на остановку двигателя сигнализацией Starline
7.	«Balance» - запрос баланса симкарты. 

Ниже идёт выбор протокола, по которому будет осуществляться управление  котлом:
8.	«Impulse»  - запуск котла осуществляется 1 сек импульсом «массы» на бело-синем проводе. 
9.	«W-Bus»  - запуск котла осуществляется цифровым сигналом по шине W-Bus (зелёный провод устройства)
10.	«Potenzial» - запуск котла осуществляется потенциалом +12В (вывод 12 Ардуино), в этом варианте устройства данное подключение аппаратно пока не реализовано!

Ниже идет сохранение в память времени цикла работы Webasto (используется для запуска по протоколу W-Bus и Potenzial)
11.	«45 min» - 45 – это время работы котла, цифру 45 нужно поставить свою, в зависимости от того, какое время работы вы хотите установить, далее пробел и min. 

Ниже  - процесс удаления номеров пользователей из памяти устройства (это возможно только с номера #1)
12.	«ResetNumbers» - после отправки данной команды номера стираются из памяти.

После отправки команды «Webasto-ON» приходит оповещение, что команда принята, а через 6 мин приходит отчет – удачно ли произошел старт котла. 
После отправки команды «Engine-ON» приходит оповещение, что команда принята, а через 50 сек приходит отчет – удачно ли произошел старт двигателя. 
Если система Старлайн на охране и включилась тревога (сирена кричит) – приходит соответствующее СМС на оба номера.
Номера телефонов, время работы котла и протокол запуска котла хранятся в энергонезависомой памяти устройства и сохраняются после перевключения питания. 
Для удобства управления устройством при помощи СМС команд (чтобы каждый раз не вводить команды) необходимо скачать с PlayMarket приложение «GSM Trinket». Скачиваем файл настроек брелка, идущий в комплекте с устройством, на телефон. Открываем приложение – настройки – настройки брелков – справа вверху кнопка восстановление настроек брелка – выбираем скаченный файл настроек брелка. Выходим в общий вид программы. Листая вправо-влево, выбираем созданный только что брелок. Заходим в настройки, убираем галочку «Отчет о доставке», заходим в настройки брелков, выбираем наш брелок – «правка» - входящие сообщения- убираем галочку (если установлена) «Перехватывать входящие сообщения». Программа готова к работе. 
Подключение датчиков температуры DS18B20 производить параллельно. Необходимо заранее узнать адрес каждого вашего датчика из примера библиотеки работы с датчиками даллас, используя  сериал монитор, вписать в соответствующее место в скетче устройства (ДВС, улица, выхлоп котла или салон), также необходимо естественно пометить датчик куда он будет установлен  - ДВС, улица, выхлоп котла или салон. 

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

MaksVV пишет:

Внимательно читаем эту фразу. У сигнализации старлайн есть провод-вход событий. Оранжево-синий. Его можно запрограммировать, чтобы если подается импульс GND на этот провод, сигнализация запускает ДВС, если ещё раз подать импульс - заглушит ДВС

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

MaksVV
Offline
Зарегистрирован: 06.08.2015

Penni пишет:
Спасибо за пояснения. Не на всех даже старлайнах есть такой вход событий, не говоря уже и о других фирмах.

да не на всех, вроде начиная с А94 должен быть этот вход 

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

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

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Пойти поменять свою А91 на 94 чтоли :) Давно хотел GSM запуск, да жаба душила за решение от старлайна, а тут наткнулся на Вашу тему.

MaksVV
Offline
Зарегистрирован: 06.08.2015

лучше А63 с последним брелком (новый экран). Она дешевле. отличается от сиги с заупском только релейным блоком и датчиком тепературы. Которые можно дешевле самим сделать, а если авто с кнопки запускается, то релейный блок и вовсе не нужен. Кстати эта сига сама умеет Webasto по цифре запускать и имеет индикацию на дисплее брелка. Только не сочтите за рекламу. никак не навязываю. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

эмм, щас посмотрел схему А93 / 63 нет там входа событий похоже, не получится ДВС запускать. А94 сняли с производства если что. Т.е. мое устройство с точки зрения запуска ДВС актуально для A94/B94/E90/E91 вроде как. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

 "Пандоры" тоже можно запускать импульсом, и тем более все оставльное реализовать, там гибкие настройки

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Когда хотел такую штуку делать, единственный более менее адекватный вариант для работы с любой сигнашкой был такой: под панель запихать еще один брелок к нему подключить такое устройство как Ваше и чтобы оно имулировало нажатие 1+3 на брелке для запуска двигателя ) Но как-то время кончилось, энтузиазм иссяк :)

MaksVV
Offline
Зарегистрирован: 06.08.2015

а чё, решение имеет право на жизнь, если спрятать хорошо конечно. Использовать нужно запасной брелок, подавать питание сначала 3,3 В (а то родная батарейка на морозе сядет нафиг), потом нажиамать на кнопки. Опять же проблема в современных старлайнах, где нет входа событий, нельзя сделать запуск с запасного брелка, а с дисплеем брелок прятать дорого, он  стоит 3 тыщи, проще ихний GSM модуль взять тогда уж.  

defed
Offline
Зарегистрирован: 27.10.2015

У меня 3 мА примерно потребляет.. Да и принцип работы у меня без обр.связи смс настройка времени работы. А звонок с определенного номера включение, и еще один звонок если обратный отсчет еще идет вырубает. Ну и запуск движки с определенного номера с определенной командой.

MaksVV
Offline
Зарегистрирован: 06.08.2015

defed пишет:
У меня 3 мА примерно потребляет.. Да и принцип работы у меня без обр.связи смс настройка времени работы. А звонок с определенного номера включение, и еще один звонок если обратный отсчет еще идет вырубает. Ну и запуск движки с определенного номера с определенной командой.

логично было бы с этим постом и код выложить. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

забыл добавить в функционал вкл/выкл котла тактовой кнопкой и индикацию вкл/выкл светодиодом, это актуально при использовании режимов W-BUS и Potenzial. Т.к. таймера от котла на панели при этом не будет, а знать нужно  - работает или нет котёл, к тому же быстро включить/выключить  с кнопки тоже нужно. В следующем варианте платы и скетча постараюсь добавить. 

n.suspitsin
Offline
Зарегистрирован: 01.11.2017

Добрый день!

Очень интересен ваш проект. Но очень хотелось бы увидеть список всех электронных элементов, которые расположены на вашей плате. Т.е. какие мне нужно купить радиодетали, чтобы собрать вашу схему.

Заранее спасибо.

MaksVV
Offline
Зарегистрирован: 06.08.2015

на плате же всё нарисовано, там деталей всего ничего. Вот для ленивых

Резисторы SMD типо-размер вроде 1206:
360R -1 шт. 
10К – 1шт. 
2К – 1шт. 
Резисторы обычные 0,125 Вт:
10К – 5шт.
2К – 2шт. 
1К – 2шт. 
1,2К – 1шт.
100К – 1шт. 
3.9К – 2шт. 
Конденсаторы электролиты: 
22uF (емкость можно больше ) 16В – 2шт.
220 uF (емкость можно больше ) 10В – 1шт
Неполярные керамика:
Любой От 0,1 uF  до  2,0 uF    до 50В – 3шт. 
Стабилизатор питания на 5В: 
78L05 – 1шт. 
Оптроны:   PC817 – 3шт. 
Микросхема для организации K-line (W-BUS) – LM393N в DIP корпусе  1шт. 
GSM модуль    SIM800L  -1 шт. 
Плата МК:   ардуино NANO – 1шт. 
Преобразователь питания DC12V to DC4V - 1шт. 
Защитный диод TVS (супрессор):   1N5908 или 1N1673G или ICTE5-E3/54 (я не нашел такой в радиомагазинах) пришлось SMD ставить (например SD05.TCT ), а он громоздкий, Да его можно и не ставить, делитель напряжения должен нормально делать свое дело. 


 

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

MaksVV
Offline
Зарегистрирован: 06.08.2015

Схема подключения https://yadi.sk/i/ttr_Fbkt3PMgas

 

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

MaksVV пишет:

на плате же всё нарисовано, там деталей всего ничего. Вот для ленивых

нет, то схема ленивого... и можете не спорить.

научитесь нормально схемы оформлять для начала, там схемы по факту нету, это  ж надо так 393 вывернуть на изнанку, хрен че понятно..

MaksVV
Offline
Зарегистрирован: 06.08.2015

Short Circuit пишет:
нет, то схема ленивого... и можете не спорить.

научитесь нормально схемы оформлять для начала, там схемы по факту нету, это  ж надо так 393 вывернуть на изнанку, хрен че понятно..

А кто говорил что там принципиальная схема? Там плата вообще-то и схема подключения. Схемы я умею оформлять. Ноги 393 подписаны, что не понятного? Зачем вам схема? Я делал это устройство без схемы, сразу рисовал плату. На плате нарисовано что и куда запаивать. Там схема простейшая. Проследите по дорожкам если уж очень надо. 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

обычно схемы которые предлагают  просто к повторению - в корне с ошибками и т.д.

К тому же так ПП не разводят. даже питание на сим800 это ужас.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Если вы такой умный, предложите что-нибудь получше. Слово ужас здесь никак не подходит, т.к. одно такое устройство уже 1.5 года у человека пока работает. Если бы был ужас, то явно бы уже сломалось. Вместо того чтобы умничать, лучше бы сказали в чем есть косяки, если не мне, то хотя бы остальным, кто решит собрать модуль.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

 я написал за косяки: питание, разводка и т.д...  У вас даже перезагрузки нету, рессет  сим800 свободный?

ну-ну.. в одном авто может и работает, а поставить в другое где напряжение менее стабильно и есть помехи - будет глючить мама не горюй.. а так да - 1,5 года и ВСЕ ТАКОЕ....

Ximul
Offline
Зарегистрирован: 06.11.2017

MaksVV пишет:

3. Запуск котла потенциалом 12В. Т.е. пока есть напряжение 12В - котел включен, иначе - выключен. (данный вариант применим для запуска аналоговых котлов Webasto Termo Top C , E)

Скажите, откуда такая информация ?

Сейчас на авто имеем  Webasto Termo Top C в качестве догревателя (2008 год), ни каких пультов в авто нет, т.е. работает только при заведеном двигателе.

Давно курю эту тему, везде пишут что управляется сигналом W-Bus на 1 пин. Даже уже проводок в салон протянул, висит в воздухе, и сразу появилась ошибка - "управляющий провод не подключён", но при этом все работает. 

Скажите это точно известно, что управляется +12в,  и на какой пин ?  Тоже хочу организовать запуск с ардуино. Но пробовать наугад, что-то не сильно хочется.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Моя информация это касаемо универсальных котлов, предназначенных для доп.установки. а у вас штатный котел, установленный производителем авто. Такие котлы могут и по кан шине запускаться и по w-bus. В любом случае даже по w-bus управление может отличаться от универсальных котлов

MaksVV
Offline
Зарегистрирован: 06.08.2015

Short Circuit пишет:

 я написал за косяки: питание, разводка и т.д... 


Блин, нельзя ли поподробнее. Что не так в питании и разводке? И что не так в т.д.? Про ресет , согласен, его необходимо добавить.

aln118
Offline
Зарегистрирован: 08.11.2017

я так понял что на Б9 можно реализовать штатный gsm протокол?

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

blades
Offline
Зарегистрирован: 21.11.2017

MaksVV пишет:

Осталось две фичи реализовать  - энергосбережение и контроль зависания и перезагрузки GSM. 

Добрый день! Не удалось ли реализовать контоль зависания GSM?

MaksVV
Offline
Зарегистрирован: 06.08.2015

blades пишет:

MaksVV пишет:

Осталось две фичи реализовать  - энергосбережение и контроль зависания и перезагрузки GSM. 

Добрый день! Не удалось ли реализовать контоль зависания GSM?

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

uu5jhu
Offline
Зарегистрирован: 21.11.2017

Ув MaksVV!

Доброго времени суток Вам. Спасибо за проделанную работу - есть пару вопросов. Собрал схему (пока что только Sim800 + Nano) Sim и нано проверял - работают.

Залил версию 2.1 - отправляю смс - в ответ - ПУСТО.

Что подскажите?

Спасибо.

MaksVV
Offline
Зарегистрирован: 06.08.2015

СМС с каким текстом отправляете? Это выполнено? 

Управление устройством осуществляется при помощи СМС и возможно только с номеров телефонов, сохранённых в памяти. Изначально в памяти устройства не записаны номера телефонов пользователей. Устройство при этом отвечает только на три СМС команды (писать без кавычек и соблюдать заглавные буквы):
1. «ZAPROS» - проверка работоспособности устройства.
2. «ZAPROSTEL» - запрос номеров телефонов, записанных в память устройства.
Если в ответной СМС на этот запрос номера телефонов будут вида «000000000000» или «яяяяяяяяяяяя», то номера телефонов не записаны в память устройства.
3. «WriteNumber1» - после посылки СМС с таким текстом на устройство, происходит запись номера телефона (с которого это СМС отправлено) в память как номер #1.
После записи номера #1 в память, на этот телефон приходит подтверждающее СМС.
Как только произведена запись номера #1 в память, становится возможным управление устройством в полном функционале.

GSM находит сеть? (редкое  мигание светодиода)

На балансе есть деньги?

uu5jhu
Offline
Зарегистрирован: 21.11.2017

Спасибо за быстрый ответ.

Плата собрал пока что на макетке (Нано+СИМ800+Dc-DC) соединил естественно только Rx TX GND

Счёт на карте 100р

Сеть есть - мигает раз в секунду (пробовал заливать другой скетч с просторов тырнета (правда он был для M590E - но я использовал СИМ) - зажигание светодиода по вх звонку на несколько секунд - работает.

Отправлять пробовал все СМС - в ответ тишина (звонки идут - трубку никто =) не берёт)

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

к каким пинам Tx и Rx на ардуине подключили?

uu5jhu
Offline
Зарегистрирован: 21.11.2017

Всё согласно Вашей ПП - Sim800 Rx -- A1 Tx--A0

MaksVV
Offline
Зарегистрирован: 06.08.2015

домой приеду, отвечу

uu5jhu
Offline
Зарегистрирован: 21.11.2017

Понял. Жду. Делитель напряжения на RX поставил - на TX не ставил резистор - на прямую.

Хотел прикрепить фото но не разобрался как........

uu5jhu
Offline
Зарегистрирован: 21.11.2017

Залил прошивку V2.0 (заливается в НАНО удачно но в конце предупреждает о нехватке памяти)

Сейчас попробовал снова позвонить на Sim800L - отвечает что абонент занят....

SMS типа:

1. WriteNumber1 - отправляю.....и тишина в ответ.

ZAPROS и ZAPROSTEL - тоже самое.