GSM устройство управления котлами Webasto и не только

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:

был бы ещё человек, умеющий конвертировать в формат, который китайцы берут на изготовление. Gerber чтоли. А вообще, нужно, конечно,  самому разбираться.

есть теперь такой чел. Я. Разобрался. Берём эти gerber_файлы закидываем прямо в окно онлайн сервиса по просмотру gerber проектов. Крутим плату и любуемся ей в 3д. Эти же файлы можно отправить китайцу на изготовление. Исходник от layout6 - V8.2

Но сильно не спешим - нужно ещё с разъемом разобраться. 

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Оживилась тема) прошу прощения за молчание, уезжал, не было доступа к инету, на выходных продолжу свои попытки запуска через шину

MaksVV
Offline
Зарегистрирован: 06.08.2015

Всё, разъем трассировал. Разъем Micro-Fit 3.0  2x10 на али не нашёл в единичной продаже, поэтому лучше в радиомагазе брать. 

Плата v8.3.   Gerber файлы   исходник на файл_layout  . В принципе специально делал одностороннюю и дорожки не сильно мелкие, чтобы ЛУТом тоже можно было развести. Только металлизацию лучше убрать при этом. Конечно перед заказом в Китай надо бы ЛУТом проверить. 

Выглядит так: 

sotyi
Offline
Зарегистрирован: 05.01.2017

На схеме не показано подключение D3 и D4 (SoftwareSerial)

MaksVV
Offline
Зарегистрирован: 06.08.2015

на какой схеме? софт сериал на других пинах сидит

sotyi
Offline
Зарегистрирован: 05.01.2017

MaksVV пишет:

на какой схеме? софт сериал на других пинах сидит

Я про сообщение #86.

Для чего софт сериал, если сообщения выводим на USB?

MaksVV
Offline
Зарегистрирован: 06.08.2015

там не нужен софт сериал, и без него всё работает, можете не подключать

Serjeant
Offline
Зарегистрирован: 08.11.2018

Всем привет. Только что присоединился к проекту, достаточно интересное устройство. Большое уважение автору, считаю что проделана громандная работа с которой он поделился с остальными.  

Когда то сомибирал эмулятор 1533 на атмега48, до сих пор работает.

По W-bus  получилось у кого получить ответ от котла, темпретаруту, напряжение, наличие пламени? Температура на Thermo TOP C -  (с другими дел не имел у уеня догреватели с Туарега, и одна плата с Ауди Q7 все что тут пишу о них) - имеет нелинейную зависимость, то что тут где то было на писано , что надо отнять 50 С - не верно, у меня не так , как вариант строить таблицу, типа  ниже нуля - Cold, 0-10 С, 10-20С, 30-40С, 40-50С, выше 50 - Hot. Напряжение -там АЦП с линейной зависимостью, пламя 00 или 01- соответственно есть или нету пламени. 

Тут кто то спрашивал Webasto   Thermo Call -  родня программа - может управлять посылая комманды по СМС - Start, Stop, Temp и режимы работы, причем температуру она хочет брать с внешнего датчика, а не с котла, видимо с ней не все так просто даже немцам. То есть что бы ее пользовать достаточно поменять в коде программы комманды Webasto-On -  на Start - и должно работат через Themo Call. 

У меня пока только теория, с ардуино дела не имел, ничего нет, только заказал.

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Serjeant пишет:

По W-bus  получилось у кого получить ответ от котла, темпретаруту, напряжение, наличие пламени? Температура на Thermo TOP C -  (с другими дел не имел у уеня догреватели с Туарега, и одна плата с Ауди Q7 все что тут пишу о них) - имеет нелинейную зависимость, то что тут где то было на писано , что надо отнять 50 С - не верно, у меня не так , как вариант строить таблицу, типа  ниже нуля - Cold, 0-10 С, 10-20С, 30-40С, 40-50С, выше 50 - Hot. Напряжение -там АЦП с линейной зависимостью, пламя 00 или 01- соответственно есть или нету пламени. 

Ранее речь шла про котлы Thermo TOP C и E, предназначенные для допустановки. А у вас штатные, поэтому протокол отличается. 

Нужно просто создать эмпирическую формулу для температуры. Это делается при помощи эмулятора котла. чуть выше написано как заснифить обмен данными между диагностикой и котлом при помощи K-line адаптера и инженерной версии программы Webasto TermoTest (сокращённо WTT). Когда будет сниф, я легко напишу эмулятор, подсунем его программе WTT и будете менять байт температуры и посмотрите по какой зависимости он будет меняться в диагностике. 

Serjeant
Offline
Зарегистрирован: 08.11.2018

А что снифить то нужно? У меня есть блок управления от вебасты, можно и без эмулятора (пока нет возможности его реализовать), адаптер тоже есть, WWT 2.16 (расширенная) есьь, если будет сниф просто, то там не видно будет реальной температуры, только ответ от котла, или я ошибаюсь. Я могу снять показания котла по температуре, +1С - ответ котла и так далее, осталось придумать как нагревать плавно на 1С.

Есть старые наработки

22 - B8, 23 - B7, 24 - B(пропуск) , 25- B2, 26- B0, 27- AE, 28-AC, 29- AA, 30 A8

 

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

в WTT есть функция чтобы показывать весь протокол обмена (читай выше как это сделать). Если снимете лог общения, я сделаю эмуль, и скажу какая зависимость байта температуры. Тем более лог будет полезен для коллекции

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот следующая продвинутая версия эмулятора котлов TTC/E . Верхние две строки скетча смотрим настраиваем (комментируем либо нет). 

Там настраивается как подключаемся к WTT либо без к-лайн адаптера (через юсб ардуины), либо через к-лайн

Когда через к-лайн адаптер  - есть возможность изменять значения байтов  ответного сообщения (PIDa) "на лету" через сериал терминал. 

если подключаемся к WTT через юсб ардуины значение байтов можно менять только вручную в скетче, каждый раз его перезаливая. 

отправляя через терминал (9600 без переноса каретки и конца строки) символы '1' '2' или '3' выбираем какой ответный пид меням 2А 01 01,  2А 01 02 или  2А 01 05. 

отправляя '+' или '-' выбираем номер изменяемого байта

отправляя ',' или '.' изменяем значение байта на -1 или +1 соответственно

отправляя 'm' -  делаем значение байта поочереди либо 0 либо FF


#define K_LINE_COM_WTT    // закоментировать эту строку если собираемся подключать эмулятор напрямую к WTT без к-лайн адаптера, через юсб ардуины 
                          // (если строка закоментирована в WTT выбираем компорт, на котором висит ардуино, если строка раскоментирована выбираем в WTT компорт К-лайн адаптера)

//#define ARDUINO_MEGA    // закоментировать эту строку, если используем НЕ Мегу2560 (на меге к-лайн подключен к Serial1)


#ifdef K_LINE_COM_WTT
byte bytenumber = 5;
byte numberMAX = 5; 
byte pid=2;
bool f = 0;
   #ifdef ARDUINO_MEGA
      #define K_LINE Serial1    // сериал, на котором висит к-лайн адаптер (для меги)
   #else
       #include <SoftwareSerial.h>  // софт сериал, на котором висит к-лайн адаптер  
                             // (при этом строка выше "#define ARDUINO_COM" должна быть закоментирована)
       #define RX 7          // это пины К-лайн адаптера, висящего на софт сериал
       #define TX 8          // это пины К-лайн адаптера, висящего на софт сериал
       SoftwareSerial K_LINE   (RX, TX);  
   #endif
#else
#define K_LINE Serial        // работаем через Serial, когда выбрано без к-лайн адаптера
#endif

#define MY_ADDRESS 0x51   // прикидываемся котлом (адрес котла 0x51)
#define RX_ADDRESS 0xF1   // соответственно получаемые сообщения от диагностики (0хF1)


 uint32_t timerdelay = 0;    // таймер ожидания байт (для успевания появления данных в буфере UART)
 bool Delay = 0;             // таймер ожидания байт (для успевания появления данных в буфере UART)
 byte waitbyte_RX = 1;       // задержка, мс для успевания появления данных в буфере RX 
                             // (подрегулировать в зависимости от уровня жизнидеятельности на Марсе) 
 #define TIMER_DELAY Delay = 0; timerdelay = curmillis  // включение этого таймера

 uint32_t prevRESETheader=0; // таймер сброса заголовка если в момент приёма заголовка данные оборвались
 bool RESETheader_timer;     // таймер сброса заголовка если в момент приёма заголовка данные оборвались
 
  
 byte delaybyte_TX  = 1;     // задержка между посылкой байт в запросе, мс
 

byte header = 0;          // состояние заголовка
byte message_size = 0;    // размер тела сообщения
byte j = 3;               // инкремент
byte n = 3;               // количество старт байт
const byte bufsize = 100; // размер буфера принятого сообщения
byte buf [bufsize] = {0}; // буфер принятого сообщения
byte crc =0;              // байт контрольной суммы 


#define sizeMes 19
byte answ_message[][sizeMes] = {

{0x83, RX_ADDRESS, MY_ADDRESS, 0xC1, 0xC2, 0x46, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 81 51 F1 81 44
{0x8F, RX_ADDRESS, MY_ADDRESS, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x12, 0x07, 0x04, 0x26, 0x99, 0x22, 0x66}, // 82 51 F1 3C 00 00

{0x87, RX_ADDRESS, MY_ADDRESS, 0x6A, 0x01, 0xAF, 0x00, 0xB9, 0x00, 0x50, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 83 51 F1 2A 01 01 F1
{0x88, RX_ADDRESS, MY_ADDRESS, 0x6A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 83 51 F1 2A 01 02 F2 
{0x84, RX_ADDRESS, MY_ADDRESS, 0x6A, 0x05, 0x70, 0xC3, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 83 51 F1 2A 01 05 F5
{0x84, RX_ADDRESS, MY_ADDRESS, 0xE1, 0xFF, 0xFF, 0x00, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 81 51 F1 A1 64

};

byte answ_unknown_command[] {0x83, 0xF1, 0x51, 0x7F, 0x31, 0x23, 0x98};  // 82 51 F1 31 03 F8 

#define sizetabl 37
byte tabl[][sizetabl] = {
{0x17, 0x20, 0x22, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE8, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE},
{0x00, 0x3F, 0x8F, 0x5F, 0x88, 0x00, 0xAB, 0x80, 0x10 ,0x01, 0x17, 0x01, 0x08, 0x01, 0x20, 0x01, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x41, 0x17, 0x98, 0x01, 0x15, 0x00, 0x60, 0xA4, 0x07, 0x24, 0x26, 0x41, 0x06, 0x98, 0x45}
};

void setup() 
{
Serial.begin (9600);  
K_LINE.begin (10400);     
}

void loop() {

uint32_t curmillis = millis();

#ifdef  K_LINE_COM_WTT 
if (Serial.available()) {
     
  byte inbyte=0;
     
          inbyte = Serial.read(); delay(2);
  if (inbyte == '-')  {bytenumber  --; if (bytenumber< 5) bytenumber = numberMAX+4; Serial.print ("        bytenumber: "); Serial.println (bytenumber);} 
  if (inbyte == '+')  {bytenumber  ++; if (bytenumber> numberMAX+4) bytenumber = 5; Serial.print ("        bytenumber: "); Serial.println (bytenumber);} 
  
  if (inbyte == '.') {answ_message[pid][bytenumber]++;Serial.print ("byte value: "); Serial.println (answ_message[pid][bytenumber], HEX);}
  if (inbyte == ',') {answ_message[pid][bytenumber]--;Serial.print ("byte value: "); Serial.println (answ_message[pid][bytenumber], HEX);}
  
  if (inbyte == '1') {pid = 2; Serial.println ("            PID: 2A 01 01");}
  if (inbyte == '2') {pid = 3; Serial.println ("            PID: 2A 01 02");}
  if (inbyte == '5') {pid = 4; Serial.println ("            PID: 2A 01 05");}

  if (inbyte == '1' || inbyte == '2' || inbyte == '5' ) { bytenumber = 5;  numberMAX = answ_message[pid][0]; bitWrite (numberMAX, 7, 0); numberMAX-=2; }
  
  if (inbyte == 'm') {if (f)answ_message[pid][bytenumber]=255; 
                      else answ_message[pid][bytenumber]=0; f=!f; 
                      Serial.print ("byte value: "); Serial.println (answ_message[pid][bytenumber], HEX);}
    
Serial.flush();
  return;}
#endif






 
if (K_LINE.available() ){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (!bitRead (buf[0],6) && bitRead (buf[0],7)&& buf[0]!=0x03){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         else if (buf[0]==0x03)header = 6;
         }                  

 // второй старт байт
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); if (buf[1]==MY_ADDRESS){ header = 2;} else {header = 0; RESETheader_timer=0;}} 

 // третий старт байт
 if (header == 2 && Delay){ 
  TIMER_DELAY ;
  buf[2]=K_LINE.read(); 
  if (buf[2]==RX_ADDRESS){ message_size = buf[0]; 
  if (buf[0] !=0x80) {header = 4;  bitWrite (message_size, 7 , 0);j=3;n=3;}
  else {header = 3; j=4;n=4;}
  if (message_size > bufsize) message_size = bufsize;  crc = 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;  
  crc = 0; header = 4;  
                         }

  // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n+1) {
 buf[j] = K_LINE.read(); 
 if (j<message_size+n) crc+= buf[j]; // подсчёт КС
 
 if (j==message_size+n) header = 5; 
 TIMER_DELAY ; j++;} 



 
 if (header == 6 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); header = 7;} 
 if (header == 7 && Delay){TIMER_DELAY ; buf[2]=K_LINE.read(); header = 8;} 
 
 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  
   
#if not defined K_LINE_COM_WTT
 for (byte i=0; i< message_size+n+1; i++){ K_LINE.write (buf[i]); delay (delaybyte_TX);}
#endif  


for(byte i = 0; i<n; i++) crc+=buf[i]; // прибавляем к контрольной сумме старт байты

 // если контрольная сумма верна: 
if ( crc == buf[message_size+n]) {  
  
 bool message_found = 0;
 byte crc_answ;
   for (byte j = 0; j < sizeof(answ_message)/sizeMes; j++)      {
    if (
        ((answ_message[j][3]&~0x40)==buf[3] && answ_message[j][4] == buf[5] && (buf[0]&0xF)==3) || 
        ((answ_message[j][3]&~0x40)==buf[3] && (buf[0]&0xF)==1) || 
        ((answ_message[j][3]&~0x40)==buf[3] && answ_message[j][4] == buf[4] && (buf[0]&0xF)==2)
        ) 
    
       {
         
        for (byte i=0; i<(answ_message[j][0]&0xF)+4 ; i++) {  if (i!=((answ_message[j][0]&0xF)+3)) crc_answ+=answ_message[j][i];
                                                      else                          {answ_message[j][i]= crc_answ;}  
                                                      K_LINE.write (answ_message[j][i]); delay (delaybyte_TX);
                                                    }
       message_found = 1;                                             
       }
     
                                                          }
    if (!message_found){ 
   
        answ_unknown_command[4] = buf[3]; 
        for (byte i = 0; i < ((answ_unknown_command[0]&0xF)+4);  i++) {  if (i!=((answ_unknown_command[0]&0xF)+3)) crc_answ+=answ_unknown_command[i];  // если неизвестное сообщение 
                                                                   else  {answ_unknown_command[i]= crc_answ;}  K_LINE.write (answ_unknown_command[i]); delay (delaybyte_TX);
                                                    }
                                                    
                       }
}   

// если контрольная сумма не совпала: 
//else Serial.println("CRC fail!!!" );
message_size = 0; header=0; RESETheader_timer=0; j=3; crc = 0;
}

if (header==8) { header=0;
     
 #if not defined K_LINE_COM_WTT
  for (byte i=0; i<3; i++) {K_LINE.write (buf[i]); delay (delaybyte_TX);} // делаем эхо принятого сообщения для WTT т.к. проверяем без К-Line адаптера (на нём эхо и так возникнет)
 #endif    
     for (byte j = 0; j < sizetabl; j++)   {if  (buf[1] == tabl[0][j]) K_LINE.write (tabl[1][j]); delay (delaybyte_TX);}
                  
                  }


// таймер ожидания байт (для успевания появления данных в буфере UART)
if (!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1; 

// таймер сброса заголовка если данные оборвались во время приёма заголовка
if (RESETheader_timer && curmillis - prevRESETheader > 500) {RESETheader_timer = 0; header = 0;}   
  }


 

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Serjeant пишет:

Есть старые наработки

22 - B8, 23 - B7, 24 - B(пропуск) , 25- B2, 26- B0, 27- AE, 28-AC, 29- AA, 30 A8

попробовал эмулятором. На универсальных котлах такие же данные. Пока не могу подобрать формулу. Не ужели там просто таблица соостветсвия значений заложена в WTT. Врядли , какая то должна быть зависимость. 

а напряжение вычисляется так. напряжение сидит в 7 байте ответа, отметил жирным

87 F1 51 6A 01 AF 00 B9 00 50 FC

U = byte*0.07 - byte/571

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:

Пока не могу подобрать формулу. Не ужели там просто таблица соостветсвия значений заложена в WTT. Врядли , какая то должна быть зависимость. 

нет, линейной зависимости не наблюдается. Вероятно значения в этом байте температуры это показания АЦП. А показания датчика t видимо нелинейны. Поэтому либо здоровенную таблицу соответсвия в скетч закладывать (222 значения *2 итого 450 байт) - слишком жирно. Сделал парсинг температуры по диапазонам через функцию map. 

Почти во всём диапазоне точно показывает (ну кое где в диапазоне есть отличия максимум на пару градусов). 

получилось так, по лучше и красивее мозгов у меня не хватило



if (byte_temp >= 242) temperature = -40;
else if (byte_temp >= 229 && byte_temp <= 241) temperature = map (byte_temp, 241,229,-35,-12); 
else if (byte_temp == 228) temperature = -11;
else if (byte_temp == 227) temperature = -10;
else if (byte_temp >= 217 && byte_temp <= 226) temperature = map (byte_temp, 226,217,-8,1); 
else if (byte_temp >= 211 && byte_temp <= 216) temperature = map (byte_temp, 216,211,1,5); 
else if (byte_temp >= 168 && byte_temp <= 210) temperature = map (byte_temp, 210,168,6,30); 
else if (byte_temp >= 124 && byte_temp <= 167) temperature = map (byte_temp, 167,124,30,50); 
else if (byte_temp >= 83 && byte_temp <= 123)  temperature = map (byte_temp, 123,83,50,70); 
else if (byte_temp >= 67 && byte_temp <= 82)   temperature = map (byte_temp, 82,67,71,80); 
else if (byte_temp >= 53 && byte_temp <= 66)   temperature = map (byte_temp, 66,53,81,90); 
else if (byte_temp >= 42 && byte_temp <= 52)   temperature = map (byte_temp, 52,42,91,100); 
else if (byte_temp >= 34 && byte_temp <= 41)   temperature = map (byte_temp, 41,34,101,110); 
else if (byte_temp >= 27 && byte_temp <= 33)   temperature = map (byte_temp, 33,27,111,120); 
else if (byte_temp >= 20 && byte_temp <= 26)   temperature = map (byte_temp, 26,20,122,133); 
else if (byte_temp <= 19 ) temperature = 135;

 

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Сегодня пробовал запустить свой догреватель по шине, но чет не работает, что именно моих знаний пока что не хватает, что то я упускаю.

Пойду дальше думать пока время есть

//все оказалось проще чем могло, кнопка не на том пине висела

MaksVV
Offline
Зарегистрирован: 06.08.2015

то есть заработало?

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Завтра узнаем) понял свою ошибку когда на улице уже темнеть начало

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Не взлетело, думаю дальше. В общем поведение следующее: при подаче питания кратковременно мигает светодиод на 13ом пине, далее через секунд 10 мигает светодиод подключенный к wbus (через транзистор) 4 раза и всё на этом, на нажатие кнопки не реагирует (В скетче сменил пин кнопки на 22) Попробую сейчас из скетча все что не относится к запуску по шине закоментить

//курю велосипед, интересная штука, не там оказывается сменил номер пина но все равно пока что не работает

follor
Offline
Зарегистрирован: 18.03.2018

Всем привет. Нужна консультация от тех кто в теме. Есть вебасто ттс аналогавая которая пускается плюсом, естественно бе wbus, но присутствует пин для диагностики и если я правильно понимаю то там передача данных происхрдит по k-line. Так же прикупил для дистанционного пуска altox wbus 5 она пускает котлы как аналоговые так и wbus, так же у алтокса есть обратная связь, она читает по wbus данные с котла(температуру и прочее). Так вот вопрос если подключить wbus от алтокса к пину диагностики аналогового котла, будет ли он что то видеть, и если нет то что можно сделать чтоб читал? (поменять котел самый крайний вариант).

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Так wbus по своей сути и есть kline

В 6ти контактном разъеме 2ой пин, возможно нужно допиновать разъем что бы было возможно получить доступ к wbus

follor
Offline
Зарегистрирован: 18.03.2018

А что значит допиновать? У меня же есть провод (пин диагностики)

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Это значит добавить в разъем недостающий контакт.
Если есть провод для диагностики котла то это и есть wbus, что бы убедиться можно проверить что он выходит из 6ти контактного разъема под номером 2

follor
Offline
Зарегистрирован: 18.03.2018

Отлично. То есть получается он может запускаться и плюсом и через второй пин wbus-ом? Или в данной ситуации запускаться плюсом а со второго пина может читать данные?

MaksVV
Offline
Зарегистрирован: 06.08.2015

На сколько знаю, вообще wbus ом называется шина только для котлов эво. Физически она такаяже как у ттс, т.е. к-лайн. Но настройки уарт этой шины 2400 8Е1. А у ттс 10400 8И1. И вроде у ттс все таки шина не wbus зовется , а просто линия диагностики.
Но запускать котел ттс по этой линии можно (даже не подавая 12в на пин запуска), также вытягивать все параметры и смотреть ошибки. Короче делать все то , что творит диагностика WTT.
Также будет работать и вариант запуска по +12в, и при этом читать параметры и ошибки из шины

Протокол обмена с ттс я конкретно поисследовал, скоро выложу описание протокола.

follor
Offline
Зарегистрирован: 18.03.2018

Спасибо за дельную информацию, сегодня возможно подключу все, по итогу отпишу получилось ли считать данные wbus ом с k line или же нет.

MaksVV
Offline
Зарегистрирован: 06.08.2015

SyntAcc пишет:

Не взлетело, думаю дальше. В общем поведение следующее: при подаче питания кратковременно мигает светодиод на 13ом пине, далее через секунд 10 мигает светодиод подключенный к wbus (через транзистор) 4 раза и всё на этом, на нажатие кнопки не реагирует (В скетче сменил пин кнопки на 22) Попробую сейчас из скетча все что не относится к запуску по шине закоментить

//курю велосипед, интересная штука, не там оказывается сменил номер пина но все равно пока что не работает

13 мигает при старте это нормально. LED w-bus мигает в начале это МК на котёл шлёт сообщение "стоп". 

а почему тот пин кнопки не устроил? и 22 это что мега чтоли? 

пины кнопок настраиваются так, покажу на примере, где подключены 3 кнопки :
#include <Button.h>
Button test;

#define StartButtonpin  7     // пин старт кнопки 7
#define LEFTButtonpin   8     // пин кнопки лево  8
#define RIGHTButtonpin  9     // пин кнопки право 9

#define StartButton 0
#define LEFTButton  1
#define RIGHTButton 2

void setup() {

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);

// ниже через запятую пишутся пины кнопок, соответственно в скетче программные номера у этих кнопок будут 0, 1 , 2 и т.д. и обращение к ним далее уже будет по программым номера, поэтому выше рядом с дефайнами пинов сделаны дефайны программных номеров: 
test.button(StartButtonpin, LEFTButtonpin, RIGHTButtonpin);
}
void loop (){ 
test.read(); 
if (test.event_click_Dn (StartButton)){ если нажата старт}; 
if (test.event_click_Dn (LEFTButton)){ если нажата лево}; 
if (test.event_click_Dn (RIGHTButton)){ если нажата право}; 
}

 

 

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Нет, ардуино промини, пин а7, как понимаю это 22, просто удобнее на плате к нему было подпаяться.
В общем сделал как должно было быть изначально по условиям скетча, завтра попробую.

Есть вот такая мысль, а не может ли быть что промини (mega328) некорректно обрабатывает инициализацию для общения по шине (Не подтягивает к 1 и 0)? Спрашиваю так как встречалось что пины 1 и 0 вроде проблематично использовать как аналоговые, отсюда появилась мысль а может Serial и SoftwareSerial местами махнуть? Для SoftwareSerial есть библиотеки что бы он умел 8E1

MaksVV
Offline
Зарегистрирован: 06.08.2015

не тут то было. Как цифровые пины аналоговые могут работать до А5.   А6 и А7 могут быть чисто аналоговыми входами!!! Так что для кнопок выбирай другие пины . С этим внимательнее. Тем более А7 было бы 21!!! потому что А0 это 14 и т.д.

На счёт пинов 0 и 1. Установка лог "1" или "0"  это нормальная работа этих портов, проблем тут нет. (и вообщето это нельзя называть "использовать как аналоговые", аналоговый выход это типа цифрового потенциометра) 

Последнее предложение это вопрос или утверждение? Я не искал библу софт сериал с нестандартными настройками UART. Если найдёшь дай линк. 

 

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Хм, интересные нюансы, частично понял свою ошибку.

Путаюсь в формулировках, плюс не хватает практики)

Утверждение, один из вариантов для расширения функционала Softwareserial здесь https://github.com/ledongthuc/CustomSoftwareSerial

MaksVV
Offline
Зарегистрирован: 06.08.2015

о пасиб, давно хотел найти

MaksVV
Offline
Зарегистрирован: 06.08.2015

на счёт того, что пины Serial 0 и 1 у промини и нано различаются это я наврал оказывается. скетч #282 поправил обратно. 

BDW
Offline
Зарегистрирован: 09.03.2018

Всем привет! Давно меня тут не было. Что по поводу потребления тока этим устройством? У моего устройства (Sim800L + arduino PRO mini), потребление по 12 вольтам 15-16мА. И это я еще не усыплял девайсы и не ковырял светодиоды со стабилизатором.

Sim800 удалось усыпить?

Сейчас бьюсь с подключением rfm69. Смысл: считать код брелка webasto, а потом, по команде с  arduino, воспроизводить этот код штатно запуская котел.

Кто нибудь работал с rfm69?

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Ок, может из-за этого и не работает, сейчас попробовал и снова нет результата, вечером поправленный скетч залью и проверю

//попробовал просто TX RX местами поменять, и снова нет результата, но ардуино реагирует на нажатие кнопки включения котла, светодиод на 15 пине включается

MaksVV
Offline
Зарегистрирован: 06.08.2015

Нет. Надо не менять местами, а чтобы дефайн Tx вверху скетча был 1 . Рекомендую также при попытке подключиться, смотреть что творится на шине монитором шины wbus программой WTT.

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Заработало!)
Котел стартует (включается продувка, начинается розжиг) но я не стал из-за помпы дожидаться когда выйдет на полную мощность. Самое главное что оно работает)

Теперь надо GSM заказывать с али и собирать полную версию

MaksVV
Offline
Зарегистрирован: 06.08.2015

с победой!

MaksVV
Offline
Зарегистрирован: 06.08.2015

пытаюсь доделать скетч, но ппц  голова кипит. Большой код уже слишком стал. Шарики за ролики. Главное всё понимаю, как всё работает и как нужно сделать, но  когда приступаю писать программу, охота сразу посидеть  кино лучше посмотреть)))

SyntAcc
Offline
Зарегистрирован: 26.01.2018

И облегчением, а то уже начинал думать может я просто рукожоп и даже готовое не могу запустить)

Вечером включу на запущенном моторе (дорога занимает 15-20 минут) посмотрим работает ли поддержание работы. Циркуляции помпы в климате вроде хватает что бы котел не ушел в перегрев.

Сделай перерыв пару дней, работа и правда большая проделана. Я к сожалению настолько хорошо не разбираюсь в кодинге, вряд ли смогу как то помочь допилить))

А что хочешь еще дополнить?

MaksVV
Offline
Зарегистрирован: 06.08.2015

вытягивание данных из различных котлов (не только пламя) , чтение и стирание ошибок. Просто протоколы я хакнул EVO , VEVO, TTC/E, гидроник первый, протоколы у всех совсем разные. Поэтому работы над скетчем много. 

Ну и оптимизация кода. С течением времени опыт немного подрос, щас гляжу на код и вижу шляпу кое где. 

и да не факт, что с моим уровнем программирования все желаемое получится уложить в атмегу 328

BDW
Offline
Зарегистрирован: 09.03.2018

Ура! Отработал алгоритм усыпления и пробуждения arduino & SIM800. Сейчас у меня жрет 7-8мА. И это еще не снимал светодиоды и стабилизатор. Если интересно, то расскажу. А по поводу кода.... в 328 (как мне уже кажется) можно слона запихнуть. Если надо, то и с этим могу помочь.

YoKeL
Offline
Зарегистрирован: 29.11.2018

Можешь рассказать , как удалось усыпить SIM800?

MaksVV
Offline
Зарегистрирован: 06.08.2015

на джсм естьпин DTR. подавая туда лог1 или 0 он либо спит либо подрствует 

SyntAcc
Offline
Зарегистрирован: 26.01.2018

Поддержание работы котла работает, Led13 включается когда ардуино видит пламя, но после отключения котла Led13 не гаснет

На али увидел что сейчас есть модули Sim800L v2.0 они только напряжением питания отличаются как я понял?

BDW
Offline
Зарегистрирован: 09.03.2018

Информация взята от сюда: http://www.2150692.ru/wiki/19-sim800l/125-energosberezhenie-modulya-sim800l 

Т.е. Сигнал DTR не будет работать сам по себе. Требуется вывесить 0 на DTR, дать команду:  "AT+CSCLK=1"  (не уверен в 100% достоверности последовательности действий, но я сделал так, и у меня все получилось). И далее модуль будет реагировать на сигнал DTR.

Еще требуется учесть, что модуль просыпается не сразу, а через 110 мсек. По этому если "будить" его во время звонка - ничего не получится. У меня сделано так:

..................
#define Ring 3                   //прерывание 1 для вывода процессора из сна
#define SimSleep 15              // выход для усыпления/пробуждения SIM800 сигнал DTR
..........................
void setup() 
{
.................................................
  _countInterrupt = 0;
  pinMode(SimSleep, OUTPUT);    //выход для пробуждения/усыпления SIM800
  pinMode(Ring, INPUT);                     // 3 пин - ISR(1) вход
  digitalWrite(SimSleep,LOW);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); //режим микропотребления самый экономный режим
  sendATCommand("AT+CSCLK=1", true);  // sendATCommand - процедура посылающая SIM800 AT команды....
..............................................
  attachInterrupt(1, Interrupt_Ring, FALLING);
.............................................
}
void loop() 
{
  digitalWrite(SimSleep,HIGH);        //усыпить SIM800
  sleep_mode();                       //усыпляем arduino
  delay(110);                       //выдержка времени для вывода SIM800 из сна
  if (SIM800.available())            // Ожидаем прихода данных (ответа) от модема.
  {
 ................................. // Процедура обработки входящего звонка
  }
.............................................................
}
//Прерывание по входящему звонку
void Interrupt_Ring()
{
  digitalWrite(SimSleep,LOW);     //разбудить SIM800
}

Хочу отметить, что без delay(110) - не работало! Проходил звонок, но модуль не поднимал трубку.

MaksVV
Offline
Зарегистрирован: 06.08.2015

SyntAcc пишет:

Поддержание работы котла работает, Led13 включается когда ардуино видит пламя, но после отключения котла Led13 не гаснет

На али увидел что сейчас есть модули Sim800L v2.0 они только напряжением питания отличаются как я понял?

да, там упрощенный алгоритм опроса пламени. В принципе если данные перестали от котла идти, то переменная не меняется, а остаётся последнее значение. По идее нужно сделать "noData" на всех параметрах если связи нет. 

BDW
Offline
Зарегистрирован: 09.03.2018

Все поснимал. Вот результаты:

1) со всеми светодиодами (без светодиода SIM800) ~ 7,9 мА
2) cон arduino & SIM800 без светодиода б.п. ~ 7.0 мА
3) cон arduino & SIM800 без стабилизатора ~ 7,0 мА
4) cон arduino & SIM800 без сведодиодов по питанию и общего назначения ~ 6,2 мА
Но, у меня еще не полностью рабочий модуль. Он, для контроля, подключен к через UART к компу. Так, что туда то же может что то может утекать. А в общем, можно сказать, что я добился искомых 5 мА.
 
MaksVV
Offline
Зарегистрирован: 06.08.2015

все что менее 10мА это пойдет даже для японских акб 45ач, главное чтоб состояние норм было. при моих алгоритмах усыплять дуню скорее всего не получится. да и в общем и так должно быть не более 10мА. 

BDW
Offline
Зарегистрирован: 09.03.2018

Почему не получится? Честно говоря, у меня нет времени и желания копать Ваш код. Так, что если скажете, чем проц занимается, то могу помочь.

А про потребление: то изначальными 17-18 мА - это устройство высаживает около 0,45 А*ч из аккумулятора в сутки, а за месяц - 13 А*ч. Если брать Ваши 10 мА - то соответственно 0,24 А*ч и 7,5 А*ч. При 5 мА - 0,12 А*ч и 3,6 А*ч. Если учесть, что в зимнее время аккумулятор плохо берет заряд, короткие поездки, да еще и немалое потребление webasto во время работы, то поверьте, 10 А*ч - лишними не будут. Так, что чем меньше - тем лучше.

YoKeL
Offline
Зарегистрирован: 29.11.2018

А когда он спит , он вызовы принимает ?

BDW
Offline
Зарегистрирован: 09.03.2018

И да и нет. Когда Sim800 спит, то сигнал вызова изменяет логический уровень на ножке "Ring". Если SIM800 не разбудить, то он не будет слушать AT команды и как следствие, трубку не поднимет и вызов не будет принят. Но, если по сигналу "Ring" проц. разбудит SIM800 (подаст 0 на DTR) и выждет 110мсек., то SIM800 проснется и примет вызов. 

Я этот алгоритм опубликовал: - во время входящего вызова логический сигнал с ножки "Ring" SIM800 вызывает прерывание проца, который просыпается и выставляет 0 на DTR SIM800, далее задержка в 110мсек., опрос порта и далее соответствующие действия. 

В реалии, при звонке на SIM800 я не заметил задержки по времени, даже 1 гудка не проходит, как модуль поднимает трубку и отвечает.