судя по логам. Когда мы сначала запускаем котёл, он далее отвечает нормально (кроме команды на стирание ошибок - её видимо нужно как раз отправлять когда котёл не работает).
Но вот если на выключенном котле сразу отправляем запрос параметров или ошибок, ну или любые другие команды, то котёл отвечает очень странно: 44 03 C4 00 83 . 44 это типа сам себе. Кстати похожий ответ C4 00 (а полное 4F 03 C4 00 88) котёл отвечает на запросы поддержания связи F4 04 44 20 00 94 после запуска , только тут уже отвечает не сам себе 44, а как положено 4F - от котла на девайс.
Возможно это происходит , потому что нет сообщений начала коммуникации от девайса. В скетче 3.62 я их сделал, дак опять ты говоришь чето с GSM там не то. Попробуй может джсм все таки заработает. и лог надо будет на 3.62 снять.
что касается странности по сообщениям сам себе 44. То при выключении котла такое тоже происходит (44 02 90 D6) , но это нормально. Котёл таким же сообщением отвечает при остановке (помимо нормального ответа 4F 02 90 DD) и WTT и даже круглому таймеру 1533.
Пробовал я отправлять команду на стирание ошибок когда котел выключен, тоже пишет что нет овета от котла , единственный раз когда у меня стерло ошибки с смс команды было когда котел уже выключился и шла продувка после , вроде как уже ппамя не горит но еще и не уснул . Когда WTT подключено к котлу но он не запущен , стирает же ошибки. Может нужно какую нибудь команду добавить не просто пробуждение перепадами уровня а как WTT делает. я в этом еще не очень разобрался, но типо повторить команды когда программа подключается к котлу и считывает первоначальные данные , в нашем же случае , когда данные с котла корректно читаюстя котел в это время или греет или продувается , но программа же может читать данные и изменять их в режиме покоя .
Возможно это происходит , потому что нет сообщений начала коммуникации от девайса. В скетче 3.62 я их сделал, дак опять ты говоришь чето с GSM там не то. Попробуй может джсм все таки заработает. и лог надо будет на 3.62 снять.
вот еще логи но это уже wtt и котел , в первых двух просто подключение и ни каких действий , а в третьем стирание ошибок. И эти логи сняты без отключения девайса от шины , просто забыл отключить его от шины когда программу на ноуте подключил к котлу
может сделать как WTT делает ну там Tx: F4 03 51 0A AC и несколько следующих команд, а потом уже 50 30 . А эта команда 44 03 C4 00 83 это вроде как и в логе с WTT есть , а потом написано истечение времени ожидания. Типо затуп у котла какой то.
он заработал , но как то не сразу , может мой модем глючил , или сеть , я подключил девайс на авто, он у меня в родной разъем вставляется от таймера , отправил несколько смс , они были доствлены но ответа от котла или дивайса нет , котел не включился и ответных смс небыло, а потом я подключился через тройник для снифера , и о чудо все заработало, но в выключенном состоянии девайс не видит данные о температуре и напряжении , значит не получилось , как то по другому надо этот запрос делать.
может сделать как WTT делает ну там Tx: F4 03 51 0A AC и несколько следующих команд, а потом уже 50 30 . А эта команда 44 03 C4 00 83 это вроде как и в логе с WTT есть , а потом написано истечение времени ожидания. Типо затуп у котла какой то.
дак я так и сделал в 3.62. смотри пост #761 строка 44 там в конце это сообщение посылается. Просто этот логер коряво режет сообщения, поэтому трудно ориентироваться.
Самое интересное, что ведь заработало! - котел отвечает как положено. Просто я как то коряво видимо запарсил этот ответ, поэтому он пишет в смске что нет ответа. Посмотрю что да как, постараюсь исправить
Тогда не забудь добавить в еще функцию проверки уровня сигнала , очень понравилась, в гараже у меня всего 12 попугаев , а на работе 31 а это помоему максимум . И с ошибками т.е. их удалением надо что то делать. И еще я разобрался после какой команды настройки модема у меня перестает показывать регистрацию в сети , после набора AT+GSMBUSY=1 все сеть не видит модем а потом приходит смска что абонент доступен. хотя раньше было постоянно занято.
Все команды должны заканчиваться новой строкой. '\r' это значит перевод строки. Если пишем SIM800.print, то этот символ в конце нужен. Если пишем SIM800.println то можно без него.
дак а чё #761 лог то по ходу в момент работы котла. В строке 44 выключается котёл , но т.к. там далее продувка ещё идёт наверное поэтому котёл правильно ещё отвечает. Почему не снял лог, когда котёл спит?
Хотя по логу начиная только со строки 51 это через 3 минуты после остановки котла. По идее должен уже затихнуть и данные нормально считались. И вот здесь то и должна была нормальная СМС ка с ответом на ZAPROS прийти. Т.к. я посмотрел парсинг ответа от котла - всё там нормально.
Хотя глюк всё же был - в строке 50 опять котёл этой хренью ответил 44 03 C4 00 83 и это при том что до этого старт коммуникации F4 03 51 0A AС было отправлено
Ура товарисчи Ура , заработало показывает напряжение и температуру при выключенном котле , но возникла мысль что эта темпратура отражает скорее температуру котла. А он быстрее отсывает , когда выключен, может вернуть ненужный теперь датчик на выхлопе и перевесить его на движку,и смотреть по нему реальную температуру движки, а данные с w-bus обозвать температурой котла, это нужно чтобы можно было понять эфективность нагрева , а в режиме покоя эфективность утепления отсека двигателя.
Добрый вечер! Максим, а есть схема полная к последней версии платы 8.8. Для себя хочу разобраться, чтоб не нужное исключить. Мне нужно только чтоб сим была и К-лайн шина для Вебасты.
Мужики, че там исключать то? там рассыпухи максимум на 200 рублей. У меня нет пока времени схему рисовать, тем более что плата из китая мне ещё не пришла. вдруг найду косяки и опять схему перерисовывать.
Один транзистор рулит реле сброса питания джсм модуля в случае его зависания. Другой садит на массу вход сигнализации на 1 сек для инициирования запуска двс силами сигнализации.
Поправь пожалуста скетч , как я просил , если не сложно, а то уже охота смонтировать на постоянную , что бы провода не висели, у нас зима уже закончилась практически, ночью всего минус 5, не заметишь как плюс 40 будет. Тут уже пора озаботисья адаптивным охлажнением, что бы вентилятор охлаждения двигателя включался плавно и при достижении определенной температуры , и при выключении двигателя электропомпа работала еще несколько минут, как тебе идея , пока лето не наступило , через твой девайс можно же и помпу отдельно включать. без нагрева ?
со скетчем чуть позже пока некогда. Но есть хорошая новость. Пришли платы v8.8 из Китая. Блин качество и упаковки и плат вообще огонь! (по крайней мере на первый взгляд. надеюсь я с разводкой не накосячил и всё заработает). Платы пришли в вакуумном пакете с уловителем влаги внутри. Заказал 13 февраля , пришли 5 марта - норм срок для времени изготовления и дешёвой доставки. 5 плат вышло 750 руб. Т.е. 150р за одну плату. Цена тоже адекватная за такое качество.
Боялся, что я мог накосячить с размером платы, т.к. мерил корпус (см. по ссылкам много выше) простой линейкой. Думал, может не влезет плата в корпус или, наоборот, болтаться будет. Но всё просто супер, плата с минимальным зазором вошла в корпус. Отверстия для крепления совпадают хорошо.
Это моя первая заводская плата, заказанная в Китае. Я доволен. Впереди запаяка деталей, но ещё не все пришли.
со скетчем чуть позже пока некогда. Но есть хорошая новость. Пришли платы v8.8 из Китая. Блин качество и упаковки и плат вообще огонь! (по крайней мере на первый взгляд. надеюсь я с разводкой не накосячил и всё заработает). Платы пришли в вакуумном пакете с уловителем влаги внутри. Заказал 13 февраля , пришли 5 марта - норм срок для времени изготовления и дешёвой доставки. 5 плат вышло 750 руб. Т.е. 150р за одну плату. Цена тоже адекватная за такое качество.
Молодец, на фото платы классные, ждем результаты и фото сборки. Я тоже заказал с Китая, но 10 шт и цена 677 руб с оставкой.
со скетчем чуть позже пока некогда. Но есть хорошая новость. Пришли платы v8.8 из Китая. Блин качество и упаковки и плат вообще огонь! (по крайней мере на первый взгляд. надеюсь я с разводкой не накосячил и всё заработает). Платы пришли в вакуумном пакете с уловителем влаги внутри. Заказал 13 февраля , пришли 5 марта - норм срок для времени изготовления и дешёвой доставки. 5 плат вышло 750 руб. Т.е. 150р за одну плату. Цена тоже адекватная за такое качество.
Молодец, на фото платы классные, ждем результаты и фото сборки. Я тоже заказал с Китая, но 10 шт и цена 677 руб с оставкой.
скетч v 3.64 . Добавлена переменная температуры котла, котора контролируется только по шине. Переменная температуры ДВС теперь управляется только датчиком DS18B20. Температуру выхлопа не трогал. Все осталось как раньше - при протоколе статусов по аналогу датчик выхлопа опрашивается, при протоколе по цифре - не опрашивается.
char ver[] = "Firmware 3.64"; // версия прошивки
//----------------------------------название ячеек еепром----------------------------------------------------------------
#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
};
//-------------------------------------для voltmetr-----------------------------------------------------------------------
float vout = 0.0; // Напряжение на входе аналового входа
float Vpit = 0.0; // Измеряемое напряжение на выходе ИБП
int volt = 0; // Напряжение на входе АЦП
//------------------- распиновка ног ардуино (плата весий 8.5-8.8)--------------------------------------------------------
#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
/*
//------------------- распиновка ног ардуино (плата весий 5)---------------------------------------------------------------
#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
*/
//------------------------------------для GSM модуля----------------------------------------------------------------------
#include <SoftwareSerial.h>
SoftwareSerial SIM800 (GSM_RX, GSM_TX);//Rx, Tx //UART для соединения с GSM модулем
String currStr = "";
String TelNumber[] = {"", "000000000000", "000000000000", "000000000000"};
byte isStringMessage = 0;
byte KTOreport = 1; // флаг кто запросил отчет о запуске котла или ДВС
byte KTOzapros = 0; // флаг кто запросил баланс или запрос параметров
uint32_t prevReset=0; // для таймера периодичности проверки (командой "АТ")
byte intervalReset = 15; // каждые столько мин будет проверка жив ли GSM модуль
uint32_t timerWaitOK=0; // для таймера ожидания ответа после посылки команды "АТ"
bool timerenabledWaitOK=false; // для таймера ожидания ответа после посылки команды "АТ"
byte NoAnswersGSM=0; // количество неответов от GSM модуля
bool gsmOK = 1; // флаг есть связь с GSM модулем или нет
bool resettimer = 0; // для таймера удерживания реле в режиме сброс питания
uint32_t resetTimer=0; // для таймера удерживания реле в режиме сброс питания
byte ResetNumber = 0; // количество ресетов GSM модуля для статистики (хранится в еепром)
//------------------- для шины 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; // разница температур выхлопа и улицы, выше которой считается, что пламя в котле есть.
int8_t HeaterC = -100;
//---------------------------для организации W-BUS и различные таймеры-----------------------------------------------------------
#include <Button.h>
Button test;
#define K_LINE Serial //UART для соединения с шиной котла
#define TX 1
#define NEED 1
#define READY 10
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; // таймер сброса заголовка если в момент приёма сообщения данные оборвались
// команды для котлов ЭВО
byte StartByte = 0x20;
byte HEATER_BEGIN[] {0x51, 0x0A};
byte HEATER_START[] {StartByte, 0x3B};
byte HEATER_PRESENCE[] {0x44, StartByte, 0x00};
byte HEATER_STOP[] {0x10};
byte HEATER_STATUS_VEVO[] {0x50, 0x05};
byte HEATER_STATUS_EVO[] {0x50, 0x30, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x1E, 0x32};
byte HEATER_DTC_REQUEST[] {0x56, 0x01};
byte HEATER_DTC_ERASE[] {0x56, 0x03};
// команды для котлов ТТС/TTE
byte START_SESSION[] {0x81};
byte REQUEST_2A10101[] {0x2A, 0x01, 0x01};
byte REQUEST_2A10102[] {0x2A, 0x01, 0x02};
byte REQUEST_2A10105[] {0x2A, 0x01, 0x05};
byte REQUEST_DTC[] {0xA1};
byte START_TTC[] {0x31, 0x22, 0xFF};
byte STOP_TTC[] {0x31, 0x22, 0x00};
enum needAction_ {NO_ACTION, NEED_SMSZAPROS, NEED_SERVICEINFO, NEED_DTCCLEAR};// возможные действия, стоящие в очереди
byte needAction = NO_ACTION; // переменная действия, стоящего в очереди
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;
bool noData = 0; // флаг пришли ли данные от котла после запроса.
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 = 4; //количество отправленных сообщений на остановку котла
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; //переменная для таймера периодического измерения напряжения АКБ
uint32_t prevInitreset = 0; //переменная для таймера сброса инита шины
bool Initreset = 0; //переменная для таймера сброса инита шины
uint32_t timerInit = 0; bool timerInitflag = 0; //для таймера инита шины W-BUS
uint32_t prevNeedTimer = 0; bool NeedTimer = 0; //для таймера задержки функций SMSzapros() и ServiceINFO() на время обновления параметров по шине
uint32_t last_Flame = 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
//---------------------------------Основные переменные--------------------------------------------------------------------------------
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; // флаг работы вентилятора печки автомобиля
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); // реле ресет на данный момент делаем "неактивно"
SIM800.begin(19200); // сериал соединение для gsm модуля
delay(100);
NastroykaGSM ();
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);
if (Heater == EVO || Heater == VEVO) K_LINE.begin(2400, SERIAL_8E1);
else if (Heater == TTC_E) K_LINE.begin(10400);
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;
if (trevoga && !alarmSMS) AlarmSMS ();
if (gsmOK)readSMS();
Reset_gsm();
delSMS();
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]){ // если контрольная сумма совпадает
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();}}
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;
static bool SaveNumber2 = 0; // флаг когда необходима запись номера#2, он true
char currSymb = SIM800.read();
if ('\r' == currSymb)
{
if (isStringMessage!=0&&isStringMessage!=3) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
{
if (!currStr.compareTo("ZAPROS")) {if (webasto)SMSzapros(); else {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_SMSZAPROS; w_bus_init = 1;}} // Передача параметров по СМС
else if (!currStr.compareTo("ZAPROSTEL")) {SMSzaprosTEL();} // Передача номеров телефонов пользователей по СМС
else if (!currStr.compareTo("Service-info")) {if (webasto) ServiceINFO(); else {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_SERVICEINFO;w_bus_init = 1;}} // Передача сервисной информации по СМС
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("Erase DTC")) {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_DTCCLEAR; if (w_bus_init == 0) w_bus_init = 1;} //запрос на стриание ошибок
else if (!currStr.compareTo("Signal-level")) {digitalWrite (DTR, LOW); delay (150); SIM800.println(F("AT+CSQ")); digitalWrite (DTR, HIGH);} // запрос уровня сигнала GSM
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")), K_LINE.end(), K_LINE.begin(10400);
else if (Heater == 1)SIM800.println(F("VEVO")), K_LINE.end(), K_LINE.begin(2400, SERIAL_8E1);
else if (Heater == 2)SIM800.println(F("EVO")), K_LINE.end(), K_LINE.begin(2400, SERIAL_8E1);
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("+CSQ:")) //если текущая строка начинается с "+CSQ",то значит был запрос на уровень сигнала GSM, отправим ответ запрашивающему
{
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;}
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()
{
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: ")); if ((needAction>0 && !noData) || needAction == 0 || ProtocolSTATUS == ANALOG) {SIM800.print (Vpit,1); SIM800.println(F(" V"));}
else if (needAction>0 && noData && ProtocolSTATUS != ANALOG) SIM800.println(F(" No Data"));
SIM800.println(F("Temperatures:"));
if (ProtocolSTATUS != ANALOG){
SIM800.print(F("Heater: ")); if ((needAction>0 && !noData) || needAction == 0) {SIM800.print (HeaterC); grad ();}
else if (needAction>0 && noData) SIM800.println(F(" No Data"));}
else { SIM800.print(F("Vyhlop: ")); SIM800.print (Temper(VyhlopC)); grad ();}
SIM800.print(F("Engine: ")); SIM800.print (Temper(EngineC)); grad ();
SIM800.print(F("Ulica: ")); SIM800.print (Temper(UlicaC)); grad ();
SIM800.print(F("Salon: ")); SIM800.print (Temper(SalonC)); grad ();
if (ProtocolSTATUS == STATUSBUS){
SIM800.print(F("Errors: ")); if ((needAction>0 && !noData) || needAction == 0) SIM800.println (DTC[0]);
else if (needAction>0 && noData) SIM800.println(F(" No Data"));}
}
EndSMS();
}
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("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"));
SIM800.print(F("Start: "));
if (ProtocolSTART==IMPULSE) SIM800.println(F("GND Imp"));
else if (ProtocolSTART==STARTBUS) {SIM800.print(F("BUS"));
if (Heater== VEVO || Heater== EVO) {SIM800.print(F(" 0x")); SIM800.println (StartByte, HEX);}
else SIM800.println();}
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"));
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 && !noData) {
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("Errors: ")); SIM800.println (DTC[0]);
if (DTC[0] >0) 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+1)) SIM800.println (F(" Active"));
else SIM800.println (F(" Passive")); }
}
else if (noData) SIM800.println(F("Heater not answer. No Data"));
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 = NEED;
}
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;
}
void Heater_BUS (){
if (Heater == EVO || Heater == VEVO){
if (webasto) {
if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800) && w_bus_init >= 9){
sendMessage (HEATER_START, sizeof(HEATER_START));
StartMessageRepeat++;
Prev_PeriodW_BusStartStop = millis();
}
if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>4000) {
if (requiredmessage==1) sendMessage (HEATER_PRESENCE, sizeof(HEATER_PRESENCE));
else if (requiredmessage==2) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO, sizeof(HEATER_STATUS_EVO));
if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO, sizeof(HEATER_STATUS_VEVO));}
else if (requiredmessage==3) sendMessage (HEATER_DTC_REQUEST, sizeof(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, sizeof(HEATER_STOP));
StopMessageRepeat++;
StartMessageRepeat = 0;
Prev_PeriodW_BusStartStop = millis();
}
if (!timerInitflag && w_bus_init==NEED) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==NEED) {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=9;
if (needAction>0) sendMessage (HEATER_BEGIN, sizeof(HEATER_BEGIN)); }
if (K_LINE.available()){
// первый старт байт
if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();
if (buf[0]==0x4F || buf[0]==0x44){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] ==0x0A) {
airfan = (bool)buf[5]; // получаем флаг работы нагнетателя воздуха
plug = (buf[5] & 0x02)>>1; // получаем флаг работы штифта накаливания
fuelpump = (buf[5] & 0x04)>>2; // получаем флаг работы топливного насоса
waterpump = (buf[5] & 0x08)>>3; // получаем флаг работы циркуляционного насоса
blowerfan = (buf[6] & 0x10)>>4; // получаем флаг работы вентилятора печки автомобиля
}
if (buf[6] ==0x0C) HeaterC = buf[7]-50; // получаем температуру антифриза в котле
if (buf[8]==0x0E) {Vpit = (float)(buf[9]<<8|buf[10])/1000.0;} // получаем напряжение борт сети
if (buf[11]==0x10) {startWebasto_OK = (bool)buf[12]; last_Flame = curmillis;} // проверяем наличие пламени
if (needAction>0 && needAction<NEED_DTCCLEAR) {w_bus_init = 12; sendMessage (HEATER_DTC_REQUEST, sizeof(HEATER_DTC_REQUEST));}
}
if (buf[0]==0x44 && buf[2]==0xC4 && buf[3]==0x00) {w_bus_init = 1; delay (500); K_LINE.flush();} // если получили от котла сбой инита, делаем переинит
if (buf[2]==0xD6 && buf[3]==0x01) {if (needAction>0 && needAction<NEED_DTCCLEAR) w_bus_init = 13;
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, (buf[h*3+6] & 0x02)>>1);}
}
if (buf[2]==0xD6 && buf[3]==0x03) {startSMS (KTOzapros); SIM800.println (F("DTCs are erased!")); EndSMS(); needAction=0; w_bus_init = 9; NeedTimer = 0; }
if (buf[2]==0xD1 && buf[3]==0x0A) {w_bus_init = 10; }// если получили ответ на сообщение старта коммуникации
}
if (Heater == VEVO){
if (buf[2]==0xD0 && buf[3]==0x05) {startWebasto_OK = buf[7]; last_Flame = 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==NEED) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>299) && w_bus_init==NEED) {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=9; sendMessage (START_SESSION, sizeof(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 (curmillis - last_Flame>20000 && ProtocolSTATUS==STATUSBUS) {startWebasto_OK=0; last_Flame = curmillis;} // делаем статус "нет пламени" через 20 сек, если не получаем сообщения от котла
if (Initreset && curmillis - prevInitreset>17000) {Initreset = 0; w_bus_init = 0;} // сброс инита, если прошло более 17 сек после отправки последнего сообщения
if (needAction>0 && needAction < NEED_DTCCLEAR && w_bus_init==10) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO, sizeof(HEATER_STATUS_EVO));
if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO, sizeof(HEATER_STATUS_VEVO));
w_bus_init=11;}
if ((NeedTimer && curmillis - prevNeedTimer>11000) || w_bus_init == 13) {NeedTimer = 0;
if (curmillis - prevNeedTimer>11000) noData = 1;
if (needAction == NEED_SMSZAPROS) SMSzapros();
else if (needAction == NEED_SERVICEINFO) ServiceINFO();
else if (needAction == NEED_DTCCLEAR) {startSMS(KTOzapros); SIM800.println (F("DTC not cleared. Heater no answer!")); EndSMS();}
w_bus_init = 9; noData = 0; needAction = 0;
}
if (needAction==NEED_DTCCLEAR && w_bus_init==10) { sendMessage (HEATER_DTC_ERASE, sizeof(HEATER_DTC_ERASE)); w_bus_init = 20; }
}
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();
NoAnswersGSM++; if (NoAnswersGSM>4) NoAnswersGSM = 4;
}
}
if (!gsmOK) {
if (SIM800.available()>0){
char currSymb = SIM800.read();
if ('\r' == currSymb) {
if (!currStr.compareTo("OK")) { gsmOK = true; timerenabledWaitOK = 0; NoAnswersGSM=0; digitalWrite (DTR, HIGH);}
currStr = "";
}
else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11) {currStr += String(currSymb);}}}
if (NoAnswersGSM>=4) Reset();
}
void Reset(){
if (!resettimer) {digitalWrite (ResetGSM, RelayON); resettimer = 1; resetTimer = millis();}
else if (millis()- resetTimer>6000 ) {
resettimer = 0;
NoAnswersGSM=0;
ResetNumber++;
EEPROM.write (ResetNumber_cell, ResetNumber);
digitalWrite (ResetGSM, !RelayON);
delay (3500); NastroykaGSM ();}
}
void sendMessage(const byte *command, const size_t size){
Initreset = 1; prevInitreset = curmillis; // включение таймера сброса инита
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]);
}
}
}
Залил скетч 3.64 все работает, правда заметил такую приколюху , после заливки нового сктеча проверил просто на блоке питания без подключения к авто, все работает, поставил в автомобиль, для проверки отправил в приложении команду на запрос состояния ,вроде смс ушло и отчет о получении пришел , но ответа нет, отправил еще одну , такая же х...ня , передернул питание и все заработало, не знаю что за прикол. но так же было после предидущих прошивок, я еще писал что они не заработали сразу , а потом обнаружилось что они работают, почему то первый запуск после обновления скетча , так работает , не знаю почему , может глюк модема , хотя модем я поставил другой . пришла посылка с Китая на конец то. Странно это все.
Залил скетч 3.64 все работает, правда заметил такую приколюху , после заливки нового сктеча проверил просто на блоке питания без подключения к авто, все работает, поставил в автомобиль, для проверки отправил в приложении команду на запрос состояния ,вроде смс ушло и отчет о получении пришел , но ответа нет, отправил еще одну , такая же х...ня , передернул питание и все заработало, не знаю что за прикол. но так же было после предидущих прошивок, я еще писал что они не заработали сразу , а потом обнаружилось что они работают, почему то первый запуск после обновления скетча , так работает , не знаю почему , может глюк модема , хотя модем я поставил другой . пришла посылка с Китая на конец то. Странно это все.
сфоткай как собрано устройство. Может аппаратный косяк. У меня таких глюков не замечено.
положил адреса датчиков даллас в еепром. Теперь они не жестко в скетче сидят и их можно прописывать при помощи смс (например при замене датчика, или если перепутал место установки).
изначальную запись адресов можно делать в скетче чистки еепром
#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
sizeCells,
TelNumber1_cell =20, //20
TelNumber2_cell =40, //40
DallasAddr_cell =60 //60
};
// названия температур котла:
enum TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp};
// возможные протоколы чтения статуса котла:
enum ProtocolSTATUS_ {
STATUSBUS, // статусы котла читаются по цифровой шине
ANALOG // статусы котла считываются силами ардуино - по датчикам
};
// возможные протоколы запуска котла:
enum ProtocolSTART_ {
STARTBUS, // запуск котла происходит по цифровой шине
IMPULSE, // запуск котла происходит импульсом GND (для подпайки к кнопке пуск на таймере котла)
POTENCIAL // запуск котла происходит подачей потенциала +12В (пока плюс висит - котёл работает)
};
// возможные типы котла:
enum Heater_ { TTC_E, VEVO, EVO, HYDRONIC};
//--------------------ниже здесь устанавливаем какие настройки у девайса будут по умолчанию
byte ProtocolSTATUS = STATUSBUS; // в данном случае статусы читаются по цифровой шине
byte ProtocolSTART = STARTBUS; // в данном случае запуск котла происходит по цифровой шине
byte Heater = EVO; // в данном случае тип котла EVO
byte StartByte = 0x20; // в данном случае байт на старт котла 0x20 (для шины w-bus)
byte worktime = 30; // в данном случае время цикла работы котла 30 минут
byte deltaT = 45; // разница температур улицы и выхлопа, выше которой считается, что котёл успешно стартанул
//сюда пишем адреса датчиков даллас (левые 8 байт):
byte DS18B20 [size_arrayTemp][10] = {
{0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1, VyhlopC, -100},
{0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D, EngineC, -100},
{0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48, UlicaC, -100},
{0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1, SalonC, -100}
};
//----------------------
void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, 0);
EEPROM.write(TimeWebasto_cell, worktime);
EEPROM.write(ProtocolSTART_cell, ProtocolSTART);
EEPROM.write(ProtocolSTATUS_cell, ProtocolSTATUS);
EEPROM.write(Heater_cell, Heater);
EEPROM.write(ResetNumber_cell, 0);
EEPROM.write(StartByte_cell, StartByte);
EEPROM.write(delta_cell, deltaT);
for (int i = sizeCells ; i < DallasAddr_cell ; i++) EEPROM.write(i, '0'); // стираем ячейки под номера телефонов
// ниже записываем в еепром адреса датчиков даллас:
for (byte i=0; i<sizeof(DS18B20)/10; i++) {
for (byte k=0; k<10; k++) EEPROM.write (DallasAddr_cell+i*10+k, DS18B20 [i][k]);
}
digitalWrite(13, HIGH);
}
void loop() {}
не забываем после чистки еепром нужно свой тел.номер заново записать командой WriteNumber1
Сделал задержку 4 секунды вместо 3.5 , и глюк прошел вроде, глюк себя проявлял при снятии аккума или после подключения питания после прошивки, как будто синхронизация модема с друиной не происходила или может dc-dc медленно раскачивается.
бери мой логгер w-bus и снифь девайс и котёл, когда он выключен и ты посылаешь zapros.
после работы попробю. Вчера залил скетч в нано , вечером буду пробовать снифить.
вот сделал лог
Вот еще
судя по логам. Когда мы сначала запускаем котёл, он далее отвечает нормально (кроме команды на стирание ошибок - её видимо нужно как раз отправлять когда котёл не работает).
Но вот если на выключенном котле сразу отправляем запрос параметров или ошибок, ну или любые другие команды, то котёл отвечает очень странно: 44 03 C4 00 83 . 44 это типа сам себе. Кстати похожий ответ C4 00 (а полное 4F 03 C4 00 88) котёл отвечает на запросы поддержания связи F4 04 44 20 00 94 после запуска , только тут уже отвечает не сам себе 44, а как положено 4F - от котла на девайс.
Возможно это происходит , потому что нет сообщений начала коммуникации от девайса. В скетче 3.62 я их сделал, дак опять ты говоришь чето с GSM там не то. Попробуй может джсм все таки заработает. и лог надо будет на 3.62 снять.
что касается странности по сообщениям сам себе 44. То при выключении котла такое тоже происходит (44 02 90 D6) , но это нормально. Котёл таким же сообщением отвечает при остановке (помимо нормального ответа 4F 02 90 DD) и WTT и даже круглому таймеру 1533.
Пробовал я отправлять команду на стирание ошибок когда котел выключен, тоже пишет что нет овета от котла , единственный раз когда у меня стерло ошибки с смс команды было когда котел уже выключился и шла продувка после , вроде как уже ппамя не горит но еще и не уснул . Когда WTT подключено к котлу но он не запущен , стирает же ошибки. Может нужно какую нибудь команду добавить не просто пробуждение перепадами уровня а как WTT делает. я в этом еще не очень разобрался, но типо повторить команды когда программа подключается к котлу и считывает первоначальные данные , в нашем же случае , когда данные с котла корректно читаюстя котел в это время или греет или продувается , но программа же может читать данные и изменять их в режиме покоя .
вот еще логи но это уже wtt и котел , в первых двух просто подключение и ни каких действий , а в третьем стирание ошибок. И эти логи сняты без отключения девайса от шины , просто забыл отключить его от шины когда программу на ноуте подключил к котлу
может сделать как WTT делает ну там Tx: F4 03 51 0A AC и несколько следующих команд, а потом уже 50 30 . А эта команда 44 03 C4 00 83 это вроде как и в логе с WTT есть , а потом написано истечение времени ожидания. Типо затуп у котла какой то.
Вот лог с 3.62 скетча , но сделанный без твоего w-bus снифера на ардуино, и в начале не переключил на хекс режим показа ,
он заработал , но как то не сразу , может мой модем глючил , или сеть , я подключил девайс на авто, он у меня в родной разъем вставляется от таймера , отправил несколько смс , они были доствлены но ответа от котла или дивайса нет , котел не включился и ответных смс небыло, а потом я подключился через тройник для снифера , и о чудо все заработало, но в выключенном состоянии девайс не видит данные о температуре и напряжении , значит не получилось , как то по другому надо этот запрос делать.
может сделать как WTT делает ну там Tx: F4 03 51 0A AC и несколько следующих команд, а потом уже 50 30 . А эта команда 44 03 C4 00 83 это вроде как и в логе с WTT есть , а потом написано истечение времени ожидания. Типо затуп у котла какой то.
дак я так и сделал в 3.62. смотри пост #761 строка 44 там в конце это сообщение посылается. Просто этот логер коряво режет сообщения, поэтому трудно ориентироваться.
Самое интересное, что ведь заработало! - котел отвечает как положено. Просто я как то коряво видимо запарсил этот ответ, поэтому он пишет в смске что нет ответа. Посмотрю что да как, постараюсь исправить
Тогда не забудь добавить в еще функцию проверки уровня сигнала , очень понравилась, в гараже у меня всего 12 попугаев , а на работе 31 а это помоему максимум . И с ошибками т.е. их удалением надо что то делать. И еще я разобрался после какой команды настройки модема у меня перестает показывать регистрацию в сети , после набора AT+GSMBUSY=1 все сеть не видит модем а потом приходит смска что абонент доступен. хотя раньше было постоянно занято.
А что значит \r в конце команды AT+GSMBUSY=1 из ранних скетчей ? В мануале по командам этого нет .
Все команды должны заканчиваться новой строкой. '\r' это значит перевод строки. Если пишем SIM800.print, то этот символ в конце нужен. Если пишем SIM800.println то можно без него.
дак а чё #761 лог то по ходу в момент работы котла. В строке 44 выключается котёл , но т.к. там далее продувка ещё идёт наверное поэтому котёл правильно ещё отвечает. Почему не снял лог, когда котёл спит?
Хотя по логу начиная только со строки 51 это через 3 минуты после остановки котла. По идее должен уже затихнуть и данные нормально считались. И вот здесь то и должна была нормальная СМС ка с ответом на ZAPROS прийти. Т.к. я посмотрел парсинг ответа от котла - всё там нормально.
Хотя глюк всё же был - в строке 50 опять котёл этой хренью ответил 44 03 C4 00 83 и это при том что до этого старт коммуникации F4 03 51 0A AС было отправлено
Эта хрень есть и в логе с wtt ,если ты заметил.
да один раз она там была и wtt снова запустила сообщение старт коммуницации, мы также будем делать тогда.
к версии 3.62 добавил запрос уровня сигнала и переинит при получении от котла 44 03 C4 00 83
получилcя скетч v3.63
Ура товарисчи Ура , заработало показывает напряжение и температуру при выключенном котле , но возникла мысль что эта темпратура отражает скорее температуру котла. А он быстрее отсывает , когда выключен, может вернуть ненужный теперь датчик на выхлопе и перевесить его на движку,и смотреть по нему реальную температуру движки, а данные с w-bus обозвать температурой котла, это нужно чтобы можно было понять эфективность нагрева , а в режиме покоя эфективность утепления отсека двигателя.
Легко. Проверь как ошибки стирает
Это просто праздник какой-то, и ошибки теперь стирает , всё работает .
Добрый вечер! Максим, а есть схема полная к последней версии платы 8.8. Для себя хочу разобраться, чтоб не нужное исключить. Мне нужно только чтоб сим была и К-лайн шина для Вебасты.
Мужики, че там исключать то? там рассыпухи максимум на 200 рублей. У меня нет пока времени схему рисовать, тем более что плата из китая мне ещё не пришла. вдруг найду косяки и опять схему перерисовывать.
Хорошо, просто на плате есть транзисторы не очень понятно что куда. Я тоже заказал платы из Китая на этой неделе, буду ждать.
Один транзистор рулит реле сброса питания джсм модуля в случае его зависания. Другой садит на массу вход сигнализации на 1 сек для инициирования запуска двс силами сигнализации.
День добрый вопрос по уровню сигнала сим 800, при каком минимальном уровне стабильно работает ?
--
Непонятен вопрос , если смс доходят ,значит будет работать .
Поправь пожалуста скетч , как я просил , если не сложно, а то уже охота смонтировать на постоянную , что бы провода не висели, у нас зима уже закончилась практически, ночью всего минус 5, не заметишь как плюс 40 будет. Тут уже пора озаботисья адаптивным охлажнением, что бы вентилятор охлаждения двигателя включался плавно и при достижении определенной температуры , и при выключении двигателя электропомпа работала еще несколько минут, как тебе идея , пока лето не наступило , через твой девайс можно же и помпу отдельно включать. без нагрева ?
со скетчем чуть позже пока некогда. Но есть хорошая новость. Пришли платы v8.8 из Китая. Блин качество и упаковки и плат вообще огонь! (по крайней мере на первый взгляд. надеюсь я с разводкой не накосячил и всё заработает). Платы пришли в вакуумном пакете с уловителем влаги внутри. Заказал 13 февраля , пришли 5 марта - норм срок для времени изготовления и дешёвой доставки. 5 плат вышло 750 руб. Т.е. 150р за одну плату. Цена тоже адекватная за такое качество.
Боялся, что я мог накосячить с размером платы, т.к. мерил корпус (см. по ссылкам много выше) простой линейкой. Думал, может не влезет плата в корпус или, наоборот, болтаться будет. Но всё просто супер, плата с минимальным зазором вошла в корпус. Отверстия для крепления совпадают хорошо.
Это моя первая заводская плата, заказанная в Китае. Я доволен. Впереди запаяка деталей, но ещё не все пришли.
со скетчем чуть позже пока некогда. Но есть хорошая новость. Пришли платы v8.8 из Китая. Блин качество и упаковки и плат вообще огонь! (по крайней мере на первый взгляд. надеюсь я с разводкой не накосячил и всё заработает). Платы пришли в вакуумном пакете с уловителем влаги внутри. Заказал 13 февраля , пришли 5 марта - норм срок для времени изготовления и дешёвой доставки. 5 плат вышло 750 руб. Т.е. 150р за одну плату. Цена тоже адекватная за такое качество.
Молодец, на фото платы классные, ждем результаты и фото сборки. Я тоже заказал с Китая, но 10 шт и цена 677 руб с оставкой.
со скетчем чуть позже пока некогда. Но есть хорошая новость. Пришли платы v8.8 из Китая. Блин качество и упаковки и плат вообще огонь! (по крайней мере на первый взгляд. надеюсь я с разводкой не накосячил и всё заработает). Платы пришли в вакуумном пакете с уловителем влаги внутри. Заказал 13 февраля , пришли 5 марта - норм срок для времени изготовления и дешёвой доставки. 5 плат вышло 750 руб. Т.е. 150р за одну плату. Цена тоже адекватная за такое качество.
Молодец, на фото платы классные, ждем результаты и фото сборки. Я тоже заказал с Китая, но 10 шт и цена 677 руб с оставкой.
может я где-то лоханулся и если бы нажал 10 то цена была бы такая же. Но, помится, вроде ценник больше становился.
И странно ,что у меня стоимость изготовления 350 руб. протива ваших 131р. а доставка даже дешевле - 409руб. Уж не знаю почему так.
сейчас проверил у них на сайте тоже стало 131р. за 10 плат. Может они после НГ своего с похмелья меня так немного нагрели))
Ну как там со временем ,не появилось ещё , или до следующей зимы все затухло?
скетч v 3.64 . Добавлена переменная температуры котла, котора контролируется только по шине. Переменная температуры ДВС теперь управляется только датчиком DS18B20. Температуру выхлопа не трогал. Все осталось как раньше - при протоколе статусов по аналогу датчик выхлопа опрашивается, при протоколе по цифре - не опрашивается.
запаял быстренько все деталюхи на заводскую плату. Косяков пока не обнаружил. всё работает. Паять приятно такую плату, ну и само собой быстрее.
Вообще огонь, классно вышло, как заводская. Разъем, тип какой, напиши пожалуйста или ссылку кинь где заказать можно
#353
Доброго! подскажите пожалуйста или дайте ссылочку на файлик Button.h . Возможно искал невнимательно ну в общем не нашел , подскажите если не сложно .
титановый вел button.h для кнопки от добрейшего дяди Клапы Пост 563
vgk_com благодарю !
Всем привет, может подскажите, как настрить CanHacker на скорость 200 кбит/с., а то или125 или 250, а 200 нету
Залил скетч 3.64 все работает, правда заметил такую приколюху , после заливки нового сктеча проверил просто на блоке питания без подключения к авто, все работает, поставил в автомобиль, для проверки отправил в приложении команду на запрос состояния ,вроде смс ушло и отчет о получении пришел , но ответа нет, отправил еще одну , такая же х...ня , передернул питание и все заработало, не знаю что за прикол. но так же было после предидущих прошивок, я еще писал что они не заработали сразу , а потом обнаружилось что они работают, почему то первый запуск после обновления скетча , так работает , не знаю почему , может глюк модема , хотя модем я поставил другой . пришла посылка с Китая на конец то. Странно это все.
Попробуй в строке 239 скетча 3.64 поставить задержку 4сек вместо 3.5
Всем привет, может подскажите, как настрить CanHacker на скорость 200 кбит/с., а то или125 или 250, а 200 нету
Причем здесь канхакер в этой теме? Спрашивайте это у разработчика библиотеки канхакер на ситроен с4 клубе
Залил скетч 3.64 все работает, правда заметил такую приколюху , после заливки нового сктеча проверил просто на блоке питания без подключения к авто, все работает, поставил в автомобиль, для проверки отправил в приложении команду на запрос состояния ,вроде смс ушло и отчет о получении пришел , но ответа нет, отправил еще одну , такая же х...ня , передернул питание и все заработало, не знаю что за прикол. но так же было после предидущих прошивок, я еще писал что они не заработали сразу , а потом обнаружилось что они работают, почему то первый запуск после обновления скетча , так работает , не знаю почему , может глюк модема , хотя модем я поставил другой . пришла посылка с Китая на конец то. Странно это все.
сфоткай как собрано устройство. Может аппаратный косяк. У меня таких глюков не замечено.
положил адреса датчиков даллас в еепром. Теперь они не жестко в скетче сидят и их можно прописывать при помощи смс (например при замене датчика, или если перепутал место установки).
изначальную запись адресов можно делать в скетче чистки еепром
не забываем после чистки еепром нужно свой тел.номер заново записать командой WriteNumber1
в связи с этими изменениями обновлённая инструкция пользователя
сам скетч v3.65
запаял быстренько все деталюхи на заводскую плату. Косяков пока не обнаружил. всё работает. Паять приятно такую плату, ну и само собой быстрее.
А какой предохранитель ставил? Можно маркировку, размер?
Детальки едут, остальное надо докупать)
Сделал задержку 4 секунды вместо 3.5 , и глюк прошел вроде, глюк себя проявлял при снятии аккума или после подключения питания после прошивки, как будто синхронизация модема с друиной не происходила или может dc-dc медленно раскачивается.