Бортовой компьютер для Опель Зафира.

vsrgv
Offline
Зарегистрирован: 20.06.2017

Не, твой блок должен поддерживаться програмой диагностики которой ты подключишься к KWPTest

viki13viki
Offline
Зарегистрирован: 14.11.2016

ну ка распиши, попробую пока MaksVV не глянет мои последние исследование.

vsrgv
Offline
Зарегистрирован: 20.06.2017

щас проверю кое что и отпишусь

vsrgv
Offline
Зарегистрирован: 20.06.2017

надо поставить vspd и скачать kwptest.zip и найти несколько программ для диагностики твоего эбу, для твоей машины в общем.

vsrgv
Offline
Зарегистрирован: 20.06.2017

В vspd просто наживаешь справа Add pair для добавления 2 виртуальных ком портов, советуют брать полсе com10, прогу не закрываешь.

 

Запускаешь KWP и указываешь один из портов которые добавил, я еще галочку echo ставил, без нее не работает, жмешь start. Запускаешь програму для диагностики и ставишь в настройках другой порт. И пробуешь подключиться как бы к эбу.

viki13viki
Offline
Зарегистрирован: 14.11.2016

уже все скачал иду пробовать.

vsrgv
Offline
Зарегистрирован: 20.06.2017

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

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

пока эти для пробы https://vagcom.com.ua/programmy/programmy-dlya-diagnostiki-opel/

Дизел 2.0 (Y20DTH) 2001

viki13viki
Offline
Зарегистрирован: 14.11.2016

вот куча прог , седьмая для тебя, для себя пока ничего не нашел http://avtodevice.narod.ru/programm.htm

viki13viki
Offline
Зарегистрирован: 14.11.2016

я правильно понял? нужно создать файл protocol,txt засунуть в него все ответы и запросы и кинуть в папку kwptest так? а потом подобрать программу.

vsrgv
Offline
Зарегистрирован: 20.06.2017

Нет, в KWP есть кнопка reverse, если нажать выходит окно в котором можно вводить заголовок запроса и ответа, длинну ответа и даные ответа.

скрин

vsrgv
Offline
Зарегистрирован: 20.06.2017

Половина програм то ли глючные, то ли вообще не рабочие, просто падают с ошибкой и все,некоторые не совместимы 64 разрядной виндой

vsrgv
Offline
Зарегистрирован: 20.06.2017

В описании к KWP написано:"Вышла финальная версия программы эмуляции диагностического протокола ЭБУ Январь 5/7 - KWPTest".

У меня эбу bosch m1.5.4, хз возможно они взаимозамеяемы и этот эмулятор только для тазов, да и что это за диагностический протокол ЭБУ Январь 5/7 ? В моем понимании диагностическим протоколом к примеру можно назвать KWP2000 или OBD, а не как не название самих мозгов.

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

согласен, бред. похоже тлько для тазов, выставлял в Reverse ставлю свой адрес 11 а он зараза пересчитывает и шлет 10 адрес

8110F18103    ->    83F110C16B8F3F

Буду ждать ВЕЛИКОГО ИЗ ВЕЛИКИХ, что он скажет на счет моих последних доводов и экспериментов

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

предлагаю сделать задержки, такие же как в при сниффе. Т.е. там задержка внутри сообщения ident_2 :  114 мс, в районе байта как раз где надпись "BD". Ну и дальше там ещё задержка одна. Вот скетч твой с этими задержками

class BUTTON {
public:
//================================================================
static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 1200000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 1600; // длительность отслеживания нажатия и удержания.
//================================================================
boolean click_down;
boolean click_up;
boolean doubleclick;
boolean timer;
boolean retention;
//=================================
unsigned long m;
boolean  p;
boolean  b;
boolean dc;
byte     c;
boolean  t;
boolean  r;
//=================================
byte _pb;
//=================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//====
click_down      = 0;
click_up        = 0;
doubleclick     = 0;
timer           = 0;
retention       = 0;
//====
m  =      millis();
p  = digitalRead(_pb);
b  =                0;
dc =                0;
c  =                0;
t  =                0;
r  =                0;
//====
}

void read() {
//=======================================================
unsigned long nm =      millis();
boolean       np = digitalRead(_pb);
//=================
boolean nb  = 0;
boolean ndc = 0;
boolean nt  = 0;
boolean nr  = 0;
//================
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//=================
if (np != p) {p = np; m = nm; }
//=======================================================
if (nm - m > bounce_) {nb = 1;}
if (nm - m > doubleclick_) {ndc = 1;}
if (ndc != dc) {dc = ndc; if (dc == 1) {c = 0;}}
if (nb != b) {b = nb;
if (p == 0 && b == 0) {click_down = 1;
++c;      if (c == 2) {c = 0; doubleclick = 1;}
}
if (p == 1 && b == 1) {click_up = 1;}
}
//=======================================================
if (nm - m > timer_) {nt = 1;}
if (nt != t) {t = nt;
if (p == 1 && t == 1) {timer = 1;}
}
//=======================================================
if (nm - m > retention_) {nr = 1;}
if (nr != r) {r = nr;
if (p == 0 && r == 1) {retention = 1;}
}
//=======================================================
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






BUTTON button(12); // вход кнопки (digital pin arduino)

int bytenumber = 0;


///////////////////////////////////////////////////////////////////////
// Всё что выше для считывания кнопки 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 

int length5 = 5;
int length7 = 7;
byte MessageRx[100] = {0};  // массив байтов принимаемого сообщения

byte messageCOMUN[7] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40};
byte messagePRES[5] = {0x81, 0xF1, 0x11, 0x7E, 0x01};

int length44 = 44;
byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x68, 0x03,
0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 
0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC};

int length100 = 100;
byte messageIDEN2[100] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37, 
0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34, 0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20, 
0x50, 0x44, 0x42, 0x4F, 0x53, 0x20, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35, 0xFF, 0x4B, 0x4D, 0x37, 0x4D, 
0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, 0x00, 0x06, 0x42, 0x30, 0x31, 0x30, 0x31, 0x35, 0x59, 0x32, 0x30, 0x44, 
0x54, 0x48, 0x20, 0x44, 0x33, 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30, 0x20, 0x07, 0x07, 
0x25, 0x05, 0x48, 0x30, 0x32, 0x38, 0x31, 0x30, 0x031, 0x30, 0x32, 0x36, 0x38, 0xFF};

int length83 = 83;
byte messagePIDS[83] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x0D, 0x37, 0x01, 0x79, 0x0C, 0xEB, 0x00, 0x00, 0x02, 0xB3, 0x00, 0x00, 0x11, 0x89, 0x04, 0x30, 0x00, 0x00, 
0x03, 0x20, 0x0B, 0x55, 0x03, 0xA3, 0x04, 0x2D, 0x03, 0x20, 0xEE, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x35, 
0x03, 0x0A, 0x02, 0xD9, 0x08, 0xA3, 0x01, 0x90, 0x0C, 0x27, 0xA0, 0x00, 0x01, 0x2C, 0x02, 0x76, 0xAD, 0x08, 
0x01, 0x30, 0x00, 0x03, 0x01, 0x7B, 0x0B, 0xDB, 0x03, 0xA3, 0x00, 0x02, 0x5C, 0x81, 0x1F};

int waitbyte=5;

unsigned long TimeLED, timerLED = 0;
bool timerenabledLED = 0;
#define TIMEREXPIRED_LED (TimeLED - timerLED)> 1200 // время включения светодиода если кнопка длительно нажата, мс

void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
pinMode (13, OUTPUT);
digitalWrite (13,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");
}

void loop() {
button.read();
TimeLED = millis ();

//////////////////////тут поменять на сообщение 21 00
if (button.click_down) { messagePIDS[bytenumber]++;  } // коротким нажатием на кнопку изменяем значение выбранного байта 
if (button.retention) { bytenumber++; digitalWrite (13,1) ; timerLED=TimeLED; timerenabledLED=1; 
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");} // длительным нажатием на кнопку изменяем номер байта, который будем менять

if (timerenabledLED){ if (TIMEREXPIRED_LED) {timerenabledLED=0;digitalWrite (13,0);}}



if (mySerial.available()) {
      delay(100);
     int k=0;
     byte inbyte=0;
     
  while( mySerial.available() && k < 100) {
     inbyte = mySerial.read();
    MessageRx[k] = inbyte;
    k++;   }

      Serial.print ("Recieve:   ");

    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");

if (MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04) {
  Serial.println ("Prinyat zapros init!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length7; i++) {
    mySerial.write(messageCOMUN[i]);
    Serial.print(messageCOMUN[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
if (MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x3E && MessageRx[4]==0xC1) {
  Serial.println ("Prinyat zapros prisutstvia!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length5; i++) {
    mySerial.write(messagePRES[i]);
    Serial.print(messagePRES[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) {
  Serial.println ("Prinyat zapros identificacion 1!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length44; i++) {
    mySerial.write(messageIDEN1[i]);
    Serial.print(messageIDEN1[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) {
  Serial.println ("Prinyat zapros identificacion 2!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length100; i++) {
    mySerial.write(messageIDEN2[i]);
    Serial.print(messageIDEN2[i],HEX); Serial.print (" ");
    if (i==31)  delay (113);
    if (i==92)  delay (113);
    
    
    
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) {
  Serial.println ("Prinyat zapros datos!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length83; i++) {
    mySerial.write(messagePIDS[i]);
    Serial.print(messagePIDS[i],HEX); Serial.print ("  ");
//   /delay (waitbyte); 
   } 
    Serial.println("");
 
   }
}
}



 

viki13viki
Offline
Зарегистрирован: 14.11.2016

Рад тебя слышать, иду с детьми в парк, позже попробую и отпишусь. я тоже думал об этих задержках

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

короче пришли две микрухи. L9637D Собрал два адаптера, один USB-K_Line   Второй : Arduino-K_Line

вот по этим схемам 

Соединил к-лайны, подал на пины "+12V" питание от адаптера 12В, соединил все массы. Скачалал программу опком для адаптера KKL, короче нифига не заработало. Прога опком вроде как видит адаптер. А вот в мониторе ардуины ни одит байт не приходит. хз может ошибки в подключении где-то, надо адаптер на ВАЗе опробовать. 

viki13viki
Offline
Зарегистрирован: 14.11.2016

Опком видео только свои гаджет. Адаптер к-лине нет. Проверено мной.

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

вопрос в адаптере ардуино K-line Rx цепляем к RX,   а Tx к Tx? ну  и в USB - K-line думаю также Rx цепляем к RX,   а Tx к Tx?

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

ну я который скачал - видит адаптер, там в настройках можно выбрать - K-line либо свой гаджет

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

качал отсюда https://www.drive2.ru/l/5209582/ там в середине текста ссылка на опком

viki13viki
Offline
Зарегистрирован: 14.11.2016

Пин 10 это rx адаптера. 11 это тх адаптера. Если не ошибаюсь. Дом гляну потом.

viki13viki
Offline
Зарегистрирован: 14.11.2016

На мобиле не вижу файлы. Но похоже что он.

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

это понятно просто чаще подключается крест на крест то есть Rx к Tx, а здесь вроде как надо Rx к Rx

viki13viki
Offline
Зарегистрирован: 14.11.2016

Здесь как мы в скетче определим output input. Это если цеплять на сериал 0, сериал 1 и т.д, то это важно.

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

а какой адаптер для опкома ты используешь?

viki13viki
Offline
Зарегистрирован: 14.11.2016

Я купил опком чина, его и использую. Извени, не поставил в известность. Что использую опком для сниффера. А для проэкта ардуино к -линие. Мои косяк.

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

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

viki13viki
Offline
Зарегистрирован: 14.11.2016

Дома гляну, что у меня и куда. И скажу.

viki13viki
Offline
Зарегистрирован: 14.11.2016

MaksVV

1. прогу что ты скачал для опкома она либо для своего гаджета либо для порта com1 компа, нужна схема на мах232 из моего поста 1, адаптер нометр 1.

2. USB TTL тебе нужна схема типа этой, где присутсвует чип конвертирующий в usb порт

3. да, Пин 10 это rx адаптера. 11 это тх адаптера.

4. твоя схема чуток отличается от моей из 8-го поста, попробуй собрать по моей схеме.

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

Скетч из поста 315 выдает это

avrdude: stk500v2_getsync(): can't communicate with device: resp=0x01

попробовал засунуть это задержки в другие скетчи

if (i==31)  delay (113);
    if (i==92)  delay (113);

Не помогает.

это номер байта в ответет или конкретный байт 0x31 0x92, туплю уже наверно. Надо идти спать.....

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

Это номер байта в сообщении. Переведи все байты в ASCII в нех редакторе ( например НхD) и поймешь что и где в сообщении. А эту ошибку опком пишет или компилятор ардуины?

viki13viki
Offline
Зарегистрирован: 14.11.2016

компилятор пишет ошибку, попробовал с версией 1.8, мои скетчи почти все выдаеют в компиляторе ошибки. в 1.0.3 все компилятся. кроме последнего твоего о котором я говорил выше.

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

странно у меня всё компилируется. Я же только добавил эти две строки  с  delay. Попробуй их закоментировать , будет ли удачная компиляция? Может так прокатит: 

class BUTTON {
public:
//================================================================
static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 1200000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 1600; // длительность отслеживания нажатия и удержания.
//================================================================
boolean click_down;
boolean click_up;
boolean doubleclick;
boolean timer;
boolean retention;
//=================================
unsigned long m;
boolean  p;
boolean  b;
boolean dc;
byte     c;
boolean  t;
boolean  r;
//=================================
byte _pb;
//=================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//====
click_down      = 0;
click_up        = 0;
doubleclick     = 0;
timer           = 0;
retention       = 0;
//====
m  =      millis();
p  = digitalRead(_pb);
b  =                0;
dc =                0;
c  =                0;
t  =                0;
r  =                0;
//====
}

void read() {
//=======================================================
unsigned long nm =      millis();
boolean       np = digitalRead(_pb);
//=================
boolean nb  = 0;
boolean ndc = 0;
boolean nt  = 0;
boolean nr  = 0;
//================
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//=================
if (np != p) {p = np; m = nm; }
//=======================================================
if (nm - m > bounce_) {nb = 1;}
if (nm - m > doubleclick_) {ndc = 1;}
if (ndc != dc) {dc = ndc; if (dc == 1) {c = 0;}}
if (nb != b) {b = nb;
if (p == 0 && b == 0) {click_down = 1;
++c;      if (c == 2) {c = 0; doubleclick = 1;}
}
if (p == 1 && b == 1) {click_up = 1;}
}
//=======================================================
if (nm - m > timer_) {nt = 1;}
if (nt != t) {t = nt;
if (p == 1 && t == 1) {timer = 1;}
}
//=======================================================
if (nm - m > retention_) {nr = 1;}
if (nr != r) {r = nr;
if (p == 0 && r == 1) {retention = 1;}
}
//=======================================================
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






BUTTON button(12); // вход кнопки (digital pin arduino)

int bytenumber = 0;


///////////////////////////////////////////////////////////////////////
// Всё что выше для считывания кнопки 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 

int length5 = 5;
int length7 = 7;
byte MessageRx[100] = {0};  // массив байтов принимаемого сообщения

byte messageCOMUN[7] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40};
byte messagePRES[5] = {0x81, 0xF1, 0x11, 0x7E, 0x01};

int length44 = 44;
byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x68, 0x03,
0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 
0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC};

int length100 = 100;
byte messageIDEN2[100] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37, 
0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34, 0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20, 
0x50, 0x44, 0x42, 0x4F, 0x53, 0x20, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35, 0xFF, 0x4B, 0x4D, 0x37, 0x4D, 
0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, 0x00, 0x06, 0x42, 0x30, 0x31, 0x30, 0x31, 0x35, 0x59, 0x32, 0x30, 0x44, 
0x54, 0x48, 0x20, 0x44, 0x33, 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30, 0x20, 0x07, 0x07, 
0x25, 0x05, 0x48, 0x30, 0x32, 0x38, 0x31, 0x30, 0x031, 0x30, 0x32, 0x36, 0x38, 0xFF};

int length83 = 83;
byte messagePIDS[83] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x0D, 0x37, 0x01, 0x79, 0x0C, 0xEB, 0x00, 0x00, 0x02, 0xB3, 0x00, 0x00, 0x11, 0x89, 0x04, 0x30, 0x00, 0x00, 
0x03, 0x20, 0x0B, 0x55, 0x03, 0xA3, 0x04, 0x2D, 0x03, 0x20, 0xEE, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x35, 
0x03, 0x0A, 0x02, 0xD9, 0x08, 0xA3, 0x01, 0x90, 0x0C, 0x27, 0xA0, 0x00, 0x01, 0x2C, 0x02, 0x76, 0xAD, 0x08, 
0x01, 0x30, 0x00, 0x03, 0x01, 0x7B, 0x0B, 0xDB, 0x03, 0xA3, 0x00, 0x02, 0x5C, 0x81, 0x1F};

int waitbyte=5;

unsigned long TimeLED, timerLED = 0;
bool timerenabledLED = 0;
#define TIMEREXPIRED_LED (TimeLED - timerLED)> 1200 // время включения светодиода если кнопка длительно нажата, мс

void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
pinMode (13, OUTPUT);
digitalWrite (13,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");
}

void loop() {
button.read();
TimeLED = millis ();

//////////////////////тут поменять на сообщение 21 00
if (button.click_down) { messagePIDS[bytenumber]++;  } // коротким нажатием на кнопку изменяем значение выбранного байта 
if (button.retention) { bytenumber++; digitalWrite (13,1) ; timerLED=TimeLED; timerenabledLED=1; 
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");} // длительным нажатием на кнопку изменяем номер байта, который будем менять

if (timerenabledLED){ if (TIMEREXPIRED_LED) {timerenabledLED=0;digitalWrite (13,0);}}



if (mySerial.available()) {
      delay(100);
     int k=0;
     byte inbyte=0;
     
  while( mySerial.available() && k < 100) {
     inbyte = mySerial.read();
    MessageRx[k] = inbyte;
    k++;   }

      Serial.print ("Recieve:   ");

    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");

if (MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04) {
  Serial.println ("Prinyat zapros init!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length7; i++) {
    mySerial.write(messageCOMUN[i]);
    Serial.print(messageCOMUN[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
if (MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x3E && MessageRx[4]==0xC1) {
  Serial.println ("Prinyat zapros prisutstvia!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length5; i++) {
    mySerial.write(messagePRES[i]);
    Serial.print(messagePRES[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) {
  Serial.println ("Prinyat zapros identificacion 1!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length44; i++) {
    mySerial.write(messageIDEN1[i]);
    Serial.print(messageIDEN1[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) {
  Serial.println ("Prinyat zapros identificacion 2!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length100; i++) {
    mySerial.write(messageIDEN2[i]);
    Serial.print(messageIDEN2[i],HEX); Serial.print (" ");
    if (i==31) { delay (120);}
    if (i==92)  {delay (120);}
    
    
    
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) {
  Serial.println ("Prinyat zapros datos!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length83; i++) {
    mySerial.write(messagePIDS[i]);
    Serial.print(messagePIDS[i],HEX); Serial.print ("  ");
//   /delay (waitbyte); 
   } 
    Serial.println("");
 
   }
}
}



 

viki13viki
Offline
Зарегистрирован: 14.11.2016

этот скомпилися на 1.8. но в программе опкома все таже шняга, срезает что не влазиет в строчку и пихает в другое место. обрати внимание там где заголовок коротки влезает все значение , а где заголовок длинный, что влезает хорошо а что нет срезает. сделал эксеперимент я добавил пробел перед   (тут)24417169 было так

vehicleManufacturerECUHardwareNumber: 24417169
systemSupplierECUHardwareNumber:  PDBOS 0105
стало 
vehicleManufacturerECUHardwareNumber  2441716
systemSupplierECUHardwareNumber:  9PDBOS 010
он сместил вниз 9-ку и снез в другое место 5-ку. 
а если убираю два байта цифры 69 то становится так
vehicleManufacturerECUHardwareNumber: 244171PD      //PD смещается на верх вместо 69
systemSupplierECUHardwareNumber:  BOS 010505     // в эту срочку подымется второе 05 и становится правильно

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

Keyword 2027 protocol
Keyword #1: 6B
Keyword #2: 8F
 
Normal timing parameter set.
 
VIN: W0L0TGF7512233714
vehicleManufacturerECUHardwareNumber 24417169     //24417169 PD
systemSupplierECUHardwareNumber:  PDBOS 0105      //BOS 010505
systemSupplierECUHardwareVersionNumber: 30           //255
systemSupplierECUSoftwareNumber: 5255KM7M30       //KM7M3040_S
systemSupplierECUSoftwareVersionNumber: 3430         //6
exhaustRegulationOrTypeApprovalNumber: _S6B01       //B01015
systemNameOrEngineType:  015Y20DTH                       //Y20DTH_D3
RepairShopCodeOrTesterSerialNumber:  _D3S001006    //S001006940
ProgrammingDate:  39343032                                      //20070725
 
Identifier: 3030
 
VehicleManufacturerSpecific: 7072502810                     //0281010268
 
вот скетч с подправлеными байтами, я там прокоментил данные, может ты че поймешь
class BUTTON {
public:
//================================================================
static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 1200000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 1600; // длительность отслеживания нажатия и удержания.
//================================================================
boolean click_down;
boolean click_up;
boolean doubleclick;
boolean timer;
boolean retention;
//=================================
unsigned long m;
boolean  p;
boolean  b;
boolean dc;
byte     c;
boolean  t;
boolean  r;
//=================================
byte _pb;
//=================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//====
click_down      = 0;
click_up        = 0;
doubleclick     = 0;
timer           = 0;
retention       = 0;
//====
m  =      millis();
p  = digitalRead(_pb);
b  =                0;
dc =                0;
c  =                0;
t  =                0;
r  =                0;
//====
}

void read() {
//=======================================================
unsigned long nm =      millis();
boolean       np = digitalRead(_pb);
//=================
boolean nb  = 0;
boolean ndc = 0;
boolean nt  = 0;
boolean nr  = 0;
//================
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//=================
if (np != p) {p = np; m = nm; }
//=======================================================
if (nm - m > bounce_) {nb = 1;}
if (nm - m > doubleclick_) {ndc = 1;}
if (ndc != dc) {dc = ndc; if (dc == 1) {c = 0;}}
if (nb != b) {b = nb;
if (p == 0 && b == 0) {click_down = 1;
++c;      if (c == 2) {c = 0; doubleclick = 1;}
}
if (p == 1 && b == 1) {click_up = 1;}
}
//=======================================================
if (nm - m > timer_) {nt = 1;}
if (nt != t) {t = nt;
if (p == 1 && t == 1) {timer = 1;}
}
//=======================================================
if (nm - m > retention_) {nr = 1;}
if (nr != r) {r = nr;
if (p == 0 && r == 1) {retention = 1;}
}
//=======================================================
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






BUTTON button(12); // вход кнопки (digital pin arduino)

int bytenumber = 0;


///////////////////////////////////////////////////////////////////////
// Всё что выше для считывания кнопки 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 

int length5 = 5;
int length7 = 7;
byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения

byte messageCOMUN[7] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40};
byte messagePRES[5] = {0x81, 0xF1, 0x11, 0x7E, 0x01};

int length44 = 44;
byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x68, 0x03,
0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 
0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC};

int length105 = 102;
byte messageIDEN2[102] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 
0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37, 0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34,  //W0L0TGF7512233714   
0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20, 0x50, 0x44,   //24417169 PD       
0x42, 0x4F, 0x53, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35,       //BOS 010505       
0x32, 0x35, 0x35, //255                                                                     
0x4B, 0x4D, 0x37, 0x4D, 0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, //KM7M3040_S       
0x36, //6                                                                     
0x42, 0x30, 0x31, 0x30, 0x31, 0x35, //B01015                            
0x59, 0x32, 0x30, 0x44, 0x54, 0x48, 0x5F, 0x44, 0x33, //Y20DTH_D3             
0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30,  //S001006940    
0x32, 0x30, 0x30, 0x37, 0x30, 0x37, 0x32, 0x35,  //20070725                  
0x30, 0x32, 0x38, 0x31, 0x30, 0x31, 0x30, 0x32, 0x36, 0x38}; //0281010268   

int length83 = 83;
byte messagePIDS[83] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x0D, 0x37, 0x01, 0x79, 0x0C, 0xEB, 0x00, 0x00, 0x02, 0xB3, 0x00, 0x00, 0x11, 0x89, 0x04, 0x30, 0x00, 0x00, 
0x03, 0x20, 0x0B, 0x55, 0x03, 0xA3, 0x04, 0x2D, 0x03, 0x20, 0xEE, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x35, 
0x03, 0x0A, 0x02, 0xD9, 0x08, 0xA3, 0x01, 0x90, 0x0C, 0x27, 0xA0, 0x00, 0x01, 0x2C, 0x02, 0x76, 0xAD, 0x08, 
0x01, 0x30, 0x00, 0x03, 0x01, 0x7B, 0x0B, 0xDB, 0x03, 0xA3, 0x00, 0x02, 0x5C, 0x81, 0x1F};

int waitbyte=5;

unsigned long TimeLED, timerLED = 0;
bool timerenabledLED = 0;
#define TIMEREXPIRED_LED (TimeLED - timerLED)> 1200 // время включения светодиода если кнопка длительно нажата, мс

void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
pinMode (13, OUTPUT);
digitalWrite (13,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");
}

void loop() {
button.read();
TimeLED = millis ();

//////////////////////тут поменять на сообщение 21 00
if (button.click_down) { messagePIDS[bytenumber]++;  } // коротким нажатием на кнопку изменяем значение выбранного байта 
if (button.retention) { bytenumber++; digitalWrite (13,1) ; timerLED=TimeLED; timerenabledLED=1; 
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");} // длительным нажатием на кнопку изменяем номер байта, который будем менять

if (timerenabledLED){ if (TIMEREXPIRED_LED) {timerenabledLED=0;digitalWrite (13,0);}}



if (mySerial.available()) {
      delay(100);
     int k=0;
     byte inbyte=0;
     
  while( mySerial.available() && k < 100) {
     inbyte = mySerial.read();
    MessageRx[k] = inbyte;
    k++;   }

      Serial.print ("Recieve:   ");

    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");

if (MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04) {
  Serial.println ("Prinyat zapros init!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length7; i++) {
    mySerial.write(messageCOMUN[i]);
    Serial.print(messageCOMUN[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
if (MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x3E && MessageRx[4]==0xC1) {
  Serial.println ("Prinyat zapros prisutstvia!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length5; i++) {
    mySerial.write(messagePRES[i]);
    Serial.print(messagePRES[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) {
  Serial.println ("Prinyat zapros identificacion 1!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length44; i++) {
    mySerial.write(messageIDEN1[i]);
    Serial.print(messageIDEN1[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) {
  Serial.println ("Prinyat zapros identificacion 2!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length105; i++) {
    mySerial.write(messageIDEN2[i]);
    Serial.print(messageIDEN2[i],HEX); Serial.print (" ");
    if (i==31)  delay (113);
    if (i==92)  delay (113);
    
    
    
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) {
  Serial.println ("Prinyat zapros datos!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length83; i++) {
    mySerial.write(messagePIDS[i]);
    Serial.print(messagePIDS[i],HEX); Serial.print ("  ");
//   /delay (waitbyte); 
   } 
    Serial.println("");
 
   }
}
}


 

все, блин, крыша едет полностью. застопорился.

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

короче есть ошибка одного байта №11 в сообщении ID1 - ответ на 1А81. Там ты поставил 68 а надо 6B. Может в этом косяк 

вот скетч 

class BUTTON {
public:
//================================================================
static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 1200000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 1600; // длительность отслеживания нажатия и удержания.
//================================================================
boolean click_down;
boolean click_up;
boolean doubleclick;
boolean timer;
boolean retention;
//=================================
unsigned long m;
boolean  p;
boolean  b;
boolean dc;
byte     c;
boolean  t;
boolean  r;
//=================================
byte _pb;
//=================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//====
click_down      = 0;
click_up        = 0;
doubleclick     = 0;
timer           = 0;
retention       = 0;
//====
m  =      millis();
p  = digitalRead(_pb);
b  =                0;
dc =                0;
c  =                0;
t  =                0;
r  =                0;
//====
}

void read() {
//=======================================================
unsigned long nm =      millis();
boolean       np = digitalRead(_pb);
//=================
boolean nb  = 0;
boolean ndc = 0;
boolean nt  = 0;
boolean nr  = 0;
//================
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//=================
if (np != p) {p = np; m = nm; }
//=======================================================
if (nm - m > bounce_) {nb = 1;}
if (nm - m > doubleclick_) {ndc = 1;}
if (ndc != dc) {dc = ndc; if (dc == 1) {c = 0;}}
if (nb != b) {b = nb;
if (p == 0 && b == 0) {click_down = 1;
++c;      if (c == 2) {c = 0; doubleclick = 1;}
}
if (p == 1 && b == 1) {click_up = 1;}
}
//=======================================================
if (nm - m > timer_) {nt = 1;}
if (nt != t) {t = nt;
if (p == 1 && t == 1) {timer = 1;}
}
//=======================================================
if (nm - m > retention_) {nr = 1;}
if (nr != r) {r = nr;
if (p == 0 && r == 1) {retention = 1;}
}
//=======================================================
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






BUTTON button(12); // вход кнопки (digital pin arduino)

int bytenumber = 0;


///////////////////////////////////////////////////////////////////////
// Всё что выше для считывания кнопки 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 

int length5 = 5;
int length7 = 7;
byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения

byte messageCOMUN[7] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40};
byte messagePRES[5] = {0x81, 0xF1, 0x11, 0x7E, 0x01};

int length44 = 44;
byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x6B, 0x03,
0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 
0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC};

/*int length105 = 102;
byte messageIDEN2[102] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 
0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37, 0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34,  //W0L0TGF7512233714   
0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20, 0x50, 0x44,   //24417169 PD       
0x42, 0x4F, 0x53, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35,       //BOS 010505       
0x32, 0x35, 0x35, //255                                                                     
0x4B, 0x4D, 0x37, 0x4D, 0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, //KM7M3040_S       
0x36, //6                                                                     
0x42, 0x30, 0x31, 0x30, 0x31, 0x35, //B01015                            
0x59, 0x32, 0x30, 0x44, 0x54, 0x48, 0x5F, 0x44, 0x33, //Y20DTH_D3             
0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30,  //S001006940    
0x32, 0x30, 0x30, 0x37, 0x30, 0x37, 0x32, 0x35,  //20070725                  
0x30, 0x32, 0x38, 0x31, 0x30, 0x31, 0x30, 0x32, 0x36, 0x38}; //0281010268   

*/

int length100 = 100;

byte messageIDEN2[100] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37,
0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34, 0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20,
0x50, 0x44, 0x42, 0x4F, 0x53, 0x20, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35, 0xFF, 0x4B, 0x4D, 0x37, 0x4D,
0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, 0x00, 0x06, 0x42, 0x30, 0x31, 0x30, 0x31, 0x35, 0x59, 0x32, 0x30, 0x44,
0x54, 0x48, 0x20, 0x44, 0x33, 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30, 0x20, 0x07, 0x07,
0x25, 0x05, 0x48, 0x30, 0x32, 0x38, 0x31, 0x30, 0x031, 0x30, 0x32, 0x36, 0x38, 0xFF};


int length83 = 83;
byte messagePIDS[83] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x0D, 0x37, 0x01, 0x79, 0x0C, 0xEB, 0x00, 0x00, 0x02, 0xB3, 0x00, 0x00, 0x11, 0x89, 0x04, 0x30, 0x00, 0x00, 
0x03, 0x20, 0x0B, 0x55, 0x03, 0xA3, 0x04, 0x2D, 0x03, 0x20, 0xEE, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x35, 
0x03, 0x0A, 0x02, 0xD9, 0x08, 0xA3, 0x01, 0x90, 0x0C, 0x27, 0xA0, 0x00, 0x01, 0x2C, 0x02, 0x76, 0xAD, 0x08, 
0x01, 0x30, 0x00, 0x03, 0x01, 0x7B, 0x0B, 0xDB, 0x03, 0xA3, 0x00, 0x02, 0x5C, 0x81, 0x1F};

int waitbyte=5;

unsigned long TimeLED, timerLED = 0;
bool timerenabledLED = 0;
#define TIMEREXPIRED_LED (TimeLED - timerLED)> 1200 // время включения светодиода если кнопка длительно нажата, мс

void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
pinMode (13, OUTPUT);
digitalWrite (13,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");
}

void loop() {
button.read();
TimeLED = millis ();

//////////////////////тут поменять на сообщение 21 00
if (button.click_down) { messagePIDS[bytenumber]++;  } // коротким нажатием на кнопку изменяем значение выбранного байта 
if (button.retention) { bytenumber++; digitalWrite (13,1) ; timerLED=TimeLED; timerenabledLED=1; 
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");} // длительным нажатием на кнопку изменяем номер байта, который будем менять

if (timerenabledLED){ if (TIMEREXPIRED_LED) {timerenabledLED=0;digitalWrite (13,0);}}



if (mySerial.available()) {
      delay(100);
     int k=0;
     byte inbyte=0;
     
  while( mySerial.available() && k < 100) {
     inbyte = mySerial.read();
    MessageRx[k] = inbyte;
    k++;   }

      Serial.print ("Recieve:   ");

    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");

if (MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04) {
  Serial.println ("Prinyat zapros init!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length7; i++) {
    mySerial.write(messageCOMUN[i]);
    Serial.print(messageCOMUN[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
if (MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x3E && MessageRx[4]==0xC1) {
  Serial.println ("Prinyat zapros prisutstvia!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length5; i++) {
    mySerial.write(messagePRES[i]);
    Serial.print(messagePRES[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) {
  Serial.println ("Prinyat zapros identificacion 1!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length44; i++) {
    mySerial.write(messageIDEN1[i]);
    Serial.print(messageIDEN1[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
   Serial.print ("Otvechayu DEC:    ");
    for (int i = 0; i < length44; i++) {
   
    Serial.print(messageIDEN1[i]); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) {
  Serial.println ("Prinyat zapros identificacion 2!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length100; i++) {
    mySerial.write(messageIDEN2[i]);
    Serial.print(messageIDEN2[i],HEX); Serial.print ("  ");
 //   if (i==31){  delay (113);Serial.println ("");}
 //   if (i==92){  delay (113);Serial.println ("");}
     //delay (waitbyte); 
   } 
    Serial.println("");
  Serial.print ("Otvechayu DEC:    ");
 for (int i = 0; i < length100; i++) {
    
    Serial.print(messageIDEN2[i]); Serial.print ("  ");
    
     //delay (waitbyte); 
   } 
   Serial.println("");
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) {
  Serial.println ("Prinyat zapros datos!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length83; i++) {
    mySerial.write(messagePIDS[i]);
    Serial.print(messagePIDS[i],HEX); Serial.print ("  ");
//   /delay (waitbyte); 
   } 
    Serial.println("");
 
   }
}
}


 

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

  #include <UTouch.h>
  #include <UTFT.h>
  #include <SPI.h>
  
  //pin 20 SCL , 21 SDA датчик реального времени
  #include <Wire.h>
  #include "RTClib.h"
  RTC_DS3231 rtc;       
  
  //датчик наружней температуры
  #include <OneWire.h>
  #define ONE_WIRE_BUS 8   
  OneWire oneWire(ONE_WIRE_BUS);
  #include <DallasTemperature.h>
  DallasTemperature sensors(&oneWire);
  
  //датчик внутринней температуры и влаги
  #include "DHT.h"
  #define DHTPIN 9   
  #define DHTTYPE DHT22 
  DHT dht(DHTPIN, DHTTYPE);
  
  //пины экрана и тача
  UTFT    myGLCD(31,38,39,40,41); 
  UTouch  myTouch(6,5,4,3,2);
 
  //шрифты + не стандартный шрифт GroteskBold16x32.с
  extern uint8_t SmallFont[];
  extern uint8_t BigFont[];
  extern uint8_t SevenSegNumFont[];
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage, selectedUnit;

  float h;
  float t;

  unsigned long prevWatch = 0;
  unsigned long prevDvoet = 0;
  unsigned long prevData = 0;
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial(10, 11); //RХ,TХ
  #define TX 11


  int length5 = 5;
  int length6 = 6;

  int pid = 1; // очередность пида
  bool Init = 0;

  int PIDTime = 150;    // задержка между посылками запросов пидов, мс
  int PresTime = 9000;    // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;       // задержка между отправкой байт в сообщении, мс

  int Temp = 0;    // температура 
  int rpm = 0;     // обороты
  int load = 0;    // нагрузка
  int tempair = 0; // температура входного воздуха
  int Speed = 0;   // скорость
  int MAP = 0;     // давление впускного коллектора
  int Acceler = 0;     // положение педали
  int MAF = 0;     // массовый расход воздуха

  // массив байтов принимаемого сообщения
  byte MessageRx[12] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};  

  //массивы сообщений (пидов)
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messageTemp[6] = {0x82,0x11,0xF1,0x01,0x05,0x8A};    // запрос температуры 1
  byte messageRPM[6] = {0x82,0x11,0xF1,0x01,0x0C,0x91};     // запрос оборотов ДВС 2
  byte messageLoad[6] = {0x82,0x11,0xF1,0x01,0x04,0x89};    // запрос нагрузки на ДВС 3
  byte messageAirTemp[6] = {0x82,0x11,0xF1,0x01,0x0F,0x94}; // запрос температура впускного воздуха 4
  byte messageSpeed[6]= {0x82,0x11,0xF1,0x01,0x0D,0x92};    // запрос скорости а/м 5
  byte messageMAP[6] = {0x82,0x11,0xF1,0x01,0x0B,0x90};     // запрос абсолютное давление во впускном коллекторе (MAP) 6
  byte messageAcceler[6] = {0x82,0x11,0xF1,0x01,0x11,0x96}; // положения педали газа, % 7
  byte messageMAF[6] = {0x82,0x11,0xF1,0x01,0x10,0x95};     // массовый расход воздуха, г/cек  8

  unsigned long prevPID = 0;
  unsigned long prevpres = 0;


  unsigned long TimewaitPID, timerwaitPID = 0;
  bool timerenabledPID = 0;
  #define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 60 // здесь задержка на ожидание правильного ответа пидов, мс

  unsigned long TimewaitInit, timerwaitInit = 0;
  bool timerenabledInit = 0;
  #define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 500 // здесь задержка на ожидание ответа об удачной инициализации, мс

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void setup() {
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
 
    drawHomeScreen();  
    currentPage = '0'; 
    selectedUnit = '0'; 
  
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    // строка ниже используется для настройки даты и времени часов (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 6, 23, 18, 0, 0));
    Watch_Temperature ();
    ///////if (rpm) {myGLCD.print("                    ", 150, 215); delay (1000);};
  
    pinMode(TX, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void loop() {

    unsigned long curPID = millis ();
    unsigned long curpres = millis ();
    TimewaitPID = millis ();
    TimewaitInit = millis ();

    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
    else {if (TIMEREXPIRED_Init) {timerenabledInit=0;}}}
    else {
      if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}
      if (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
      if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}
      }
  
    receive ();
    
    unsigned long curWatch = millis();  
    unsigned long curDvoet = millis();  
    unsigned long curData = millis();  

    if (curWatch - prevWatch > 10000)  { Watch_Temperature (); prevWatch = curWatch;}
    if (curDvoet - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
   Menu();
   //---------------------------------------------------------
   //прописываем где и что мы хотим видеть (пиды)
     if (currentPage == '0') {if (curWatch - prevWatch > 200){
       
       myGLCD.setColor(0, 255, 0);
       
       if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
       if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
       myGLCD.printNumI(Speed, 350, 0);
      
      myGLCD.setColor(255, 255, 255); 
      
      //if (--<10) {myGLCD.print("  ", 166, 40); }; //затираем вторую цифру и третью
      //if (-->10) {myGLCD.print(" ", 182, 40); }; //затирает третюю цифру
      //myGLCD.printNumI(--, 150, 40);
      
      //if (--<10) {myGLCD.print("  ", 166, 75); }; //затираем вторую цифру и третью
      //if (-->10) {myGLCD.print(" ", 182, 75); }; //затирает третюю цифру
      //myGLCD.printNumI(--, 150, 75);
  
      myGLCD.printNumI(h, 150, 110);

      if (Acceler<10) {myGLCD.print("  ", 166, 145); }; //затираем вторую цифру и третью
      if (Acceler>10) {myGLCD.print(" ", 182, 145); }; //затирает третюю цифру
      myGLCD.printNumI(Acceler, 150, 145);

      
      if (MAF<10) {myGLCD.print("  ", 166, 180); }; //затираем вторую цифру и третью
      if (MAF>10) {myGLCD.print(" ", 182, 180); }; //затирает третюю цифру
      myGLCD.printNumI(MAF, 150, 180);
        
      if (rpm>100) {myGLCD.print(" ", 198, 215);};   //затираем четвертую цифру
      myGLCD.printNumI(rpm, 150, 215);
      
      //-------------------------------------------
      if (Temp<10) {myGLCD.print("  ", 411, 40); }; //затираем вторую цифру и третью
      if (Temp>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
      myGLCD.printNumI(Temp, 395, 40);
      
      if (tempair<10) {myGLCD.print("  ", 411, 75); }; //затираем вторую цифру и третью
      if (tempair>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру  
      myGLCD.printNumI(tempair, 395, 75);
  
      myGLCD.printNumI(sensors.getTempCByIndex(0), 395, 110);
      
      myGLCD.printNumI(t, 395, 145);
      
      if (MAP<10) {myGLCD.print("  ", 411, 180); }; //затираем вторую цифру и третью
      if (MAP>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру
      myGLCD.printNumI(MAP, 395, 180);
      
      if (load<10) {myGLCD.print("  ", 411, 215); }; //затираем вторую цифру и третью
      if (load>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру  
      myGLCD.printNumI(load, 395, 215);
     
     prevData = curData;   
    }
   }
   //----------------------------------------------------------
      if (currentPage == '1') {if (curWatch - prevWatch > 200){
        myGLCD.setColor(0, 255, 0);
        
        if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
        if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
        //myGLCD.print("Start of Delivery  C:", 10, 40);
        //myGLCD.print("Desir inject Start C:", 10, 75);
        //myGLCD.print("Actua Inject Start C:", 10, 110);
        //myGLCD.print("Desir Inject Quan mg:", 10, 145);
        //myGLCD.print("Actu Inject Quant mg:", 10, 180);
        
        //myGLCD.printNumI(tempair, 360, 215);
          //if (tempair>10) {myGLCD.print("   ", 376, 215); };
          //if (tempair<10) {myGLCD.print("   ", 392, 215); };
        
        prevData = curData;
      }
      }
      //----------------------------------------------------------
      if (currentPage == '2') {
        if (curWatch - prevWatch > 200){
        myGLCD.setColor(0, 255, 0);
        
        if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
        if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
        //myGLCD.print("EGR Pulse Ratio  :", 10, 40);
        //myGLCD.print("Boost Pressure   :", 10, 75);
        //myGLCD.print("Fuel Valve       :", 10, 110);
        //myGLCD.print("Pump Speed       :", 10, 145);
        //myGLCD.print("Glow Time        :", 10, 180);
        //myGLCD.print("A/C Pressure     :", 10, 215);
        
        prevData = curData;
      }
      }
      //----------------------------------------------------------
      if (currentPage == '3') {if (curWatch - prevWatch > 200){
        myGLCD.setColor(0, 255, 0);
        
        if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
        if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
        myGLCD.printNumI(Speed, 350, 0);
          
       myGLCD.setColor(255, 255, 255);
        
        prevData = curData;
      }
    }
  }

  ///////////////////////////////////////////////////////////////////////////
  //отправка запросов пидов
  void PIDs() {

    if (pid==1){
    for (int i = 0; i < length6; i++) {
    mySerial.write(messageTemp[i]);
    delay (waitbyte); } 
   }

    if (pid==2){
    for (int i = 0; i < length6; i++) {
    mySerial.write(messageRPM[i]);
    delay (waitbyte); } 
   }

    if (pid==3){
    for (int i = 0; i < length6; i++) {
    mySerial.write(messageLoad[i]);
    delay (waitbyte); } 
   }

   if (pid==4){
    for (int i = 0; i < length6; i++) {
    mySerial.write(messageAirTemp[i]);
    delay (waitbyte); } 
   }

    if (pid==5){
    for (int i = 0; i < length6; i++) {
    mySerial.write(messageSpeed[i]);
    delay (waitbyte); } 
   }

   if (pid==6){
    for (int i = 0; i < length6; i++) {
    mySerial.write(messageMAP[i]);
    delay (waitbyte); } 
   }

   if (pid==7){
    for (int i = 0; i < length6; i++) {
    mySerial.write(messageAcceler[i]);
    delay (waitbyte); } 
   }

   if (pid==8){
    for (int i = 0; i < length6; i++) {
    mySerial.write(messageMAF[i]);
    delay (waitbyte); } 
   }
  
   pid++; if (pid>8) {pid = 1; }
   }

  void present() {
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }

/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных из конкретных ответо, конкретные байты
    void receive () {
     if (mySerial.available()) {
     delay(51);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 12) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
     
     for (int i = 0; i < 12; i++) {
     }

   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F) {Init=1;
   timerenabledInit=0;  
   }

   if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x05) {Temp = MessageRx[8]-40;
   timerenabledPID=0; }

   if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0C) {rpm = ((MessageRx[8]*256) + MessageRx[9]) / 4;
   timerenabledPID=0; }
    
   if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x04){ load = MessageRx[8]*100/255;
   timerenabledPID=0; }
    
   if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0F) {tempair = MessageRx[8]-40;
   timerenabledPID=0; }

   if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0D){ Speed = MessageRx[8];
   timerenabledPID=0; }

   if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x0B){ MAP = MessageRx[8];
   timerenabledPID=0; }

   if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x11) {Acceler = MessageRx[8]*100/255;
   timerenabledPID=0; }

   if (MessageRx[5]==0x11 && MessageRx[6]==0x41 && MessageRx[7]==0x10) { MAF = ((MessageRx[8]*256) + MessageRx[9]) / 100;
   timerenabledPID=0; }
  
   for (int i = 0; i < 12; i++) MessageRx[i]=0;
     }
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  void initialization() {
    for (int i = 0; i < length5; i++) {
    mySerial.write(messageInit[i]);
    delay (5);
    } 
    delay (55);
 }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //стартовая инициализация
  void fastinit() {
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка координат тач кнопок
  void Menu () {
      //Page 0 (home)
      if (currentPage == '0') { 
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
      // Button home
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
        Watch_Temperature ();
      }
       
     // Button INF1
     if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
        drawFrame(10, 275, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
        Watch_Temperature ();
      } 
      
     // Button INF2
     if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        drawFrame(180, 275, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
        Watch_Temperature ();                                                                   
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
        Watch_Temperature ();                                                                   
      } 
     }
    }
   
  //----------------------------------------------------------------------------------------------------------------------------------
    //Page 1
    if (currentPage == '1') { 
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
        Watch_Temperature ();
      }
       
    // Button INF2
    if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        drawFrame(180, 275, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
        Watch_Temperature ();                                                                   
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
        Watch_Temperature ();                                                                   
      } 
     }
    }
   

  //---------------------------------------------------------------------------------------------------
    //Page 2
    if (currentPage == '2') { 
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
        Watch_Temperature ();
      }
      
    // Button INF1
    if ((x>=10) && (x<=120) && (y>=275) && (y<=310)) {
        drawFrame(10, 275, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();   
        Watch_Temperature ();                                                                   
      } 
      
    // Button CHECK
    if ((x>=350) && (x<=470) && (y>=275) && (y<=310)) {
        drawFrame(350, 275, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();  
        Watch_Temperature ();                                                                    
      } 
    }
  }
  //----------------------------------------------------------
    //Page 3
    if (currentPage == '3') { 
       if (myTouch.dataAvailable()) {
       myTouch.read();
       x=myTouch.getX(); 
       y=myTouch.getY();
      
    //Button ERASE
    //if ((x>=180) && (x<=300) && (y>=275) && (y<=310)) {
        //drawFrame(180, 275, 300, 310); 
        //currentPage = '3';  //потом заменить на дейсвие         
        //myGLCD.clrScr();             
        //drawscreen_three();   //потом заменить на дейсвие                                                                   
      //} 
  
    // Button home
    if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        selectedUnit == 0;
        myGLCD.clrScr();
        drawHomeScreen(); 
        Watch_Temperature ();
      }    
     }
    }
  }
  
  //--------------------------------------------------------
  //прописывает заголовки на всех страницах
   void drawHomeScreen() {
     line() ;
     vista();
     myGLCD.drawLine(239,35,239,248); // линия вертикальная
     myGLCD.print("Ltr/Hor:", 10, 40);
     myGLCD.print("Ltr/100:", 10, 75);
     myGLCD.print("Humed %:", 10, 110);
     myGLCD.print("Accel %:", 10, 145);
     myGLCD.print("MAF g/s:", 10, 180);
     myGLCD.print("Eng RPM:", 10, 215);
     myGLCD.print("Engin C:", 255, 40);
     myGLCD.print("AirTemC:", 255, 75);
     myGLCD.print("Exter C:", 255, 110);
     myGLCD.print("Inter C:", 255, 145);
     myGLCD.print("MAP   %:", 255, 180);
     myGLCD.print("Load  %:", 255, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     vista();
     myGLCD.print("Start of Delivery  C:", 10, 40);
     myGLCD.print("Desir inject Start C:", 10, 75);
     myGLCD.print("Actua Inject Start C:", 10, 110);
     myGLCD.print("Desir Inject Quan mg:", 10, 145);
     myGLCD.print("Actu Inject Quant mg:", 10, 180);
     myGLCD.print("Mass Air Flow     mg:", 10, 215);
 
  
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     vista();
     myGLCD.print("EGR Pulse Ratio  :", 10, 40);
     myGLCD.print("Boost Pressure   :", 10, 75);
     myGLCD.print("Fuel Valve       :", 10, 110);
     myGLCD.print("Pump Speed       :", 10, 145);
     myGLCD.print("Glow Time        :", 10, 180);
     myGLCD.print("A/C Pressure     :", 10, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
  //----------------------------------------------------------------------------
   void drawscreen_three() {
     vista();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     
     buttonHome();
  
     //Button - ERASE
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 275, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 275, 300, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("ERASE", 200, 285);
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  void drawFrame(int x1, int y1, int x2, int y2) {
     myGLCD.setColor(255, 0, 0);
     myGLCD.drawRoundRect (x1, y1, x2, y2);
     while (myTouch.dataAvailable())
     myTouch.read();
     myGLCD.setColor(255, 255, 255); 
   }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка кнопок
  void buttonHome() {
     myGLCD.setColor(0,0,0); // цвет кнопки -серый
     myGLCD.fillRoundRect (1, 1, 65, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(0, 255, 0); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.setFont(BigFont);                      // размер шрифта
     myGLCD.setBackColor(0,0,0);            // цвет фона области где будет надпись и кнопки
     myGLCD.print("HOME", 1, 10); // центровка строки
    }
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 275, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 275, 120, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("INF 1", 25, 285);
    }
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 275, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 275, 300, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("INF 2", 200, 285);
    }
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 275, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 275, 470, 310);
     myGLCD.setFont(BigFont);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("CHECK", 375, 285);
    }

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  void line() {
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,73,479,73); // линия горизонтальная
     myGLCD.drawLine(1,108,479,108); // линия горизонтальная
     myGLCD.drawLine(1,143,479,143); // линия горизонтальная
     myGLCD.drawLine(1,178,479,178); // линия горизонтальная
     myGLCD.drawLine(1,212,479,212); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
   }

  ////////////////////////////////////////////////////////////////////////////////////////////
  //отображение щрифта
  void vista(){
     myGLCD.setFont(GroteskBold16x32);
     myGLCD.setColor(255, 0, 0);
     myGLCD.setBackColor(0,0,0); 
  }

  /////////////////////////////////////////////////////////////////////////////////////////////
  //верхняя часть экрана часы и дата отображается на всех экранах
  void Watch_Temperature (){
    DateTime now = rtc.now();
    int m = now.minute(); 
    int hour = now.hour();
    int mon = now.month();
    int date = now.day();
  
    myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
    myGLCD.setFont(GroteskBold16x32);
    
    if (date<10) { 
    myGLCD.print("0", 85, 0); 
    myGLCD.printNumI(now.day(), 100, 0); } 
    
    else if (date >=10) {
    myGLCD.printNumI(now.day(), 85, 0); }
    myGLCD.print("/", 115, 0);
    
    if ( mon<10) {
    myGLCD.print("0", 130, 0); 
    myGLCD.printNumI(now.month(), 145, 0);} 
    
    else if (mon >=10) {
    myGLCD.printNumI(now.month(), 130, 0);}  
    myGLCD.print("/", 160, 0);
    myGLCD.printNumI(now.year(), 175, 0);
    myGLCD.setColor(255, 255, 255);
    
    if (hour<10) {
    myGLCD.print("0",255, 0); 
    myGLCD.printNumI(now.hour(), 270, 0); } 
    
    else if(hour>=10){ 
    myGLCD.printNumI(now.hour(), 255, 0); } 
    
    if (m<10) {
    myGLCD.print("0",300, 0); 
    myGLCD.printNumI(now.minute(), 315, 0); } 
    
    else if (m>=10){ 
    myGLCD.printNumI(now.minute(), 300, 0); }
  
    h = dht.readHumidity();
    t = dht.readTemperature();
 
    myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
    myGLCD.print("Km/h", 410, 0);
    sensors.requestTemperatures();
  }

 

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

опком почему-то воспринимает аппаратный номер ЭБУ в 5 символов, а надо 8 символов  - на 3 меньше (кстати байты 68 и 6B как раз на 3 отличаются, может поможет всё таки?) Ну давай по балабасу, сделаем аппаратный номер 5 символьным, можем опкому пофиг на это, зато всё остальное будет правильно показывать. Примерно так: 

class BUTTON {
public:
//================================================================
static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 1200000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 1600; // длительность отслеживания нажатия и удержания.
//================================================================
boolean click_down;
boolean click_up;
boolean doubleclick;
boolean timer;
boolean retention;
//=================================
unsigned long m;
boolean  p;
boolean  b;
boolean dc;
byte     c;
boolean  t;
boolean  r;
//=================================
byte _pb;
//=================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//====
click_down      = 0;
click_up        = 0;
doubleclick     = 0;
timer           = 0;
retention       = 0;
//====
m  =      millis();
p  = digitalRead(_pb);
b  =                0;
dc =                0;
c  =                0;
t  =                0;
r  =                0;
//====
}

void read() {
//=======================================================
unsigned long nm =      millis();
boolean       np = digitalRead(_pb);
//=================
boolean nb  = 0;
boolean ndc = 0;
boolean nt  = 0;
boolean nr  = 0;
//================
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//=================
if (np != p) {p = np; m = nm; }
//=======================================================
if (nm - m > bounce_) {nb = 1;}
if (nm - m > doubleclick_) {ndc = 1;}
if (ndc != dc) {dc = ndc; if (dc == 1) {c = 0;}}
if (nb != b) {b = nb;
if (p == 0 && b == 0) {click_down = 1;
++c;      if (c == 2) {c = 0; doubleclick = 1;}
}
if (p == 1 && b == 1) {click_up = 1;}
}
//=======================================================
if (nm - m > timer_) {nt = 1;}
if (nt != t) {t = nt;
if (p == 1 && t == 1) {timer = 1;}
}
//=======================================================
if (nm - m > retention_) {nr = 1;}
if (nr != r) {r = nr;
if (p == 0 && r == 1) {retention = 1;}
}
//=======================================================
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






BUTTON button(12); // вход кнопки (digital pin arduino)

int bytenumber = 0;


///////////////////////////////////////////////////////////////////////
// Всё что выше для считывания кнопки 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 

int length5 = 5;
int length7 = 7;
byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения

byte messageCOMUN[7] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40};
byte messagePRES[5] = {0x81, 0xF1, 0x11, 0x7E, 0x01};

int length44 = 44;
byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x6B, 0x03,
0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 
0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC};

/*int length105 = 102;
byte messageIDEN2[102] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 
0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37, 0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34,  //W0L0TGF7512233714   
0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20, 0x50, 0x44,   //24417169 PD       
0x42, 0x4F, 0x53, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35,       //BOS 010505       
0x32, 0x35, 0x35, //255                                                                     
0x4B, 0x4D, 0x37, 0x4D, 0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, //KM7M3040_S       
0x36, //6                                                                     
0x42, 0x30, 0x31, 0x30, 0x31, 0x35, //B01015                            
0x59, 0x32, 0x30, 0x44, 0x54, 0x48, 0x5F, 0x44, 0x33, //Y20DTH_D3             
0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30,  //S001006940    
0x32, 0x30, 0x30, 0x37, 0x30, 0x37, 0x32, 0x35,  //20070725                  
0x30, 0x32, 0x38, 0x31, 0x30, 0x31, 0x30, 0x32, 0x36, 0x38}; //0281010268   

*/

int length97 = 97;

byte messageIDEN2[97] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37,
0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34, 
0x32, 0x34, 0x34, 0x31, 0x37, 0x20, 
0x50, 0x44, 0x42, 0x4F, 0x53, 0x20, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35, 0xFF, 0x4B, 0x4D, 0x37, 0x4D,
0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, 0x00, 0x06, 0x42, 0x30, 0x31, 0x30, 0x31, 0x35, 0x59, 0x32, 0x30, 0x44,
0x54, 0x48, 0x20, 0x44, 0x33, 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30, 0x20, 0x07, 0x07,
0x25, 0x05, 0x48, 0x30, 0x32, 0x38, 0x31, 0x30, 0x31, 0x30, 0x32, 0x36, 0x38, 0xFF};


int length83 = 83;
byte messagePIDS[83] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x0D, 0x37, 0x01, 0x79, 0x0C, 0xEB, 0x00, 0x00, 0x02, 0xB3, 0x00, 0x00, 0x11, 0x89, 0x04, 0x30, 0x00, 0x00, 
0x03, 0x20, 0x0B, 0x55, 0x03, 0xA3, 0x04, 0x2D, 0x03, 0x20, 0xEE, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x35, 
0x03, 0x0A, 0x02, 0xD9, 0x08, 0xA3, 0x01, 0x90, 0x0C, 0x27, 0xA0, 0x00, 0x01, 0x2C, 0x02, 0x76, 0xAD, 0x08, 
0x01, 0x30, 0x00, 0x03, 0x01, 0x7B, 0x0B, 0xDB, 0x03, 0xA3, 0x00, 0x02, 0x5C, 0x81, 0x1F};

int waitbyte=5;

unsigned long TimeLED, timerLED = 0;
bool timerenabledLED = 0;
#define TIMEREXPIRED_LED (TimeLED - timerLED)> 1200 // время включения светодиода если кнопка длительно нажата, мс

void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
pinMode (13, OUTPUT);
digitalWrite (13,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");
}

void loop() {
button.read();
TimeLED = millis ();

//////////////////////тут поменять на сообщение 21 00
if (button.click_down) { messagePIDS[bytenumber]++;  } // коротким нажатием на кнопку изменяем значение выбранного байта 
if (button.retention) { bytenumber++; digitalWrite (13,1) ; timerLED=TimeLED; timerenabledLED=1; 
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");} // длительным нажатием на кнопку изменяем номер байта, который будем менять

if (timerenabledLED){ if (TIMEREXPIRED_LED) {timerenabledLED=0;digitalWrite (13,0);}}



if (mySerial.available()) {
      delay(100);
     int k=0;
     byte inbyte=0;
     
  while( mySerial.available() && k < 100) {
     inbyte = mySerial.read();
    MessageRx[k] = inbyte;
    k++;   }

      Serial.print ("Recieve:   ");

    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");

if (MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04) {
  Serial.println ("Prinyat zapros init!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length7; i++) {
    mySerial.write(messageCOMUN[i]);
    Serial.print(messageCOMUN[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
if (MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x3E && MessageRx[4]==0xC1) {
  Serial.println ("Prinyat zapros prisutstvia!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length5; i++) {
    mySerial.write(messagePRES[i]);
    Serial.print(messagePRES[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) {
  Serial.println ("Prinyat zapros identificacion 1!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length44; i++) {
    mySerial.write(messageIDEN1[i]);
    Serial.print(messageIDEN1[i],HEX); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
   Serial.print ("Otvechayu DEC:    ");
    for (int i = 0; i < length44; i++) {
   
    Serial.print(messageIDEN1[i]); Serial.print ("  ");
   //delay (waitbyte); 
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) {
  Serial.println ("Prinyat zapros identificacion 2!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length97; i++) {
    mySerial.write(messageIDEN2[i]);
    Serial.print(messageIDEN2[i],HEX); Serial.print ("  ");
 //   if (i==28){  delay (113);Serial.println ("");}
 //   if (i==89){  delay (113);Serial.println ("");}
     //delay (waitbyte); 
   } 
    Serial.println("");
  Serial.print ("Otvechayu DEC:    ");
 for (int i = 0; i < length97; i++) {
    
    Serial.print(messageIDEN2[i]); Serial.print ("  ");
    
     //delay (waitbyte); 
   } 
   Serial.println("");
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) {
  Serial.println ("Prinyat zapros datos!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length83; i++) {
    mySerial.write(messagePIDS[i]);
    Serial.print(messagePIDS[i],HEX); Serial.print ("  ");
//   /delay (waitbyte); 
   } 
    Serial.println("");
 
   }
}
}


 

viki13viki
Offline
Зарегистрирован: 14.11.2016

иду с машины вытащу все. и щас попробую

viki13viki
Offline
Зарегистрирован: 14.11.2016

нет, завтра. блок питания и зажими на работе оставил. завтра это проверю

viki13viki
Offline
Зарегистрирован: 14.11.2016

я делал по балабасу , он и другие чатси не правильно определяет . например здесь systemSupplierECUHardwareVersionNumber: 30           //255 только два символа а должно быть три. здесь systemSupplierECUSoftwareVersionNumber: 3430         //6 должен одни а определяет четыре  т.д но если как ты думаешь что может первое сообщение определяет размеры..... то завтра выясним

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

не, 255 это он из НЕХ переводит, тобишь это один байт всего и на это место должен FF попасть, он как раз там рядом. и 6 тоже скорее всего это байт, он тоже рядом причём там рядом как раз два байта 00 и 06,  что и будет 6

Короче первое сообщение только неправильно он видит, а дальше просто всё сдвигается, если первое исправить, остальное должно тоже выправиться

viki13viki
Offline
Зарегистрирован: 14.11.2016

чета както не додумал, действительно FF это 255. а на счет 6 понятно что это 1 байт, не понятно почему он на местн где должна быть одна цифра , вписывает четыре, как и где должно быть три цифры(255) а вписывает только две (30). чтото должно определять длинну дванных в каждой строке, буду надеятся что твоя идея проканает.

viki13viki
Offline
Зарегистрирован: 14.11.2016

стоп, подожи, он же переводит байты в текст а не DEC, в DEC FF будет 255, по этому он FF в ASCII  как "ÿ", в проге он же выдает в ASCII . или я чета не догоняю?

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

вписывает четыре потому что там опрос двух байт. А надо чтоб стояли байты 00 06 и тогда будет "6". Точно также и с 255 он переводит из HEX в DEC, если бы стояло FF он написал бы 255, а там сдвинулось и показывает байт который соотвествует 30

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

он не во всех параметрах ASCII использует 

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

так то да, вредный ссука опком попался

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

 

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

короче первое ID1 сообщение совсем не просто так, оно как раз похоже распределяет сколько байт считывать в каждой строке идентификаторов  и устанавливает считывать ли их байтами или ASCII.  Я перевел байты сообщения ID1 в DEC вот что получилось 

курсив это байты, что запрос принят. Жирным номера строчек идентификаторов. Далее после номера, например если "107" то  это понимать семь байт + ещё четыре байта в ASCII (зачем-то еще четыре, непонятно почему, но так оно есть, хотя понял, вон какая-то четверка после курсива стоит, наверное это оно), а если например "02" то понимать два байта напрямую без ASCII, 3 это разделитель просто походу 

168  241  17  90  129  4  144  111  98  3  145  107  3  146  107  3  147  1  3  148  106  3  149  2  3  150  102  3  151  105  3  152  106  3  153  68  3  154  2  3  159  106  255  172  

Вот взять например строку 153 это дата. она в сообщении ID2 представлена напрямую байтами. т.е. 20 07 07 25 

и в сообщении ID1 указано 153 68 3, т.е. 68 это без единички в начале значит понимает напрямую байтами без ASCII, а 68 это 4 в DEC то есть надо понимать 4 байта напрямую, что и есть 20 07 07 25 )))))

Ох должно получиться....

viki13viki
Offline
Зарегистрирован: 14.11.2016

Утром у меня была мысль что оно отвечает за распределение данных. И когда ты говоришь ох должно получится, обычно получается. Надо пересмотреть и перекроить все сообщение.