GSM устройство управления котлами Webasto и не только
- Войдите на сайт для отправки комментариев
Я вникал в ардуино как раз с этой темы. 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 мА. Многовато, если учесть ещё потребление сигнализации старлайн.
Если кто будет собирать, спрашивайте что не понятно.
АКТУАЛЬНАЯ ИНФОРМАЦИЯ ПО ПРОЕКТУ В СООБЩЕНИИ #5 !!!
НИЖЕ ПОСТ , КОНЕЧНО, МОЖНО ПОЧИТАТЬ, ТАК ДЛЯ ИСТОРИИ
Также осуществляется мониторинг 4 -х температур : ДВС, Салон, улица, выхлоп вебасто и напряжения АКБ
Фото изготовления и плата v3
перед заливкой основного скетча чистим еепром этим скетчем и (заливаем и ждём пока LED13 загорится)!!!!!
Во время сборки устройства, до установки GSM модуля нужно не забыть настроить правильное напряжение на DС-DC преобразователе, Я выставил 4.1В под нагрузкой может немного просесть до 4.0 - это не страшно. Потом лучше залить эпоксидкой или ещё чем подстроечник. или вообще запаять постоянный резистор вместо него.
Следующий абзац выполняем до запайки деталей LM393 и её обвязки. Для корректной работы контроля бортового напряжения, необходимо подстроить в основном скетче значение сопротивлений плеч делителя напряжения (строка 198 скетча v2.1), контролируя реальное напряжение более менее точным вольтметром и сравнивая с измеряемым. Для удобства пользуемся этим скетчем.
далее собираем остальное и заливаем прошивку V2.1 (если LM393 уже запаяна, скетч грузится только после вытаскивания ардуино из посадочного места платы):
Скетч v2.1.
Инструкция пользователя
Для удобства отправки СМС команд рекомендую использовать приложение для Андройид GSM Trinket. (качается в playMarket). Файл настроек брелка для программы GSM Trinket. Подробности читаем в инструкции к моему устройству.
Список радиодеталей
Принципиальная схема варианта с реле и тактовой кнопкой
Схема подключения тынц
В таблице программирования 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
Пол дня просидел, чтобы сделать запись номеров пользователей не через скетч, а при помощи отправки СМС. Но оно того стоило. Самое главное, не пришлось на корню менять конструкцию парсинга данных с GSM модуля. Доволен как слон. Номера хранятся в еепром. Если номера не запрограммированы, модуль принимает только две команды "ZAPROS" и "ZAPROSTEL" . И сообщает в ответной смс какую смс (команда "WriteNumber1") отправить для сохранения номера #1. Если мы отправили такую команду номер сохраняется, приходит соответствующее подтверждение о записи номера #1. Теперь можно управлять модулем. Запись номера #2 возможна только в случае записанного номера #1 и только с номера #1.
Есть также команда для удаления обоих номеров из еепром и памяти ("NumbersReset"). После чего модуль опять начинает реагировать только на две команды. "ZAPROS" и "ZAPROSTEL"
скетч v.2.0
Осталось две фичи реализовать - энергосбережение и контроль зависания и перезагрузки GSM. Всем спасибо, так активно помогаете.
Режим выбирается посредством посылкой SMS с соответствующей командой и хранится в еепром. Имеется обратная связь по успешности запуска котла даже для аналоговых webasto. Имеется выбор времени работы котла (также хранится в еепром).
а нельзя ли схемму глянуть а то элементов много а схеммы нет хочу себе собрать
- Актуальная версия платы
- Актуальный скетч подготовки еепром и основной скетч - смотрим в этой папке последнюю версию. В скетче еепром делаем предварительные настройки (в комментах всё подробно там). Сначала заливаем скетч еепром, дожидаемся пока загорится встроенный светодиод LED 13. Потом заливаем основной скетч. Там же в папке актуальная инструкция пользователя.
- список деталей и рассыпухи для заказа
- корпус девайса на 3д принтере
- Для удобства отправки СМС команд рекомендую использовать приложение для Андройид GSM Trinket. (качается в playMarket). Файл настроек брелка для программы GSM Trinket. Подробности читаем в инструкции к моему устройству. Но когда появился MQTT это уже лишнее, хотя как резервный вариант всетаки лучше иметь, чтобы не вспоминать команды управления, в случае отказа облачного сервиса MQTT.
- Настройка MQTT на смартфоне тут. MQTT для тех кто не знает - это текстовый протокол взаимодействия, в нашем случае управление по интернет соединению, т.к. через облачный сервер. Работает почти в реальном времени, т.е. мгновенный отклик и дешевле СМС. В месяц трафик не более 10 Мб.
- Для тех кто будет подключать сигнализацию старлайн:
В таблице программирования AF сигнализации Starline необходимо запрограммировать следующие функции (помечены красными галочками): Это всё справедливо для сигнализаций B94, D94, E90, E91. Для A94 будет немного отличаться, надо корректировать номера доп.каналов.
Далее на доп.каналы настраиваем следующие события включения и задержки:
Для старлайн А94. Вкл. котёл - "1" допканал, выкл. котёл - "4" допканал
Для старлайн A93, B94, E90, E91 Вкл. котёл - "2" допканал, выкл. котёл - "5" допканал
чуть оптимизировал скетч. Для установки время работы webasto. Отправить смс с текстом "45 min". Где 45 соответственно время работы.
v2.1.
Всем привет. У кого данное устройство на Sim 800 отработали зиму? Как ведет себя в мороз? У самого стоит подобное работает два месяца, пока без нареканий.
Я один не понял как заодится двигатель? В обход сигнашки? Т.е. врезаетесь после сигнашки на замок зажигания по сути? Сначала думал что реализовали протокол штатного GSM модуля, но потом вспомнил что такая халява кончилась со времен старлайна Б9.
Если завести в обход сигнашки, то она и сработает. Даже если на штатный иммобилайзер закрыть и завести со старлайна то сработает штатный иммобилайзер. Хотя может для тазиков и нормально.
Внимательно читаем эту фразу. У сигнализации старлайн есть провод-вход событий. Оранжево-синий. Его можно запрограммировать, чтобы если подается импульс GND на этот провод, сигнализация запускает ДВС, если ещё раз подать импульс - заглушит ДВС
поставил двум человекам, связь поддерживаю с одним из них, у которого год работает почти норм. Иногда виснет GSM решается первключением питания, руки не доходят допилить скетч с проверкой связи с SIM800L и при необходимости выполнением перезагрузки.
ПС. потребление тока около 35мА, многовато конечно, учитывая, что сигналка ещё также где-то ест, в итоге получаем около 70мА. Но хороший АКБ решает. Режимы засыпания трудно сделать с моим уровнем программирования и нехваткой времени.
70 ма- привет аккумулятору зимой дней через 10. Надо как-то уменьшать. Схемку соединений бы - не всё понятно по скетчу и фото. Набралось несколько желаюших повторить и потестировать- зима на носу..
схему попробую нарисовать
конкретнее
инструкция пользователя
Внимательно читаем эту фразу. У сигнализации старлайн есть провод-вход событий. Оранжево-синий. Его можно запрограммировать, чтобы если подается импульс GND на этот провод, сигнализация запускает ДВС, если ещё раз подать импульс - заглушит ДВС
Спасибо за пояснения. Не на всех даже старлайнах есть такой вход событий, не говоря уже и о других фирмах. Вообще странно конечно, т.е. старлайн мне предоставил возможность залезть в ваше авто и замыканием контакта на землю завести ваше авто ) Забавно. Вот почему угонов становится больше.
да не на всех, вроде начиная с А94 должен быть этот вход
по умолчанию данный вход событий запрограммирован на другую функцию. А значит в массовом варианте (редко кто использует данный вход), у вас так не получится запустить ДВС.
Пойти поменять свою А91 на 94 чтоли :) Давно хотел GSM запуск, да жаба душила за решение от старлайна, а тут наткнулся на Вашу тему.
лучше А63 с последним брелком (новый экран). Она дешевле. отличается от сиги с заупском только релейным блоком и датчиком тепературы. Которые можно дешевле самим сделать, а если авто с кнопки запускается, то релейный блок и вовсе не нужен. Кстати эта сига сама умеет Webasto по цифре запускать и имеет индикацию на дисплее брелка. Только не сочтите за рекламу. никак не навязываю.
эмм, щас посмотрел схему А93 / 63 нет там входа событий похоже, не получится ДВС запускать. А94 сняли с производства если что. Т.е. мое устройство с точки зрения запуска ДВС актуально для A94/B94/E90/E91 вроде как.
"Пандоры" тоже можно запускать импульсом, и тем более все оставльное реализовать, там гибкие настройки
Когда хотел такую штуку делать, единственный более менее адекватный вариант для работы с любой сигнашкой был такой: под панель запихать еще один брелок к нему подключить такое устройство как Ваше и чтобы оно имулировало нажатие 1+3 на брелке для запуска двигателя ) Но как-то время кончилось, энтузиазм иссяк :)
а чё, решение имеет право на жизнь, если спрятать хорошо конечно. Использовать нужно запасной брелок, подавать питание сначала 3,3 В (а то родная батарейка на морозе сядет нафиг), потом нажиамать на кнопки. Опять же проблема в современных старлайнах, где нет входа событий, нельзя сделать запуск с запасного брелка, а с дисплеем брелок прятать дорого, он стоит 3 тыщи, проще ихний GSM модуль взять тогда уж.
У меня 3 мА примерно потребляет.. Да и принцип работы у меня без обр.связи смс настройка времени работы. А звонок с определенного номера включение, и еще один звонок если обратный отсчет еще идет вырубает. Ну и запуск движки с определенного номера с определенной командой.
логично было бы с этим постом и код выложить.
забыл добавить в функционал вкл/выкл котла тактовой кнопкой и индикацию вкл/выкл светодиодом, это актуально при использовании режимов W-BUS и Potenzial. Т.к. таймера от котла на панели при этом не будет, а знать нужно - работает или нет котёл, к тому же быстро включить/выключить с кнопки тоже нужно. В следующем варианте платы и скетча постараюсь добавить.
Добрый день!
Очень интересен ваш проект. Но очень хотелось бы увидеть список всех электронных элементов, которые расположены на вашей плате. Т.е. какие мне нужно купить радиодетали, чтобы собрать вашу схему.
Заранее спасибо.
на плате же всё нарисовано, там деталей всего ничего. Вот для ленивых
модуль GSM и нану естественно вставляем в постельки, а не припаеваем на плату. GSM нужно вынимать для установки сим карты, а ардуину, чтоб прошить, тоже нужно вытаскивать.
Схема подключения https://yadi.sk/i/ttr_Fbkt3PMgas
на плате же всё нарисовано, там деталей всего ничего. Вот для ленивых
нет, то схема ленивого... и можете не спорить.
научитесь нормально схемы оформлять для начала, там схемы по факту нету, это ж надо так 393 вывернуть на изнанку, хрен че понятно..
научитесь нормально схемы оформлять для начала, там схемы по факту нету, это ж надо так 393 вывернуть на изнанку, хрен че понятно..
А кто говорил что там принципиальная схема? Там плата вообще-то и схема подключения. Схемы я умею оформлять. Ноги 393 подписаны, что не понятного? Зачем вам схема? Я делал это устройство без схемы, сразу рисовал плату. На плате нарисовано что и куда запаивать. Там схема простейшая. Проследите по дорожкам если уж очень надо.
обычно схемы которые предлагают просто к повторению - в корне с ошибками и т.д.
К тому же так ПП не разводят. даже питание на сим800 это ужас.
Если вы такой умный, предложите что-нибудь получше. Слово ужас здесь никак не подходит, т.к. одно такое устройство уже 1.5 года у человека пока работает. Если бы был ужас, то явно бы уже сломалось. Вместо того чтобы умничать, лучше бы сказали в чем есть косяки, если не мне, то хотя бы остальным, кто решит собрать модуль.
я написал за косяки: питание, разводка и т.д... У вас даже перезагрузки нету, рессет сим800 свободный?
ну-ну.. в одном авто может и работает, а поставить в другое где напряжение менее стабильно и есть помехи - будет глючить мама не горюй.. а так да - 1,5 года и ВСЕ ТАКОЕ....
3. Запуск котла потенциалом 12В. Т.е. пока есть напряжение 12В - котел включен, иначе - выключен. (данный вариант применим для запуска аналоговых котлов Webasto Termo Top C , E)
Скажите, откуда такая информация ?
Сейчас на авто имеем Webasto Termo Top C в качестве догревателя (2008 год), ни каких пультов в авто нет, т.е. работает только при заведеном двигателе.
Давно курю эту тему, везде пишут что управляется сигналом W-Bus на 1 пин. Даже уже проводок в салон протянул, висит в воздухе, и сразу появилась ошибка - "управляющий провод не подключён", но при этом все работает.
Скажите это точно известно, что управляется +12в, и на какой пин ? Тоже хочу организовать запуск с ардуино. Но пробовать наугад, что-то не сильно хочется.
Моя информация это касаемо универсальных котлов, предназначенных для доп.установки. а у вас штатный котел, установленный производителем авто. Такие котлы могут и по кан шине запускаться и по w-bus. В любом случае даже по w-bus управление может отличаться от универсальных котлов
я написал за косяки: питание, разводка и т.д...
Блин, нельзя ли поподробнее. Что не так в питании и разводке? И что не так в т.д.? Про ресет , согласен, его необходимо добавить.
я так понял что на Б9 можно реализовать штатный gsm протокол?
По идее можно даже в космос полететь, если захотеть. Не знаю с чего вы это поняли, но если у вас получиться хакнуть и выложить сюда протокол обмена, все будут благодарны.
Осталось две фичи реализовать - энергосбережение и контроль зависания и перезагрузки GSM.
Добрый день! Не удалось ли реализовать контоль зависания GSM?
Осталось две фичи реализовать - энергосбережение и контроль зависания и перезагрузки GSM.
Добрый день! Не удалось ли реализовать контоль зависания GSM?
пока не занимался, нужно на плату реле добавлять для разрыва пиания GSM при зависании.
Ув MaksVV!
Доброго времени суток Вам. Спасибо за проделанную работу - есть пару вопросов. Собрал схему (пока что только Sim800 + Nano) Sim и нано проверял - работают.
Залил версию 2.1 - отправляю смс - в ответ - ПУСТО.
Что подскажите?
Спасибо.
СМС с каким текстом отправляете? Это выполнено?
GSM находит сеть? (редкое мигание светодиода)
На балансе есть деньги?
Спасибо за быстрый ответ.
Плата собрал пока что на макетке (Нано+СИМ800+Dc-DC) соединил естественно только Rx TX GND
Счёт на карте 100р
Сеть есть - мигает раз в секунду (пробовал заливать другой скетч с просторов тырнета (правда он был для M590E - но я использовал СИМ) - зажигание светодиода по вх звонку на несколько секунд - работает.
Отправлять пробовал все СМС - в ответ тишина (звонки идут - трубку никто =) не берёт)
к каким пинам Tx и Rx на ардуине подключили?
Всё согласно Вашей ПП - Sim800 Rx -- A1 Tx--A0
домой приеду, отвечу
Понял. Жду. Делитель напряжения на RX поставил - на TX не ставил резистор - на прямую.
Хотел прикрепить фото но не разобрался как........
Залил прошивку V2.0 (заливается в НАНО удачно но в конце предупреждает о нехватке памяти)
Сейчас попробовал снова позвонить на Sim800L - отвечает что абонент занят....
SMS типа:
1. WriteNumber1 - отправляю.....и тишина в ответ.
ZAPROS и ZAPROSTEL - тоже самое.