Как сделать аирдроп в unturned в одиночке

Как сделать аирдроп в unturned в одиночке

Я вникал в ардуино как раз с этой темы. 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); // команда на замену на транслит 11162# //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 мА. Многовато, если учесть ещё потребление сигнализации старлайн.  

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