а можно както дополнить скетч #531 чтобы так и остался пин импульно на массу вк\вкл , индикатор о вкл котла , и пин на включение помпы с таймером отключение помпы ?
К примеру по импульсу вкл вкл можно подключить к сигналке канала 3 , так как есть котлы без одключение помпы и нужно чтобы после вкл котла помпа еще поработала для остывание пламени .
проще другой скетч переделать, в котором все твои хотелки уже есть. надеюсь я найду время и доделаю его. А у тебя разве работает индикация пламени? у тебя ж другая версия протокола w-bus - 3.1 помнится. Там должно по другому пламя определяться
Do you have complete list of 98xx/xx series fault codes . I tried to google but couldn't get much info about these codes . There is lack of info about these codes on our country websites but i saw lots of info in your language . I tried to translate those websites to english and found some code . If you have complete list of codes and can list it here will really appriciate .
when i send 81 51 F1 A1 64 error request command , boiler reply back with fault codes command where index 4 gives 98 and index 5 gives rest of code(00,01,02 etc) . Index 7 gives value after /xx . Following are few codes i found .
Какой скетч самый послдений рабочий , полнофунциональный , или такого еще нет? Пришли заказанные детальки , сегодня вытравил плату , которую любезно выложил MaksVV, только обкосячился забыл галку отзеркалить поставить, теперь придется извращаться , с припайкой модулей наоборот. Делаю для себя в одном экземпляре, так что сойдет и так , текстолита жалко , да и время тоже.
Какой скетч самый послдений рабочий , полнофунциональный , или такого еще нет? Пришли заказанные детальки , сегодня вытравил плату , которую любезно выложил MaksVV, только обкосячился забыл галку отзеркалить поставить, теперь придется извращаться , с припайкой модулей наоборот. Делаю для себя в одном экземпляре, так что сойдет и так , текстолита жалко , да и время тоже.
Какой скетч самый послдений рабочий , полнофунциональный , или такого еще нет?
ещё толком нет. Вот что есть на данный момент. для платы 8.5 - 8.6.
перед заливкой основного скетча заливаем этот для подготовки еепром (смотрим коменты и там же выполняем какие настройки будут по умолчанию, чтобы потом это смс_ками не настраивать) . Ждём когда встроенный LED загорится, далее можно заливать основной скетч.
//#define debugW_bus // раскоментировать эту строку для отладки, при этом нужно вынуть SIM800 и подключить юсб<->уарт, т.к. отладка идёт в УАРТ, предназначенный для GSM
0002
//#define debugSIM800
0003
0004
#include <EEPROM.h>
0005
enumCells {
0006
ResetNumber_cell, //0
0007
TimeWebasto_cell, //1
0008
ProtocolSTART_cell, //2
0009
Zapusk_cell, //3
0010
ProtocolSTATUS_cell, //4
0011
Heater_cell, //5
0012
delta_cell, //6
0013
TelNumber1_cell =20, //20
0014
TelNumber2_cell =40 //40
0015
};
0016
0017
#include <Button.h>
0018
0019
Button test;
0020
0021
// для GSM модуля *********************
0022
#include <SoftwareSerial.h>
0023
0024
#ifndef debugW_bus
0025
SoftwareSerial SIM800 (10, 11);//Rx, Tx //UART для соединения с GSM модулем
0026
#else
0027
SoftwareSerial DEBUG (10, 11); //Rx, Tx //UART для соединения с отладкой (используется юсб<->УАРТ вместо SIM800)
0028
#endif
0029
0030
#define K_LINE Serial //UART для соединения с шиной котла
0031
#define TX 1
0032
0033
String currStr = "";
0034
String TelNumber1 = "000000000000";
0035
String TelNumber2 = "000000000000";
0036
String BufferNumber = "000000000000";
0037
boolSaveNumber2 = 0; // флаг когда необходима запись номера#2, он true
0038
byteisStringMessage = 0;
0039
byteKTOzapros = 0;
0040
byteKTOreport = 1;
0041
0042
//************************
0043
0044
0045
0046
//_______Все для цикла void voltmetr()*************
0047
floatvout = 0.0; // Напряжение на входе аналового входа
0048
floatVpit = 0.0; // Измеряемое напряжение на выходе ИБП
0049
intvolt = 0; // Напряжение на входе АЦП
0050
0051
0052
0053
// дефайны входов выходов на соостветствующие пины ************** (плата 8.5 с разъемом)
0054
0055
#define OutWebasto_12V 2 // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера).
0056
#define Dallas_pin 3 // пин шины OneWire для датчиков даллас
0057
#define DopOn 4 // сюда доп канал от сигналки на включение вебасто
0058
#define DopOff 5 // сюда доп канал от сигналки на выключение вебасто
0059
#define Ohrana 6 // Сюда состояние охраны сигналки
0060
#define Trevoga 7 // Сюда состояние тревоги
0061
#define IGN 8 // Сюда состояние зажигания
0062
#define Sost 9 // Сюда состояние вебасто (+12В когда работает)
0063
#define ResetGSM 12 // пин ресета GSM подключен к реле, разрывающее питание модуля.
0064
#define Eng 14 // (А0) Сюда состояние работы ДВС
0065
#define StatusWebastoLED 15 // (А1) пин LED индикация включенности котла
0066
#define StartButtonpin 16 // (А2) пин тактовой кнопки вкл/выкл котла
elseif(!currStr.compareTo("Webasto-ON")) { if(!webasto) {StartWebasto (); // если получили команду на включение и вебаста в настоящий момент выключена - включаем
elseif(!currStr.compareTo("Webasto-OFF")) {if(webasto){StopWebasto (); // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
elseif(!currStr.compareTo("Engine-ON")) {if(!engine) { digitalWrite (StartEng, HIGH); timerStartEng=millis(); timerenabledStartEng=true; reportEngine = true; EndReportEngine = timerStartEng; // если получили команду на включение ДВС и он в настоящий момент выключен - включаем
elseif(!currStr.compareTo("Engine-OFF")) {if(engine){ digitalWrite (StartEng, HIGH); timerStartEng=millis(); timerenabledStartEng=true; reportEngine = false; // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
elseif(currStr.endsWith("min")) {if(!webasto) {TimeWebasto = currStr.toInt(); // для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
и пин на включение помпы с таймером отключение помпы ?
добавил транзистор управления помпой с пина 13. Управляет минусом помпы. Как раз в разъеме один пин был неиспользуемый. Но такая плата теперь уже получается двусторонняя (до этого по сути на второй стороне только перемычки были, а сейчас дорожка одна появилась), поэтому вручную тяжело сделать.
и пин на включение помпы с таймером отключение помпы ?
добавил транзистор управления помпой с пина 13. Управляет минусом помпы. Как раз в разъеме один пин был неиспользуемый. Но такая плата теперь уже получается двусторонняя (до этого по сути на второй стороне только перемычки были, а сейчас дорожка одна появилась), поэтому вручную тяжело сделать.
Мерил от БП 7В. на 12В может ещё меньше потребление будет)
ардуино в стоке 12,2 мА
с отпаянным LED питания 10,9 мА
с отпаянным LED и стабом (диодом) 9,4мА
Вот замерил как положено от 12В. Считаю этот вопрос закрыт. 8,5 мА. Даже с 8 мгц ардуиной заморачиваться не стОит - дефицитная она в таком форм факторе. 8,5 мА - отличный показатель.
//#define debugW_bus // раскоментировать эту строку для отладки w-bus, при этом нужно вынуть SIM800 и подключить юсб<->уарт, т.к. отладка идёт в УАРТ, предназначенный для GSM
if(engine){ digitalWrite (StartEng, HIGH); timerStartEng=millis(); timerenabledStartEng=true; reportEngine = false;} // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
elseif(currStr.endsWith("min")) {if(!webasto) {TimeWebasto = currStr.toInt(); // для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
Мерил от БП 7В. на 12В может ещё меньше потребление будет)
ардуино в стоке 12,2 мА
с отпаянным LED питания 10,9 мА
с отпаянным LED и стабом (диодом) 9,4мА
Вот замерил как положено от 12В. Считаю этот вопрос закрыт. 8,5 мА. Даже с 8 мгц ардуиной заморачиваться не стОит - дефицитная она в таком форм факторе. 8,5 мА - отличный показатель.
Потребление даже не очем . Если в машине оборудование тяниться до 250мА смотря еще как магнитола подключена и доп .
Печатку переделал , собираю на плату , выяснилось что нет у меня лм393 в дип корпусе и реле такого нет , надо покупать, в моем городе нет торгашей радиодеталями , вернее есть небольшие лавки , где всякой хренью торгуют . типо разъемов и пультов, а серьезные с выбором микросхем и транзисторов всяких только в Иркутске , а у нас сейчас морозы под 45 градусов , ехать туда только за одной микросхемой и реле обламываюсь 90 км до Иркутска. Может кто поедет на днях , закажу им. Еще вопрос , ардуину лучше впаять на плату или на разъемах делать, и если в скетче выствить получать данные от вебасто по W-Bus . то нужно ли городить датчик температуры на выхлоп? И нужно ли в скетче впсывать калибровку на измерение напряжения в борт сети и если нужно то в какую строку?
Lm393 найдёте легко, а вот такое реле даже в у нас в многочисленных радиомагазинах бывает сложно найти, поэтому не спеша ждал из китая (можно временно пока перемычку вместо реле запаять, ну не будет ресета GSM ничё страшного, это ж перестраховка на случай зависания). Ардуину обязательно на постельки (пинхидеры), иначе не прошьёте когда LM393 будет уже запаяна (кстати её тоже можно на постель). Да и вообще ардуина лучше чтоб вытаскивалась. Датчик на выхлоп можно не городить, но t ДВС лучше вывести. В случае, если не получится данные по w-bus вытянуть, датчик на выхлоп можете позже добавить (все датчики t подключаются паралелльно, поэтому подцепитесь к шине ДВС-ного датчика). Напряжение если вытянуть по в-бус, с калибровкой можно не заморачиваться.
Приехала комне webasto top v . Теперь думаю она лучше чем старенький Тор с ? . Просто неудержался по цене 100 уе за полный комплект . Сейчас к ТТ тесту подключу гляну чё оно там . Сегодня ещё две помпы ремонтировал , додумались пеной всю плату задули . На вид как монтажная пена , только плотная . Идея появилась как вслед раз ее розрушить , кварцевой лампой . Плату сотрудника попросил вытравить. Так как сам не успиваю и.
Получается , если у меня котел TTEvo и я буду подключать по шине W-bus . то я могу кучу деталей не впаивать , те которые нужны для упавлением старыми котлами Е и С , и датчики температуры в салоне и на выхлопе мне не нужны , оставить только температуру двигателя и забортную , и получается можно родной овальный пульт не подключать?
Получается , если у меня котел TTEvo и я буду подключать по шине W-bus . то я могу кучу деталей не впаивать , те которые нужны для упавлением старыми котлами Е и С , и датчики температуры в салоне и на выхлопе мне не нужны , оставить только температуру двигателя и забортную , и получается можно родной овальный пульт не подключать?
У меня сейчас на машине стоит top c , подключен через w-bus и к Ардуино , на ней только микросхема к-лине и 5 в кренка . И идёт один провод в салон на кнопку включает Ардуино и все . Жду пока мне плату вытравят и буду играться с котлом ево , сейчас ремонтируют помпу .
Я так понял что у вас другое управление сейчас стоит . не то которое здесь обсуждаем, и нет родного таймера ? Плату можно за час с утюгом и хлорным железом изготвить, я сам вообщето фоторезист предпочитаю , но для этого девайса за час Лутом плату сварганил, правда потом выяснилось что я ее не отзеркалил, но не сложно переделать. Сейчас занят распайкой деталей на плату , реле такого как нужно не нашел, так взял маленокое реле с автосигнализации старой и на спину его на плату приклеел и проводками подпаял. Тут еще идея возникла , если w-bus шина рабоатет , то как бы сделать что бы еще и ошибки по смс можно было считывать, было бы вообще сдорово , и скидывать их тоже можно , команды же известные , только бы памяти в ардуине хватило бы. Правда из меня прогарммер хреновый , еще чужой исходник смогу разобрать по коментариям. а сам еще не умею прогрммировать даже в ардуино . И еще вопрос по помпе, если вы ее разобрали , что там в нутри, почему она ометром звониться 10 килоом, по ходу там полевик какой стоит , который включает саму помпу , потому что если просто подать на нее 12 вольт .то она тоже работает, я это почему спрашиваю , по тому что оригинальная помпа на вебасто очень не прилично стоит , а аналогичтные подобные помпы , которые просто как элетромотор прозваниваются в несколько раз дешевле , но их вебасто не признает и выдает ошибку , я не думаю что там что то цифровое внутри , думаю что просто полевой транзистор с резистором в затворе, а по резистору вебасто опознает свой чужой.
Получается , если у меня котел TTEvo и я буду подключать по шине W-bus . то я могу кучу деталей не впаивать , те которые нужны для упавлением старыми котлами Е и С , и датчики температуры в салоне и на выхлопе мне не нужны , оставить только температуру двигателя и забортную , и получается можно родной овальный пульт не подключать?
под TTE/C никаких кучи деталей и нету. Так что лишнего не напаяешь)) датчики температуры все параллельно подключаются. Можно не подключать, которые не нужны. Температуру ДВС кстати, по идее , можно приравнять к температуре в котле, а её через в-бус считывать. Так что только забортная нужна.
Паша про TTC/E который у тебя это скорее исключение, чем правило, т.к. TTC у тебя штатный, поэтому имеет шину w-bus. А универсальные запускаются потенциалом плюс 12В и шина у них не W-bus, а просто K-line.
родной овальный пульт можно не подключать, если по шине решишь цепляться. т.к. этот овальный таймер и мой девайс, если одновременно включить, могут конфликтовать.
И еще вопрос по помпе, если вы ее разобрали , что там в нутри, почему она ометром звониться 10 килоом, по ходу там полевик какой стоит , который включает саму помпу , потому что если просто подать на нее 12 вольт .то она тоже работает, я это почему спрашиваю , по тому что оригинальная помпа на вебасто очень не прилично стоит , а аналогичтные подобные помпы , которые просто как элетромотор прозваниваются в несколько раз дешевле , но их вебасто не признает и выдает ошибку , я не думаю что там что то цифровое внутри , думаю что просто полевой транзистор с резистором в затворе, а по резистору вебасто опознает свой чужой.
там стоит целая плата, которая из постоянного тока создает вращающееся магнитное поле. По сути эл. двигатель переменного тока получается (полость антифриза герметична никаких сальников нет, там ротор просто вал с магнитом). Читайте выше по теме. я выкладывал парт номер помпы bosch. Она как раз такая, и стОит не дорого, до 3 тыс. по-моему. Так стартвольт ещё какая то есть, тоже выше читайте.
Понятно про помпу , я ее не разбирал , и у меня она рабочая , это так на всякий случай. У меня на автомобиле стоит еще дополнительная помпа на печку от бош , и она гоняет антифриз когда двигатель работает и после выключения еще немного что бы небыло теплового удара. На крайний случай ее можно задействовать, только я не мерял ее сопротивление. А про лишние детали для моего котла . это я про оптроны , и их обвязку. и сигнализации старлайн у меня нет , есть сталкер 600 тый. А что вы думаете про функцию считывания ошибок , вроде не лишней будет, если не запускается котел И . то можно посмотреть причину , или это слишком сложно реализовать? При подключении к сигнализации еще бы не помешала функция автозаводки двигателя для подзарядки аккумулятора , если напряжение опасно просело , например в процессе прогрева котлом напряжение просело до опасного предела . но двигатель уже успел немного прогреться до приемлемого значения , тогда идет автозапуск двигателя и при включенном котле , с подзарядкой аккума. Но думаю что памяти уже не хватит на это .
Функцию чтения и сброса ошибок добавить можно. Но нужно оттестировать уже имеющийся функционал, а то если он не работает. Какой смысл добавлять что либо еще. И так в скетче уже трудно становится разбираться из за его размера. Подход то дилетантский у меня. Ниразу не программист.
Понятно, я только что допаял плату , собираюсь проверять , в какой строке в скетче прописываются адреса датчиков тепмпературы? и какой стартовый байт у котла TTEvo ? Вообще был хорошо расписать поподробней первоначальную настройку ?
Что то не работает , залил подготовителный скетч , залил основной , подал питание, отпраляю смс ZAPROS приходит уведомление что доставлено , и тишина , пробовал звонить на симку , идут длинные гудки. Светодиод на сим 800 мигает , на адруине горят оба светодиода . Что не так?
Ура заработало, просто сначало криво прошился скетч, эта промини такой плахой человек , кое как его уговарил прошиться :) . Может дело в моём адаптере он у меня на СР2102 , но скетч ни как не хотел заливаться в ардуину , пришлось зажимать рессет на ней а потом включать загрузку в плату , и то с 100500 раза прошло. Завтра попробую на машину установить. Еще вопрос, я еще датчики не прописывал в скетче , если я потом в скетч пропишу их адреса и залью в ардуину , то телефон не надо будет заного приписывать , он вроде в епроме сохраняется? Я правильно понимаю? И как изменить команду на запрос баланса , а то она не работает на мегафоне?
Да еепром не нужно больше прописывать. Там в коде старался довольно подробно все комментировать. Датчики даллас смотри вверху самом массив DS18B20 Левые 8 байт это адреса датчиков. На старт команда 20 , реже 21
Команда на запрос баланса. Строка 609 скетч#568. Далласы строка 108 и далее.
Две оптопары можно не запаивать и резисторы к ним. Но тот оптрон, который под ардуино, он нужен. Он считывает кнопку включения вебасто.
В стоке 609 нужно будет в место #100#\ поставить *100# ? Или обратный слеш тоже нужен? С далласами вроде сам разобрался но у меня их только 3 оставалось и те в виде обычных микросхем, нужно будет их в трубку упаковывать с термопастой.
вместо #100# ставишь *100# , оставльное оставляешь как есть. Далласы я тоже поначалу в виде микросхем брал. а сейчас иногда в колбах по 50р./шт. бывают если по одному заказывать . беру их, удобнее.
а #100# не работает чтоли? Набор цифар потому что на русском приходит, а надо на английском чтобы приходило. Узнай у оператора как сделать чтобы баланс на английском приходил
С чего бы сколхозить разъем , тобы был такой же как на родном овальном пульте вебасты, не охота резать или подпаивать , та так воткнул родной провод в устройство , и ни чего резать не надо , если не заработает по W-bus то обратно пультик воткнул и через подпайку управлять, и еще хочу кнопку на 3.5 джек вывести и на далласы тоже , что бы меньше соплей было , сигу не буду подцеплять , хотя может на автозапуск двигателя попробую в 600 сталкере есть вывод состояния для автозапуска.
У меня симка мегафон а у него запрос баланса *100# , а решетка сто решетка не работает почему то , просто ни чего не происходит , а на звездочка сто решетка приходит ответ в виде +CUSD: 0, "куча цифр и букв,
скрутками подматайся к проводам разъема вебасто и сделай свой разъем, который найти можно. И будет два разъема торчать - один для штатного таймера. второй для сего девайса.
Долбаный Мегафон у нас убрал услугу поговорить с девушкой из службы поддержки , посадили робота вместо девченок . надо в офис идти что бы с ними пообщаться. Как я понял нужно ставить кнопку с подсветкой светодиодной , эта подсветка какое нибудь еще занчение имеет кроме как электричестово жечь ? Ну типо статус работы вебасты , может это где и говорилось но я не понял , а так можно что бы блинки ошибок выдавала , есл что не так , типо как чек инжин .
лампа показывает включен котёл или нет . Кнопка то без фиксации. Хотел в будущем сделать, что если включили котёл и он НЕ запустился , то лампа будет быстро мигать. Типа незапуск. А ошибки нех по миганию считать, проще в смске их получить.
Ну да в хексе их считывать не удобно, но ошибки дело нужное , не всегда удобно , или есть возможность тащить в авто ноутбук со шнурком , сброс блокировок котла тоже бы не помешал, у меня было так когда устанавливал котел насос не дощелкнул . и вебаста в блокировку ушла , и сброс с помощью предохранителя не помогал, но не всегда и не у всех есть возможность ошибки считать, у нас в городе установщики котлов барыги конченные хотят за диагностику ( тупо подключить шнурок к котлу и считать ошибки) хотят 1000руб.
да не вопрос сделаем мы ошибки. нужен только лог где идет запрос ошибок и ответ котла без ошибок, а также ответ с ошибками (лучше 2 ошибки для анализа). ну и удаление.
постараюсь сделать лог где без ошибок , к выходным а может и раньше , завтра сварганю корпус для устройсва , хочу его из металла сдеать из алюминия . У меня внешняя антена , думаю проблем не будет. Подключу пока без датчиков , если по шине будет работать , то и не буду заморачиватся пока с датчиками, один сделаю на внешнюю температуру.
Класс . Интересно какой минемальный заказ .?
Уже жсм модуль у меня . ручки чешуться уже поставить и проверить связь . Хотя и от сигналки толку хватит .
минимально 10 плат. Примерно 800 руб. за все вместе с доставкой получается.
а можно както дополнить скетч #531 чтобы так и остался пин импульно на массу вк\вкл , индикатор о вкл котла , и пин на включение помпы с таймером отключение помпы ?
К примеру по импульсу вкл вкл можно подключить к сигналке канала 3 , так как есть котлы без одключение помпы и нужно чтобы после вкл котла помпа еще поработала для остывание пламени .
проще другой скетч переделать, в котором все твои хотелки уже есть. надеюсь я найду время и доделаю его. А у тебя разве работает индикация пламени? у тебя ж другая версия протокола w-bus - 3.1 помнится. Там должно по другому пламя определяться
Hi MaksVV
Do you have complete list of 98xx/xx series fault codes . I tried to google but couldn't get much info about these codes . There is lack of info about these codes on our country websites but i saw lots of info in your language . I tried to translate those websites to english and found some code . If you have complete list of codes and can list it here will really appriciate .
when i send 81 51 F1 A1 64 error request command , boiler reply back with fault codes command where index 4 gives 98 and index 5 gives rest of code(00,01,02 etc) . Index 7 gives value after /xx . Following are few codes i found .
No start 9800/00
Flame failure 9801/01
Operating voltage too low 9802/01
Flame Was Detected Prior to Combustion 9803/00
Metering pump interruption 9820/01
Compustion air fan interruption 9821/01
To be honest, nothing is clear. Give an example of the boiler response with at least one error .
Please check details . Thanks
Error summery from WTT software
Error:
------
Fault 1..................................Glow plug / flame monitor interruption
Code..................................................................9822/01
Counter.....................................................................1
Temperature................................................................22 [°C]
Operating state................................Flame detector interrogation 1
Data collected from Arduino serial :
Error Request Command
————————
81
51
F1
A1
64
————————
Response from Webasto ( Fault 1 Detail )
88
F1
51
E1
98 -> First 2 digits of error
22 -> Last 2 digits of error
10
1 -> xxxx/01 value after \ in error code
1 -> Fault Counter ( How many times same fault occured )
1 -> Boiler state
B7 -> Temp at time error was recored in memory
2F
-----------------------------------
Error request reply
84
F1
51
E1
FF
FF
1 -> Number of faults present in controller
A6
—————————————
Какой скетч самый послдений рабочий , полнофунциональный , или такого еще нет? Пришли заказанные детальки , сегодня вытравил плату , которую любезно выложил MaksVV, только обкосячился забыл галку отзеркалить поставить, теперь придется извращаться , с припайкой модулей наоборот. Делаю для себя в одном экземпляре, так что сойдет и так , текстолита жалко , да и время тоже.
Какой скетч самый послдений рабочий , полнофунциональный , или такого еще нет? Пришли заказанные детальки , сегодня вытравил плату , которую любезно выложил MaksVV, только обкосячился забыл галку отзеркалить поставить, теперь придется извращаться , с припайкой модулей наоборот. Делаю для себя в одном экземпляре, так что сойдет и так , текстолита жалко , да и время тоже.
Походу #282
я бы все таки заново вытравил, замучаетесь додумывать.
ещё толком нет. Вот что есть на данный момент. для платы 8.5 - 8.6.
перед заливкой основного скетча заливаем этот для подготовки еепром (смотрим коменты и там же выполняем какие настройки будут по умолчанию, чтобы потом это смс_ками не настраивать) . Ждём когда встроенный LED загорится, далее можно заливать основной скетч.
Ниже скетч подготовки еепром:
01
#include <EEPROM.h>
02
03
04
enum
Cells {
05
ResetNumber_cell,
//0
06
TimeWebasto_cell,
//1
07
ProtocolSTART_cell,
//2
08
Zapusk_cell,
//3
09
ProtocolSTATUS_cell,
//4
10
Heater_cell,
//5
11
delta_cell,
//6
12
sizeCells,
13
TelNumber1_cell =20,
//20
14
TelNumber2_cell =40
//40
15
};
16
17
18
19
20
// возможные протоколы чтения статуса котла:
21
22
enum
ProtocolSTATUS_ {
23
STATUSBUS,
// статусы котла читаются по цифровой шине
24
ANALOG
// статусы котла считываются силами ардуино - по датчикам
25
};
26
27
28
// возможные протоколы запуска котла:
29
30
enum
ProtocolSTART_ {
31
STARTBUS,
// запуск котла происходит по цифровой шине
32
IMPULSE,
// запуск котла происходит импульсом GND (для подпайки к кнопке пуск на таймере котла)
33
POTENCIAL
// запуск котла происходит подачей потенциала +12В (пока плюс висит - котёл работает)
34
};
35
36
// тип котла:
37
38
enum
Heater_ { TTC_E, VEVO, EVO, HYDRONIC};
39
40
41
/////////////// ниже здесь устанавливаем какие настройки у девайса будут по умолчанию
42
43
byte
ProtocolSTATUS = STATUSBUS;
// в данном случае статусы читаются по цифровой шине
44
byte
ProtocolSTART = STARTBUS;
// в данном случае запуск котла происходит по цифровой шине
45
byte
Heater = TTC_E;
// в данном случае тип котла Termo Top C / E (будет шина не w-bus, а просто к-лайн, к которой настройки 10400 8N1)
46
byte
Zapusk = 0x20;
// в данном случае байт на старт котла 0x20 (для шины w-bus)
47
byte
worktime = 30;
// в данном случае время цикла работы котла 30 минут
48
byte
deltaT = 45;
// разница температур улицы и выхлопа, выше которой считается, что котёл успешно стартанул
49
///////////////////////////////////////////////
50
51
52
void
setup
() {
53
54
pinMode(13, OUTPUT);
55
digitalWrite(13, 0);
56
EEPROM.write(TimeWebasto_cell, worktime);
57
EEPROM.write(ProtocolSTART_cell, ProtocolSTART);
58
EEPROM.write(ProtocolSTATUS_cell, ProtocolSTATUS);
59
EEPROM.write(Heater_cell, Heater);
60
EEPROM.write(ResetNumber_cell, 0);
61
EEPROM.write(Zapusk_cell, Zapusk);
62
EEPROM.write(delta_cell, deltaT);
63
for
(
int
i = sizeCells ; i < EEPROM.length() ; i++) EEPROM.write(i,
'0'
);
64
65
66
digitalWrite(13, HIGH);
67
}
68
69
void
loop
() {}
Ниже основной скетч:
0001
//#define debugW_bus // раскоментировать эту строку для отладки, при этом нужно вынуть SIM800 и подключить юсб<->уарт, т.к. отладка идёт в УАРТ, предназначенный для GSM
0002
//#define debugSIM800
0003
0004
#include <EEPROM.h>
0005
enum
Cells {
0006
ResetNumber_cell,
//0
0007
TimeWebasto_cell,
//1
0008
ProtocolSTART_cell,
//2
0009
Zapusk_cell,
//3
0010
ProtocolSTATUS_cell,
//4
0011
Heater_cell,
//5
0012
delta_cell,
//6
0013
TelNumber1_cell =20,
//20
0014
TelNumber2_cell =40
//40
0015
};
0016
0017
#include <Button.h>
0018
0019
Button test;
0020
0021
// для GSM модуля *********************
0022
#include <SoftwareSerial.h>
0023
0024
#ifndef debugW_bus
0025
SoftwareSerial SIM800 (10, 11);
//Rx, Tx //UART для соединения с GSM модулем
0026
#else
0027
SoftwareSerial DEBUG (10, 11);
//Rx, Tx //UART для соединения с отладкой (используется юсб<->УАРТ вместо SIM800)
0028
#endif
0029
0030
#define K_LINE Serial //UART для соединения с шиной котла
0031
#define TX 1
0032
0033
String currStr =
""
;
0034
String TelNumber1 =
"000000000000"
;
0035
String TelNumber2 =
"000000000000"
;
0036
String BufferNumber =
"000000000000"
;
0037
bool
SaveNumber2 = 0;
// флаг когда необходима запись номера#2, он true
0038
byte
isStringMessage = 0;
0039
byte
KTOzapros = 0;
0040
byte
KTOreport = 1;
0041
0042
//************************
0043
0044
0045
0046
//_______Все для цикла void voltmetr()*************
0047
float
vout = 0.0;
// Напряжение на входе аналового входа
0048
float
Vpit = 0.0;
// Измеряемое напряжение на выходе ИБП
0049
int
volt = 0;
// Напряжение на входе АЦП
0050
0051
0052
0053
// дефайны входов выходов на соостветствующие пины ************** (плата 8.5 с разъемом)
0054
0055
#define OutWebasto_12V 2 // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера).
0056
#define Dallas_pin 3 // пин шины OneWire для датчиков даллас
0057
#define DopOn 4 // сюда доп канал от сигналки на включение вебасто
0058
#define DopOff 5 // сюда доп канал от сигналки на выключение вебасто
0059
#define Ohrana 6 // Сюда состояние охраны сигналки
0060
#define Trevoga 7 // Сюда состояние тревоги
0061
#define IGN 8 // Сюда состояние зажигания
0062
#define Sost 9 // Сюда состояние вебасто (+12В когда работает)
0063
#define ResetGSM 12 // пин ресета GSM подключен к реле, разрывающее питание модуля.
0064
#define Eng 14 // (А0) Сюда состояние работы ДВС
0065
#define StatusWebastoLED 15 // (А1) пин LED индикация включенности котла
0066
#define StartButtonpin 16 // (А2) пин тактовой кнопки вкл/выкл котла
0067
#define DTR 17 // пин (А3), управляющий энергосберегающим режимом GSM модуля
0068
#define StartEng 18 // (A4) это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
0069
#define OutWebasto_GndImp 19 // (A5) это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).
0070
#define Voltmeter_pin A7 // пин, которым измеряем напряжение питания
0071
#define StartButton 0 // программный номер тактовой кнопки вкл/выкл котла
0072
const
bool
RelayON = 1;
// логика управления реле ресета GSM, в данном случае включается высоким уровнем на пине
0073
0074
0075
/*
0076
0077
#define Dallas_pin 2 // пин шины OneWire для датчиков даллас
0078
#define OutWebasto_12V 3 // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера).
0079
#define DopOn 4 // сюда доп канал от сигналки на включение вебасто
0080
#define DopOff 5 // сюда доп канал от сигналки на выключение вебасто
0081
#define Ohrana 6 // Сюда состояние охраны сигналки
0082
#define Trevoga 7 // Сюда состояние тревоги
0083
#define StartEng 8 // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
0084
#define Sost 9 // Сюда состояние вебасто (+12В когда работает)
0085
#define IGN 10 // Сюда состояние зажигания
0086
#define Eng 11 // Сюда состояние работы ДВС
0087
#define OutWebasto_GndImp 12 // это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).
0088
#define StatusWebastoLED 13 // пин индикация включенности котла
0089
#define ResetGSM 16 // пин ресета GSM (A2) подключен к реле, разрывающее питание модуля.
0090
#define StartButtonpin 17 // пин тактовой кнопки вкл/выкл котла
0091
#define DTR 19 // пин (А5), управляющий энергосберегающим режимом GSM модуля
0092
#define StartButton 0 // программный номер тактовой кнопки вкл/выкл котла
0093
const
bool
RelayON = 0;
// логика управления реле ресета GSM, в данном случае включается низким уровнем на пине
0094
0095
*/
0096
0097
// для шины 1-wire и датчиков DS18B20****************
0098
0099
#include <OneWire.h> // библиотека для DS18B20
0100
OneWire ds(Dallas_pin);
// датчики DS18B20 на нужный пин
0101
0102
enum
TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp};
// перечисление нужных температур (в конце размер массива температур)
0103
0104
// ниже соответствие адресов датчиков различным температурам (изначально =20*С)
0105
byte
DS18B20 [size_arrayTemp][10] = {
0106
{0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1, VyhlopC, 20},
0107
{0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D, EngineC, 20},
0108
{0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48, UlicaC, 20},
0109
{0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1, SalonC, 20}
0110
};
0111
byte
delta = 50;
// разница температур выхлопа и улицы, выше которой считается, что пламя в котле есть.
0112
0113
// для организации W-BUS и различные таймеры********************
0114
0115
byte
header = 0;
// состояние заголовка
0116
byte
message_size = 0;
// размер тела принимаемого сообщения, кол-во байт
0117
0118
byte
j = 2;
// инкремент
0119
byte
n = 2;
0120
const
byte
bufsize = 140;
// размер буфера принятого сообщения
0121
byte
buf [bufsize] = {0};
// буфер принятого сообщения
0122
byte
checksum = 0;
// контрольная сумма входящего сообщения
0123
uint32_t curmillis = 0;
// снимок системного времени
0124
byte
delaybyte_TX = 0 ;
// задержка между байтами отправляемого сообщения
0125
byte
waitbyte_RX = 1;
// задержка, мс для успевания заполнения буфера RX (подрегулировать в зависимости от уровня жизнидеятельности на Марсе)
0126
uint32_t timerdelay = 0;
// таймер ожидания байт (для успевания заполнения буфера УАРТ)
0127
bool
Delay = 0;
// таймер ожидания байт (для успевания заполнения буфера УАРТ)
0128
#define TIMER_DELAY Delay = 0; timerdelay = curmillis // включение этого таймера
0129
0130
uint32_t prevRESETheader=0;
// таймер сброса заголовка если в момент приёма сообщения данные оборвались
0131
bool
RESETheader_timer = 0;
// таймер сброса заголовка если в момент приёма сообщения данные оборвались
0132
0133
0134
// ниже строка даже не спрашивайте что это)) это так... кот по клаве прошёл
0135
#define ConstArray(...) [](void)->size_t{ const byte _[] = { __VA_ARGS__}; return sizeof(_)/sizeof(_[0]); }(),[](void)->const byte *{ const static byte _[] = { __VA_ARGS__}; return _; }()
0136
0137
// команды для котлов ЭВО
0138
byte
Zapusk = 0x20;
0139
#define HEATER_START ConstArray (Zapusk, 0x3B)
0140
#define HEATER_PRESENCE ConstArray (0x44, Zapusk, 0x00)
0141
#define HEATER_STOP ConstArray (0x10)
0142
#define HEATER_STATUS_VEVO ConstArray (0x50, 0x05)
0143
#define HEATER_STATUS_EVO ConstArray (0x50, 0x30, 0x0A, 0x10)
0144
0145
0146
0147
// команды для котлов ТТС/TTE
0148
#define START_SESSION ConstArray (0x81)
0149
#define REQUSET_2A10101 ConstArray (0x2A, 0x01, 0x01)
0150
#define REQUSET_2A10102 ConstArray (0x2A, 0x01, 0x02)
0151
#define REQUSET_2A10105 ConstArray (0x2A, 0x01, 0x05)
0152
#define REQUSET_DTC ConstArray (0xA1)
0153
#define START_TTC ConstArray (0x31, 0x22, 0xFF)
0154
#define STOP_TTC ConstArray (0x31, 0x22, 0x00)
0155
0156
0157
enum
ProtocolSTATUS_ {STATUSBUS, ANALOG};
// возможные протоколы чтения статуса котла
0158
enum
ProtocolSTART_ {STARTBUS, IMPULSE, POTENCIAL};
// возможные протоколы запуска котла
0159
enum
Heater_ {TTC_E, VEVO, EVO, HYDRONIC};
// тип котла
0160
0161
byte
ProtocolSTATUS = STATUSBUS;
0162
byte
ProtocolSTART = STARTBUS;
0163
byte
Heater = EVO;
0164
0165
byte
w_bus_init = 0;
//флаг проведена или нет инициализация шины w-bus (25мс LOW, 25мс HIGH для ЭВО
0166
// либо 300ms LOW, 50ms HIGH, 25ms LOW, 3025ms HIGH для TTC
0167
bool
flagStartPresence = 1;
//флаг что отправляем в момент периодического поддержания связи W-Bus status или start
0168
byte
StartMessageRepeat = 0;
//количество отправленных сообщений на старт котла
0169
byte
StopMessageRepeat = 0;
//количество отправленных сообщений на остановку котла
0170
0171
byte
TimeWebasto = 30;
//время работы котла, = 30мин
0172
uint32_t EndReportMillis = 0;
//переменная для таймера отправки отчета об успешности запуска котла
0173
uint32_t EndReportEngine = 0;
//переменная для таймера отправки отчета об успешности запуска ДВС
0174
uint32_t Prev_PeriodW_BusMessage = 0;
//переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus
0175
uint32_t Prev_PeriodW_BusStartStop = 0;
//переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus
0176
uint32_t prevdelSMS = 0;
//переменная для таймера периодического удаления СМС
0177
uint32_t prevVpit = 0;
//переменная для таймера периодического измерения напряжения АКБ
0178
0179
//для таймера создания импульса GND - для протокола запуска котла импульсом GND
0180
uint32_t timer=0;
0181
bool
timerenabled=
false
;
0182
#define TIMEREXPIRED (curmillis-timer)>800
0183
0184
0185
//для таймера - старт двигателя - импульс +5В на транзистор, в итоге минусовой импульс 1.5 сек на вход событий сигналки для запуска ДВС)
0186
uint32_t timerStartEng=0;
bool
timerenabledStartEng=
false
;
0187
#define TIMEREXPIRED_StartEng (millis()-timerStartEng)>1500
0188
0189
0190
//для таймера - старт котла по W-BUS )
0191
uint32_t timerStart_W_BUS=0;
bool
timerenabledStart_W_BUS=
false
;
0192
#define TIMEREXPIRED_Start_W_BUS (curmillis-timerStart_W_BUS)> (uint32_t)TimeWebasto * 60000UL
0193
0194
//для таймера инита шины W-BUS
0195
uint32_t timerInit = 0;
bool
timerInitflag = 0;
0196
0197
//для таймера контроля жив или мертв обмен по W-bus
0198
uint32_t last_W_bus = 0;
bool
kotel_zhiv = 0;
0199
0200
//ниже всё для организации ресета GSM модуля, если с ним отсутствует связь****************
0201
0202
uint32_t prevReset=0;
// для таймера периодичности проверки (командой "АТ")
0203
byte
intervalReset = 2;
// каждые столько мин будет проверка жив ли GSM модуль
0204
uint32_t timerWaitOK=0;
// для таймера ожидания ответа после посылки команды "АТ"
0205
bool
timerenabledWaitOK=
false
;
// для таймера ожидания ответа после посылки команды "АТ"
0206
byte
errors=0;
// количество неответов от GSM модуля
0207
bool
gsmOK = 1;
// флаг есть связь с GSM модулем или нет
0208
bool
resettimer = 0;
// для таймера удерживания реле в режиме сброс питания
0209
uint32_t resetTimer=0;
// для таймера удерживания реле в режиме сброс питания
0210
byte
ResetNumber = 0;
// количество ресетов GSM модуля для статистики (хранится в еепром)
0211
0212
//**************************
0213
0214
//Основные переменные
0215
bool
webasto = 0;
// флаг команды на работу Webasto. 0 - котел выключен, 1 - котел включен
0216
bool
startWebasto_OK = 0;
// флаг успешного запуска котла
0217
bool
report =
false
;
// флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
0218
bool
reportEngine =
false
;
// флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
0219
bool
engine =0;
// флаг работает ли ДВС или нет
0220
bool
ignition=0;
// флаг включено ли зажигание или нет
0221
bool
ohrana=0;
// флаг включена ли охрана или нет
0222
bool
trevoga=0;
// флаг включена ли тревога или нет
0223
bool
alarmSMS = 0;
// флаг отправлена ли смс о тревоге или нет
0224
0225
0226
// СТАРТОВЫЙ ЦИКЛ
0227
0228
void
setup
()
0229
{
0230
delay (3500);
0231
0232
0233
test.NO();
0234
test.pullUp();
0235
test.duration_bounce ( 50);
0236
test.duration_click_Db ( 250);
0237
test.duration_inactivity_Up(5000);
0238
test.duration_inactivity_Dn(1000);
0239
test.duration_press ( 500);
0240
test.button(StartButtonpin);
// в скобках пин тактовой кнопки вкл/выкл котла (программный номер у неё будет 0)
0241
0242
pinMode (DopOn, INPUT_PULLUP);
0243
pinMode (DopOff, INPUT_PULLUP);
0244
pinMode (Sost, INPUT_PULLUP);
0245
pinMode (Ohrana, INPUT_PULLUP);
0246
pinMode (Trevoga, INPUT_PULLUP);
0247
pinMode (IGN, INPUT_PULLUP);
0248
pinMode (Eng, INPUT_PULLUP);
0249
0250
pinMode (OutWebasto_12V, OUTPUT); digitalWrite (OutWebasto_12V, LOW);
0251
pinMode (StartEng, OUTPUT); digitalWrite (StartEng, LOW);
0252
pinMode (13, OUTPUT); digitalWrite (13, LOW);
0253
pinMode (StatusWebastoLED, OUTPUT); digitalWrite (StatusWebastoLED, LOW);
0254
pinMode (OutWebasto_GndImp, OUTPUT); digitalWrite (OutWebasto_GndImp, HIGH);
0255
pinMode (DTR, OUTPUT); digitalWrite (DTR, HIGH);
// делаем высокий, а низкий уровень будет для пробуждения GSM из "спячки"
0256
pinMode (ResetGSM, OUTPUT); digitalWrite (ResetGSM, !RelayON);
// реле ресет на данный момент делаем "неактивно"
0257
0258
#ifndef debugW_bus
0259
SIM800.begin(19200);
// сериал соединение для gsm модуля
0260
delay(100);
0261
NastroykaGSM ();
0262
#else DEBUG.begin(9600);
0263
#endif
0264
0265
TimeWebasto = EEPROM.read(TimeWebasto_cell);
0266
ProtocolSTART = EEPROM.read(ProtocolSTART_cell);
0267
ProtocolSTATUS = EEPROM.read(ProtocolSTATUS_cell);
0268
ResetNumber = EEPROM.read(ResetNumber_cell);
0269
Zapusk = EEPROM.read(Zapusk_cell);
0270
Heater = EEPROM.read(Heater_cell);
0271
delta = EEPROM.read(delta_cell);
0272
for
(
int
i=0; i<12; i++) TelNumber1[i] = EEPROM.read (i+TelNumber1_cell);
0273
for
(
int
i=0; i<12; i++) TelNumber2[i] = EEPROM.read (i+TelNumber2_cell);
0274
0275
#ifndef debugSIM800
0276
if
(Heater == EVO || Heater == VEVO) K_LINE.begin(2400, SERIAL_8E1);
0277
else
if
(Heater == TTC_E) K_LINE.begin(10400);
0278
#else
0279
K_LINE.begin(9600);
0280
#endif
0281
0282
0283
for
(
byte
i=0; i<20; i++) {digitalWrite (13, !digitalRead(13)); delay (80);}
0284
digitalWrite (13,0);
0285
}
0286
0287
0288
void
loop
() {
0289
curmillis = millis();
0290
test.read();
0291
0292
digitalWrite (StatusWebastoLED, webasto);
0293
//digitalWrite (13, startWebasto_OK);
0294
digitalWrite (13, webasto);
0295
0296
0297
//если нажали тактовую кнопку меняем состояние котла на противоположное
0298
if
(test.event_press_short (StartButton)) {
0299
if
(!webasto) {StartWebasto(); report =
false
;}
0300
else
StopWebasto();
0301
}
0302
0303
if
(ProtocolSTATUS==ANALOG) {
if
(Temper(VyhlopC) - Temper(UlicaC) > delta) startWebasto_OK = 1;
0304
else
startWebasto_OK = 0;}
0305
0306
if
(ProtocolSTART==IMPULSE) webasto = !digitalRead (Sost);
0307
0308
Heater_BUS();
0309
0310
//ниже для таймера старта котла по шине и аналогу
0311
0312
if
(timerenabledStart_W_BUS && TIMEREXPIRED_Start_W_BUS) StopWebasto();
0313
0314
//ниже для таймера создания импульса на старт ДВС
0315
0316
if
(timerenabledStartEng && TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=
false
;}
0317
0318
engine = !digitalRead (Eng);
0319
ignition= !digitalRead (IGN);
0320
ohrana= !digitalRead (Ohrana);
0321
trevoga= !digitalRead (Trevoga);
0322
0323
if
(webasto && report) timerReport ();
0324
if
(reportEngine) timerReportEngine ();
0325
if
(!ohrana) alarmSMS =
false
;
0326
0327
#ifndef debugW_bus
0328
if
(trevoga && !alarmSMS) AlarmSMS ();
0329
if
(gsmOK)readSMS();
0330
Reset_gsm();
0331
delSMS();
0332
#endif
0333
0334
WebastoOprosImpulse ();
0335
izmereniya();
0336
0337
0338
}
0339
0340
void
izmereniya() {
0341
0342
if
(millis()-prevVpit>7000){
0343
0344
//измерение напряжения борт сети
0345
if
(ProtocolSTATUS==ANALOG){
0346
volt = analogRead(Voltmeter_pin);
0347
vout = (volt * 4.13) / 1024;
0348
Vpit = vout / (9700.0/(98930.0+9700.0));
// По формуле Vpit = vout / (R2/(R1+R2))
0349
if
(Vpit<0.09) Vpit=0.0;
// Округление до нуля
0350
}
0351
0352
// ниже измерение датчиков даллас
0353
static
bool
n=0;
// флаг работы: запрос температуры или её чтение
0354
n=!n;
0355
if
(n) {ds.reset();
// сброс шины
0356
ds.write(0xCC);
// обращение ко всем датчикам
0357
ds.write(0x44);
// начать преобразование (без паразитного питания)
0358
}
0359
else
{
0360
for
(
byte
i=0; i<size_arrayTemp; i++){
0361
int
Temper_ = 20;
byte
buff[9];
0362
ds.reset();
0363
ds.select(DS18B20[i]);
0364
ds.write(0xBE);
// чтение регистров датчиков
0365
for
(
byte
j=0; j<9; j++) buff[j]=ds.read();
// читаем все 9 байт от датчика
0366
ds.reset();
0367
if
(OneWire::crc8(buff, 8) == buff[8]){
// если контрольная сумма совпадает
0368
Temper_ = buff[0]|(buff[1]<<8);
// читаем температуру из первых двух байт (остальные были нужны только для проверки CRC)
0369
Temper_ = Temper_ / 16;
0370
if
(Temper_<150 && Temper_>-55) DS18B20[i][9] = Temper_;
0371
}}}
0372
0373
0374
prevVpit=millis();
0375
}}
0376
0377
0378
0379
int8_t Temper (
byte
addressTemp) {
for
(
byte
j=0; j<size_arrayTemp; j++){
if
(DS18B20[j][8]==addressTemp)
return
(int8_t)DS18B20[j][9];}
return
-99;}
0380
0381
0382
0383
void
WebastoOprosImpulse (){
0384
0385
// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла
0386
0387
if
(timerenabled) {
if
(TIMEREXPIRED) {digitalWrite (OutWebasto_GndImp, HIGH); timerenabled=
false
;}}
0388
else
{
if
(!digitalRead (DopOn) && !webasto) {StartWebasto(); KTOreport = 1;}
0389
if
(!digitalRead (DopOff) && webasto) StopWebasto();
0390
}}
0391
0392
0393
// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
0394
void
timerReport () {
0395
if
(millis() - EndReportMillis > 360000UL)
0396
{EndReportMillis = millis(); report =
false
; SMSzapros(); }}
0397
0398
// цикл таймера отправки отчета об успешности запуска ДВС (отчёт через 90сек после старта)
0399
void
timerReportEngine () {
0400
if
(millis() - EndReportEngine > 90000ul)
0401
{EndReportEngine = millis(); reportEngine =
false
; SMSzapros();}}
0402
0403
0404
0405
0406
#ifndef debugW_bus
0407
void
NastroykaGSM () {
0408
digitalWrite (DTR, LOW);
// выводим из спячки GSM модуль
0409
delay (150);
0410
SIM800.println(F(
"AT"
));
//просто AT для разогреву
0411
delay(250);
0412
SIM800.println(F(
"AT+CMGF=1"
));
//устанавливает текстовый режим смс-сообщения
0413
delay(250);
0414
SIM800.println(F(
"AT+IFC=0, 0"
));
//отключает программный контроль потоком передачи данных
0415
delay(250);
0416
SIM800.println(F(
"AT+GSMBUSY=1"
));
//запрет всех входящих звонков
0417
delay(250);
0418
SIM800.println(F(
"AT+CNMI=1,2,2,1,0"
));
//включает оповещение о новых сообщениях
0419
delay(250);
0420
SIM800.println(F(
"AT+CMGDA=\"DEL ALL\""
));
// удаляем все смс, ки
0421
delay(1500);
0422
SIM800.println(F(
"AT+CSCLK=1"
));
//включает энергосберегающий режим
0423
delay(150);
0424
digitalWrite (DTR, HIGH);
// вводим в спячку GSM модуль высоким уровнем на пине DTR
0425
0426
}
0427
0428
void
startNumber1SMS()
//__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
0429
{
0430
digitalWrite (DTR, LOW);
// выводим из спячки GSM модуль
0431
delay (150);
0432
SIM800.print(F(
"AT+CMGF=1\r"
));
0433
delay(150);
0434
SIM800.print(F(
"AT+CMGS=\""
)); SIM800.print(TelNumber1); SIM800.println(
"\""
);
0435
delay(150);
0436
}
0437
0438
void
startNumber2SMS()
//__________________Цикл подготовки модуля к отправке СМС-сообщений по второму номеру
0439
{
0440
digitalWrite (DTR, LOW);
// выводим из спячки GSM модуль
0441
delay (150);
0442
SIM800.print(F(
"AT+CMGF=1\r"
));
0443
delay(150);
0444
SIM800.print(F(
"AT+CMGS=\""
)); SIM800.print(TelNumber2); SIM800.println(F(
"\""
));
0445
delay(150);
0446
}
0447
0448
void
startBufferNumberSMS()
//__________________Цикл подготовки модуля к отправке СМС-сообщений по второму номеру
0449
{
0450
digitalWrite (DTR, LOW);
// выводим из спячки SIM800 модуль
0451
delay (150);
0452
SIM800.print(F(
"AT+CMGF=1\r"
));
0453
delay(200);
0454
SIM800.print(F(
"AT+CMGS=\""
)); SIM800.print(BufferNumber); SIM800.println(F(
"\""
));
0455
delay(150);
0456
}
0457
0458
void
EndSMS ()
0459
{
0460
SIM800.println((
char
)26);
// Команда отправки СМС
0461
delay(1500);
0462
digitalWrite (DTR, HIGH);
// вводим в спячку SIM800 модуль
0463
0464
}
0465
0466
void
delSMS ()
0467
{
0468
if
(millis() - prevdelSMS > 7200000ul){
//раз в 2 часа
0469
digitalWrite (DTR, LOW);
// выводим из спячки SIM800 модуль
0470
delay (150);
0471
SIM800.print(F(
"AT+CMGDA=\"DEL ALL\"\r"
));
// удаляем все смс, ки
0472
delay(1500);
0473
digitalWrite (DTR, HIGH);
// вводим в спячку SIM800 модуль
0474
delay (150);
0475
0476
prevdelSMS = millis();}
0477
}
0478
0479
0480
void
readSMS()
//_____Цикл чтения входящих СМС-сообщений______________
0481
{
0482
if
(!SIM800.available())
return
;
0483
char
currSymb = SIM800.read();
0484
#ifdef debugSIM800
0485
if
(currSymb!=0x13 && currSymb!=0x11) K_LINE.print (currSymb);
0486
#endif
0487
if
(
'\r'
== currSymb)
0488
{
0489
if
(isStringMessage!=0&&isStringMessage!=10)
//если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
0490
{
0491
if
(!currStr.compareTo(
"ZAPROS"
)) {SMSzapros();}
// Передача параметров по СМС
0492
else
if
(!currStr.compareTo(
"ZAPROSTEL"
)) {SMSzaprosTEL();}
// Передача номеров телефонов пользователей по СМС
0493
else
if
(!currStr.compareTo(
"ServiceINFO"
)) {ServiceINFO();}
// Передача сервисной информации по СМС
0494
else
if
(!currStr.compareTo(
"Resets0"
)) {ResetNumber=0; EEPROM.write (ResetNumber_cell, ResetNumber); ServiceINFO();}
//сброс счетчика ресетов GSM модуля
0495
0496
else
if
(!currStr.compareTo(
"Webasto-ON"
)) {
if
(!webasto) {StartWebasto ();
// если получили команду на включение и вебаста в настоящий момент выключена - включаем
0497
if
(isStringMessage == 1) {startNumber1SMS(); KTOreport = 1;}
0498
else
if
(isStringMessage == 2) {startNumber2SMS(); KTOreport = 2;}
0499
SIM800.println(F(
"Webasto Vkluchena"
)); EndSMS();}
0500
0501
else
{
if
(isStringMessage == 1) startNumber1SMS();
0502
else
if
(isStringMessage == 2) startNumber2SMS();
0503
SIM800.println(F(
"Webasto uzhe vkluchena"
)); EndSMS();}}
0504
0505
0506
else
if
(!currStr.compareTo(
"Webasto-OFF"
)) {
if
(webasto){StopWebasto ();
// если получили команду на выключение и вебаста в настоящий момент включена - выключаем
0507
if
(isStringMessage == 1) startNumber1SMS();
0508
else
if
(isStringMessage == 2) startNumber2SMS();
0509
SIM800.println(F(
"Webasto Otkluchena"
)); EndSMS();}
0510
0511
0512
else
{
if
(isStringMessage == 1) startNumber1SMS();
0513
else
if
(isStringMessage == 2) startNumber2SMS();
0514
SIM800.println(F(
"Webasto uzhe otkluchena"
)); EndSMS();}}
0515
0516
0517
else
if
(!currStr.compareTo(
"Engine-ON"
)) {
if
(!engine) { digitalWrite (StartEng, HIGH); timerStartEng=millis(); timerenabledStartEng=
true
; reportEngine =
true
; EndReportEngine = timerStartEng;
// если получили команду на включение ДВС и он в настоящий момент выключен - включаем
0518
if
(isStringMessage == 1) {startNumber1SMS(); KTOreport = 1;}
0519
else
if
(isStringMessage == 2) {startNumber2SMS(); KTOreport = 2;}
0520
SIM800.println(F(
"Engine Start"
)); EndSMS();}
0521
0522
else
{
if
(isStringMessage == 1) startNumber1SMS();
0523
else
if
(isStringMessage == 2) startNumber2SMS();
0524
SIM800.println(F(
"Dvigatel uzhe rabotaet"
)); EndSMS();}}
0525
0526
else
if
(!currStr.compareTo(
"Engine-OFF"
)) {
if
(engine){ digitalWrite (StartEng, HIGH); timerStartEng=millis(); timerenabledStartEng=
true
; reportEngine =
false
;
// если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
0527
if
(isStringMessage == 1) startNumber1SMS();
0528
else
if
(isStringMessage == 2) startNumber2SMS();
0529
SIM800.println(F(
"Dvigatel ostanovlen"
)); EndSMS();}
0530
0531
0532
else
{
if
(isStringMessage == 1) startNumber1SMS();
0533
else
if
(isStringMessage == 2) startNumber2SMS();
0534
SIM800.println(F(
"dvigatel uzhe ostanovlen"
)); EndSMS(); }}
0535
0536
else
if
(!currStr.compareTo(
"Impulse"
)) {
if
(!webasto) {ProtocolSTART = IMPULSE; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);
0537
if
(isStringMessage == 1) startNumber1SMS();
0538
else
if
(isStringMessage == 2) startNumber2SMS();
0539
SIM800.println(F(
"zapusk GND_impulse"
)); EndSMS();}}
0540
0541
else
if
(!currStr.compareTo(
"Startbus"
)) {
if
(!webasto) {ProtocolSTART = STARTBUS; EEPROM.write(ProtocolSTART_cell,ProtocolSTART); webasto = 0;
0542
if
(isStringMessage == 1) startNumber1SMS();
0543
else
if
(isStringMessage == 2) startNumber2SMS();
0544
SIM800.println(F(
"zapusk BUS"
)); EndSMS();}}
0545
0546
else
if
(!currStr.compareTo(
"Potencial"
)) {
if
(!webasto) {ProtocolSTART = POTENCIAL; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);
0547
if
(isStringMessage == 1) startNumber1SMS();
0548
else
if
(isStringMessage == 2) startNumber2SMS();
0549
SIM800.println(F(
"zapusk +12V Potencial"
)); EndSMS();}}
0550
0551
else
if
(currStr.endsWith(
"Status"
)) {
if
(!webasto) {
byte
st = currStr.toInt();
if
(st >= STATUSBUS && st<=ANALOG )ProtocolSTATUS = st; EEPROM.write(ProtocolSTATUS_cell,ProtocolSTATUS);
0552
if
(isStringMessage == 1) startNumber1SMS();
0553
else
if
(isStringMessage == 2) startNumber2SMS();
0554
SIM800.print (F(
"Status: "
));
0555
if
(ProtocolSTATUS == 0)SIM800.println(F(
"BUS"
));
0556
else
if
(ProtocolSTATUS == 1)SIM800.println(F(
"Analog"
));
0557
EndSMS();}}
0558
0559
0560
else
if
(currStr.endsWith(
"HeaterType"
)) {
if
(!webasto) {
byte
st = currStr.toInt();
if
(st >= TTC_E && st<=HYDRONIC) Heater = st; EEPROM.write(Heater_cell,Heater);
0561
if
(isStringMessage == 1) startNumber1SMS();
0562
else
if
(isStringMessage == 2) startNumber2SMS();
0563
SIM800.print (F(
"Heater: "
));
0564
if
(Heater == 0)SIM800.println(F(
"TTC_E"
));
0565
else
if
(Heater == 1)SIM800.println(F(
"VEVO"
));
0566
else
if
(Heater == 2)SIM800.println(F(
"EVO"
));
0567
else
if
(Heater == 3)SIM800.println(F(
"HYDRONIC"
));
0568
EndSMS();}}
0569
0570
else
if
(currStr.endsWith(
"Delta"
)) {
if
(!webasto) {delta = currStr.toInt();
//
0571
EEPROM.write(delta_cell, delta);
0572
if
(isStringMessage == 1) startNumber1SMS();
0573
else
if
(isStringMessage == 2) startNumber2SMS();
0574
SIM800.print(F(
"DeltaT: "
)); SIM800.print(delta); SIM800.print(F(
"*C"
)); EndSMS();}}
0575
0576
0577
0578
else
if
(currStr.endsWith(
"min"
)) {
if
(!webasto) {TimeWebasto = currStr.toInt();
// для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
0579
if
(TimeWebasto>59) TimeWebasto = 59;
0580
if
(TimeWebasto<=15) TimeWebasto = 15;
0581
EEPROM.write(TimeWebasto_cell,TimeWebasto);
0582
if
(isStringMessage == 1) startNumber1SMS();
0583
else
if
(isStringMessage == 2) startNumber2SMS();
0584
SIM800.print(F(
"Webasto time: "
)); SIM800.print(TimeWebasto); SIM800.print(F(
"min"
)); EndSMS();}}
0585
0586
else
if
(currStr.endsWith(
"zapusk"
)) {
byte
Z =currStr.toInt();
if
(Z>=0x14 && Z<=0x17) Zapusk= Z+12;
0587
if
(isStringMessage == 1)startNumber1SMS();
0588
else
if
(isStringMessage == 2) startNumber2SMS();
0589
SIM800.print(F(
"Zapusk byte: "
)); SIM800.print(Zapusk, HEX); SIM800.print(F(
"h"
)); EndSMS();}
0590
0591
else
if
(!currStr.compareTo(
"ResetNumbers"
)) {
if
(isStringMessage == 1) {startNumber1SMS(); SIM800.println(F(
"Phone numbers are erased"
)); EndSMS();
0592
0593
TelNumber1 =
"000000000000"
; TelNumber2 =
"000000000000"
;
for
(
int
i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell, TelNumber1[i]); EEPROM.write (i+TelNumber2_cell, TelNumber2[i]); }}}
0594
0595
else
if
(!currStr.compareTo(
"WriteNumber2"
)&& isStringMessage == 1) {
0596
SaveNumber2 = 1; startNumber1SMS(); SIM800.println(F(
"Otpravte lyuboye SMS s nomera#2 dlya sohraneniya nomera"
)); EndSMS();}
0597
0598
0599
0600
0601
else
if
(!currStr.compareTo(
"Balance"
)) SMSbalance();
0602
isStringMessage = 0;
0603
}
0604
else
if
(isStringMessage==10){
if
(!currStr.compareTo(
"WriteNumber1"
)) { TelNumber1 = BufferNumber;
for
(
int
i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell, BufferNumber[i]);}
0605
startNumber1SMS(); SIM800.println(F(
"Tel Number#1 is saving in memory"
)); SIM800.print(
"Tel#1: "
); SIM800.println (TelNumber1); EndSMS();
0606
}
0607
else
if
(!currStr.compareTo(
"ZAPROS"
)) { SMSzapros();}
0608
else
if
(!currStr.compareTo(
"ZAPROSTEL"
)) { SMSzaprosTEL();}
// Передача номеров телефонов пользователей по СМС
0609
isStringMessage = 0;
0610
0611
}
0612
0613
0614
0615
0616
else
if
(isStringMessage==0) {
if
(TelNumber1!=
"000000000000"
&& !SaveNumber2 && TelNumber1!=
"яяяяяяяяяяяя"
){
0617
0618
if
(currStr.startsWith(
"+CMT: \""
+TelNumber1)) { isStringMessage = 1; KTOzapros = 1; }
0619
else
if
(currStr.startsWith(
"+CMT: \""
+TelNumber2)) { isStringMessage = 2; KTOzapros = 2; }
0620
else
if
(currStr.startsWith(
"+CUSD: 0,"
))
//если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
0621
{
0622
if
(KTOzapros == 1) startNumber1SMS();
0623
else
if
(KTOzapros == 2) startNumber2SMS();
0624
SIM800.print (currStr);
0625
EndSMS();
0626
}
0627
}
0628
0629
else
if
(currStr.startsWith(
"+CMT:"
) && !SaveNumber2) { isStringMessage = 10;
for
(
int
i =0; i<12; i++) {BufferNumber[i]=currStr[i+7];}}
0630
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+TelNumber2_cell, BufferNumber[i]);}
0631
startNumber2SMS(); SIM800.println(F(
"Vash nomer sochranyon kak Number#2 v pamyati!"
));
0632
SIM800.print(F(
"Tel#1: "
)); SIM800.println(TelNumber1); SIM800.print(F(
"Tel#2: "
)); SIM800.println (TelNumber2); EndSMS(); SaveNumber2 = 0; }
0633
0634
}
0635
0636
currStr =
""
;
0637
}
0638
0639
else
if
(
'\n'
!= currSymb && currSymb!=0x13 && currSymb!=0x11) currStr += String(currSymb);
0640
}
0641
0642
0643
0644
void
SMSzaprosTEL(){
0645
if
(isStringMessage == 1) startNumber1SMS();
0646
else
if
(isStringMessage == 2) startNumber2SMS();
0647
else
if
(isStringMessage == 10) startBufferNumberSMS();
0648
SIM800.print(F(
"Tel#1: "
)); SIM800.println(TelNumber1);
0649
SIM800.print(F(
"Tel#2: "
)); SIM800.println(TelNumber2);
0650
EndSMS();
0651
}
0652
0653
0654
void
SMSbalance() {
0655
digitalWrite (DTR, LOW);
// выводим из спячки SIM800 модуль
0656
delay (150);
0657
SIM800.print(F(
"AT+CMGF=1\r"
));
0658
delay(200);
0659
SIM800.println (F(
"AT+CUSD=1,\"#100#\""
));
// команда на замену на транслит *111*6*2# у МТС
0660
delay(1500);
0661
digitalWrite (DTR, HIGH);
// вводим в спячку SIM800 модуль
0662
delay (150);
0663
0664
0665
}
0666
0667
0668
void
AlarmSMS() {
0669
0670
startNumber1SMS();
0671
SIM800.println (F(
"Vnimanie!!! Trevoga!!! Sirena Vkl!"
));
0672
EndSMS();
0673
startNumber2SMS();
0674
SIM800.println (F(
"Vnimanie!!! Trevoga!!! Sirena Vkl!"
));
0675
EndSMS();
0676
alarmSMS =
true
;
0677
}
0678
0679
#endif
0680
0681
void
SMSzapros()
0682
0683
{
0684
#ifndef debugW_bus
0685
if
(isStringMessage == 10){
0686
startBufferNumberSMS();
0687
0688
SIM800.println (F(
"Tel.number#1 not has been save in memory"
));
0689
SIM800.println (F(
"For save Tel#1 send SMS command \"WriteNumber1\""
));
0690
SIM800.print(F(
"Tel#1: "
)); SIM800.println(TelNumber1);
0691
SIM800.print(F(
"Tel#2: "
)); SIM800.println(TelNumber2);
0692
}
0693
0694
0695
0696
else
{
0697
0698
if
(isStringMessage == 1) { startNumber1SMS();}
0699
else
if
(isStringMessage == 2) { startNumber2SMS();}
0700
else
if
(isStringMessage == 0) {
if
(KTOreport == 1) startNumber1SMS();
0701
else
if
(KTOreport == 2) startNumber2SMS();}
0702
SIM800.print (F(
"Webasto "
));
0703
if
(webasto) { SIM800.println (F(
"ON"
));
0704
if
(startWebasto_OK) SIM800.println (F(
"StartWebasto OK"
));
0705
else
SIM800.println (F(
"StartWebasto FAIL"
));}
0706
else
SIM800.println (F(
"OFF"
));
0707
SIM800.print (F(
"Engine "
));
0708
if
(engine) SIM800.println (F(
"ON"
));
0709
else
SIM800.println (F(
"OFF"
));
0710
SIM800.print (F(
"IGN "
));
0711
if
(ignition) SIM800.println (F(
"ON"
));
0712
else
SIM800.println (F(
"OFF"
));
0713
SIM800.print (F(
"Ohrana "
));
0714
if
(ohrana) SIM800.println (F(
"ON"
));
0715
else
SIM800.println (F(
"OFF"
));
0716
0717
if
(trevoga) SIM800.println (F(
"Vnimanie!!! Trevoga!!! Sirena Vkl!"
));
0718
0719
SIM800.print(F(
"Battery: "
)); SIM800.print (Vpit); SIM800.println(F(
"V"
));
0720
SIM800.print(F(
"Engine: "
)); SIM800.print (Temper(EngineC)); SIM800.println(F(
"*C"
));
0721
SIM800.print(F(
"Vyhlop: "
)); SIM800.print (Temper(VyhlopC)); SIM800.println(F(
"*C"
));
0722
SIM800.print(F(
"Ulica: "
)); SIM800.print (Temper(UlicaC)); SIM800.println(F(
"*C"
));
0723
SIM800.print(F(
"Salon: "
)); SIM800.print (Temper(SalonC)); SIM800.println(F(
"*C"
));
0724
0725
0726
0727
}
0728
EndSMS();
0729
#endif
0730
}
0731
0732
0733
0734
void
ServiceINFO(){
0735
if
(isStringMessage == 1) startNumber1SMS();
0736
else
if
(isStringMessage == 2) startNumber2SMS();
0737
SIM800.print(F(
"Zapusk: "
));
0738
if
(ProtocolSTART==IMPULSE) SIM800.println(F(
"GND Imp"
));
0739
else
if
(ProtocolSTART==STARTBUS) {SIM800.println(F(
"BUS"
));
0740
if
(Heater== VEVO || Heater== EVO) {SIM800.print(F(
"ZapuskByte: 0x"
)); SIM800.println (Zapusk, HEX);}}
0741
else
if
(ProtocolSTART==POTENCIAL) SIM800.println(F(
"Potencial+12V"
));
0742
0743
SIM800.print(F(
"Status: "
));
0744
if
(ProtocolSTATUS==ANALOG) SIM800.println(F(
"ANOLOG"
));
0745
else
if
(ProtocolSTATUS==STATUSBUS) SIM800.println(F(
"BUS"
));
0746
0747
SIM800.print(F(
"Heater: "
));
0748
if
(Heater==TTC_E) SIM800.println(F(
"TTC/E"
));
0749
else
if
(Heater==VEVO) SIM800.println(F(
"VEVO"
));
0750
else
if
(Heater==EVO) SIM800.println(F(
"EVO"
));
0751
else
if
(Heater==HYDRONIC) SIM800.println(F(
"HYDRONIC"
));
0752
0753
if
(ProtocolSTART!=IMPULSE) {SIM800.print(F(
"Webasto Time: "
)); SIM800.print (TimeWebasto); SIM800.println(F(
"min"
));}
0754
SIM800.print(F(
"SIM800 Resets: "
)); SIM800.println (ResetNumber);
0755
0756
SIM800.print(F(
"DeltaT: "
)); SIM800.print(delta);SIM800.println(F(
"*C"
));
0757
0758
EndSMS();
0759
0760
}
0761
0762
void
StartWebasto()
0763
{
0764
if
(ProtocolSTART==IMPULSE){
0765
0766
digitalWrite (OutWebasto_GndImp, LOW);
0767
timer=curmillis;
0768
timerenabled=
true
;}
0769
0770
else
{
0771
StartMessageRepeat = 0;
0772
webasto = 1; digitalWrite (OutWebasto_12V, HIGH);
0773
timerStart_W_BUS=millis();
0774
timerenabledStart_W_BUS =
true
;}
0775
0776
report =
true
; EndReportMillis = millis();
0777
w_bus_init = 1;
0778
}
0779
0780
void
StopWebasto()
0781
{
0782
if
(ProtocolSTART==IMPULSE){ digitalWrite (OutWebasto_GndImp, LOW);
0783
timer=curmillis;
0784
timerenabled=
true
;}
0785
0786
else
{
0787
StopMessageRepeat = 0;
0788
webasto = 0; digitalWrite (OutWebasto_12V, LOW);
0789
timerenabledStart_W_BUS =
false
;}
0790
report =
false
;
0791
w_bus_init = 0;
0792
0793
}
0794
0795
0796
0797
void
Heater_BUS (){
0798
0799
if
(Heater == EVO || Heater == VEVO){
0800
if
(webasto) {
0801
if
(StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800) && w_bus_init == 10){
0802
sendMessage (HEATER_START);
0803
StartMessageRepeat++;
0804
Prev_PeriodW_BusStartStop = millis();
0805
0806
}
0807
if
(StartMessageRepeat>=4){
if
(millis()-Prev_PeriodW_BusMessage>5000) {
0808
0809
if
(flagStartPresence) sendMessage (HEATER_PRESENCE);
0810
else
{
if
(Heater == EVO) sendMessage (HEATER_STATUS_EVO);
0811
if
(Heater == VEVO)sendMessage (HEATER_STATUS_VEVO);}
0812
flagStartPresence = !flagStartPresence;
0813
StopMessageRepeat = 0;
0814
0815
Prev_PeriodW_BusMessage = millis();
0816
}}}
0817
0818
0819
0820
0821
0822
else
if
(StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
0823
sendMessage (HEATER_STOP);
0824
StopMessageRepeat++;
0825
StartMessageRepeat = 0;
0826
Prev_PeriodW_BusStartStop = millis();
0827
0828
0829
}
0830
0831
0832
if
(!timerInitflag && w_bus_init==1) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
0833
if
( timerInitflag && (millis() - timerInit>24) && w_bus_init==1) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
0834
if
( timerInitflag && (millis() - timerInit>24) && w_bus_init==2) {K_LINE.begin (2400,SERIAL_8E1 );timerInitflag = 0; w_bus_init=10; }
0835
0836
0837
if
(K_LINE.available()){
0838
0839
0840
// первый старт байт
0841
if
(header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();
0842
if
(buf[0]==0x4F){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
0843
else
{header = 0; RESETheader_timer=0;}
0844
}
0845
0846
// длина сообщения
0847
if
(header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); message_size = buf[1];
if
(message_size > bufsize) message_size = bufsize; header = 4;j=2;n=2;checksum = 0;}
0848
0849
// пишем тело сообщения
0850
if
(header == 4 && Delay && j< message_size+n) {
0851
buf[j] = K_LINE.read();
0852
0853
if
(j<message_size+n-1) checksum^= buf[j];
// подсчёт КС
0854
0855
if
(j==message_size+n-1) header = 5;
0856
TIMER_DELAY ; j++;}
0857
0858
}
// end of K_LINE.available()
0859
0860
// сообщение приняли, действуем
0861
if
(header == 5) {TIMER_DELAY ;
0862
0863
for
(
byte
i = 0; i<n; i++) checksum^=buf[i];
// прибавляем к контрольной сумме старт байты
0864
0865
// если контрольная сумма верна:
0866
if
( checksum == buf[message_size+n-1]) {
0867
0868
if
(buf[2]==0xD0 && buf[3]==0x05 && Heater == VEVO) {startWebasto_OK = buf[7]; last_W_bus = millis();}
// проверяем наличие пламени у VEVO
0869
if
(buf[2]==0xD0 && buf[3]==0x30 && buf[6]==0x10 && Heater == EVO) {startWebasto_OK = (
bool
)buf[7]; last_W_bus = millis();}
// проверяем наличие пламени у EVO
0870
0871
0872
}
0873
0874
// если контрольная сумма не совпала:
0875
0876
//else K_LINE.println("CRC fail!!!" );
0877
0878
message_size = 0; header=0; RESETheader_timer=0; j=2; checksum = 0;
0879
}
0880
0881
0882
0883
0884
}
// end EVO VEVO
0885
0886
0887
else
if
(Heater == TTC_E){
0888
0889
0890
0891
0892
if
(!timerInitflag && w_bus_init==1) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
0893
if
( timerInitflag && (millis() - timerInit>299) && w_bus_init==1) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
0894
if
( timerInitflag && (millis() - timerInit>49) && w_bus_init==2) {timerInit = millis(); digitalWrite(TX, 0); w_bus_init=3; }
0895
if
( timerInitflag && (millis() - timerInit>24) && w_bus_init==3) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=4; }
0896
if
( timerInitflag && (millis() - timerInit>3024) && w_bus_init==4) {K_LINE.begin (10400); timerInitflag = 0; w_bus_init=10; sendMessage (START_SESSION);}
0897
0898
if
(K_LINE.available()){
0899
0900
0901
// первый старт байт
0902
if
(header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();
0903
if
(!bitRead (buf[0],6) && bitRead (buf[0],7)){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
0904
0905
}
0906
0907
// второй старт байт
0908
if
(header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read();
if
(buf[1]==0xF1){ header = 2;}
else
{header = 0; RESETheader_timer=0;}}
0909
0910
// третий старт байт
0911
if
(header == 2 && Delay){
0912
TIMER_DELAY ;
0913
buf[2]=K_LINE.read();
0914
if
(buf[2]==0x51){ message_size = buf[0];
0915
if
(buf[0] !=0x80) {header = 4; message_size&=~0x80; j=3; n=3;}
0916
else
{header = 3; j=4;n=4;}
0917
if
(message_size > bufsize) message_size = bufsize; checksum = 0;}
else
{header = 0; RESETheader_timer=0; }
0918
0919
}
0920
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
0921
if
(header == 3 && Delay){
0922
TIMER_DELAY ;
0923
buf[3]=K_LINE.read();
0924
message_size = buf[3];
0925
if
(message_size > bufsize) message_size = bufsize;
0926
checksum = 0; header = 4;
0927
}
0928
0929
// пишем тело сообщения
0930
if
(header == 4 && Delay && j< message_size+n+1) {
0931
buf[j] = K_LINE.read();
0932
if
(j<message_size+n) checksum+= buf[j];
// подсчёт КС
0933
0934
if
(j==message_size+n) header = 5;
0935
TIMER_DELAY ; j++;}
0936
0937
}
// end of K_LINE.available()
0938
0939
// сообщение приняли, действуем
0940
if
(header == 5) {TIMER_DELAY ;
0941
0942
for
(
byte
i = 0; i<n; i++) checksum+=buf[i];
// прибавляем к контрольной сумме старт байты
0943
0944
//for (byte i=0; i<message_size+n+1; i++) {Serial.print (buf[i], HEX); Serial.print(" ");}
0945
0946
// если контрольная сумма верна:
0947
if
(buf[message_size+n] == checksum) {
0948
0949
// if (buf[n]== 0xC1) Serial.println ("StartSession OK!!!");
0950
0951
0952
0953
0954
}
0955
0956
// если контрольная сумма не совпала:
0957
//else Serial.println("CRC fail!!!" );
0958
message_size = 0; header=0; RESETheader_timer=0; j=3; checksum = 0;
0959
}
0960
0961
}
// end TTC_E
0962
0963
// таймер ожидания байт (для успевания появления данных в буфере UART)
0964
if
(!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1;
0965
0966
// таймер сброса заголовка если данные оборвались во время приёма заголовка
0967
if
(RESETheader_timer && curmillis - prevRESETheader > 500) {RESETheader_timer = 0; header = 0;}
0968
0969
if
(webasto && millis() - last_W_bus>30000) { startWebasto_OK=0;}
0970
0971
0972
0973
}
0974
0975
#ifndef debugW_bus
0976
void
Reset_gsm (){
0977
if
(millis()-prevReset>(unsigned
long
)intervalReset*60000UL){
0978
0979
digitalWrite (DTR, LOW); delay (150);
0980
SIM800.println (F(
"AT"
));
0981
timerenabledWaitOK = 1; timerWaitOK = millis();
0982
gsmOK =
false
;
0983
prevReset = millis(); }
0984
0985
if
(timerenabledWaitOK && millis()-timerWaitOK>6000) {
0986
timerenabledWaitOK = 0;
0987
if
(!gsmOK) {
0988
SIM800.println (F(
"AT"
)); timerenabledWaitOK = 1; timerWaitOK = millis();
0989
errors++;
if
(errors>4) errors = 4;
0990
0991
}
0992
}
0993
0994
0995
if
(!gsmOK) {
0996
if
(SIM800.available()>0){
0997
char
currSymb = SIM800.read();
0998
#ifdef debugSIM800
0999
K_LINE.print (currSymb);
1000
#endif
1001
if
(
'\r'
== currSymb) {
1002
1003
if
(!currStr.compareTo(
"OK"
)) { gsmOK =
true
; timerenabledWaitOK = 0; errors=0; digitalWrite (DTR, HIGH);}
1004
currStr =
""
;
1005
}
1006
1007
else
if
(
'\n'
!= currSymb && currSymb!=0x13 && currSymb!=0x11) {currStr += String(currSymb);}}}
1008
1009
1010
if
(errors>=4) Reset();
1011
1012
}
1013
1014
1015
1016
1017
void
Reset(){
1018
1019
if
(!resettimer) {digitalWrite (ResetGSM, RelayON); resettimer = 1; resetTimer = millis();}
1020
else
if
(millis()- resetTimer>6000 ) {
1021
resettimer = 0;
1022
errors=0;
1023
ResetNumber++;
1024
EEPROM.write (ResetNumber_cell, ResetNumber);
1025
digitalWrite (ResetGSM, !RelayON);
1026
delay (3500); NastroykaGSM ();}
1027
}
1028
1029
#endif
1030
1031
1032
void
sendMessage(
const
size_t size,
const
byte
*command){
1033
1034
if
(Heater == TTC_E){
1035
const
byte
siZe = size+4;
1036
byte
Mes[siZe];
1037
byte
Checksum = 0;
1038
for
(
byte
i=0; i<siZe; i++) {
1039
if
(i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);}
1040
if
(i==1) Mes[i] = 0x51;
1041
if
(i==2) Mes[i] = 0xF1;
1042
if
(i==3) {
for
(
byte
t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum+=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
1043
if
(i!=siZe-1) Checksum+=Mes[i];
1044
else
Mes[i] = Checksum;
1045
K_LINE.write (Mes[i]);
1046
}
1047
1048
}
1049
else
if
(Heater == EVO){
1050
const
byte
siZe = size+3;
1051
byte
Mes[siZe];
1052
byte
Checksum = 0;
1053
for
(
byte
i=0; i<siZe; i++) {
1054
if
(i==0) Mes[i] = 0xF4;
1055
if
(i==1) Mes[i]=size+1;
1056
if
(i==2) {
for
(
byte
t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum^=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
1057
if
(i!=siZe-1) Checksum^=Mes[i];
1058
else
Mes[i] = Checksum;
1059
K_LINE.write (Mes[i]);
1060
}
1061
1062
}
1063
}
Ниже основной скетч:
Не подскажете ссылку на библиотеку Button.h, скачал с github , почемуто ардунка ругается.
"no matching function for call to 'Button::Button()"
титановый вел button.h для кнопки от добрейшего дяди Клапы
Уже переделал , не выдержала душа поэта.
добавил транзистор управления помпой с пина 13. Управляет минусом помпы. Как раз в разъеме один пин был неиспользуемый. Но такая плата теперь уже получается двусторонняя (до этого по сути на второй стороне только перемычки были, а сейчас дорожка одна появилась), поэтому вручную тяжело сделать.
gerber8_7 плата 8_7
добавил транзистор управления помпой с пина 13. Управляет минусом помпы. Как раз в разъеме один пин был неиспользуемый. Но такая плата теперь уже получается двусторонняя (до этого по сути на второй стороне только перемычки были, а сейчас дорожка одна появилась), поэтому вручную тяжело сделать.
gerber8_7 плата 8_7
Спасибо большое . Едет комне еще один котел
Webasto Thermo Top V . Дя експеременотов
ардуино в стоке 12,2 мА
с отпаянным LED питания 10,9 мА
с отпаянным LED и стабом (диодом) 9,4мА
Вот замерил как положено от 12В. Считаю этот вопрос закрыт. 8,5 мА. Даже с 8 мгц ардуиной заморачиваться не стОит - дефицитная она в таком форм факторе. 8,5 мА - отличный показатель.
последние изменения
подготовка еепром 3.5
01
#include <EEPROM.h>
02
03
04
enum
Cells {
05
ResetNumber_cell,
//0
06
TimeWebasto_cell,
//1
07
ProtocolSTART_cell,
//2
08
StartByte_cell,
//3
09
ProtocolSTATUS_cell,
//4
10
Heater_cell,
//5
11
delta_cell,
//6
12
sizeCells,
13
TelNumber1_cell =20,
//20
14
TelNumber2_cell =40
//40
15
};
16
17
18
19
20
// возможные протоколы чтения статуса котла:
21
22
enum
ProtocolSTATUS_ {
23
STATUSBUS,
// статусы котла читаются по цифровой шине
24
ANALOG
// статусы котла считываются силами ардуино - по датчикам
25
};
26
27
28
// возможные протоколы запуска котла:
29
30
enum
ProtocolSTART_ {
31
STARTBUS,
// запуск котла происходит по цифровой шине
32
IMPULSE,
// запуск котла происходит импульсом GND (для подпайки к кнопке пуск на таймере котла)
33
POTENCIAL
// запуск котла происходит подачей потенциала +12В (пока плюс висит - котёл работает)
34
};
35
36
// возможные типы котла:
37
38
enum
Heater_ { TTC_E, VEVO, EVO, HYDRONIC};
39
40
41
/////////////// ниже здесь устанавливаем какие настройки у девайса будут по умолчанию
42
43
byte
ProtocolSTATUS = STATUSBUS;
// в данном случае статусы читаются по цифровой шине
44
byte
ProtocolSTART = STARTBUS;
// в данном случае запуск котла происходит по цифровой шине
45
byte
Heater = TTC_E;
// в данном случае тип котла Thermo Top C / E (будет шина не w-bus, а просто к-лайн, у которой настройки 10400 8N1)
46
byte
StartByte = 0x20;
// в данном случае байт на старт котла 0x20 (для шины w-bus)
47
byte
worktime = 30;
// в данном случае время цикла работы котла 30 минут
48
byte
deltaT = 45;
// разница температур улицы и выхлопа, выше которой считается, что котёл успешно стартанул
49
///////////////////////////////////////////////
50
51
52
void
setup
() {
53
54
pinMode(13, OUTPUT);
55
digitalWrite(13, 0);
56
EEPROM.write(TimeWebasto_cell, worktime);
57
EEPROM.write(ProtocolSTART_cell, ProtocolSTART);
58
EEPROM.write(ProtocolSTATUS_cell, ProtocolSTATUS);
59
EEPROM.write(Heater_cell, Heater);
60
EEPROM.write(ResetNumber_cell, 0);
61
EEPROM.write(StartByte_cell, StartByte);
62
EEPROM.write(delta_cell, deltaT);
63
for
(
int
i = sizeCells ; i < EEPROM.length() ; i++) EEPROM.write(i,
'0'
);
64
65
66
digitalWrite(13, HIGH);
67
}
68
69
void
loop
() {}
скетч ver 3.5
001
char
ver[] =
"Firmware 3.5"
;
002
003
//#define debugW_bus // раскоментировать эту строку для отладки w-bus, при этом нужно вынуть SIM800 и подключить юсб<->уарт, т.к. отладка идёт в УАРТ, предназначенный для GSM
004
//#define debugSIM800
005
006
#include <EEPROM.h>
007
enum
Cells {
008
ResetNumber_cell,
//0
009
TimeWebasto_cell,
//1
010
ProtocolSTART_cell,
//2
011
StartByte_cell,
//3
012
ProtocolSTATUS_cell,
//4
013
Heater_cell,
//5
014
delta_cell,
//6
015
TelNumber1_cell =20,
//20
016
TelNumber2_cell =40
//40
017
};
018
019
#include <Button.h>
020
Button test;
021
022
// для GSM модуля *********************
023
024
String currStr =
""
;
025
String TelNumber[] = {
""
,
"000000000000"
,
"000000000000"
,
"000000000000"
};
026
027
bool
SaveNumber2 = 0;
// флаг когда необходима запись номера#2, он true
028
byte
isStringMessage = 0;
029
byte
KTOzapros = 0;
030
byte
KTOreport = 1;
031
032
//************************
033
034
035
036
//_______Все для цикла void voltmetr()*************
037
float
vout = 0.0;
// Напряжение на входе аналового входа
038
float
Vpit = 0.0;
// Измеряемое напряжение на выходе ИБП
039
int
volt = 0;
// Напряжение на входе АЦП
040
041
042
// дефайны входов выходов на соостветствующие пины ************** (плата весий 8.5-8.7)
043
044
#define OutWebasto_12V 2 // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера).
045
#define Dallas_pin 3 // пин шины OneWire для датчиков даллас
046
#define DopOn 4 // сюда доп канал от сигналки на включение вебасто
047
#define DopOff 5 // сюда доп канал от сигналки на выключение вебасто
048
#define Ohrana 6 // Сюда состояние охраны сигналки
049
#define Trevoga 7 // Сюда состояние тревоги
050
#define IGN 8 // Сюда состояние зажигания
051
#define Sost 9 // Сюда состояние вебасто (+12В когда работает)
052
#define ResetGSM 12 // пин ресета GSM подключен к реле, разрывающее питание модуля.
053
#define Eng 14 // (А0) Сюда состояние работы ДВС
054
#define StatusWebastoLED 15 // (А1) пин LED индикация включенности котла
055
#define StartButtonpin 16 // (А2) пин тактовой кнопки вкл/выкл котла
056
#define DTR 17 // пин (А3), управляющий энергосберегающим режимом GSM модуля
057
#define StartEng 18 // (A4) это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
058
#define OutWebasto_GndImp 19 // (A5) это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).
059
#define Voltmeter_pin A7 // пин, которым измеряем напряжение питания
060
#define StartButton 0 // программный номер тактовой кнопки вкл/выкл котла
061
const
bool
RelayON = 1;
// логика управления реле ресета GSM, в данном случае включается высоким уровнем на пине
062
#define GSM_RX 10 // пин софт RX Arduino для соединения с TX модуля SIM800
063
#define GSM_TX 11 // пин софт TX Arduino для соединения с RX модуля SIM800
064
065
/*
066
067
#define Dallas_pin 2 // пин шины OneWire для датчиков даллас
068
#define OutWebasto_12V 3 // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера).
069
#define DopOn 4 // сюда доп канал от сигналки на включение вебасто
070
#define DopOff 5 // сюда доп канал от сигналки на выключение вебасто
071
#define Ohrana 6 // Сюда состояние охраны сигналки
072
#define Trevoga 7 // Сюда состояние тревоги
073
#define StartEng 8 // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
074
#define Sost 9 // Сюда состояние вебасто (+12В когда работает)
075
#define IGN 10 // Сюда состояние зажигания
076
#define Eng 11 // Сюда состояние работы ДВС
077
#define OutWebasto_GndImp 12 // это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).
078
#define StatusWebastoLED 13 // пин индикация включенности котла
079
#define ResetGSM 16 // пин ресета GSM (A2) подключен к реле, разрывающее питание модуля.
080
#define StartButtonpin 17 // пин тактовой кнопки вкл/выкл котла
081
#define DTR 19 // пин (А5), управляющий энергосберегающим режимом GSM модуля
082
#define StartButton 0 // программный номер тактовой кнопки вкл/выкл котла
083
const
bool
RelayON = 0;
// логика управления реле ресета GSM, в данном случае включается низким уровнем на пине
084
#define GSM_RX 14 // пин софт RX Arduino для соединения с TX модуля SIM800
085
#define GSM_TX 15 // пин софт TX Arduino для соединения с RX модуля SIM800
086
087
*/
088
089
#include <SoftwareSerial.h>
090
091
#ifndef debugW_bus
092
SoftwareSerial SIM800 (GSM_RX, GSM_TX);
//Rx, Tx //UART для соединения с GSM модулем
093
#else
094
SoftwareSerial DEBUG (GSM_RX, GSM_TX);
//Rx, Tx //UART для соединения с отладкой (используется юсб<->УАРТ вместо SIM800)
095
#endif
096
097
098
099
// для шины 1-wire и датчиков DS18B20****************
100
101
#include <OneWire.h> // библиотека для DS18B20
102
OneWire ds(Dallas_pin);
// датчики DS18B20 на нужный пин
103
104
enum
TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp};
// перечисление нужных температур (в конце размер массива температур)
105
106
// ниже соответствие адресов датчиков различным температурам (изначально 0х14=20*С)
107
byte
DS18B20 [size_arrayTemp][10] = {
108
{0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1, VyhlopC, 0x14},
109
{0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D, EngineC, 0x14},
110
{0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48, UlicaC, 0x14},
111
{0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1, SalonC, 0x14}
112
};
113
byte
delta = 50;
// разница температур выхлопа и улицы, выше которой считается, что пламя в котле есть.
114
115
// для организации W-BUS и различные таймеры********************
116
117
#define K_LINE Serial //UART для соединения с шиной котла
118
#define TX 1
119
120
byte
header = 0;
// состояние заголовка
121
byte
message_size = 0;
// размер тела принимаемого сообщения, кол-во байт
122
123
byte
j = 2;
// инкремент
124
byte
n = 2;
125
const
byte
bufsize = 140;
// размер буфера принятого сообщения
126
byte
buf [bufsize] = {0};
// буфер принятого сообщения
127
byte
checksum = 0;
// контрольная сумма входящего сообщения
128
uint32_t curmillis = 0;
// снимок системного времени
129
byte
delaybyte_TX = 0 ;
// задержка между байтами отправляемого сообщения
130
byte
waitbyte_RX = 1;
// задержка, мс для успевания заполнения буфера RX (подрегулировать в зависимости от уровня жизнидеятельности на Марсе)
131
uint32_t timerdelay = 0;
// таймер ожидания байт (для успевания заполнения буфера УАРТ)
132
bool
Delay = 0;
// таймер ожидания байт (для успевания заполнения буфера УАРТ)
133
#define TIMER_DELAY Delay = 0; timerdelay = curmillis // включение этого таймера
134
135
uint32_t prevRESETheader=0;
// таймер сброса заголовка если в момент приёма сообщения данные оборвались
136
bool
RESETheader_timer = 0;
// таймер сброса заголовка если в момент приёма сообщения данные оборвались
137
138
139
// ниже строка даже не спрашивайте что это)) это так... кот по клаве прошёл
140
#define ConstArray(...) [](void)->size_t{ const byte _[] = { __VA_ARGS__}; return sizeof(_)/sizeof(_[0]); }(),[](void)->const byte *{ const static byte _[] = { __VA_ARGS__}; return _; }()
141
142
// команды для котлов ЭВО
143
byte
StartByte = 0x20;
144
#define HEATER_START ConstArray (StartByte, 0x3B)
145
#define HEATER_PRESENCE ConstArray (0x44, StartByte, 0x00)
146
#define HEATER_STOP ConstArray (0x10)
147
#define HEATER_STATUS_VEVO ConstArray (0x50, 0x05)
148
#define HEATER_STATUS_EVO ConstArray (0x50, 0x30, 0x0A, 0x10)
149
150
// команды для котлов ТТС/TTE
151
#define START_SESSION ConstArray (0x81)
152
#define REQUEST_2A10101 ConstArray (0x2A, 0x01, 0x01)
153
#define REQUEST_2A10102 ConstArray (0x2A, 0x01, 0x02)
154
#define REQUEST_2A10105 ConstArray (0x2A, 0x01, 0x05)
155
#define REQUEST_DTC ConstArray (0xA1)
156
#define START_TTC ConstArray (0x31, 0x22, 0xFF)
157
#define STOP_TTC ConstArray (0x31, 0x22, 0x00)
158
159
160
enum
ProtocolSTATUS_ {STATUSBUS, ANALOG};
// возможные протоколы чтения статуса котла
161
enum
ProtocolSTART_ {STARTBUS, IMPULSE, POTENCIAL};
// возможные протоколы запуска котла
162
enum
Heater_ {TTC_E, VEVO, EVO, HYDRONIC};
// тип котла
163
164
byte
ProtocolSTATUS = STATUSBUS;
165
byte
ProtocolSTART = STARTBUS;
166
byte
Heater = EVO;
167
168
byte
w_bus_init = 0;
//флаг проведена или нет инициализация шины w-bus (25мс LOW, 25мс HIGH для ЭВО
169
// либо 300ms LOW, 50ms HIGH, 25ms LOW, 3025ms HIGH для TTC
170
bool
flagStartPresence = 1;
//флаг что отправляем в момент периодического поддержания связи W-Bus status или start
171
byte
StartMessageRepeat = 0;
//количество отправленных сообщений на старт котла
172
byte
StopMessageRepeat = 0;
//количество отправленных сообщений на остановку котла
173
174
byte
TimeWebasto = 30;
//время работы котла, = 30мин
175
uint32_t EndReportMillis = 0;
//переменная для таймера отправки отчета об успешности запуска котла
176
uint32_t EndReportEngine = 0;
//переменная для таймера отправки отчета об успешности запуска ДВС
177
uint32_t Prev_PeriodW_BusMessage = 0;
//переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus
178
uint32_t Prev_PeriodW_BusStartStop = 0;
//переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus
179
uint32_t prevdelSMS = 0;
//переменная для таймера периодического удаления СМС
180
uint32_t prevVpit = 0;
//переменная для таймера периодического измерения напряжения АКБ
181
182
//для таймера создания импульса GND - для протокола запуска котла импульсом GND
183
uint32_t timer=0;
184
bool
timerenabled=
false
;
185
#define TIMEREXPIRED (curmillis-timer)>800
186
187
188
//для таймера - старт двигателя - импульс +5В на транзистор, в итоге минусовой импульс 1.5 сек на вход событий сигналки для запуска ДВС)
189
uint32_t timerStartEng=0;
bool
timerenabledStartEng=
false
;
190
#define TIMEREXPIRED_StartEng (millis()-timerStartEng)>1500
191
192
193
//для таймера - старт котла по W-BUS )
194
uint32_t timerStart_W_BUS=0;
bool
timerenabledStart_W_BUS=
false
;
195
#define TIMEREXPIRED_Start_W_BUS (curmillis-timerStart_W_BUS)> (uint32_t)TimeWebasto * 60000UL
196
197
//для таймера инита шины W-BUS
198
uint32_t timerInit = 0;
bool
timerInitflag = 0;
199
200
//для таймера контроля жив или мертв обмен по W-bus
201
uint32_t last_W_bus = 0;
bool
kotel_zhiv = 0;
202
203
//ниже всё для организации ресета GSM модуля, если с ним отсутствует связь****************
204
205
uint32_t prevReset=0;
// для таймера периодичности проверки (командой "АТ")
206
byte
intervalReset = 2;
// каждые столько мин будет проверка жив ли GSM модуль
207
uint32_t timerWaitOK=0;
// для таймера ожидания ответа после посылки команды "АТ"
208
bool
timerenabledWaitOK=
false
;
// для таймера ожидания ответа после посылки команды "АТ"
209
byte
errors=0;
// количество неответов от GSM модуля
210
bool
gsmOK = 1;
// флаг есть связь с GSM модулем или нет
211
bool
resettimer = 0;
// для таймера удерживания реле в режиме сброс питания
212
uint32_t resetTimer=0;
// для таймера удерживания реле в режиме сброс питания
213
byte
ResetNumber = 0;
// количество ресетов GSM модуля для статистики (хранится в еепром)
214
215
//**************************
216
217
//Основные переменные
218
bool
webasto = 0;
// флаг команды на работу Webasto. 0 - котел выключен, 1 - котел включен
219
bool
startWebasto_OK = 0;
// флаг успешного запуска котла
220
bool
report =
false
;
// флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
221
bool
reportEngine =
false
;
// флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
222
bool
engine =0;
// флаг работает ли ДВС или нет
223
bool
ignition=0;
// флаг включено ли зажигание или нет
224
bool
ohrana=0;
// флаг включена ли охрана или нет
225
bool
trevoga=0;
// флаг включена ли тревога или нет
226
bool
alarmSMS = 0;
// флаг отправлена ли смс о тревоге или нет
227
228
229
// СТАРТОВЫЙ ЦИКЛ
230
231
void
setup
()
232
{
233
234
235
delay (3500);
236
237
238
test.NO();
239
test.pullUp();
240
test.duration_bounce ( 50);
241
test.duration_click_Db ( 250);
242
test.duration_inactivity_Up(5000);
243
test.duration_inactivity_Dn(1000);
244
test.duration_press ( 500);
245
test.button(StartButtonpin);
// в скобках пин тактовой кнопки вкл/выкл котла (программный номер у неё будет 0)
246
247
pinMode (DopOn, INPUT_PULLUP);
248
pinMode (DopOff, INPUT_PULLUP);
249
pinMode (Sost, INPUT_PULLUP);
250
pinMode (Ohrana, INPUT_PULLUP);
251
pinMode (Trevoga, INPUT_PULLUP);
252
pinMode (IGN, INPUT_PULLUP);
253
pinMode (Eng, INPUT_PULLUP);
254
255
pinMode (OutWebasto_12V, OUTPUT); digitalWrite (OutWebasto_12V, LOW);
256
pinMode (StartEng, OUTPUT); digitalWrite (StartEng, LOW);
257
pinMode (13, OUTPUT); digitalWrite (13, LOW);
258
pinMode (StatusWebastoLED, OUTPUT); digitalWrite (StatusWebastoLED, LOW);
259
pinMode (OutWebasto_GndImp, OUTPUT); digitalWrite (OutWebasto_GndImp, HIGH);
260
pinMode (DTR, OUTPUT); digitalWrite (DTR, HIGH);
// делаем высокий, а низкий уровень будет для пробуждения GSM из "спячки"
261
pinMode (ResetGSM, OUTPUT); digitalWrite (ResetGSM, !RelayON);
// реле ресет на данный момент делаем "неактивно"
262
263
#ifndef debugW_bus
264
SIM800.begin(19200);
// сериал соединение для gsm модуля
265
delay(100);
266
NastroykaGSM ();
267
#else DEBUG.begin(9600);
268
#endif
269
270
TimeWebasto = EEPROM.read(TimeWebasto_cell);
271
ProtocolSTART = EEPROM.read(ProtocolSTART_cell);
272
ProtocolSTATUS = EEPROM.read(ProtocolSTATUS_cell);
273
ResetNumber = EEPROM.read(ResetNumber_cell);
274
StartByte = EEPROM.read(StartByte_cell);
275
Heater = EEPROM.read(Heater_cell);
276
delta = EEPROM.read(delta_cell);
277
for
(
int
i=0; i<12; i++) TelNumber[1][i] = EEPROM.read (i+TelNumber1_cell);
278
for
(
int
i=0; i<12; i++) TelNumber[2][i] = EEPROM.read (i+TelNumber2_cell);
279
280
#ifndef debugSIM800
281
if
(Heater == EVO || Heater == VEVO) K_LINE.begin(2400, SERIAL_8E1);
282
else
if
(Heater == TTC_E) K_LINE.begin(10400);
283
#else
284
K_LINE.begin(9600);
285
#endif
286
287
288
for
(
byte
i=0; i<20; i++) {digitalWrite (13, !digitalRead(13)); delay (80);}
289
digitalWrite (13,0);
290
}
291
292
293
void
loop
() {
294
curmillis = millis();
295
test.read();
296
297
digitalWrite (StatusWebastoLED, webasto);
298
digitalWrite (13, startWebasto_OK);
299
//digitalWrite (13, webasto);
300
301
302
//если нажали тактовую кнопку меняем состояние котла на противоположное
303
if
(test.event_press_short (StartButton)) {
304
if
(!webasto) {StartWebasto(); report =
false
;}
305
else
StopWebasto();
306
}
307
308
if
(ProtocolSTATUS==ANALOG) {
if
(Temper(VyhlopC) - Temper(UlicaC) > delta) startWebasto_OK = 1;
309
else
startWebasto_OK = 0;}
310
311
if
(ProtocolSTART==IMPULSE) webasto = !digitalRead (Sost);
312
313
Heater_BUS();
314
315
//ниже для таймера старта котла по шине и аналогу
316
317
if
(timerenabledStart_W_BUS && TIMEREXPIRED_Start_W_BUS) StopWebasto();
318
319
//ниже для таймера создания импульса на старт ДВС
320
321
if
(timerenabledStartEng && TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=
false
;}
322
323
engine = !digitalRead (Eng);
324
ignition= !digitalRead (IGN);
325
ohrana= !digitalRead (Ohrana);
326
trevoga= !digitalRead (Trevoga);
327
328
if
(webasto && report) timerReport ();
329
if
(reportEngine) timerReportEngine ();
330
if
(!ohrana) alarmSMS =
false
;
331
332
#ifndef debugW_bus
333
if
(trevoga && !alarmSMS) AlarmSMS ();
334
if
(gsmOK)readSMS();
335
Reset_gsm();
336
delSMS();
337
#endif
338
339
WebastoOprosImpulse ();
340
izmereniya();
341
342
343
}
344
345
void
izmereniya() {
346
347
if
(millis()-prevVpit>7000){
348
349
//измерение напряжения борт сети
350
if
(ProtocolSTATUS==ANALOG){
351
volt = analogRead(Voltmeter_pin);
352
vout = (volt * 4.13) / 1024;
353
Vpit = vout / (9700.0/(98930.0+9700.0));
// По формуле Vpit = vout / (R2/(R1+R2))
354
if
(Vpit<0.09) Vpit=0.0;
// Округление до нуля
355
}
356
357
// ниже измерение датчиков даллас
358
static
bool
n=0;
// флаг работы: запрос температуры или её чтение
359
n=!n;
360
if
(n) {ds.reset();
// сброс шины
361
ds.write(0xCC);
// обращение ко всем датчикам
362
ds.write(0x44);
// начать преобразование (без паразитного питания)
363
}
364
else
{
365
for
(
byte
i=0; i<size_arrayTemp; i++){
366
int
Temper_ = 20;
byte
buff[9];
367
ds.reset();
368
ds.select(DS18B20[i]);
369
ds.write(0xBE);
// чтение регистров датчиков
370
for
(
byte
j=0; j<9; j++) buff[j]=ds.read();
// читаем все 9 байт от датчика
371
ds.reset();
372
if
(OneWire::crc8(buff, 8) == buff[8]){
// если контрольная сумма совпадает
373
Temper_ = buff[0]|(buff[1]<<8);
// читаем температуру из первых двух байт (остальные были нужны только для проверки CRC)
374
Temper_ = Temper_ / 16;
375
if
(Temper_<150 && Temper_>-55) DS18B20[i][9] = Temper_;
376
}}}
377
378
379
prevVpit=millis();
380
}}
381
382
383
384
int8_t Temper (
const
byte
&addressTemp) {
for
(
byte
j=0; j<size_arrayTemp; j++){
if
(DS18B20[j][8]==addressTemp)
return
(int8_t)DS18B20[j][9];}
return
-99;}
385
386
387
388
void
WebastoOprosImpulse (){
389
390
// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла
391
392
if
(timerenabled) {
if
(TIMEREXPIRED) {digitalWrite (OutWebasto_GndImp, HIGH); timerenabled=
false
;}}
393
else
{
if
(!digitalRead (DopOn) && !webasto) {StartWebasto(); KTOreport = 1;}
394
if
(!digitalRead (DopOff) && webasto) StopWebasto();
395
}}
396
397
398
// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
399
void
timerReport () {
400
if
(millis() - EndReportMillis > 360000UL)
401
{EndReportMillis = millis(); report =
false
; SMSzapros(); }}
402
403
// цикл таймера отправки отчета об успешности запуска ДВС (отчёт через 60сек после старта)
404
void
timerReportEngine () {
405
if
(millis() - EndReportEngine > 90000ul)
406
{EndReportEngine = millis(); reportEngine =
false
; SMSzapros();}}
407
408
409
410
411
#ifndef debugW_bus
412
void
NastroykaGSM () {
413
digitalWrite (DTR, LOW);
// выводим из спячки GSM модуль
414
delay (150);
415
SIM800.println(F(
"AT"
));
//просто AT для разогреву
416
delay(250);
417
SIM800.println(F(
"AT+CMGF=1"
));
//устанавливает текстовый режим смс-сообщения
418
delay(250);
419
SIM800.println(F(
"AT+IFC=0, 0"
));
//отключает программный контроль потоком передачи данных
420
delay(250);
421
SIM800.println(F(
"AT+GSMBUSY=1"
));
//запрет всех входящих звонков
422
delay(250);
423
SIM800.println(F(
"AT+CNMI=1,2,2,1,0"
));
//включает оповещение о новых сообщениях
424
delay(250);
425
SIM800.println(F(
"AT+CMGDA=\"DEL ALL\""
));
// удаляем все смс, ки
426
delay(1500);
427
SIM800.println(F(
"AT+CSCLK=1"
));
//включает энергосберегающий режим
428
delay(150);
429
digitalWrite (DTR, HIGH);
// вводим в спячку GSM модуль высоким уровнем на пине DTR
430
431
}
432
433
void
startSMS(
byte
stat)
//__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
434
{
435
if
(stat==0) stat = KTOreport;
436
digitalWrite (DTR, LOW);
// выводим из спячки GSM модуль
437
delay (150);
438
SIM800.print(F(
"AT+CMGF=1\r"
));
439
delay(200);
440
SIM800.print(F(
"AT+CMGS=\""
)); SIM800.print(TelNumber[stat]); SIM800.println(
"\""
);
441
delay(200);
442
}
443
444
445
446
void
EndSMS ()
447
{
448
SIM800.println((
char
)26);
// Команда отправки СМС
449
delay(1500);
450
digitalWrite (DTR, HIGH);
// вводим в спячку SIM800 модуль
451
452
}
453
454
void
delSMS ()
455
{
456
if
(millis() - prevdelSMS > 7200000ul){
//раз в 2 часа
457
digitalWrite (DTR, LOW);
// выводим из спячки SIM800 модуль
458
delay (150);
459
SIM800.print(F(
"AT+CMGDA=\"DEL ALL\"\r"
));
// удаляем все смс, ки
460
delay(1500);
461
digitalWrite (DTR, HIGH);
// вводим в спячку SIM800 модуль
462
delay (150);
463
464
prevdelSMS = millis();}
465
}
466
467
468
void
readSMS()
//_____Цикл чтения входящих СМС-сообщений______________
469
{
470
if
(!SIM800.available())
return
;
471
char
currSymb = SIM800.read();
472
#ifdef debugSIM800
473
K_LINE.print (currSymb);
474
#endif
475
if
(
'\r'
== currSymb)
476
{
477
if
(isStringMessage!=0&&isStringMessage!=3)
//если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
478
{
479
if
(!currStr.compareTo(
"ZAPROS"
)) {SMSzapros();}
// Передача параметров по СМС
480
else
if
(!currStr.compareTo(
"ZAPROSTEL"
)) {SMSzaprosTEL();}
// Передача номеров телефонов пользователей по СМС
481
else
if
(!currStr.compareTo(
"Service-info"
)) {ServiceINFO();}
// Передача сервисной информации по СМС
482
else
if
(!currStr.compareTo(
"GSMResets-0"
)) {ResetNumber=0; EEPROM.write (ResetNumber_cell, ResetNumber); ServiceINFO();}
//сброс счетчика ресетов GSM модуля
483
else
if
(!currStr.compareTo(
"Version"
)) {startSMS(isStringMessage); SIM800.println (ver); EndSMS ();}
//запрос версии ПО
484
485
else
if
(!currStr.compareTo(
"Webasto-ON"
)) { startSMS(isStringMessage); SIM800.println(F(
"Webasto "
));
486
487
if
(!webasto) {StartWebasto (); KTOreport = isStringMessage;}
488
else
SIM800.println(F(
"uzhe "
)); SIM800.println (F(
"vkluchena"
)); EndSMS();}
489
490
491
else
if
(!currStr.compareTo(
"Webasto-OFF"
)) {startSMS(isStringMessage); SIM800.println(F(
"Webasto "
));
492
if
(webasto)StopWebasto ();
// если получили команду на выключение и вебаста в настоящий момент включена - выключаем
493
else
SIM800.println(F(
"uzhe "
)); SIM800.println(F(
"otkluchena"
));EndSMS();}
494
495
// если получили команду на включение ДВС и он в настоящий момент выключен - включаем
496
else
if
(!currStr.compareTo(
"Engine-ON"
)) {startSMS(isStringMessage); SIM800.println(F(
"Dvigatel "
));
497
if
(!engine) { digitalWrite (StartEng, HIGH); timerStartEng=millis(); timerenabledStartEng=
true
; reportEngine =
true
; EndReportEngine = timerStartEng; KTOreport = isStringMessage;}
498
else
SIM800.println(F(
"uzhe "
)); SIM800.println(F(
"start"
)); EndSMS();}
499
500
else
if
(!currStr.compareTo(
"Engine-OFF"
)) {startSMS(isStringMessage); SIM800.println(F(
"Dvigatel "
));
501
if
(engine){ digitalWrite (StartEng, HIGH); timerStartEng=millis(); timerenabledStartEng=
true
; reportEngine =
false
;}
// если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
502
else
SIM800.println(F(
"uzhe "
)); SIM800.println(F(
"ostanovlen"
)); EndSMS();}
503
504
else
if
(!currStr.compareTo(
"Impulse"
)) {
if
(!webasto) {ProtocolSTART = IMPULSE; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);
505
startSMS(isStringMessage); SIM800.println(F(
"zapusk GND_impulse"
)); EndSMS();}}
506
507
else
if
(!currStr.compareTo(
"Startbus"
)) {
if
(!webasto) {ProtocolSTART = STARTBUS; EEPROM.write(ProtocolSTART_cell,ProtocolSTART); webasto = 0;
508
startSMS(isStringMessage); SIM800.println(F(
"zapusk BUS"
)); EndSMS();}}
509
510
else
if
(!currStr.compareTo(
"Potencial"
)) {
if
(!webasto) {ProtocolSTART = POTENCIAL; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);
511
startSMS(isStringMessage); SIM800.println(F(
"zapusk +12V Potencial"
)); EndSMS();}}
512
513
else
if
(currStr.endsWith(
"Status"
)) {
if
(!webasto) {
byte
st = currStr.toInt();
if
(st >= STATUSBUS && st<=ANALOG )ProtocolSTATUS = st; EEPROM.write(ProtocolSTATUS_cell,ProtocolSTATUS);
514
startSMS(isStringMessage); SIM800.print (F(
"Status: "
));
515
if
(ProtocolSTATUS == 0)SIM800.println(F(
"BUS"
));
516
else
if
(ProtocolSTATUS == 1)SIM800.println(F(
"Analog"
));
517
EndSMS();}}
518
519
520
else
if
(currStr.endsWith(
"HeaterType"
)) {
if
(!webasto) {
byte
st = currStr.toInt();
if
(st >= TTC_E && st<=HYDRONIC) Heater = st; EEPROM.write(Heater_cell,Heater);
521
startSMS(isStringMessage); SIM800.print (F(
"Heater: "
));
522
if
(Heater == 0)SIM800.println(F(
"TTC_E"
));
523
else
if
(Heater == 1)SIM800.println(F(
"VEVO"
));
524
else
if
(Heater == 2)SIM800.println(F(
"EVO"
));
525
else
if
(Heater == 3)SIM800.println(F(
"HYDRONIC"
));
526
EndSMS();}}
527
528
else
if
(currStr.endsWith(
"Delta"
)) {
if
(!webasto) {delta = currStr.toInt();
//
529
EEPROM.write(delta_cell, delta); startSMS(isStringMessage);
530
SIM800.print(F(
"DeltaT: "
)); SIM800.print(delta); SIM800.print(F(
"*C"
)); EndSMS();}}
531
532
533
534
else
if
(currStr.endsWith(
"min"
)) {
if
(!webasto) {TimeWebasto = currStr.toInt();
// для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
535
if
(TimeWebasto>59) TimeWebasto = 59;
536
if
(TimeWebasto<=15) TimeWebasto = 15;
537
EEPROM.write(TimeWebasto_cell,TimeWebasto);
538
startSMS(isStringMessage); SIM800.print(F(
"Webasto time: "
)); SIM800.print(TimeWebasto); SIM800.print(F(
"min"
)); EndSMS();}}
539
540
else
if
(currStr.endsWith(
"StartByte"
)) {
byte
Z =currStr.toInt();
if
(Z>=0x14 && Z<=0x17) StartByte= Z+12;
541
startSMS(isStringMessage); SIM800.print(F(
"StartByte: "
)); SIM800.print(StartByte, HEX); SIM800.print(F(
"h"
)); EndSMS();}
542
543
else
if
(!currStr.compareTo(
"ResetNumbers"
)) {
if
(isStringMessage == 1) {startSMS(isStringMessage); SIM800.println(F(
"Phone numbers are erased"
)); EndSMS();
544
545
TelNumber[1] =
"000000000000"
; TelNumber[2] =
"000000000000"
;
for
(
int
i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell, TelNumber[1][i]); EEPROM.write (i+TelNumber2_cell, TelNumber[2][i]); }}}
546
547
else
if
(!currStr.compareTo(
"WriteNumber2"
)&& isStringMessage == 1) {
548
SaveNumber2 = 1; startSMS(isStringMessage); SIM800.println(F(
"Otpravte lyuboye SMS s nomera#2 dlya sohraneniya nomera"
)); EndSMS();}
549
550
551
552
553
else
if
(!currStr.compareTo(
"Balance"
)) SMSbalance();
554
isStringMessage = 0;
555
}
556
557
558
else
if
(isStringMessage==3){
if
(!currStr.compareTo(
"WriteNumber1"
)) { TelNumber[1] = TelNumber[3];
for
(
int
i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell, TelNumber[3][i]);}
559
startSMS(1); SIM800.println(F(
"Tel Number#1 is saving in memory"
)); SIM800.print(
"Tel#1: "
); SIM800.println (TelNumber[1]); EndSMS();
560
}
561
else
if
(!currStr.compareTo(
"ZAPROS"
)) { SMSzapros();}
562
else
if
(!currStr.compareTo(
"ZAPROSTEL"
)) { SMSzaprosTEL();}
// Передача номеров телефонов пользователей по СМС
563
isStringMessage = 0;
564
565
}
566
567
568
569
570
else
if
(isStringMessage==0) {
if
(TelNumber[1]!=
"000000000000"
&& !SaveNumber2 && TelNumber[1]!=
"яяяяяяяяяяяя"
){
571
572
if
(currStr.startsWith(
"+CMT: \""
+TelNumber[1])) { isStringMessage = 1; KTOzapros = 1; }
573
else
if
(currStr.startsWith(
"+CMT: \""
+TelNumber[2])) { isStringMessage = 2; KTOzapros = 2; }
574
else
if
(currStr.startsWith(
"+CUSD: 0,"
))
//если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
575
{
576
startSMS(KTOzapros);
577
SIM800.print (currStr);
578
EndSMS();
579
}
580
}
581
582
else
if
(currStr.startsWith(
"+CMT:"
) && !SaveNumber2) { isStringMessage = 3;
for
(
int
i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];}}
583
else
if
(currStr.startsWith(
"+CMT:"
) && SaveNumber2) {
for
(
int
i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];} TelNumber[2] = TelNumber[3];
for
(
int
i=0; i<12; i++) {EEPROM.write (i+TelNumber2_cell, TelNumber[3][i]);}
584
startSMS(2); SIM800.println(F(
"Vash nomer sochranyon kak Number#2 v pamyati!"
));
585
SIM800.print(F(
"Tel#1: "
)); SIM800.println(TelNumber[1]); SIM800.print(F(
"Tel#2: "
)); SIM800.println (TelNumber[2]); EndSMS(); SaveNumber2 = 0; }
586
587
}
588
589
currStr =
""
;
590
}
591
592
else
if
(
'\n'
!= currSymb && currSymb!=0x13 && currSymb!=0x11) currStr += String(currSymb);
593
}
594
595
596
597
void
SMSzaprosTEL(){
598
startSMS(isStringMessage);
599
PrintNumbers ();
600
EndSMS();
601
}
602
603
604
void
SMSbalance() {
605
digitalWrite (DTR, LOW);
// выводим из спячки SIM800 модуль
606
delay (150);
607
SIM800.print(F(
"AT+CMGF=1\r"
));
608
delay(200);
609
SIM800.println (F(
"AT+CUSD=1,\"#100#\""
));
// команда на замену на транслит *111*6*2# у МТС
610
delay(1500);
611
digitalWrite (DTR, HIGH);
// вводим в спячку SIM800 модуль
612
delay (150);
613
614
615
}
616
617
618
void
AlarmSMS() {
for
(
byte
i = 0; i<2; i++) {startSMS(i+1); SIM800.println (F(
"Vnimanie!!! Trevoga!!! Sirena Vkl!"
)); EndSMS();} alarmSMS =
true
;}
619
620
#endif
621
622
void
PrintNumbers () {
for
(
byte
i=0; i<2; i++) {SIM800.print(F(
"Tel#"
)); SIM800.print (i+1); SIM800.print(F(
" "
)); SIM800.println(TelNumber[i+1]);}}
623
624
void
SMSzapros()
625
626
{
627
#ifndef debugW_bus
628
startSMS(isStringMessage);
629
if
(isStringMessage == 3){
630
631
SIM800.println (F(
"Tel.number#1 not has been save in memory"
));
632
SIM800.println (F(
"For save Tel#1 send SMS command \"WriteNumber1\""
));
633
PrintNumbers ();
634
}
635
636
637
638
639
else
{
640
641
SIM800.print (F(
"Webasto "
)); on_off (webasto);
642
if
(webasto) {
643
SIM800.print (F(
"StartWebasto "
));
644
if
(startWebasto_OK) SIM800.println (F(
"OK"
));
645
else
SIM800.println (F(
"FAIL"
));}
646
SIM800.print (F(
"Engine "
)); on_off (engine);
647
SIM800.print (F(
"IGN "
)); on_off (ignition);
648
SIM800.print (F(
"Ohrana "
)); on_off (ohrana);
649
if
(trevoga) SIM800.println (F(
"Vnimanie!!! Trevoga!!! Sirena Vkl!"
));
650
651
SIM800.print(F(
"Battery: "
)); SIM800.print (Vpit); SIM800.println(F(
"V"
));
652
653
SIM800.print(F(
"Engine: "
)); SIM800.print (Temper(EngineC)); grad ();
654
SIM800.print(F(
"Vyhlop: "
)); SIM800.print (Temper(VyhlopC)); grad ();
655
SIM800.print(F(
"Ulica: "
)); SIM800.print (Temper(UlicaC)); grad ();
656
SIM800.print(F(
"Salon: "
)); SIM800.print (Temper(SalonC)); grad ();
657
658
659
660
}
661
EndSMS();
662
#endif
663
}
664
665
void
on_off (
const
bool
&stat) {
if
(stat) SIM800.println (F(
"ON"
));
else
SIM800.println (F(
"OFF"
)); }
666
void
grad () {SIM800.println (F(
"*C"
)); }
667
668
void
ServiceINFO(){
669
startSMS(isStringMessage);
670
SIM800.print(F(
"StartByte: "
));
671
if
(ProtocolSTART==IMPULSE) SIM800.println(F(
"GND Imp"
));
672
else
if
(ProtocolSTART==STARTBUS) {SIM800.println(F(
"BUS"
));
673
if
(Heater== VEVO || Heater== EVO) {SIM800.print(F(
"StartByte: 0x"
)); SIM800.println (StartByte, HEX);}}
674
else
if
(ProtocolSTART==POTENCIAL) SIM800.println(F(
"Potencial+12V"
));
675
676
SIM800.print(F(
"Status: "
));
677
if
(ProtocolSTATUS==ANALOG) SIM800.println(F(
"ANALOG"
));
678
else
if
(ProtocolSTATUS==STATUSBUS) SIM800.println(F(
"BUS"
));
679
680
SIM800.print(F(
"Heater: "
));
681
if
(Heater==TTC_E) SIM800.println(F(
"TTC/E"
));
682
else
if
(Heater==VEVO) SIM800.println(F(
"VEVO"
));
683
else
if
(Heater==EVO) SIM800.println(F(
"EVO"
));
684
else
if
(Heater==HYDRONIC) SIM800.println(F(
"HYDRONIC"
));
685
686
if
(ProtocolSTART!=IMPULSE) {SIM800.print(F(
"Webasto Time: "
)); SIM800.print (TimeWebasto); SIM800.println(F(
"min"
));}
687
SIM800.print(F(
"SIM800 Resets: "
)); SIM800.println (ResetNumber);
688
689
if
(ProtocolSTART==IMPULSE) SIM800.print(F(
"DeltaT: "
)); SIM800.print(delta);SIM800.println(F(
"*C"
));
690
691
EndSMS();
692
693
}
694
695
void
StartWebasto()
696
{
697
if
(ProtocolSTART==IMPULSE){
698
699
digitalWrite (OutWebasto_GndImp, LOW);
700
timer=curmillis;
701
timerenabled=
true
;}
702
703
else
{
704
StartMessageRepeat = 0;
705
webasto = 1; digitalWrite (OutWebasto_12V, HIGH);
706
timerStart_W_BUS=millis();
707
timerenabledStart_W_BUS =
true
;}
708
709
report =
true
; EndReportMillis = millis();
710
w_bus_init = 1;
711
}
712
713
void
StopWebasto()
714
{
715
if
(ProtocolSTART==IMPULSE){ digitalWrite (OutWebasto_GndImp, LOW);
716
timer=curmillis;
717
timerenabled=
true
;}
718
719
else
{
720
StopMessageRepeat = 0;
721
webasto = 0; digitalWrite (OutWebasto_12V, LOW);
722
timerenabledStart_W_BUS =
false
;}
723
report =
false
;
724
w_bus_init = 0;
725
726
}
727
728
729
730
void
Heater_BUS (){
731
732
if
(Heater == EVO || Heater == VEVO){
733
if
(webasto) {
734
if
(StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800) && w_bus_init == 10){
735
sendMessage (HEATER_START);
736
StartMessageRepeat++;
737
Prev_PeriodW_BusStartStop = millis();
738
739
}
740
if
(StartMessageRepeat>=4){
if
(millis()-Prev_PeriodW_BusMessage>5000) {
741
742
if
(flagStartPresence) sendMessage (HEATER_PRESENCE);
743
else
{
if
(Heater == EVO) sendMessage (HEATER_STATUS_EVO);
744
if
(Heater == VEVO)sendMessage (HEATER_STATUS_VEVO);}
745
flagStartPresence = !flagStartPresence;
746
StopMessageRepeat = 0;
747
748
Prev_PeriodW_BusMessage = millis();
749
}}}
750
751
752
753
754
755
else
if
(StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
756
sendMessage (HEATER_STOP);
757
StopMessageRepeat++;
758
StartMessageRepeat = 0;
759
Prev_PeriodW_BusStartStop = millis();
760
761
762
}
763
764
765
if
(!timerInitflag && w_bus_init==1) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
766
if
( timerInitflag && (millis() - timerInit>24) && w_bus_init==1) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
767
if
( timerInitflag && (millis() - timerInit>24) && w_bus_init==2) {K_LINE.begin (2400,SERIAL_8E1 );timerInitflag = 0; w_bus_init=10; }
768
769
770
if
(K_LINE.available()){
771
772
773
// первый старт байт
774
if
(header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();
775
if
(buf[0]==0x4F){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
776
else
{header = 0; RESETheader_timer=0;}
777
}
778
779
// длина сообщения
780
if
(header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); message_size = buf[1];
if
(message_size > bufsize) message_size = bufsize; header = 4;j=2;n=2;checksum = 0;}
781
782
// пишем тело сообщения
783
if
(header == 4 && Delay && j< message_size+n) {
784
buf[j] = K_LINE.read();
785
786
if
(j<message_size+n-1) checksum^= buf[j];
// подсчёт КС
787
788
if
(j==message_size+n-1) header = 5;
789
TIMER_DELAY ; j++;}
790
791
}
// end of K_LINE.available()
792
793
// сообщение приняли, действуем
794
if
(header == 5) {TIMER_DELAY ;
795
796
for
(
byte
i = 0; i<n; i++) checksum^=buf[i];
// прибавляем к контрольной сумме старт байты
797
798
// если контрольная сумма верна:
799
if
( checksum == buf[message_size+n-1]) {
800
801
if
(buf[2]==0xD0 && buf[3]==0x05 && Heater == VEVO) {startWebasto_OK = buf[7]; last_W_bus = millis();}
// проверяем наличие пламени у VEVO
802
if
(buf[2]==0xD0 && buf[3]==0x30 && buf[6]==0x10 && Heater == EVO) {startWebasto_OK = (
bool
)buf[7]; last_W_bus = millis();}
// проверяем наличие пламени у EVO
803
804
805
}
806
807
// если контрольная сумма не совпала:
808
809
//else K_LINE.println("CRC fail!!!" );
810
811
message_size = 0; header=0; RESETheader_timer=0; j=2; checksum = 0;
812
}
813
814
815
816
817
}
// end EVO VEVO
818
819
820
else
if
(Heater == TTC_E){
821
822
823
824
825
if
(!timerInitflag && w_bus_init==1) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
826
if
( timerInitflag && (millis() - timerInit>299) && w_bus_init==1) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
827
if
( timerInitflag && (millis() - timerInit>49) && w_bus_init==2) {timerInit = millis(); digitalWrite(TX, 0); w_bus_init=3; }
828
if
( timerInitflag && (millis() - timerInit>24) && w_bus_init==3) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=4; }
829
if
( timerInitflag && (millis() - timerInit>3024) && w_bus_init==4) {K_LINE.begin (10400); timerInitflag = 0; w_bus_init=10; sendMessage (START_SESSION);}
830
831
if
(K_LINE.available()){
832
833
834
// первый старт байт
835
if
(header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();
836
if
(!bitRead (buf[0],6) && bitRead (buf[0],7)){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
837
838
}
839
840
// второй старт байт
841
if
(header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read();
if
(buf[1]==0xF1){ header = 2;}
else
{header = 0; RESETheader_timer=0;}}
842
843
// третий старт байт
844
if
(header == 2 && Delay){
845
TIMER_DELAY ;
846
buf[2]=K_LINE.read();
847
if
(buf[2]==0x51){ message_size = buf[0];
848
if
(buf[0] !=0x80) {header = 4; message_size&=~0x80; j=3; n=3;}
849
else
{header = 3; j=4;n=4;}
850
if
(message_size > bufsize) message_size = bufsize; checksum = 0;}
else
{header = 0; RESETheader_timer=0; }
851
852
}
853
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
854
if
(header == 3 && Delay){
855
TIMER_DELAY ;
856
buf[3]=K_LINE.read();
857
message_size = buf[3];
858
if
(message_size > bufsize) message_size = bufsize;
859
checksum = 0; header = 4;
860
}
861
862
// пишем тело сообщения
863
if
(header == 4 && Delay && j< message_size+n+1) {
864
buf[j] = K_LINE.read();
865
if
(j<message_size+n) checksum+= buf[j];
// подсчёт КС
866
867
if
(j==message_size+n) header = 5;
868
TIMER_DELAY ; j++;}
869
870
}
// end of K_LINE.available()
871
872
// сообщение приняли, действуем
873
if
(header == 5) {TIMER_DELAY ;
874
875
for
(
byte
i = 0; i<n; i++) checksum+=buf[i];
// прибавляем к контрольной сумме старт байты
876
877
//for (byte i=0; i<message_size+n+1; i++) {Serial.print (buf[i], HEX); Serial.print(" ");}
878
879
// если контрольная сумма верна:
880
if
(buf[message_size+n] == checksum) {
881
882
// if (buf[n]== 0xC1) Serial.println ("StartSession OK!!!");
883
884
885
886
887
}
888
889
// если контрольная сумма не совпала:
890
//else Serial.println("CRC fail!!!" );
891
message_size = 0; header=0; RESETheader_timer=0; j=3; checksum = 0;
892
}
893
894
}
// end TTC_E
895
896
// таймер ожидания байт (для успевания появления данных в буфере UART)
897
if
(!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1;
898
899
// таймер сброса заголовка если данные оборвались во время приёма заголовка
900
if
(RESETheader_timer && curmillis - prevRESETheader > 500) {RESETheader_timer = 0; header = 0;}
901
902
if
(webasto && millis() - last_W_bus>30000) { startWebasto_OK=0;}
903
904
905
906
}
907
908
#ifndef debugW_bus
909
void
Reset_gsm (){
910
if
(millis()-prevReset>(unsigned
long
)intervalReset*60000UL){
911
912
digitalWrite (DTR, LOW); delay (150);
913
SIM800.println (F(
"AT"
));
914
timerenabledWaitOK = 1; timerWaitOK = millis();
915
gsmOK =
false
;
916
prevReset = millis(); }
917
918
if
(timerenabledWaitOK && millis()-timerWaitOK>6000) {
919
timerenabledWaitOK = 0;
920
if
(!gsmOK) {
921
SIM800.println (F(
"AT"
)); timerenabledWaitOK = 1; timerWaitOK = millis();
922
errors++;
if
(errors>4) errors = 4;
923
924
}
925
}
926
927
928
if
(!gsmOK) {
929
if
(SIM800.available()>0){
930
char
currSymb = SIM800.read();
931
#ifdef debugSIM800
932
K_LINE.print (currSymb);
933
#endif
934
if
(
'\r'
== currSymb) {
935
936
if
(!currStr.compareTo(
"OK"
)) { gsmOK =
true
; timerenabledWaitOK = 0; errors=0; digitalWrite (DTR, HIGH);}
937
currStr =
""
;
938
}
939
940
else
if
(
'\n'
!= currSymb && currSymb!=0x13 && currSymb!=0x11) {currStr += String(currSymb);}}}
941
942
943
if
(errors>=4) Reset();
944
945
}
946
947
948
949
950
void
Reset(){
951
952
if
(!resettimer) {digitalWrite (ResetGSM, RelayON); resettimer = 1; resetTimer = millis();}
953
else
if
(millis()- resetTimer>6000 ) {
954
resettimer = 0;
955
errors=0;
956
ResetNumber++;
957
EEPROM.write (ResetNumber_cell, ResetNumber);
958
digitalWrite (ResetGSM, !RelayON);
959
delay (3500); NastroykaGSM ();}
960
}
961
962
#endif
963
964
965
void
sendMessage(
const
size_t size,
const
byte
*command){
966
967
if
(Heater == TTC_E){
968
const
byte
siZe = size+4;
969
byte
Mes[siZe];
970
byte
Checksum = 0;
971
for
(
byte
i=0; i<siZe; i++) {
972
if
(i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);}
973
if
(i==1) Mes[i] = 0x51;
974
if
(i==2) Mes[i] = 0xF1;
975
if
(i==3) {
for
(
byte
t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum+=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
976
if
(i!=siZe-1) Checksum+=Mes[i];
977
else
Mes[i] = Checksum;
978
K_LINE.write (Mes[i]);
979
}
980
981
}
982
else
if
(Heater == EVO || Heater == VEVO){
983
const
byte
siZe = size+3;
984
byte
Mes[siZe];
985
byte
Checksum = 0;
986
for
(
byte
i=0; i<siZe; i++) {
987
if
(i==0) Mes[i] = 0xF4;
988
if
(i==1) Mes[i]=size+1;
989
if
(i==2) {
for
(
byte
t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum^=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
990
if
(i!=siZe-1) Checksum^=Mes[i];
991
else
Mes[i] = Checksum;
992
K_LINE.write (Mes[i]);
993
}
994
995
}
996
}
инструкция пользователя в последней инстанции
ардуино в стоке 12,2 мА
с отпаянным LED питания 10,9 мА
с отпаянным LED и стабом (диодом) 9,4мА
Вот замерил как положено от 12В. Считаю этот вопрос закрыт. 8,5 мА. Даже с 8 мгц ардуиной заморачиваться не стОит - дефицитная она в таком форм факторе. 8,5 мА - отличный показатель.
Потребление даже не очем . Если в машине оборудование тяниться до 250мА смотря еще как магнитола подключена и доп .
Уже переделал , не выдержала душа поэта.
фотку! Как успехи, господа собирающие девайс?
Печатку переделал , собираю на плату , выяснилось что нет у меня лм393 в дип корпусе и реле такого нет , надо покупать, в моем городе нет торгашей радиодеталями , вернее есть небольшие лавки , где всякой хренью торгуют . типо разъемов и пультов, а серьезные с выбором микросхем и транзисторов всяких только в Иркутске , а у нас сейчас морозы под 45 градусов , ехать туда только за одной микросхемой и реле обламываюсь 90 км до Иркутска. Может кто поедет на днях , закажу им. Еще вопрос , ардуину лучше впаять на плату или на разъемах делать, и если в скетче выствить получать данные от вебасто по W-Bus . то нужно ли городить датчик температуры на выхлоп? И нужно ли в скетче впсывать калибровку на измерение напряжения в борт сети и если нужно то в какую строку?
Lm393 найдёте легко, а вот такое реле даже в у нас в многочисленных радиомагазинах бывает сложно найти, поэтому не спеша ждал из китая (можно временно пока перемычку вместо реле запаять, ну не будет ресета GSM ничё страшного, это ж перестраховка на случай зависания). Ардуину обязательно на постельки (пинхидеры), иначе не прошьёте когда LM393 будет уже запаяна (кстати её тоже можно на постель). Да и вообще ардуина лучше чтоб вытаскивалась. Датчик на выхлоп можно не городить, но t ДВС лучше вывести. В случае, если не получится данные по w-bus вытянуть, датчик на выхлоп можете позже добавить (все датчики t подключаются паралелльно, поэтому подцепитесь к шине ДВС-ного датчика). Напряжение если вытянуть по в-бус, с калибровкой можно не заморачиваться.
Приехала комне webasto top v . Теперь думаю она лучше чем старенький Тор с ? . Просто неудержался по цене 100 уе за полный комплект . Сейчас к ТТ тесту подключу гляну чё оно там . Сегодня ещё две помпы ремонтировал , додумались пеной всю плату задули . На вид как монтажная пена , только плотная . Идея появилась как вслед раз ее розрушить , кварцевой лампой . Плату сотрудника попросил вытравить. Так как сам не успиваю и.
Получается , если у меня котел TTEvo и я буду подключать по шине W-bus . то я могу кучу деталей не впаивать , те которые нужны для упавлением старыми котлами Е и С , и датчики температуры в салоне и на выхлопе мне не нужны , оставить только температуру двигателя и забортную , и получается можно родной овальный пульт не подключать?
Получается , если у меня котел TTEvo и я буду подключать по шине W-bus . то я могу кучу деталей не впаивать , те которые нужны для упавлением старыми котлами Е и С , и датчики температуры в салоне и на выхлопе мне не нужны , оставить только температуру двигателя и забортную , и получается можно родной овальный пульт не подключать?
У меня сейчас на машине стоит top c , подключен через w-bus и к Ардуино , на ней только микросхема к-лине и 5 в кренка . И идёт один провод в салон на кнопку включает Ардуино и все . Жду пока мне плату вытравят и буду играться с котлом ево , сейчас ремонтируют помпу .
Я так понял что у вас другое управление сейчас стоит . не то которое здесь обсуждаем, и нет родного таймера ? Плату можно за час с утюгом и хлорным железом изготвить, я сам вообщето фоторезист предпочитаю , но для этого девайса за час Лутом плату сварганил, правда потом выяснилось что я ее не отзеркалил, но не сложно переделать. Сейчас занят распайкой деталей на плату , реле такого как нужно не нашел, так взял маленокое реле с автосигнализации старой и на спину его на плату приклеел и проводками подпаял. Тут еще идея возникла , если w-bus шина рабоатет , то как бы сделать что бы еще и ошибки по смс можно было считывать, было бы вообще сдорово , и скидывать их тоже можно , команды же известные , только бы памяти в ардуине хватило бы. Правда из меня прогарммер хреновый , еще чужой исходник смогу разобрать по коментариям. а сам еще не умею прогрммировать даже в ардуино . И еще вопрос по помпе, если вы ее разобрали , что там в нутри, почему она ометром звониться 10 килоом, по ходу там полевик какой стоит , который включает саму помпу , потому что если просто подать на нее 12 вольт .то она тоже работает, я это почему спрашиваю , по тому что оригинальная помпа на вебасто очень не прилично стоит , а аналогичтные подобные помпы , которые просто как элетромотор прозваниваются в несколько раз дешевле , но их вебасто не признает и выдает ошибку , я не думаю что там что то цифровое внутри , думаю что просто полевой транзистор с резистором в затворе, а по резистору вебасто опознает свой чужой.
Получается , если у меня котел TTEvo и я буду подключать по шине W-bus . то я могу кучу деталей не впаивать , те которые нужны для упавлением старыми котлами Е и С , и датчики температуры в салоне и на выхлопе мне не нужны , оставить только температуру двигателя и забортную , и получается можно родной овальный пульт не подключать?
под TTE/C никаких кучи деталей и нету. Так что лишнего не напаяешь)) датчики температуры все параллельно подключаются. Можно не подключать, которые не нужны. Температуру ДВС кстати, по идее , можно приравнять к температуре в котле, а её через в-бус считывать. Так что только забортная нужна.
Паша про TTC/E который у тебя это скорее исключение, чем правило, т.к. TTC у тебя штатный, поэтому имеет шину w-bus. А универсальные запускаются потенциалом плюс 12В и шина у них не W-bus, а просто K-line.
родной овальный пульт можно не подключать, если по шине решишь цепляться. т.к. этот овальный таймер и мой девайс, если одновременно включить, могут конфликтовать.
там стоит целая плата, которая из постоянного тока создает вращающееся магнитное поле. По сути эл. двигатель переменного тока получается (полость антифриза герметична никаких сальников нет, там ротор просто вал с магнитом). Читайте выше по теме. я выкладывал парт номер помпы bosch. Она как раз такая, и стОит не дорого, до 3 тыс. по-моему. Так стартвольт ещё какая то есть, тоже выше читайте.
Понятно про помпу , я ее не разбирал , и у меня она рабочая , это так на всякий случай. У меня на автомобиле стоит еще дополнительная помпа на печку от бош , и она гоняет антифриз когда двигатель работает и после выключения еще немного что бы небыло теплового удара. На крайний случай ее можно задействовать, только я не мерял ее сопротивление. А про лишние детали для моего котла . это я про оптроны , и их обвязку. и сигнализации старлайн у меня нет , есть сталкер 600 тый. А что вы думаете про функцию считывания ошибок , вроде не лишней будет, если не запускается котел И . то можно посмотреть причину , или это слишком сложно реализовать? При подключении к сигнализации еще бы не помешала функция автозаводки двигателя для подзарядки аккумулятора , если напряжение опасно просело , например в процессе прогрева котлом напряжение просело до опасного предела . но двигатель уже успел немного прогреться до приемлемого значения , тогда идет автозапуск двигателя и при включенном котле , с подзарядкой аккума. Но думаю что памяти уже не хватит на это .
Функцию чтения и сброса ошибок добавить можно. Но нужно оттестировать уже имеющийся функционал, а то если он не работает. Какой смысл добавлять что либо еще. И так в скетче уже трудно становится разбираться из за его размера. Подход то дилетантский у меня. Ниразу не программист.
Понятно, я только что допаял плату , собираюсь проверять , в какой строке в скетче прописываются адреса датчиков тепмпературы? и какой стартовый байт у котла TTEvo ? Вообще был хорошо расписать поподробней первоначальную настройку ?
Что то не работает , залил подготовителный скетч , залил основной , подал питание, отпраляю смс ZAPROS приходит уведомление что доставлено , и тишина , пробовал звонить на симку , идут длинные гудки. Светодиод на сим 800 мигает , на адруине горят оба светодиода . Что не так?
Ура заработало, просто сначало криво прошился скетч, эта промини такой плахой человек , кое как его уговарил прошиться :) . Может дело в моём адаптере он у меня на СР2102 , но скетч ни как не хотел заливаться в ардуину , пришлось зажимать рессет на ней а потом включать загрузку в плату , и то с 100500 раза прошло. Завтра попробую на машину установить. Еще вопрос, я еще датчики не прописывал в скетче , если я потом в скетч пропишу их адреса и залью в ардуину , то телефон не надо будет заного приписывать , он вроде в епроме сохраняется? Я правильно понимаю? И как изменить команду на запрос баланса , а то она не работает на мегафоне?
Да еепром не нужно больше прописывать. Там в коде старался довольно подробно все комментировать. Датчики даллас смотри вверху самом массив DS18B20 Левые 8 байт это адреса датчиков. На старт команда 20 , реже 21
Команда на запрос баланса. Строка 609 скетч#568. Далласы строка 108 и далее.
Две оптопары можно не запаивать и резисторы к ним. Но тот оптрон, который под ардуино, он нужен. Он считывает кнопку включения вебасто.
В стоке 609 нужно будет в место #100#\ поставить *100# ? Или обратный слеш тоже нужен? С далласами вроде сам разобрался но у меня их только 3 оставалось и те в виде обычных микросхем, нужно будет их в трубку упаковывать с термопастой.
вместо #100# ставишь *100# , оставльное оставляешь как есть. Далласы я тоже поначалу в виде микросхем брал. а сейчас иногда в колбах по 50р./шт. бывают если по одному заказывать . беру их, удобнее.
переделал на *100# , в ответ пришел какой то набор цыфр , что с этим делать ?
а #100# не работает чтоли? Набор цифар потому что на русском приходит, а надо на английском чтобы приходило. Узнай у оператора как сделать чтобы баланс на английском приходил
С чего бы сколхозить разъем , тобы был такой же как на родном овальном пульте вебасты, не охота резать или подпаивать , та так воткнул родной провод в устройство , и ни чего резать не надо , если не заработает по W-bus то обратно пультик воткнул и через подпайку управлять, и еще хочу кнопку на 3.5 джек вывести и на далласы тоже , что бы меньше соплей было , сигу не буду подцеплять , хотя может на автозапуск двигателя попробую в 600 сталкере есть вывод состояния для автозапуска.
У меня симка мегафон а у него запрос баланса *100# , а решетка сто решетка не работает почему то , просто ни чего не происходит , а на звездочка сто решетка приходит ответ в виде +CUSD: 0, "куча цифр и букв,
скрутками подматайся к проводам разъема вебасто и сделай свой разъем, который найти можно. И будет два разъема торчать - один для штатного таймера. второй для сего девайса.
говорю позвони оператору и узнай, что нужно сделать, чтобы баланс на латинице приходил.
Долбаный Мегафон у нас убрал услугу поговорить с девушкой из службы поддержки , посадили робота вместо девченок . надо в офис идти что бы с ними пообщаться. Как я понял нужно ставить кнопку с подсветкой светодиодной , эта подсветка какое нибудь еще занчение имеет кроме как электричестово жечь ? Ну типо статус работы вебасты , может это где и говорилось но я не понял , а так можно что бы блинки ошибок выдавала , есл что не так , типо как чек инжин .
лампа показывает включен котёл или нет . Кнопка то без фиксации. Хотел в будущем сделать, что если включили котёл и он НЕ запустился , то лампа будет быстро мигать. Типа незапуск. А ошибки нех по миганию считать, проще в смске их получить.
Ну да в хексе их считывать не удобно, но ошибки дело нужное , не всегда удобно , или есть возможность тащить в авто ноутбук со шнурком , сброс блокировок котла тоже бы не помешал, у меня было так когда устанавливал котел насос не дощелкнул . и вебаста в блокировку ушла , и сброс с помощью предохранителя не помогал, но не всегда и не у всех есть возможность ошибки считать, у нас в городе установщики котлов барыги конченные хотят за диагностику ( тупо подключить шнурок к котлу и считать ошибки) хотят 1000руб.
да не вопрос сделаем мы ошибки. нужен только лог где идет запрос ошибок и ответ котла без ошибок, а также ответ с ошибками (лучше 2 ошибки для анализа). ну и удаление.
в том контексте я имел ввиду не HEX про мигание, а не х..й )))
постараюсь сделать лог где без ошибок , к выходным а может и раньше , завтра сварганю корпус для устройсва , хочу его из металла сдеать из алюминия . У меня внешняя антена , думаю проблем не будет. Подключу пока без датчиков , если по шине будет работать , то и не буду заморачиватся пока с датчиками, один сделаю на внешнюю температуру.