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

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

0x01,0x00 = -247гр

0x0A,0x00 = -17гр

0x0B,0x00 = 8гр

0x0C,0x00 = 34гр

0x0D,0x00 = 59гр

0x0E,0x00 = 85гр

0x0F,0x00 = 111гр

со вторым байтом я разобрался

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

у тебя странно на втором байте порядок с шагом 0х05      - 0х10 0х15 0х20 0х25 а надо вроде как 0х10 0х15 0х1А 0х1F 0х24

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

Если начинать с 0А, то тоже по градуса прибавляет.

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

Надо с первым разобраться а потом прибавлять второй.

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

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

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

Я просто вводил 0D а мог ввести допустим 5С и было бы какое то среднее значение между 0C и 0D примерно 49гр.дома проверю.

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

Во всех температурах второй байт обычно от 00 до 99 это и есть от 1 до 10 гр. Единственный байт из температу не цифровой EB это масло. Но я посмотрю , может не правильно скопировал.

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

первый байт он использует только значения из поста 401. например 0x1B 0x00 дает 417гр

вот значение температуры масла

0x0C, //Engine Oil Temperature  // 57гр
0xEB, //Engine Oil Temperature

0x0c= DEC 12 c нулевым вторым байтом он выдает 34гр

0xEB= DEC 235 превращаются в остальные 23 гр

в формуле возможно что второй байт делится на 10, 235/10=23,5 понятно что он округляет до 23 и прибавляется уже к 12 переведенном в 34гр

меняем на F

0x0C, //Engine Oil Temperature  // 59гр
0xFB, //Engine Oil Temperature

0xFB= DEC 251 превращаются в остальные 25 гр здесь тоже, 251/10=25,1

еще пример 0x0F c нулевым байто это 111гр

0x0F ,0xFB выдает 136. тут опять видно что FB добавил тех же 25гр  251/10=25,1

уже есть какаято закономерность

но если такая фича

0x0С, //Coolant Temperature (с нулевым вторым байтом байтом это 34гр)
0x37, //Coolant Temperature с этим байтом имеем 39гр тоесть 0x37 превратились в 5гр

0x0С, //Coolant Temperature (с нулевым вторым байтом байтом это 34гр)
0x76, //Coolant Temperature с этим байтом имеем 46гр тоесть 0x76 превратились в12гр

0x0D, //Coolant Temperature (с нулевым вторым байтом байтом это 59гр)
0x37, //Coolant Temperature с этим байтом имеем 59гр тоесть 0x37 превратились в 6гр

0x0D, //Coolant Temperature (с нулевым вторым байтом байтом это 59гр)
0x37, //Coolant Temperature с этим байтом имеем 71гр тоесть 0x37 превратились в 2гр

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

Что разгадано

0x0A,0x00,  25,6 %   //Accelerator Position Sensor Signal // ((256*A)+B)/100 0k
0x11,0x89, 499 mg/strk  //Mass Air Flow Sensor // ((256*A)+B)/10 0k
0x04,0x30, 1,1 bar   //Boost Pressure  // ((256*A)+B)/1000 0k
0x03,0x20, 800 rpm  //Engine Speed  // (256*A)+B  ok
0x0B,0x55, 290 mg/strk  //EGR Command (Exhaust-Gas Recirculation Command)// ((256*A)+B)/10 0k
0x03,0xA3, 0,9 bar  //Barometer Sensor  //((256*A)+B)/1000 0k
0x04,0x2D, 1,1 bar  //Boost Pressure Command // ((256*A)+B)/1000 0k
0x03,0x20, 800 rpm  //Desired Engine Idle Speed // (256*A)+B  ok
0x0C,0x36   31 km/h  //Vehicle Speed  // (256*A)+B  ok
0x0C,0x36   31 km/h   //Vehicle Speed Command  // (256*A)+B  ok
0x03,0x0A, 7,8 mg/strk  //Desired Injection Quantity // ((256*A)+B)/100 0k
0x02,0xD9, 7,3 mg/strk  //Injection Quantity // ((256*A)+B)/100 0k
0x08,0xA3, 22,1 *CA //Start of Delivery  // ((256*A)+B)/100 0k
0x01,0x90, 400 rpm  //Pump Speed // (A*255)+B   ok
0x01,0x5C, 3 % //EGR Pulse Ratio (Exhaust Gas Recirculation) // ((256*A)+B)/100 0k
0x02,0x76, 6,3 % //Swirl Level Control Solenoid Valve Pulse Ratio // ((256*A)+B)/100 0k
0x12,0x03, 46,1 %  //Pulse Ratio Boost Pressure Solenoid Valve // ((256*A)+B)/100 0k

что не разгадано

0x01,0x7B, 4,4 *CA  //Desired Injection Start
0x01,0x92,  4,7 *CA  //Actual injection start    
0x0B,0xDB, 30 *C   //Intake Air Temperature
0x0C,0x37,  39 *C    //Coolant Temperature
0x0C,0xEB,  57 *C    //Engine Oil Temperature
0x0C,0x27, 38 *C //Fuel Temperature

все формулы одинаковые, единственное различие, это всею формулу (А*256)+В либо не делишь вообще либо на 10,100 или 1000. это чуток пугает или удивляет, не знаю. по идеи и к *CA и к *C должно было подойти , но увы не выходит. вот такие вот пироги. шифрую дальше, хотя нет, спать, мозги уже не варят.

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

может  температуру все таки стандартным пидом запрашивать? ))

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

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

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

может по поводу температуры охл. жидости такая формула?     A*26-278+B/5

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

все таки если ты понял как второй байт себя ведет, напиши все байты прибавляющие от 1 до 10

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

ок. секунду, щас

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

хотя второй байт всё таки больше 10 тоже может прибавлять . Вот ещё такая формула кое где подходит масла или входящего воздуха))  A*26-278+B/10

 

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

B/5 кстати вообще не катит

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

A*26-278+B/10 короче вот эта формула и округлять B/10 после 0,6 это 1

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

щас проверю

 

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

блин, вроде канает. :). осталась это

0x01,0x7B, 4,4 *CA  //Desired Injection Start

0x01,0x92,  4,7 *CA  //Actual injection start 

и кряк кwp закончин, Хе Хе Хе......

так правильно  ((A*26)-278)+B/10  или так ((A*26)-278)+(B/10) ?

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

единственное для если первый байт 0x0B или 0x0C то такая формула     A*26-278+B/10

 если 0х0А или меньше A*26-277+B/10

 если 0х0D или больше A*26-279+B/10

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

получается до 0A 277  после до 0D 278 и поле 279. на трех этапах 1 градус разница. я думаю можно оставить среднее 278

так правильно  ((A*26)-278)+B/10  или так ((A*26)-278)+(B/10) ?

и что думаешь по последнему гвоздю в гроб KWP ? с этой формулой

0x01,0x7B, 4,4 *CA  //Desired Injection Start

0x01,0x92,  4,7 *CA  //Actual injection start

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

да зачем сделаем все три так точнее

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

щас скетч для проверки сделаю

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

ок, как скажишь ты у нас шеф повор а я поворешка

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

вот накидал то что мне нужно

  
 int MAF = 0;           //26,27 байты
  int BoostPres = 0;     //28,29 байты
  int RPM = 0;           //32,33 байты
  int EGRmg = 0;         //34,35 байты
  int BoostPresCom = 0;  //38,39 байты
  int Speed = 0;        //44,45 байты
  int DesaInjQua = 0;   //50,51 байты
  int InjQua = 0;    //52,53 байты
  int StaDaliv = 0;  //54,55 байты
  int PumpRPM = 0;   //56,57 байты
  int EGRPul = 0;    //62,63 байты
  int SolenPul = 0;  //64,65 байты
  int SolenPre = 0;  //70,71 байты
  int DesInj = 0;    //72,73 байты 
  int ActInj = 0;    //16,17 байты
  int TempAir = 0;   //74,75 байты
  int Temp = 0;      //14,15 байты
  int TempOil = 0;   //18,19 байты
  int TempFuel = 0;   //58,59 байты

тока нужно глянуть или байты правильно подсчитал, вроде правильно, считал от "0"

 

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

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

Только в мониторе сериал порта установи  "Нет конца строки" справа внизу. 

Выбор байта для изменения значение осуществляется отправкой символа "a" или "b"


#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 




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

int bytenumber = 14; // номер изменяемого байта в сообщении 21 01  

bool Print = 0; // настройка вывода логов сообщений в сериал 1 - да, 0 - нет


bool Bytenumber = 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};
                       //  A8 F1 11 5A 81 04 90 6F 62 03 91 6B 03
                       //  92 6B 03 93 01 03 94 6A 03 95 02 03 96 66 03 97 69 
                       //  03 98 6A 03 99 44 03 9A 02 03 9F 6A FF AC 

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, 0x31, 0x30, 0x32, 0x36, 0x38, 0xFF};


int length81 = 81;
byte messagePIDS[81] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, //Coolant Temperature
0x00, //Coolant Temperature
0x01, //Actual injection start
0x92, //Actual injection start
0x0C, //Engine Oil Temperature
0xEB, //Engine Oil Temperature
0x00, //Accelerator Position Sensor Signal
0x00, //Accelerator Position Sensor Signal
0x02, //System Voltage
0xB3, //System Voltage
0x00, //High Pressure Diagnosis 1
0x00, //High Pressure Diagnosis 1
0x11, //Mass Air Flow Sensor
0x89, //Mass Air Flow Sensor
0x04, //Boost Pressure
0x30, //Boost Pressure
0x00, //High Pressure Diagnosis 2
0x00, //High Pressure Diagnosis 2
0x03, //Engine Speed
0x20, //Engine Speed
0x0B, //EGR Command (Exhaust-Gas Recirculation Command)
0x55, //EGR Command (Exhaust-Gas Recirculation Command)
0x03, //Barometer Sensor
0xA3, //Barometer Sensor
0x04, //Boost Pressure Command
0x2D, //Boost Pressure Command
0x03, //Desired Engine Idle Speed
0x20, //Desired Engine Idle Speed
0xEE, 
0xB9, 
0x00, //Vehicle Speed
0x00, //Vehicle Speed
0x00, //Vehicle Speed Command
0x00, //Vehicle Speed Command
0x0C, 
0x35, 
0x03, //Desired Injection Quantity
0x0A, //Desired Injection Quantity
0x02, //Injection Quantity
0xD9, //Injection Quantity
0x08, //Start of Delivery
0xA3, //Start of Delivery
0x01, //Pump Speed
0x90, //Pump Speed
0x0C, //Fuel Temperature
0x27, //Fuel Temperature
0xA0, 
0x00, 
0x01, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x5C, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x02, //Swirl Level Control Solenoid Valve Pulse Ratio
0x76, //Swirl Level Control Solenoid Valve Pulse Ratio
0xAD, 
0x08, 
0x01, 
0x30, 
0x00, //Pulse Ratio Boost Pressure Solenoid Valve
0x03, //Pulse Ratio Boost Pressure Solenoid Valve
0x01, //Desired Injection Start
0x7B, //Desired Injection Start
0x0B, //Intake Air Temperature
0xDB, //Intake Air Temperature
0x03, 
0xA3, 
0x00, 
0x02, 
0x1F};

int waitbyte=5;

long prev=0;
int temp=0;

void setup() {
 Serial.begin (115200);
mySerial.begin (10400);

//Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");
//Serial.println ("Please input byte in HEX...    "); Serial.println ("");
}

void loop() {
long cur = millis();

if (Serial.available()) {
      delay(30);
  byte inbyte=0;
     
          inbyte = Serial.read();
          
          
  if (inbyte == 0x61)  bytenumber = 14;
  if (inbyte == 0x62)  bytenumber = 15;
  if (inbyte == 0x2B) messagePIDS[bytenumber]++;
  if (inbyte == 0x2D) messagePIDS[bytenumber]--;
  if (bytenumber == 14) {if (messagePIDS[bytenumber]>0x0F) messagePIDS[bytenumber]==0;}
if (messagePIDS[14]<=0x0A) temp = ((messagePIDS[14]*26)-277)+messagePIDS[15]/10;
if (messagePIDS[14]==0x0B||messagePIDS[14]==0x0C) temp = ((messagePIDS[14]*26)-278)+messagePIDS[15]/10;
if (messagePIDS[14]>0x0C) temp = ((messagePIDS[14]*26)-279)+messagePIDS[15]/10;


Serial.flush();
  return;}
  
// if (cur-prev>1000) {Serial.print (messagePIDS[14]);  Serial.print("  ") ; Serial.print (messagePIDS[15]);
// Serial.print (messagePIDS[16]);  Serial.print("  ") ; Serial.print (messagePIDS[17]);
//Serial.print (messagePIDS[18]);  Serial.print("  ") ; Serial.println (messagePIDS[18]); prev=cur;}
     

  if (cur-prev>2000) { Serial.print ("A: 0x"); 
  if (messagePIDS[14]<0x10){ Serial.print("0"); } Serial.print (messagePIDS[14], HEX); Serial.print ("    "); 
    Serial.print ("B: 0x"); if (messagePIDS[15]<0x10){ Serial.print("0"); }  Serial.println (messagePIDS[15], HEX); 
Serial.println (""); Serial.print ("Coolant Temp:  "); Serial.println (temp); 
Serial.println ("");prev=cur;}
  
          

                        





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

    if (Print){  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)|| (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x81 && MessageRx[4]==0x04)) {
if (Print){  Serial.println ("Prinyat zapros init!  "); Serial.println (""); 
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i < length7; i++) {
    mySerial.write(messageCOMUN[i]);
if (Print) {   Serial.print(messageCOMUN[i],HEX); Serial.print ("  ");}
   } 
if (Print) Serial.println("");
 
   }
if (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x3E && MessageRx[4]==0xC1) {
if (Print) {  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]);
if (Print) {   Serial.print(messagePRES[i],HEX); Serial.print ("  ");}
   } 
    if (Print) Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) {
 if (Print) {  Serial.println ("Prinyat zapros identificacion 1!  "); Serial.println ("");  
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i < length44; i++) {
    mySerial.write(messageIDEN1[i]);
  if (Print) {   Serial.print(messageIDEN1[i],HEX); Serial.print ("  ");}
   } 
if (Print)    { Serial.println("");
   Serial.print ("Otvechayu DEC:    ");
    for (int i = 0; i < length44; i++) {
   
    Serial.print(messageIDEN1[i]); Serial.print ("  ");
   } 
    Serial.println("");}
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) {
 if (Print) { Serial.println ("Prinyat zapros identificacion 2!  "); Serial.println ("");  
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i < length100; i++) {
    mySerial.write(messageIDEN2[i]);
    if (Print) {Serial.print(messageIDEN2[i],HEX); Serial.print ("  ");}
   } 
    if (Print) {Serial.println("");
  Serial.print ("Otvechayu DEC:    ");
 for (int i = 0; i < length100; i++) {
    
    Serial.print(messageIDEN2[i]); Serial.print ("  ");
    
   } 
   Serial.println("");}
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) {
 if (Print) { Serial.println ("Prinyat zapros datos!  "); Serial.println (""); 
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i < length81; i++) {
    mySerial.write(messagePIDS[i]);
    if (i==31){  delay (113); if (Print) {Serial.println ("");}}
  if (Print) {  Serial.print(messagePIDS[i],HEX); Serial.print ("  ");}
   } 
    if (Print) Serial.println("");
 
   }
}
}

 

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

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

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

ок. щас попробую

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

а как изменять байт. сразу скажу что в опкоме -273 а сериале -277

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

послать а и ввести значение?

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

отправляешь с сериал порта "+" или "-".   как в сериале -277 ?    у меня в сериал сначала 0 температура пока байты не начнешь менять.

на температуру ниже -40 не стоит обращать внимания, там точность нас не интересует 

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

"a" послал, это значит выбран байт A для изменения отправкой + или -. Т.е. послал "b" далее посылаешь "+" например. байт B изменяется на +0x01. Не обязательно каждый раз "b" отправлять. Один раз выбрал b  и далее шлешь плюсы или минусы, потом опять можно "a" выбрать и т.д.  

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

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

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

первый байт меняет и совпадения идеальные. меняя воторой байт такое

до 8E...   serial 21  opcom 22

после  serial 22  opcom 22

от 98... serial 23  opcom 23

после 99...  serial 23  opcom 24

от 9A... serial 23  opcom 24

от A0... serial 24 opcom 24

от A3... serial 24 opcom 25

от AA... serial 25  opcom 25

гдето так. 

 

 

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

просто округление вообще не настроено - апример число 13,9 он воспринимает как 13. Надо учиться программировать, там через double делается или float. Все не сложно, надо почитать просто. А так то хорошая точность 

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

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

0x01,0x7B, 4,4 *CA  //Desired Injection Start

0x01,0x92,  4,7 *CA  //Actual injection start  если есть желание и возможность, конечно.

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

 у меня выходит что то в этом роде (((A*256)+B)+70)/100 щас проверю на других показаниях

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

измени мой скетч под байты этого параметра, и сделай статистику побольше, чтоб 0 был байт А потом 0 байт B, потом вместе изменяеются. С моим скетчем проще статистику собирать 

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

ок. потом буду щарапать скетч для этого

int MAF = 0;           //26,27 байты
 int BoostPres = 0;     //28,29 байты
 int RPM = 0;           //32,33 байты
 int EGRmg = 0;         //34,35 байты
 int BoostPresCom = 0;  //38,39 байты
 int Speed = 0;        //44,45 байты
 int DesaInjQua = 0;   //50,51 байты
 int InjQua = 0;    //52,53 байты
 int StaDaliv = 0;  //54,55 байты
 int PumpRPM = 0;   //56,57 байты
 int EGRPul = 0;    //62,63 байты
 int SolenPul = 0;  //64,65 байты
 int SolenPre = 0;  //70,71 байты
 int DesInj = 0;    //72,73 байты 
 int ActInj = 0;    //16,17 байты
 int TempAir = 0;   //74,75 байты
 int Temp = 0;      //14,15 байты
 int TempOil = 0;   //18,19 байты
 int TempFuel = 0;   //58,59 байты

 

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

вот скетч actual inj с твоей формулой 


  
#include <math.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 




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

int bytenumber = 16; // номер изменяемого байта в сообщении 21 01  

bool Print = 0; // настройка вывода логов сообщений в сериал 1 - да, 0 - нет


bool Bytenumber = 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};
                       //  A8 F1 11 5A 81 04 90 6F 62 03 91 6B 03
                       //  92 6B 03 93 01 03 94 6A 03 95 02 03 96 66 03 97 69 
                       //  03 98 6A 03 99 44 03 9A 02 03 9F 6A FF AC 

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, 0x31, 0x30, 0x32, 0x36, 0x38, 0xFF};


int length81 = 81;
byte messagePIDS[81] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, //Coolant Temperature
0x00, //Coolant Temperature
0x01, //Actual injection start
0x92, //Actual injection start
0x0C, //Engine Oil Temperature
0xEB, //Engine Oil Temperature
0x00, //Accelerator Position Sensor Signal
0x00, //Accelerator Position Sensor Signal
0x02, //System Voltage
0xB3, //System Voltage
0x00, //High Pressure Diagnosis 1
0x00, //High Pressure Diagnosis 1
0x11, //Mass Air Flow Sensor
0x89, //Mass Air Flow Sensor
0x04, //Boost Pressure
0x30, //Boost Pressure
0x00, //High Pressure Diagnosis 2
0x00, //High Pressure Diagnosis 2
0x03, //Engine Speed
0x20, //Engine Speed
0x0B, //EGR Command (Exhaust-Gas Recirculation Command)
0x55, //EGR Command (Exhaust-Gas Recirculation Command)
0x03, //Barometer Sensor
0xA3, //Barometer Sensor
0x04, //Boost Pressure Command
0x2D, //Boost Pressure Command
0x03, //Desired Engine Idle Speed
0x20, //Desired Engine Idle Speed
0xEE, 
0xB9, 
0x00, //Vehicle Speed
0x00, //Vehicle Speed
0x00, //Vehicle Speed Command
0x00, //Vehicle Speed Command
0x0C, 
0x35, 
0x03, //Desired Injection Quantity
0x0A, //Desired Injection Quantity
0x02, //Injection Quantity
0xD9, //Injection Quantity
0x08, //Start of Delivery
0xA3, //Start of Delivery
0x01, //Pump Speed
0x90, //Pump Speed
0x0C, //Fuel Temperature
0x27, //Fuel Temperature
0xA0, 
0x00, 
0x01, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x5C, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x02, //Swirl Level Control Solenoid Valve Pulse Ratio
0x76, //Swirl Level Control Solenoid Valve Pulse Ratio
0xAD, 
0x08, 
0x01, 
0x30, 
0x00, //Pulse Ratio Boost Pressure Solenoid Valve
0x03, //Pulse Ratio Boost Pressure Solenoid Valve
0x01, //Desired Injection Start
0x7B, //Desired Injection Start
0x0B, //Intake Air Temperature
0xDB, //Intake Air Temperature
0x03, 
0xA3, 
0x00, 
0x02, 
0x1F};

int waitbyte=5;

long prev=0;
float  temp=0.0;

//double B = 2.71;
//double x, y;    
//y = std::modf(B, &x); // целая часть запишется в x, дробная - в y

void setup() {
 Serial.begin (115200);
mySerial.begin (10400);

//Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");
//Serial.println ("Please input byte in HEX...    "); Serial.println ("");
}

void loop() {
long cur = millis();

if (Serial.available()) {
      delay(30);
  byte inbyte=0;
     
          inbyte = Serial.read();
          
          
  if (inbyte == 0x61)  bytenumber = 16;
  if (inbyte == 0x62)  bytenumber = 17;
  if (inbyte == 0x2B) messagePIDS[bytenumber]++;
  if (inbyte == 0x2D) messagePIDS[bytenumber]--;
//B =  messagePIDS[15];
//y = std::modf(B, &x); 

 
 
//if (messagePIDS[14]<=0x0A) temp = ((messagePIDS[14]*26)-277)+messagePIDS[15]/10;
//if (messagePIDS[14]==0x0B||messagePIDS[14]==0x0C) temp = ((messagePIDS[14]*26)-278)+messagePIDS[15]/10;
//if (messagePIDS[14]>0x0C) temp = ((messagePIDS[14]*26)-279)+messagePIDS[15]/10;


Serial.flush();
  return;}
  

     temp =  (((messagePIDS[16]*256)+messagePIDS[17])+70)/100.0;

  if (cur-prev>2000) {Serial.print ("A: 0x"); 
  if (messagePIDS[16]<0x10){ Serial.print("0"); } Serial.print (messagePIDS[16], HEX); Serial.print ("    "); 
    Serial.print ("B: 0x"); if (messagePIDS[17]<0x10){ Serial.print("0"); }  Serial.println (messagePIDS[17], HEX); 
Serial.println (""); Serial.print ("Actual Injection:  "); Serial.println (temp); 
Serial.println ("");prev=cur;}
  
          

                        





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

    if (Print){  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)|| (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x81 && MessageRx[4]==0x04)) {
if (Print){  Serial.println ("Prinyat zapros init!  "); Serial.println (""); 
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i < length7; i++) {
    mySerial.write(messageCOMUN[i]);
if (Print) {   Serial.print(messageCOMUN[i],HEX); Serial.print ("  ");}
   } 
if (Print) Serial.println("");
 
   }
if (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x3E && MessageRx[4]==0xC1) {
if (Print) {  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]);
if (Print) {   Serial.print(messagePRES[i],HEX); Serial.print ("  ");}
   } 
    if (Print) Serial.println("");
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x81 && MessageRx[5]==0x1F) {
 if (Print) {  Serial.println ("Prinyat zapros identificacion 1!  "); Serial.println ("");  
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i < length44; i++) {
    mySerial.write(messageIDEN1[i]);
  if (Print) {   Serial.print(messageIDEN1[i],HEX); Serial.print ("  ");}
   } 
if (Print)    { Serial.println("");
   Serial.print ("Otvechayu DEC:    ");
    for (int i = 0; i < length44; i++) {
   
    Serial.print(messageIDEN1[i]); Serial.print ("  ");
   } 
    Serial.println("");}
 
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x1A && MessageRx[4]==0x80 && MessageRx[5]==0x1E) {
 if (Print) { Serial.println ("Prinyat zapros identificacion 2!  "); Serial.println ("");  
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i < length100; i++) {
    mySerial.write(messageIDEN2[i]);
    if (Print) {Serial.print(messageIDEN2[i],HEX); Serial.print ("  ");}
   } 
    if (Print) {Serial.println("");
  Serial.print ("Otvechayu DEC:    ");
 for (int i = 0; i < length100; i++) {
    
    Serial.print(messageIDEN2[i]); Serial.print ("  ");
    
   } 
   Serial.println("");}
   }
   if (MessageRx[0]==0x82 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x21 && MessageRx[4]==0x01 && MessageRx[5]==0xA6) {
 if (Print) { Serial.println ("Prinyat zapros datos!  "); Serial.println (""); 
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i < length81; i++) {
    mySerial.write(messagePIDS[i]);
    if (i==31){  delay (113); if (Print) {Serial.println ("");}}
  if (Print) {  Serial.print(messagePIDS[i],HEX); Serial.print ("  ");}
   } 
    if (Print) Serial.println("");
 
   }
}
}

 

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

формула для actinj неправильная   A: 0x04    B: 0x92             Actual Injection:  12.40         а должно быть  13,7

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

да , подбераю по скетчу, блин очень удобно

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

подобрал вроде формулу. есть проблема

0x01(DEC=1), 0x95(DEC=149) отображение 4,7 *CA

формула такая ((A*3)+B/100)+0.3 получаем  ((1*3)+149/100)+0.2  итог  3+1.49+0.2 = 4.69

проблема такая что в мониторе показывает 4.2 тоесть 0.49 гдето теряется. если делать без +0.2 

(A*3)+B/100 получает (1*3)+149/100 итог  3+1.49 = 4.49 но отображает в сериале 4.00 , где засада?

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

Там где 149/100 попробуй 149/100.00

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

да сработало. формула работает. берусь за скетч

(A*3)+(B/100.00)+0.30;

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

MaksVV накидал сетч, что то не так, глянь пожалуйста.

   #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 MAF = 0;           //26,27 байты
  int BoostPres = 0;     //28,29 байты
  int RPM = 0;           //32,33 байты
  int EGRmg = 0;         //34,35 байты
  int BoostPresCom = 0;  //38,39 байты
  int Speed = 0;        //44,45 байты
  int DesaInjQua = 0;   //50,51 байты
  int InjQua = 0;    //52,53 байты
  int StaDaliv = 0;  //54,55 байты
  int PumpRPM = 0;   //56,57 байты
  int EGRPul = 0;    //62,63 байты
  int SolenPul = 0;  //64,65 байты
  int SolenPre = 0;  //70,71 байты
  int DesInj = 0;    //72,73 байты 
  int ActInj = 0;    //16,17 байты
  int TempAir = 0;   //74,75 байты
  int Temp = 0;      //14,15 байты
  int TempOil = 0;   //18,19 байты
  int TempFuel = 0;   //58,59 байты


  // массив байтов принимаемого сообщения
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  //массивы сообщений (пидов)
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос температуры 1
  
  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, 7, 6, 17, 35, 0));
    Watch_Temperature ();
    
    pinMode(TX, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void loop() {
    MAF =  ((messagePids[26]*256)+messagePids[27])/10;
    BoostPres =  ((messagePids[28]*256)+messagePids[29])/1000;
    RPM =  (messagePids[32]*256)+messagePids[33];
    EGRmg =  ((messagePids[34]*256)+messagePids[35])/10;
    BoostPresCom =  ((messagePids[38]*256)+messagePids[39])/1000;
    Speed =  (messagePids[44]*256)+messagePids[45];
    DesaInjQua =  ((messagePids[50]*256)+messagePids[51])/100;
    InjQua =  ((messagePids[52]*256)+messagePids[53])/100;
    StaDaliv =  ((messagePids[54]*256)+messagePids[55])/100;
    PumpRPM =  (messagePids[56]*256)+messagePids[57];
    EGRPul =  ((messagePids[62]*256)+messagePids[63])/100;
    SolenPul =  ((messagePids[64]*256)+messagePids[65])/100;
    SolenPre =  ((messagePids[70]*256)+messagePids[71])/100;
    DesInj =  ((messagePids[72]*3)+(messagePids[73])/100.00)+0.3;
    ActInj =  ((messagePids[16]*3)+(messagePids[17])/100.00)+0.3;
    TempAir =  ((messagePids[74]*26)-278)+messagePids[75]/10;
    Temp =  ((messagePids[14]*26)-278)+messagePids[15]/10;
    TempOil =  ((messagePids[18]*26)-278)+messagePids[19]/10;
    TempFuel =  ((messagePids[58]*26)-278)+messagePids[59]/10;

    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(--, 165, 40);
      
      //if (--<10) {myGLCD.print("  ", 166, 75); }; //затираем вторую цифру и третью
      //if (-->10) {myGLCD.print(" ", 182, 75); }; //затирает третюю цифру
      //myGLCD.printNumI(--, 165, 75);
      
      //if (--<10) {myGLCD.print("  ", 166, 110); }; //затираем вторую цифру и третью
      //if (-->10) {myGLCD.print(" ", 182, 110); }; //затирает третюю цифру
      //myGLCD.printNumI(--, 165, 110);

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

      
      //if (MAF<10) {myGLCD.print("  ", 166, 180); }; //затираем вторую цифру и третью
      if (PumpRPM>10) {myGLCD.print(" ", 198, 180); }; //затираем четвертую цифру
      myGLCD.printNumI(PumpRPM, 165, 180);
        
      if (RPM>100) {myGLCD.print(" ", 198, 215);};   //затираем четвертую цифру
      myGLCD.printNumI(RPM, 165, 215);
      
      //-------------------------------------------
      if (Temp<10) {myGLCD.print("  ", 411, 40); }; //затираем вторую цифру и третью
      if (Temp>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
      myGLCD.printNumI(Temp, 410, 40);
      
      if (TempOil<10) {myGLCD.print("  ", 411, 75); }; //затираем вторую цифру и третью
      if (TempOil>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру  
      myGLCD.printNumI(TempOil, 410, 75);
      
      if (TempFuel<10) {myGLCD.print("  ", 411, 110); }; //затираем вторую цифру и третью
      if (TempFuel>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру  
      myGLCD.printNumI(TempFuel, 410, 110);
  
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
      
      myGLCD.printNumI(t, 410, 180);
      
      if (TempAir<10) {myGLCD.print("  ", 411, 215); }; //затираем вторую цифру и третью
      if (TempAir>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру  
      myGLCD.printNumI(TempAir, 410, 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);
        
      if (StaDaliv<10) {myGLCD.print("  ", 411, 40); }; //затираем вторую цифру и третью
      if (StaDaliv>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
      myGLCD.printNumI(StaDaliv, 395, 40);
      
      if (DesInj<10) {myGLCD.print("  ", 411, 75); }; //затираем вторую цифру и третью
      if (DesInj>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру  
      myGLCD.printNumI(DesInj, 395, 75);
      
      if (ActInj<10) {myGLCD.print("  ", 411, 110); }; //затираем вторую цифру и третью
      if (ActInj>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру  
      myGLCD.printNumI(ActInj, 395, 110);
      
      if (DesaInjQua<10) {myGLCD.print("  ", 411, 145); }; //затираем вторую цифру и третью
      if (DesaInjQua>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру  
      myGLCD.printNumI(DesaInjQua, 395, 145);
      
      if (InjQua<10) {myGLCD.print("  ", 411, 180); }; //затираем вторую цифру и третью
      if (InjQua>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру  
      myGLCD.printNumI(InjQua, 395, 180);
      
      if (TempAir<10) {myGLCD.print("  ", 411, 215); }; //затираем вторую цифру и третью
      if (TempAir>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру  
      myGLCD.printNumI(TempAir, 395, 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);
        
        if (BoostPres<10) {myGLCD.print("  ", 411, 40); }; //затираем вторую цифру и третью
      if (BoostPres>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
      myGLCD.printNumI(BoostPres, 395, 40);
      
      if (BoostPresCom<10) {myGLCD.print("  ", 411, 75); }; //затираем вторую цифру и третью
      if (BoostPresCom>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру  
      myGLCD.printNumI(BoostPresCom, 395, 75);
      
      if (EGRmg<10) {myGLCD.print("  ", 411, 110); }; //затираем вторую цифру и третью
      if (EGRmg>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру  
      myGLCD.printNumI(EGRmg, 395, 110);
      
      if (EGRPul<10) {myGLCD.print("  ", 411, 145); }; //затираем вторую цифру и третью
      if (EGRPul>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру  
      myGLCD.printNumI(DesaInjQua, 395, 145);
      
      if (SolenPul<10) {myGLCD.print("  ", 411, 180); }; //затираем вторую цифру и третью
      if (SolenPul>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру  
      myGLCD.printNumI(SolenPul, 395, 180);
      
      if (SolenPre<10) {myGLCD.print("  ", 411, 215); }; //затираем вторую цифру и третью
      if (SolenPre>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру  
      myGLCD.printNumI(SolenPre, 395, 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(messagePids[i]);
    delay (waitbyte); } 
   }
}
  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 < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
     
     for (int i = 0; i < 110; i++) {
     }

   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F) {Init=1;
   timerenabledInit=0;  
   }
   
   for (int i = 0; i < 110; 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("Fuel  L :", 10, 110);
     myGLCD.print("Humed  %:", 10, 145);
     myGLCD.print("PUMP RPM:", 10, 180);
     myGLCD.print("Engi RPM:", 10, 215);
     myGLCD.print("Motor *C:", 255, 40);
     myGLCD.print("Oil   *C:", 255, 75);
     myGLCD.print("Fuel  *C:", 255, 110);
     myGLCD.print("Inter *C:", 255, 145);
     myGLCD.print("Exter *C:", 255, 180);
     myGLCD.print("IntAir*C:", 255, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     vista();
     myGLCD.print("Start of Delivery  *CA:", 10, 40);
     myGLCD.print("Desir inject Start *CA:", 10, 75);
     myGLCD.print("Actua Inject Start *CA:", 10, 110);
     myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
     myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
     myGLCD.print("Mass Air Flow     mg/s:", 10, 215);
 
  
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     vista();
     myGLCD.print("Boost Press       Bar:", 10, 40);
     myGLCD.print("Boost Press Com   Bar:", 10, 75);
     myGLCD.print("EGR command      mg/s:", 10, 110);
     myGLCD.print("EGR Pulse Ratio     %:", 10, 145);
     myGLCD.print("Solenoide Pulse     %:", 10, 180);
     myGLCD.print("Solenoide Boost     %:", 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(0, 255, 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
Offline
Зарегистрирован: 06.08.2015

у меня не компилится, из за конфликта библиотек походу

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

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

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

вот что у меня на экране

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

дак конечно, где у тебя проверка на принятое  сообщение 2101? щас поправлю

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

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