Шнурок есть, программа с инженерным режимом тоже, время не хватает ,сегодня по быстрому подцепи на автомобиль, по 3 проводам +,-,w-bus, который на диагностику, всё работает , вебасто запустилась, отчёты пришли, даже 2 шт . почему то, один вебасто он, стартвебосто файл, а второй вебасто он , стартвебасто ок. Температуру по шине не читает .
Не могу понять , как считывается напряжение в бортсети , если в настройкай скетча стоит считывание данных с шины , у меня в ответных смсках , почемуто напряжение питания стоит 0.00 вольт, оно должно по шине читаться или с делителя?
Dushman7776 не спеши, по шине на данный момент в скетче идёт опрос только пламени , т.е. StartwebastoOK. Все остальное нужно допиливать. То что заработало и увидело реальный запуск это уже гуд. Два отчёта так и должно быть - один должен сразу приходить после отсылки команды на запуск, второй через 6 мин - показывает запустился ли реально котёл или нет.
Друзья, все предыдущие Gerber файлы были с ошибками. Надеюсь всё исправил. Сейчас я заказал плату китайцам на https://jlcpcb.com вышло 740 рублей за 5 плат. Посмотрим , что там придёт. Жду с нетерпением. плата v8.8 layout файлы для заказа в китай gerber8_8
потому что в логике программы я заложил так. Когда выбран опрос статусов по шине, всё по шине и должно читаться. (см. п 13. инструкции). Если выбрать чтение статусов по аналогу, что все данные будут собираться силами ардуино (по её датчикам). Другое дело, что я ещё по шине не написал чтение параметров. Выберете параметры, которые нужны , скоро сделаю.
Я думаю что будет достаточно напряжения , температуры и уровня мощности пламени. И еще как отключить лишние смс , а то на один цикл уходит 3 ответа от устройства, а у меня в тарифе всего 200 штук, потом по 3 руб. за штуку, нужно доп пакет покупать , можете сделать оповещение голосом по звонку, или через интернет, а то трафик сейчас дешовый а смс дорогие стали , сейчас уже нет тарифов без абонентской платы, у меня например в тарифе на симкоме 5гб. трафика и всего 200 минут и 200 см, зато на смартфоне безлимит звонков и 25 гб. и ни одной смс , но за 55 руб . можно подключить безлимит смс, если на смартфоне они мне и могут пригодиться , то на машине они мне безлимитные не нужны.
у меня просьба взять программу WTT с инженернум режимом. См. выше есть ссылка. Подключиться к котлу этой прогой, выставить галочки параметров которые нужны и выложить лог сюда. Нужно знать как ответит котёл.
В суботу попробую логи снять на работе, программа есть.шнурок есть , время нужно найти, может и в пятницу что нибудь получистя. Утром еще попробую посчитаю смски ,может я чего напутал. К котлу подключатьсяэ в режиме сканирования шины или в режиме управления ? И какие команды посылать на котел.
при подаче команды на старт котла - периодически также шлются команды заспроса параметров. Но можно и просто запрос параметров посылать (например когда котёл выключен, а мы просто ZAPROS посылаем, напряжение или температуру посмотреть). Когда лог будет, я команды пропишу в скетче
Хорошо , и так по дейсвиям , я подключаюсь программой к котлу , высталяю галки в списке , даю команду на запуск из программы и потом выкладываю сюда файл , я правильно понял ? А то я с этой програмаой не очень знаком , только ошибки там считать или блокировку сбросить, ну еще делал себе резервный файл прошивки .
вот скетч v 3.55 с запросом по шине w-bus t двигла, напряжения борт сети, запросом режима половинной мощности, запросом флагов работы элементов котла, запросом пламени. Также читаются ошибки
char ver[] = "Firmware 3.55";
//#define debugW_bus // раскоментировать эту строку для отладки w-bus, при этом нужно вынуть SIM800 и подключить юсб<->уарт, т.к. отладка идёт в УАРТ, предназначенный для GSM
//#define debugSIM800
#include <EEPROM.h>
enum Cells {
ResetNumber_cell, //0
TimeWebasto_cell, //1
ProtocolSTART_cell, //2
StartByte_cell, //3
ProtocolSTATUS_cell, //4
Heater_cell, //5
delta_cell, //6
TelNumber1_cell =20, //20
TelNumber2_cell =40 //40
};
#include <Button.h>
Button test;
// для GSM модуля *********************
String currStr = "";
String TelNumber[] = {"", "000000000000", "000000000000", "000000000000"};
bool SaveNumber2 = 0; // флаг когда необходима запись номера#2, он true
byte isStringMessage = 0;
byte KTOzapros = 0;
byte KTOreport = 1;
//************************
//_______Все для цикла void voltmetr()*************
float vout = 0.0; // Напряжение на входе аналового входа
float Vpit = 0.0; // Измеряемое напряжение на выходе ИБП
int volt = 0; // Напряжение на входе АЦП
// дефайны входов выходов на соостветствующие пины ************** (плата весий 8.5-8.7)
#define OutWebasto_12V 2 // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера).
#define Dallas_pin 3 // пин шины OneWire для датчиков даллас
#define DopOn 4 // сюда доп канал от сигналки на включение вебасто
#define DopOff 5 // сюда доп канал от сигналки на выключение вебасто
#define Ohrana 6 // Сюда состояние охраны сигналки
#define Trevoga 7 // Сюда состояние тревоги
#define IGN 8 // Сюда состояние зажигания
#define Sost 9 // Сюда состояние вебасто (+12В когда работает)
#define ResetGSM 12 // пин ресета GSM подключен к реле, разрывающее питание модуля.
#define Eng 14 // (А0) Сюда состояние работы ДВС
#define StatusWebastoLED 15 // (А1) пин LED индикация включенности котла
#define StartButtonpin 16 // (А2) пин тактовой кнопки вкл/выкл котла
#define DTR 17 // пин (А3), управляющий энергосберегающим режимом GSM модуля
#define StartEng 18 // (A4) это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define OutWebasto_GndImp 19 // (A5) это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).
#define Voltmeter_pin A7 // пин, которым измеряем напряжение питания
#define StartButton 0 // программный номер тактовой кнопки вкл/выкл котла
const bool RelayON = 1; // логика управления реле ресета GSM, в данном случае включается высоким уровнем на пине
#define GSM_RX 10 // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX 11 // пин софт TX Arduino для соединения с RX модуля SIM800
/*
#define Dallas_pin 2 // пин шины OneWire для датчиков даллас
#define OutWebasto_12V 3 // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера).
#define DopOn 4 // сюда доп канал от сигналки на включение вебасто
#define DopOff 5 // сюда доп канал от сигналки на выключение вебасто
#define Ohrana 6 // Сюда состояние охраны сигналки
#define Trevoga 7 // Сюда состояние тревоги
#define StartEng 8 // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define Sost 9 // Сюда состояние вебасто (+12В когда работает)
#define IGN 10 // Сюда состояние зажигания
#define Eng 11 // Сюда состояние работы ДВС
#define OutWebasto_GndImp 12 // это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).
#define StatusWebastoLED 13 // пин индикация включенности котла
#define ResetGSM 16 // пин ресета GSM (A2) подключен к реле, разрывающее питание модуля.
#define StartButtonpin 17 // пин тактовой кнопки вкл/выкл котла
#define DTR 19 // пин (А5), управляющий энергосберегающим режимом GSM модуля
#define StartButton 0 // программный номер тактовой кнопки вкл/выкл котла
const bool RelayON = 0; // логика управления реле ресета GSM, в данном случае включается низким уровнем на пине
#define GSM_RX 14 // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX 15 // пин софт TX Arduino для соединения с RX модуля SIM800
*/
#include <SoftwareSerial.h>
#ifndef debugW_bus
SoftwareSerial SIM800 (GSM_RX, GSM_TX);//Rx, Tx //UART для соединения с GSM модулем
#else
SoftwareSerial DEBUG (GSM_RX, GSM_TX); //Rx, Tx //UART для соединения с отладкой (используется юсб<->УАРТ вместо SIM800)
#endif
// для шины 1-wire и датчиков DS18B20****************
#include <OneWire.h> // библиотека для DS18B20
OneWire ds(Dallas_pin); // датчики DS18B20 на нужный пин
enum TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp}; // перечисление нужных температур (в конце размер массива температур)
// ниже соответствие адресов датчиков различным температурам (изначально 0х14=20*С)
byte DS18B20 [size_arrayTemp][10] = {
{0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1, VyhlopC, 0x14},
{0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D, EngineC, 0x14},
{0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48, UlicaC, 0x14},
{0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1, SalonC, 0x14}
};
byte delta = 50; // разница температур выхлопа и улицы, выше которой считается, что пламя в котле есть.
// для организации W-BUS и различные таймеры********************
#define K_LINE Serial //UART для соединения с шиной котла
#define TX 1
byte header = 0; // состояние заголовка
byte message_size = 0; // размер тела принимаемого сообщения, кол-во байт
byte j = 2; // инкремент
byte n = 2;
const byte bufsize = 140; // размер буфера принятого сообщения
byte buf [bufsize] = {0}; // буфер принятого сообщения
byte checksum = 0; // контрольная сумма входящего сообщения
uint32_t curmillis = 0; // снимок системного времени
byte delaybyte_TX = 0 ; // задержка между байтами отправляемого сообщения
byte waitbyte_RX = 1; // задержка, мс для успевания заполнения буфера RX (подрегулировать в зависимости от уровня жизнидеятельности на Марсе)
uint32_t timerdelay = 0; // таймер ожидания байт (для успевания заполнения буфера УАРТ)
bool Delay = 0; // таймер ожидания байт (для успевания заполнения буфера УАРТ)
#define TIMER_DELAY Delay = 0; timerdelay = curmillis // включение этого таймера
uint32_t prevRESETheader=0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались
bool RESETheader_timer = 0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались
// ниже строка даже не спрашивайте что это)) это так... кот по клаве прошёл
#define ConstArray(...) [](void)->size_t{ const byte _[] = { __VA_ARGS__}; return sizeof(_)/sizeof(_[0]); }(),[](void)->const byte *{ const static byte _[] = { __VA_ARGS__}; return _; }()
// команды для котлов ЭВО
byte StartByte = 0x20;
#define HEATER_START ConstArray (StartByte, 0x3B)
#define HEATER_PRESENCE ConstArray (0x44, StartByte, 0x00)
#define HEATER_STOP ConstArray (0x10)
#define HEATER_STATUS_VEVO ConstArray (0x50, 0x05)
#define HEATER_STATUS_EVO ConstArray (0x50, 0x30, 0x05, 0x0A, 0x0C, 0x0E, 0x10)
#define HEATER_DTC_REQUEST ConstArray (0x56, 0x01)
#define HEATER_DTC_ERASE ConstArray (0x56, 0x03)
// команды для котлов ТТС/TTE
#define START_SESSION ConstArray (0x81)
#define REQUEST_2A10101 ConstArray (0x2A, 0x01, 0x01)
#define REQUEST_2A10102 ConstArray (0x2A, 0x01, 0x02)
#define REQUEST_2A10105 ConstArray (0x2A, 0x01, 0x05)
#define REQUEST_DTC ConstArray (0xA1)
#define START_TTC ConstArray (0x31, 0x22, 0xFF)
#define STOP_TTC ConstArray (0x31, 0x22, 0x00)
enum ProtocolSTATUS_ {STATUSBUS, ANALOG}; // возможные протоколы чтения статуса котла
enum ProtocolSTART_ {STARTBUS, IMPULSE, POTENCIAL}; // возможные протоколы запуска котла
enum Heater_ {TTC_E, VEVO, EVO, HYDRONIC}; // тип котла
byte ProtocolSTATUS = STATUSBUS;
byte ProtocolSTART = STARTBUS;
byte Heater = EVO;
byte w_bus_init = 0; //флаг проведена или нет инициализация шины w-bus (25мс LOW, 25мс HIGH для ЭВО
// либо 300ms LOW, 50ms HIGH, 25ms LOW, 3025ms HIGH для TTC
byte requiredmessage = 1; //флаг, что отправляем в данный момент поддержание старта, запрос параметров или запрос ошибок
byte StartMessageRepeat = 0; //количество отправленных сообщений на старт котла
byte StopMessageRepeat = 0; //количество отправленных сообщений на остановку котла
byte TimeWebasto = 30; //время работы котла, = 30мин
uint32_t EndReportMillis = 0; //переменная для таймера отправки отчета об успешности запуска котла
uint32_t EndReportEngine = 0; //переменная для таймера отправки отчета об успешности запуска ДВС
uint32_t Prev_PeriodW_BusMessage = 0; //переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus
uint32_t Prev_PeriodW_BusStartStop = 0; //переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus
uint32_t prevdelSMS = 0; //переменная для таймера периодического удаления СМС
uint32_t prevVpit = 0; //переменная для таймера периодического измерения напряжения АКБ
//для таймера создания импульса GND - для протокола запуска котла импульсом GND
uint32_t timer=0;
bool timerenabled=false;
#define TIMEREXPIRED (curmillis-timer)>800
//для таймера - старт двигателя - импульс +5В на транзистор, в итоге минусовой импульс 1.5 сек на вход событий сигналки для запуска ДВС)
uint32_t timerStartEng=0; bool timerenabledStartEng=false;
#define TIMEREXPIRED_StartEng (millis()-timerStartEng)>1500
//для таймера - старт котла по W-BUS )
uint32_t timerStart_W_BUS=0; bool timerenabledStart_W_BUS=false;
#define TIMEREXPIRED_Start_W_BUS (curmillis-timerStart_W_BUS)> (uint32_t)TimeWebasto * 60000UL
//для таймера инита шины W-BUS
uint32_t timerInit = 0; bool timerInitflag = 0;
//для таймера контроля жив или мертв обмен по W-bus
uint32_t last_W_bus = 0; bool kotel_zhiv = 0;
//ниже всё для организации ресета GSM модуля, если с ним отсутствует связь****************
uint32_t prevReset=0; // для таймера периодичности проверки (командой "АТ")
byte intervalReset = 2; // каждые столько мин будет проверка жив ли GSM модуль
uint32_t timerWaitOK=0; // для таймера ожидания ответа после посылки команды "АТ"
bool timerenabledWaitOK=false; // для таймера ожидания ответа после посылки команды "АТ"
byte errors=0; // количество неответов от GSM модуля
bool gsmOK = 1; // флаг есть связь с GSM модулем или нет
bool resettimer = 0; // для таймера удерживания реле в режиме сброс питания
uint32_t resetTimer=0; // для таймера удерживания реле в режиме сброс питания
byte ResetNumber = 0; // количество ресетов GSM модуля для статистики (хранится в еепром)
//**************************
//Основные переменные
bool webasto = 0; // флаг команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool startWebasto_OK = 0; // флаг успешного запуска котла
bool report = false; // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false; // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool engine =0; // флаг работает ли ДВС или нет
bool ignition=0; // флаг включено ли зажигание или нет
bool ohrana=0; // флаг включена ли охрана или нет
bool trevoga=0; // флаг включена ли тревога или нет
bool alarmSMS = 0; // флаг отправлена ли смс о тревоге или нет
bool waterpump = 0; // флаг работы циркуляционного насоса
bool plug = 0; // флаг работы штифта накаливания
bool airfan = 0; // флаг работы нагнетателя воздуха
bool fuelpump = 0; // флаг работы топливного насоса
bool blowerfan = 0; // флаг работы вентилятора печки автомобиля
bool ecomode = 0; // флаг экорежима
byte DTC[7] ={0}; // коды неисправностей котла
// СТАРТОВЫЙ ЦИКЛ
void setup()
{
delay (3500);
test.NO();
test.pullUp();
test.duration_bounce ( 50);
test.duration_click_Db ( 250);
test.duration_inactivity_Up(5000);
test.duration_inactivity_Dn(1000);
test.duration_press ( 500);
test.button(StartButtonpin); // в скобках пин тактовой кнопки вкл/выкл котла (программный номер у неё будет 0)
pinMode (DopOn, INPUT_PULLUP);
pinMode (DopOff, INPUT_PULLUP);
pinMode (Sost, INPUT_PULLUP);
pinMode (Ohrana, INPUT_PULLUP);
pinMode (Trevoga, INPUT_PULLUP);
pinMode (IGN, INPUT_PULLUP);
pinMode (Eng, INPUT_PULLUP);
pinMode (OutWebasto_12V, OUTPUT); digitalWrite (OutWebasto_12V, LOW);
pinMode (StartEng, OUTPUT); digitalWrite (StartEng, LOW);
pinMode (13, OUTPUT); digitalWrite (13, LOW);
pinMode (StatusWebastoLED, OUTPUT); digitalWrite (StatusWebastoLED, LOW);
pinMode (OutWebasto_GndImp, OUTPUT); digitalWrite (OutWebasto_GndImp, HIGH);
pinMode (DTR, OUTPUT); digitalWrite (DTR, HIGH); // делаем высокий, а низкий уровень будет для пробуждения GSM из "спячки"
pinMode (ResetGSM, OUTPUT); digitalWrite (ResetGSM, !RelayON); // реле ресет на данный момент делаем "неактивно"
#ifndef debugW_bus
SIM800.begin(19200); // сериал соединение для gsm модуля
delay(100);
NastroykaGSM ();
#else DEBUG.begin(9600);
#endif
TimeWebasto = EEPROM.read(TimeWebasto_cell);
ProtocolSTART = EEPROM.read(ProtocolSTART_cell);
ProtocolSTATUS = EEPROM.read(ProtocolSTATUS_cell);
ResetNumber = EEPROM.read(ResetNumber_cell);
StartByte = EEPROM.read(StartByte_cell);
Heater = EEPROM.read(Heater_cell);
delta = EEPROM.read(delta_cell);
for (int i=0; i<12; i++) TelNumber[1][i] = EEPROM.read (i+TelNumber1_cell);
for (int i=0; i<12; i++) TelNumber[2][i] = EEPROM.read (i+TelNumber2_cell);
#ifndef debugSIM800
if (Heater == EVO || Heater == VEVO) K_LINE.begin(2400, SERIAL_8E1);
else if (Heater == TTC_E) K_LINE.begin(10400);
#else
K_LINE.begin(9600);
#endif
for (byte i=0; i<20; i++) {digitalWrite (13, !digitalRead(13)); delay (80);}
digitalWrite (13,0);
}
void loop() {
curmillis = millis();
test.read();
digitalWrite (StatusWebastoLED, webasto);
digitalWrite (13, startWebasto_OK);
//digitalWrite (13, webasto);
//если нажали тактовую кнопку меняем состояние котла на противоположное
if (test.event_press_short (StartButton)) {
if (!webasto) {StartWebasto(); report = false;}
else StopWebasto();
}
if (ProtocolSTATUS==ANALOG) {if (Temper(VyhlopC) - Temper(UlicaC) > delta) startWebasto_OK = 1;
else startWebasto_OK = 0;}
if (ProtocolSTART==IMPULSE) webasto = !digitalRead (Sost);
Heater_BUS();
//ниже для таймера старта котла по шине и аналогу
if (timerenabledStart_W_BUS && TIMEREXPIRED_Start_W_BUS) StopWebasto();
//ниже для таймера создания импульса на старт ДВС
if (timerenabledStartEng && TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=false;}
engine = !digitalRead (Eng);
ignition= !digitalRead (IGN);
ohrana= !digitalRead (Ohrana);
trevoga= !digitalRead (Trevoga);
if (webasto && report) timerReport ();
if (reportEngine) timerReportEngine ();
if (!ohrana) alarmSMS = false;
#ifndef debugW_bus
if (trevoga && !alarmSMS) AlarmSMS ();
if (gsmOK)readSMS();
Reset_gsm();
delSMS();
#endif
WebastoOprosImpulse ();
izmereniya();
}
void izmereniya() {
if (millis()-prevVpit>7000){
//измерение напряжения борт сети
if (ProtocolSTATUS==ANALOG){
volt = analogRead(Voltmeter_pin);
vout = (volt * 4.13) / 1024;
Vpit = vout / (9700.0/(98930.0+9700.0)); // По формуле Vpit = vout / (R2/(R1+R2))
if (Vpit<0.09) Vpit=0.0; // Округление до нуля
}
// ниже измерение датчиков даллас
static bool n=0; // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset(); // сброс шины
ds.write(0xCC); // обращение ко всем датчикам
ds.write(0x44); // начать преобразование (без паразитного питания)
}
else {
for (byte i=0; i<size_arrayTemp; i++){
int Temper_ = 20; byte buff[9];
ds.reset();
ds.select(DS18B20[i]);
ds.write(0xBE); // чтение регистров датчиков
for (byte j=0; j<9; j++) buff[j]=ds.read(); // читаем все 9 байт от датчика
ds.reset();
if (OneWire::crc8(buff, 8) == buff[8]){ // если контрольная сумма совпадает
if (DS18B20[i][8]==EngineC && ProtocolSTATUS==STATUSBUS){} // если данные берём по шине, то t двигла не мереем
else {
Temper_ = buff[0]|(buff[1]<<8); // читаем температуру из первых двух байт (остальные были нужны только для проверки CRC)
Temper_ = Temper_ / 16;
if (Temper_<150 && Temper_>-55) DS18B20[i][9] = Temper_;}
}}}
prevVpit=millis();
}}
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;}
void WebastoOprosImpulse (){
// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла
if (timerenabled) {if (TIMEREXPIRED) {digitalWrite (OutWebasto_GndImp, HIGH); timerenabled=false;}}
else {if (!digitalRead (DopOn) && !webasto) {StartWebasto(); KTOreport = 1;}
if (!digitalRead (DopOff) && webasto) StopWebasto();
}}
// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
void timerReport () {
if(millis() - EndReportMillis > 360000UL)
{EndReportMillis = millis(); report = false; SMSzapros(); }}
// цикл таймера отправки отчета об успешности запуска ДВС (отчёт через 60сек после старта)
void timerReportEngine () {
if(millis() - EndReportEngine > 90000ul)
{EndReportEngine = millis(); reportEngine = false; SMSzapros();}}
#ifndef debugW_bus
void NastroykaGSM () {
digitalWrite (DTR, LOW); // выводим из спячки GSM модуль
delay (150);
SIM800.println(F("AT")); //просто AT для разогреву
delay(250);
SIM800.println(F("AT+CMGF=1")); //устанавливает текстовый режим смс-сообщения
delay(250);
SIM800.println(F("AT+IFC=0, 0")); //отключает программный контроль потоком передачи данных
delay(250);
SIM800.println(F("AT+GSMBUSY=1")); //запрет всех входящих звонков
delay(250);
SIM800.println(F("AT+CNMI=1,2,2,1,0")); //включает оповещение о новых сообщениях
delay(250);
SIM800.println(F("AT+CMGDA=\"DEL ALL\"")); // удаляем все смс, ки
delay(1500);
SIM800.println(F("AT+CSCLK=1")); //включает энергосберегающий режим
delay(150);
digitalWrite (DTR, HIGH); // вводим в спячку GSM модуль высоким уровнем на пине DTR
}
void startSMS(byte stat) //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
if (stat==0) stat = KTOreport;
digitalWrite (DTR, LOW); // выводим из спячки GSM модуль
delay (150);
SIM800.print(F("AT+CMGF=1\r"));
delay(200);
SIM800.print(F("AT+CMGS=\"")); SIM800.print(TelNumber[stat]); SIM800.println("\"");
delay(200);
}
void EndSMS ()
{
SIM800.println((char)26); // Команда отправки СМС
delay(1500);
digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль
}
void delSMS ()
{
if (millis() - prevdelSMS > 7200000ul){ //раз в 2 часа
digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
delay (150);
SIM800.print(F("AT+CMGDA=\"DEL ALL\"\r")); // удаляем все смс, ки
delay(1500);
digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль
delay (150);
prevdelSMS = millis();}
}
void readSMS() //_____Цикл чтения входящих СМС-сообщений______________
{
if (!SIM800.available()) return;
char currSymb = SIM800.read();
#ifdef debugSIM800
K_LINE.print (currSymb);
#endif
if ('\r' == currSymb)
{
if (isStringMessage!=0&&isStringMessage!=3) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
{
if (!currStr.compareTo("ZAPROS")) {SMSzapros();} // Передача параметров по СМС
else if (!currStr.compareTo("ZAPROSTEL")) {SMSzaprosTEL();} // Передача номеров телефонов пользователей по СМС
else if (!currStr.compareTo("Service-info")) {ServiceINFO();} // Передача сервисной информации по СМС
else if (!currStr.compareTo("GSMResets-0")) {ResetNumber=0; EEPROM.write (ResetNumber_cell, ResetNumber); ServiceINFO();} //сброс счетчика ресетов GSM модуля
else if (!currStr.compareTo("Version")) {startSMS(isStringMessage); SIM800.println (ver); EndSMS ();} //запрос версии ПО
else if (!currStr.compareTo("Webasto-ON")) { startSMS(isStringMessage); SIM800.println(F("Webasto "));
if (!webasto) {StartWebasto (); KTOreport = isStringMessage;}
else SIM800.println(F("uzhe ")); SIM800.println (F("vkluchena")); EndSMS();}
else if (!currStr.compareTo("Webasto-OFF")) {startSMS(isStringMessage); SIM800.println(F("Webasto "));
if (webasto)StopWebasto (); // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
else SIM800.println(F("uzhe ")); SIM800.println(F("otkluchena"));EndSMS();}
// если получили команду на включение ДВС и он в настоящий момент выключен - включаем
else if (!currStr.compareTo("Engine-ON")) {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));
if (!engine) { digitalWrite (StartEng, HIGH); timerStartEng=millis(); timerenabledStartEng=true; reportEngine = true; EndReportEngine = timerStartEng; KTOreport = isStringMessage;}
else SIM800.println(F("uzhe ")); SIM800.println(F("start")); EndSMS();}
else if (!currStr.compareTo("Engine-OFF")) {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));
if (engine){ digitalWrite (StartEng, HIGH); timerStartEng=millis(); timerenabledStartEng=true; reportEngine = false;} // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
else SIM800.println(F("uzhe ")); SIM800.println(F("ostanovlen")); EndSMS();}
else if (!currStr.compareTo("Impulse")) {if (!webasto) {ProtocolSTART = IMPULSE; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);
startSMS(isStringMessage); SIM800.println(F("zapusk GND_impulse")); EndSMS();}}
else if (!currStr.compareTo("Startbus")) {if (!webasto) {ProtocolSTART = STARTBUS; EEPROM.write(ProtocolSTART_cell,ProtocolSTART); webasto = 0;
startSMS(isStringMessage); SIM800.println(F("zapusk BUS")); EndSMS();}}
else if (!currStr.compareTo("Potencial")) {if (!webasto) {ProtocolSTART = POTENCIAL; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);
startSMS(isStringMessage); SIM800.println(F("zapusk +12V Potencial")); EndSMS();}}
else if (currStr.endsWith("Status")) {if (!webasto) {byte st = currStr.toInt(); if (st >= STATUSBUS && st<=ANALOG )ProtocolSTATUS = st; EEPROM.write(ProtocolSTATUS_cell,ProtocolSTATUS);
startSMS(isStringMessage); SIM800.print (F("Status: "));
if (ProtocolSTATUS == 0)SIM800.println(F("BUS"));
else if (ProtocolSTATUS == 1)SIM800.println(F("Analog"));
EndSMS();}}
else if (currStr.endsWith("HeaterType")) {if (!webasto) {byte st = currStr.toInt(); if (st >= TTC_E && st<=HYDRONIC) Heater = st; EEPROM.write(Heater_cell,Heater);
startSMS(isStringMessage); SIM800.print (F("Heater: "));
if (Heater == 0)SIM800.println(F("TTC_E"));
else if (Heater == 1)SIM800.println(F("VEVO"));
else if (Heater == 2)SIM800.println(F("EVO"));
else if (Heater == 3)SIM800.println(F("HYDRONIC"));
EndSMS();}}
else if (currStr.endsWith("Delta")) {if (!webasto) {delta = currStr.toInt(); //
EEPROM.write(delta_cell, delta); startSMS(isStringMessage);
SIM800.print(F("DeltaT: ")); SIM800.print(delta); SIM800.print(F("*C")); EndSMS();}}
else if (currStr.endsWith("min")) {if (!webasto) {TimeWebasto = currStr.toInt(); // для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
if (TimeWebasto>59) TimeWebasto = 59;
if (TimeWebasto<=15) TimeWebasto = 15;
EEPROM.write(TimeWebasto_cell,TimeWebasto);
startSMS(isStringMessage); SIM800.print(F("Webasto time: ")); SIM800.print(TimeWebasto); SIM800.print(F("min")); EndSMS();}}
else if (currStr.endsWith("StartByte")) {byte Z =currStr.toInt(); if (Z>=0x14 && Z<=0x17) StartByte= Z+12;
startSMS(isStringMessage); SIM800.print(F("StartByte: ")); SIM800.print(StartByte, HEX); SIM800.print(F("h")); EndSMS();}
else if (!currStr.compareTo("ResetNumbers")) {if (isStringMessage == 1) {startSMS(isStringMessage); SIM800.println(F("Phone numbers are erased")); EndSMS();
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]); }}}
else if (!currStr.compareTo("WriteNumber2")&& isStringMessage == 1) {
SaveNumber2 = 1; startSMS(isStringMessage); SIM800.println(F("Otpravte lyuboye SMS s nomera#2 dlya sohraneniya nomera")); EndSMS();}
else if (!currStr.compareTo("Balance")) SMSbalance();
isStringMessage = 0;
}
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]);}
startSMS(1); SIM800.println(F("Tel Number#1 is saving in memory")); SIM800.print("Tel#1: "); SIM800.println (TelNumber[1]); EndSMS();
}
else if (!currStr.compareTo("ZAPROS")) { SMSzapros();}
else if (!currStr.compareTo("ZAPROSTEL")) { SMSzaprosTEL();} // Передача номеров телефонов пользователей по СМС
isStringMessage = 0;
}
else if (isStringMessage==0) { if (TelNumber[1]!="000000000000" && !SaveNumber2 && TelNumber[1]!="яяяяяяяяяяяя"){
if (currStr.startsWith("+CMT: \""+TelNumber[1])) { isStringMessage = 1; KTOzapros = 1; }
else if (currStr.startsWith("+CMT: \""+TelNumber[2])) { isStringMessage = 2; KTOzapros = 2; }
else if (currStr.startsWith("+CUSD: 0,")) //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
{
startSMS(KTOzapros);
SIM800.print (currStr);
EndSMS();
}
}
else if (currStr.startsWith("+CMT:") && !SaveNumber2) { isStringMessage = 3; for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];}}
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]);}
startSMS(2); SIM800.println(F("Vash nomer sochranyon kak Number#2 v pamyati!"));
SIM800.print(F("Tel#1: ")); SIM800.println(TelNumber[1]); SIM800.print(F("Tel#2: ")); SIM800.println (TelNumber[2]); EndSMS(); SaveNumber2 = 0; }
}
currStr = "";
}
else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11) currStr += String(currSymb);
}
void SMSzaprosTEL(){
startSMS(isStringMessage);
PrintNumbers ();
EndSMS();
}
void SMSbalance() {
digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
delay (150);
SIM800.print(F("AT+CMGF=1\r"));
delay(200);
SIM800.println (F("AT+CUSD=1,\"#100#\"")); // команда на замену на транслит *111*6*2# у МТС
delay(1500);
digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль
delay (150);
}
void AlarmSMS() {for (byte i = 0; i<2; i++) {startSMS(i+1); SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!")); EndSMS();} alarmSMS = true;}
#endif
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]);}}
void SMSzapros()
{
#ifndef debugW_bus
startSMS(isStringMessage);
if (isStringMessage == 3){
SIM800.println (F("Tel.number#1 not has been save in memory"));
SIM800.println (F("For save Tel#1 send SMS command \"WriteNumber1\""));
PrintNumbers ();
}
else {
SIM800.print (F("Webasto ")); on_off (webasto);
if (webasto) {
SIM800.print (F("StartWebasto "));
if (startWebasto_OK) SIM800.println (F("OK"));
else SIM800.println (F("FAIL"));}
SIM800.print (F("Engine ")); on_off (engine);
SIM800.print (F("IGN ")); on_off (ignition);
SIM800.print (F("Ohrana ")); on_off (ohrana);
if (trevoga) SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
SIM800.print(F("Battery: ")); SIM800.print (Vpit,1); SIM800.println(F(" V"));
SIM800.print(F("Engine: ")); SIM800.print (Temper(EngineC)); grad ();
if (ProtocolSTATUS == ANALOG){ SIM800.print(F("Vyhlop: ")); SIM800.print (Temper(VyhlopC)); grad ();}
SIM800.print(F("Ulica: ")); SIM800.print (Temper(UlicaC)); grad ();
SIM800.print(F("Salon: ")); SIM800.print (Temper(SalonC)); grad ();
SIM800.print(F("EcoMode: ")); on_off (ecomode);
SIM800.print(F("Errors: ")); SIM800.println (DTC[0]);
}
EndSMS();
#endif
}
void on_off (const bool &stat) {if (stat) SIM800.println (F("ON")); else SIM800.println (F("OFF")); }
void grad () {SIM800.println (F("*C")); }
void ServiceINFO(){
startSMS(isStringMessage);
SIM800.print(F("StartByte: "));
if (ProtocolSTART==IMPULSE) SIM800.println(F("GND Imp"));
else if (ProtocolSTART==STARTBUS) {SIM800.println(F("BUS"));
if (Heater== VEVO || Heater== EVO) {SIM800.print(F("StartByte: 0x")); SIM800.println (StartByte, HEX);}}
else if (ProtocolSTART==POTENCIAL) SIM800.println(F("Potencial+12V"));
SIM800.print(F("Status: "));
if (ProtocolSTATUS==ANALOG) SIM800.println(F("ANALOG"));
else if (ProtocolSTATUS==STATUSBUS) SIM800.println(F("BUS"));
SIM800.print(F("Heater: "));
if (Heater==TTC_E) SIM800.println(F("TTC/E"));
else if (Heater==VEVO) SIM800.println(F("VEVO"));
else if (Heater==EVO) SIM800.println(F("EVO"));
else if (Heater==HYDRONIC) SIM800.println(F("HYDRONIC"));
if (ProtocolSTART!=IMPULSE) {SIM800.print(F("Webasto Time: ")); SIM800.print (TimeWebasto); SIM800.println(F("min"));}
SIM800.print(F("SIM800 Resets: ")); SIM800.println (ResetNumber);
if (ProtocolSTATUS==ANALOG) SIM800.print(F("DeltaT: ")); SIM800.print(delta);SIM800.println(F("*C"));
if (ProtocolSTATUS==STATUSBUS) {
SIM800.print(F("BurnFAN ")); on_off (airfan);
SIM800.print(F("WaterPUMP ")); on_off (waterpump);
SIM800.print(F("PLUG ")); on_off (plug);
SIM800.print(F("FuelPUMP ")); on_off (fuelpump);
SIM800.print(F("Blower ")); on_off (blowerfan);
SIM800.print(F("FuelPUMP ")); on_off (fuelpump);
SIM800.print (DTC[0]); SIM800.println (F(" Errors:"));
for (byte i=0; i<DTC[0]; i++) {
if (DTC[i+1]<=0x0F) SIM800.print(F("0"));
SIM800.print (DTC[i+1], HEX);
if (bitRead(DTC[6], i)) SIM800.println (F(" Active"));
else SIM800.println (F(" Passive")); }
}
EndSMS();
}
void StartWebasto()
{
if (ProtocolSTART==IMPULSE){
digitalWrite (OutWebasto_GndImp, LOW);
timer=curmillis;
timerenabled=true;}
else {
StartMessageRepeat = 0;
webasto = 1; digitalWrite (OutWebasto_12V, HIGH);
timerStart_W_BUS=millis();
timerenabledStart_W_BUS = true;}
report = true; EndReportMillis = millis();
w_bus_init = 1;
}
void StopWebasto()
{
if (ProtocolSTART==IMPULSE){ digitalWrite (OutWebasto_GndImp, LOW);
timer=curmillis;
timerenabled=true;}
else {
StopMessageRepeat = 0;
webasto = 0; digitalWrite (OutWebasto_12V, LOW);
timerenabledStart_W_BUS = false;}
report = false;
w_bus_init = 0;
}
void Heater_BUS (){
if (Heater == EVO || Heater == VEVO){
if (webasto) {
if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800) && w_bus_init == 10){
sendMessage (HEATER_START);
StartMessageRepeat++;
Prev_PeriodW_BusStartStop = millis();
}
if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>4000) {
if (requiredmessage==1) sendMessage (HEATER_PRESENCE);
else if (requiredmessage==2) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO);
if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO);}
else if (requiredmessage==3) sendMessage (HEATER_DTC_REQUEST);
requiredmessage++; if (requiredmessage > 3) requiredmessage = 1;
StopMessageRepeat = 0;
Prev_PeriodW_BusMessage = millis();
}}}
else if (StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
sendMessage (HEATER_STOP);
StopMessageRepeat++;
StartMessageRepeat = 0;
Prev_PeriodW_BusStartStop = millis();
}
if (!timerInitflag && w_bus_init==1) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==1) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==2) {K_LINE.begin (2400,SERIAL_8E1 );timerInitflag = 0; w_bus_init=10; }
if (K_LINE.available()){
// первый старт байт
if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();
if (buf[0]==0x4F){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
else {header = 0; RESETheader_timer=0;}
}
// длина сообщения
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;}
// пишем тело сообщения
if (header == 4 && Delay && j< message_size+n) {
buf[j] = K_LINE.read();
if (j<message_size+n-1) checksum^= buf[j]; // подсчёт КС
if (j==message_size+n-1) header = 5;
TIMER_DELAY ; j++;}
} // end of K_LINE.available()
// сообщение приняли, действуем
if (header == 5) {TIMER_DELAY ;
for(byte i = 0; i<n; i++) checksum^=buf[i]; // прибавляем к контрольной сумме старт байты
// если контрольная сумма верна:
if ( checksum == buf[message_size+n-1]) {
if (Heater == EVO){
if (buf[2]==0xD0 && buf[3]==0x30) {
if (buf[4] ==0x05) ecomode = (bool) buf[5]; // получаем состояние эко режима
if (buf[6] ==0x0A) {
airfan = (bool)buf[7]; // получаем флаг работы нагнетателя воздуха
plug = (buf[7] & 0x02)>>1; // получаем флаг работы штифта накаливания
fuelpump = (buf[7] & 0x04)>>2; // получаем флаг работы топливного насоса
waterpump = (buf[7] & 0x08)>>3; // получаем флаг работы циркуляционного насоса
blowerfan = (buf[7] & 0x10)>>4; // получаем флаг работы вентилятора печки автомобиля
}
if (buf[8] ==0x0C) {for (byte p=0; p<size_arrayTemp; p++ ) {if (DS18B20[p][8]==EngineC){DS18B20[p][9] = buf[9]-50; break;} }} // получаем температуру антифриза
if (buf[10]==0x0E) {Vpit = (float)(buf[11]<<8|buf[12])/1000.0;} // получаем напряжение борт сети
if (buf[13]==0x10) {startWebasto_OK = (bool)buf[14]; last_W_bus = millis();} // проверяем наличие пламени
}
if (buf[2]==0xD6 && buf[3]==0x01) {
for (byte h = 0; h< sizeof(DTC); h++) DTC[h]=0;
DTC[0] = buf[4];
for (byte h = 0; h< buf[4]; h++) {DTC[h+1]=buf[h*3+5]; bitWrite (DTC[6], h+1, (bool) DTC[h*3+6]);}
}
}
if (Heater == VEVO){
if (buf[2]==0xD0 && buf[3]==0x05) {startWebasto_OK = buf[7]; last_W_bus = millis();} // проверяем наличие пламени у VEVO
}
}
// если контрольная сумма не совпала:
//else K_LINE.println("CRC fail!!!" );
message_size = 0; header=0; RESETheader_timer=0; j=2; checksum = 0;
}
}// end EVO VEVO
else if (Heater == TTC_E){
if (!timerInitflag && w_bus_init==1) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>299) && w_bus_init==1) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>49) && w_bus_init==2) {timerInit = millis(); digitalWrite(TX, 0); w_bus_init=3; }
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==3) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=4; }
if ( timerInitflag && (millis() - timerInit>3024) && w_bus_init==4) {K_LINE.begin (10400); timerInitflag = 0; w_bus_init=10; sendMessage (START_SESSION);}
if (K_LINE.available()){
// первый старт байт
if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();
if (!bitRead (buf[0],6) && bitRead (buf[0],7)){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
}
// второй старт байт
if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); if (buf[1]==0xF1){ header = 2;} else {header = 0; RESETheader_timer=0;}}
// третий старт байт
if (header == 2 && Delay){
TIMER_DELAY ;
buf[2]=K_LINE.read();
if (buf[2]==0x51){ message_size = buf[0];
if (buf[0] !=0x80) {header = 4; message_size&=~0x80; j=3; n=3;}
else {header = 3; j=4;n=4;}
if (message_size > bufsize) message_size = bufsize; checksum = 0;} else {header = 0; RESETheader_timer=0; }
}
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
if (header == 3 && Delay){
TIMER_DELAY ;
buf[3]=K_LINE.read();
message_size = buf[3];
if (message_size > bufsize) message_size = bufsize;
checksum = 0; header = 4;
}
// пишем тело сообщения
if (header == 4 && Delay && j< message_size+n+1) {
buf[j] = K_LINE.read();
if (j<message_size+n) checksum+= buf[j]; // подсчёт КС
if (j==message_size+n) header = 5;
TIMER_DELAY ; j++;}
} // end of K_LINE.available()
// сообщение приняли, действуем
if (header == 5) {TIMER_DELAY ;
for(byte i = 0; i<n; i++) checksum+=buf[i]; // прибавляем к контрольной сумме старт байты
//for (byte i=0; i<message_size+n+1; i++) {Serial.print (buf[i], HEX); Serial.print(" ");}
// если контрольная сумма верна:
if (buf[message_size+n] == checksum) {
// if (buf[n]== 0xC1) Serial.println ("StartSession OK!!!");
}
// если контрольная сумма не совпала:
//else Serial.println("CRC fail!!!" );
message_size = 0; header=0; RESETheader_timer=0; j=3; checksum = 0;
}
} // end TTC_E
// таймер ожидания байт (для успевания появления данных в буфере UART)
if (!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1;
// таймер сброса заголовка если данные оборвались во время приёма заголовка
if (RESETheader_timer && curmillis - prevRESETheader > 500) {RESETheader_timer = 0; header = 0;}
if (webasto && millis() - last_W_bus>30000 && ProtocolSTATUS==STATUSBUS) {
startWebasto_OK=0;
airfan = 0;
plug = 0;
fuelpump = 0;
waterpump = 0;
blowerfan = 0;
for (byte p=0; p<size_arrayTemp; p++ ) {if (DS18B20[p][8]==EngineC){DS18B20[p][9] = -100; break;}}
}
}
#ifndef debugW_bus
void Reset_gsm (){
if (millis()-prevReset>(unsigned long)intervalReset*60000UL){
digitalWrite (DTR, LOW); delay (150);
SIM800.println (F("AT"));
timerenabledWaitOK = 1; timerWaitOK = millis();
gsmOK = false;
prevReset = millis(); }
if (timerenabledWaitOK && millis()-timerWaitOK>6000) {
timerenabledWaitOK = 0;
if (!gsmOK) {
SIM800.println (F("AT")); timerenabledWaitOK = 1; timerWaitOK = millis();
errors++; if (errors>4) errors = 4;
}
}
if (!gsmOK) {
if (SIM800.available()>0){
char currSymb = SIM800.read();
#ifdef debugSIM800
K_LINE.print (currSymb);
#endif
if ('\r' == currSymb) {
if (!currStr.compareTo("OK")) { gsmOK = true; timerenabledWaitOK = 0; errors=0; digitalWrite (DTR, HIGH);}
currStr = "";
}
else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11) {currStr += String(currSymb);}}}
if (errors>=4) Reset();
}
void Reset(){
if (!resettimer) {digitalWrite (ResetGSM, RelayON); resettimer = 1; resetTimer = millis();}
else if (millis()- resetTimer>6000 ) {
resettimer = 0;
errors=0;
ResetNumber++;
EEPROM.write (ResetNumber_cell, ResetNumber);
digitalWrite (ResetGSM, !RelayON);
delay (3500); NastroykaGSM ();}
}
#endif
void sendMessage(const size_t size, const byte *command){
if (Heater == TTC_E){
const byte siZe = size+4;
byte Mes[siZe];
byte Checksum = 0;
for(byte i=0; i<siZe; i++) {
if (i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);}
if (i==1) Mes[i] = 0x51;
if (i==2) Mes[i] = 0xF1;
if (i==3) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum+=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
if (i!=siZe-1) Checksum+=Mes[i];
else Mes[i] = Checksum;
K_LINE.write (Mes[i]);
}
}
else if (Heater == EVO || Heater == VEVO){
const byte siZe = size+3;
byte Mes[siZe];
byte Checksum = 0;
for(byte i=0; i<siZe; i++) {
if (i==0) Mes[i] = 0xF4;
if (i==1) Mes[i]=size+1;
if (i==2) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum^=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
if (i!=siZe-1) Checksum^=Mes[i];
else Mes[i] = Checksum;
K_LINE.write (Mes[i]);
}
}
}
Класс, осталось залить и проверить , хорошо что я не сильно запрятал сам блок. А зачем нужно вкючение вебасто через сигналку? Понятно что автозапуск двигателя через жсм нужен, а запуск вебасто сигналкой и контроль через жсм по мне не нужная фитча.
Да что то я протупил, но по мне проще один канал на сигналке использовать паралельно кнопки включения . Зачем городить один нанал на включение другой на выключение.
потому что, если вы цепляете девайс к штатному таймеру по впайке к кнопке включения, то часто возникает такая ситуация. Вы кликаете из дома на брелоке допканал. А машина довольно далеко стоит. На брелке у вас , например, пишет что ошибка связи. (А в реальности команда долетела до машины и котёл включился). Вы думаете, что нужно ещё раз кликнуть, раз команда не прошла. Кликаете ещё разок и тем самым уже выключаете котёл и приходите в холодный авто.
а в моем случае кликаешь до талого, если плохая связь. Хоть одна команда да пройдёт и котёл включится
Тоже логично, только хотелок ещё много а памяти в ардуино про мини мало, вот вчера ролики смотрел про esp8266, и как ее можно через ардуино иде программировать , там памяти 4 мгб и тактовая частота 80мгц. и прошивку можно по воздуху обновлять, а ещё есть esp32,так там ещё круче ,по ходу можно вообще какой нибудь автобота, робота замутить.
Там еще и блютуз есть , но главное это не специальный сетевой чип , его можно использовать как ардуино , ещё там много чего есть , а потребление тока там не больше чем ардуино есть куча энергосберегающих режимов , в спячке всего 30мкА.
Скетч 3.55 работает кривовато, температуру двигателя минус 100 градусов, напряжение 4.1 вольт, 3 ошибки , но через команду сервис инфо показывает 1 ошибку 3А замыкание на землю линии LIN, но это бывает когда шнурок подключал. Надо сделать чтобы ошибки можно было слрасывать.
Скетч 3.55 работает кривовато, температуру двигателя минус 100 градусов, напряжение 4.1 вольт, 3 ошибки , но через команду сервис инфо показывает 1 ошибку 3А замыкание на землю линии LIN, но это бывает когда шнурок подключал. Надо сделать чтобы ошибки можно было слрасывать.
будет лог - поправим корявость. Причем лог нужен как от диагностики с котлом, т.е. ещё где галочки нужно было выставлять (выбираем при диагностике W-шина), так и сниф девайса с котлом (в WTT при этом выбираем монитор W-шины, и WTT цепляем к w-bus, третьим будет).
Да не ставил я этих галочек , делал все по умолчанию , там даже больше этих галочек было выставлено, подумал больше не меньше, работа отвлекала, я сначала не разобрался как лог снимать, не дотумкал что каждый новый лог программы затирает старый , там еще есть логированние измерений , но это не то , это просто логрованние температур и всяких других параметров. Если этого не хватит придется еще логи снимать . Мне бы пошаговую инструкцию , какие действия нужны , а то там идет логирование пока не выключишь его. Сегодня еще работу кнопки проверил, все вроде работает, только пришлось оптрон перепаять , я его не правильно впаял , ключ перепутал, исправил , все зарабоатло как надо..
галки нужны именно те, потому что нужно знать вкакой последовательности котёл будет отвечать байтами. Иначе если неправильно сделать, всё съедет, как это было как раз в 3.55
Хорошо , сделаю, но не раньше понедельника. у меня шнурок на работе остался и тачку завтра не планировал брать. У нас как на зло зима кончилась , то месяц морозяка была , ночью под 40 и ниже , а днем под 30 , а сегодня всего минус 6 днем. весной запахло.
Ещё вопрос, по температуре если температура двигателя читается с шины, то с чего читается температура улицы и салона, получается должено быть комбинированное считывание аналог цифра?
да улица и салон по датчикам даллас. Получается если выбран статус по цифре, то в массиве температур при измерениях , t ДВС пропускается (читается в другом месте по шине котла). Кстати пока сделн обмен только во время работы котла. Позже сделаю, что бы обновление параметров по шине было возможно в т.ч. и когда котёл выключен (ZAPROS и ServiceINFO).
А напряжение считывается если котел не запущен? Не даёт покоя автоматический запуск двигателя при опасной просадке напряжения в борт сети, например автозапуск двигателя при условии , что температура двигателя не ниже минус 10 градусов если напряжение просело до опасного значения.
Отчитываюсь о работе скетча 3.56 , темпертуру двигла и напряжение читает , но надо сделать что бы можно было считать на не запущенном котле, заметил еще такой баг в ответной смс которая через 6 минут приходит . котел запустился и работает а в смс написано webasto on , startwebasto fail. Как будто не видит пламени , на скетче 3.5 было немного подругому , при запуске пришло 3 смс ,первая webasto on , вторая со статусом webasto on startwebasto fail и показания других статусов, а потом третья со статусами но уже startwebasto ok , правда я может быть сам команду на запрос послал , я стер те смски, но на скетче 3.55 и на последнем не видит статуса startwebasto правильно И еще что заметил на остывшем заглушенном двигателе и не работающем котле послал команду сервис инфо и мне пришел ответ что включены и помпа и бензанасос и вентилятор, я пошел на улицу проверил что все отключено , а на команду запрос пришло что вебаста оф но показания температуры двигателя 77 градусов и 12 вольт напряжения , как будто вебаста выдала данные на момент отключения.
Сразу скажу что для нормальной отладки нужен юсб клайн адаптер
Посмотрел ваш проект интересная идея. А что по поводу Hydronic не получается было интересно если бы не только Webasto но и Eber работал по диагностике
получается. Только времени не хватает доделать все.
получается. Только времени не хватает доделать все.
Я вот некоторые детальки получил с Китая, так что скоро тоже буду в теме ))) Надо добить протокол по гидроникам, буду оказывать всяческую помощь ))
на моей машине стоит этот гидропоник, тут проще. Ну я ж вроде всё расшарил по протоколу , забыл только уже. опять заново исслеовать надо.
зЫ. Только твой гидроник древний, там все сильно отличаться может.
Шнурок есть, программа с инженерным режимом тоже, время не хватает ,сегодня по быстрому подцепи на автомобиль, по 3 проводам +,-,w-bus, который на диагностику, всё работает , вебасто запустилась, отчёты пришли, даже 2 шт . почему то, один вебасто он, стартвебосто файл, а второй вебасто он , стартвебасто ок. Температуру по шине не читает .
Этот протокол снят с Hydronica первого покаления программой Saleae Logic котел запускался GSM text+ по диагносики
Не могу понять , как считывается напряжение в бортсети , если в настройкай скетча стоит считывание данных с шины , у меня в ответных смсках , почемуто напряжение питания стоит 0.00 вольт, оно должно по шине читаться или с делителя?
Dushman7776 не спеши, по шине на данный момент в скетче идёт опрос только пламени , т.е. StartwebastoOK. Все остальное нужно допиливать. То что заработало и увидело реальный запуск это уже гуд. Два отчёта так и должно быть - один должен сразу приходить после отсылки команды на запуск, второй через 6 мин - показывает запустился ли реально котёл или нет.
Друзья, все предыдущие Gerber файлы были с ошибками. Надеюсь всё исправил. Сейчас я заказал плату китайцам на https://jlcpcb.com вышло 740 рублей за 5 плат. Посмотрим , что там придёт. Жду с нетерпением. плата v8.8 layout файлы для заказа в китай gerber8_8
Почему напряжение в борт сети не показало? Цепи ло пина А7 я проверил.
потому что в логике программы я заложил так. Когда выбран опрос статусов по шине, всё по шине и должно читаться. (см. п 13. инструкции). Если выбрать чтение статусов по аналогу, что все данные будут собираться силами ардуино (по её датчикам). Другое дело, что я ещё по шине не написал чтение параметров. Выберете параметры, которые нужны , скоро сделаю.
Я думаю что будет достаточно напряжения , температуры и уровня мощности пламени. И еще как отключить лишние смс , а то на один цикл уходит 3 ответа от устройства, а у меня в тарифе всего 200 штук, потом по 3 руб. за штуку, нужно доп пакет покупать , можете сделать оповещение голосом по звонку, или через интернет, а то трафик сейчас дешовый а смс дорогие стали , сейчас уже нет тарифов без абонентской платы, у меня например в тарифе на симкоме 5гб. трафика и всего 200 минут и 200 см, зато на смартфоне безлимит звонков и 25 гб. и ни одной смс , но за 55 руб . можно подключить безлимит смс, если на смартфоне они мне и могут пригодиться , то на машине они мне безлимитные не нужны.
у меня просьба взять программу WTT с инженернум режимом. См. выше есть ссылка. Подключиться к котлу этой прогой, выставить галочки параметров которые нужны и выложить лог сюда. Нужно знать как ответит котёл.
должно вроде два смс быть за цикл. Пофиксим. На счёт интернета это дело будущего. Не шарю я в этом пока. MQTT нужно штудировать.
В суботу попробую логи снять на работе, программа есть.шнурок есть , время нужно найти, может и в пятницу что нибудь получистя. Утром еще попробую посчитаю смски ,может я чего напутал. К котлу подключатьсяэ в режиме сканирования шины или в режиме управления ? И какие команды посылать на котел.
при подаче команды на старт котла - периодически также шлются команды заспроса параметров. Но можно и просто запрос параметров посылать (например когда котёл выключен, а мы просто ZAPROS посылаем, напряжение или температуру посмотреть). Когда лог будет, я команды пропишу в скетче
поставь такие галки, вроде самые нужные параметры
Хорошо , и так по дейсвиям , я подключаюсь программой к котлу , высталяю галки в списке , даю команду на запуск из программы и потом выкладываю сюда файл , я правильно понял ? А то я с этой програмаой не очень знаком , только ошибки там считать или блокировку сбросить, ну еще делал себе резервный файл прошивки .
всё верно
вот скетч v 3.55 с запросом по шине w-bus t двигла, напряжения борт сети, запросом режима половинной мощности, запросом флагов работы элементов котла, запросом пламени. Также читаются ошибки
Класс, осталось залить и проверить , хорошо что я не сильно запрятал сам блок. А зачем нужно вкючение вебасто через сигналку? Понятно что автозапуск двигателя через жсм нужен, а запуск вебасто сигналкой и контроль через жсм по мне не нужная фитча.
нужная, быстрее намного с брелока кликнуть, и смски не тратятся.
Да что то я протупил, но по мне проще один канал на сигналке использовать паралельно кнопки включения . Зачем городить один нанал на включение другой на выключение.
потому что, если вы цепляете девайс к штатному таймеру по впайке к кнопке включения, то часто возникает такая ситуация. Вы кликаете из дома на брелоке допканал. А машина довольно далеко стоит. На брелке у вас , например, пишет что ошибка связи. (А в реальности команда долетела до машины и котёл включился). Вы думаете, что нужно ещё раз кликнуть, раз команда не прошла. Кликаете ещё разок и тем самым уже выключаете котёл и приходите в холодный авто.
а в моем случае кликаешь до талого, если плохая связь. Хоть одна команда да пройдёт и котёл включится
Тоже логично, только хотелок ещё много а памяти в ардуино про мини мало, вот вчера ролики смотрел про esp8266, и как ее можно через ардуино иде программировать , там памяти 4 мгб и тактовая частота 80мгц. и прошивку можно по воздуху обновлять, а ещё есть esp32,так там ещё круче ,по ходу можно вообще какой нибудь автобота, робота замутить.
потребление наверное у нее больше. вай фай все таки. В вообще, да, совершенству нет предела
Там еще и блютуз есть , но главное это не специальный сетевой чип , его можно использовать как ардуино , ещё там много чего есть , а потребление тока там не больше чем ардуино есть куча энергосберегающих режимов , в спячке всего 30мкА.
Скетч 3.55 работает кривовато, температуру двигателя минус 100 градусов, напряжение 4.1 вольт, 3 ошибки , но через команду сервис инфо показывает 1 ошибку 3А замыкание на землю линии LIN, но это бывает когда шнурок подключал. Надо сделать чтобы ошибки можно было слрасывать.
Скетч 3.55 работает кривовато, температуру двигателя минус 100 градусов, напряжение 4.1 вольт, 3 ошибки , но через команду сервис инфо показывает 1 ошибку 3А замыкание на землю линии LIN, но это бывает когда шнурок подключал. Надо сделать чтобы ошибки можно было слрасывать.
будет лог - поправим корявость. Причем лог нужен как от диагностики с котлом, т.е. ещё где галочки нужно было выставлять (выбираем при диагностике W-шина), так и сниф девайса с котлом (в WTT при этом выбираем монитор W-шины, и WTT цепляем к w-bus, третьим будет).
Завтра попробую снять лог.
как выложить логи , я не нашел как добавить файл в сообщение?
как код вставляй, только под спойлер (вкладка сверху и галка свернуть )
Это лог с диагностики , запуск , стирание ошибок которых небыло и выключение.
Это в режиме снифа, запустил с смс , и зделал запрос сервис инфо , но почему то мало очень получилось , может чего напутал.
в последнем снифе ты сам котёл выключил? или он самовольничает?
а где же сниф с установкой необходимых галочек?
Я сам выключил , а то задохнулся нахрен .
исправлю скетч , увидел косяк
Да не ставил я этих галочек , делал все по умолчанию , там даже больше этих галочек было выставлено, подумал больше не меньше, работа отвлекала, я сначала не разобрался как лог снимать, не дотумкал что каждый новый лог программы затирает старый , там еще есть логированние измерений , но это не то , это просто логрованние температур и всяких других параметров. Если этого не хватит придется еще логи снимать . Мне бы пошаговую инструкцию , какие действия нужны , а то там идет логирование пока не выключишь его. Сегодня еще работу кнопки проверил, все вроде работает, только пришлось оптрон перепаять , я его не правильно впаял , ключ перепутал, исправил , все зарабоатло как надо..
v3.56 исправлен парсинг температуры и напряжения
галки нужны именно те, потому что нужно знать вкакой последовательности котёл будет отвечать байтами. Иначе если неправильно сделать, всё съедет, как это было как раз в 3.55
Хорошо , сделаю, но не раньше понедельника. у меня шнурок на работе остался и тачку завтра не планировал брать. У нас как на зло зима кончилась , то месяц морозяка была , ночью под 40 и ниже , а днем под 30 , а сегодня всего минус 6 днем. весной запахло.
Ещё вопрос, по температуре если температура двигателя читается с шины, то с чего читается температура улицы и салона, получается должено быть комбинированное считывание аналог цифра?
да улица и салон по датчикам даллас. Получается если выбран статус по цифре, то в массиве температур при измерениях , t ДВС пропускается (читается в другом месте по шине котла). Кстати пока сделн обмен только во время работы котла. Позже сделаю, что бы обновление параметров по шине было возможно в т.ч. и когда котёл выключен (ZAPROS и ServiceINFO).
отпишись как 3.56 заработал
А напряжение считывается если котел не запущен? Не даёт покоя автоматический запуск двигателя при опасной просадке напряжения в борт сети, например автозапуск двигателя при условии , что температура двигателя не ниже минус 10 градусов если напряжение просело до опасного значения.
Конечно отпишусь.
Отчитываюсь о работе скетча 3.56 , темпертуру двигла и напряжение читает , но надо сделать что бы можно было считать на не запущенном котле, заметил еще такой баг в ответной смс которая через 6 минут приходит . котел запустился и работает а в смс написано webasto on , startwebasto fail. Как будто не видит пламени , на скетче 3.5 было немного подругому , при запуске пришло 3 смс ,первая webasto on , вторая со статусом webasto on startwebasto fail и показания других статусов, а потом третья со статусами но уже startwebasto ok , правда я может быть сам команду на запрос послал , я стер те смски, но на скетче 3.55 и на последнем не видит статуса startwebasto правильно И еще что заметил на остывшем заглушенном двигателе и не работающем котле послал команду сервис инфо и мне пришел ответ что включены и помпа и бензанасос и вентилятор, я пошел на улицу проверил что все отключено , а на команду запрос пришло что вебаста оф но показания температуры двигателя 77 градусов и 12 вольт напряжения , как будто вебаста выдала данные на момент отключения.