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

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

Так и должно, я закоментил связь с 7. Попытаюсь все же добиться совместной работы

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

вот скетч, блин, должно заработать 

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
              
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;           //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int kmAge = 0;         //суточный пробег
  
  
  int colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {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};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
    myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {

  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}
  else    {if (millis() - prevPIDgauge> 1000) {PIDsGauge(); prevPIDgauge = millis();}}
    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();
    
   }
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
                   
      myGLCD.printNumF(LHor, 1, 165, 40, '.',5);
      myGLCD.printNumF(L100, 1, 165, 75,'.',5 );
      myGLCD.printNumI(h, 165, 145, 5 );
      myGLCD.printNumI(PumpRPM, 165, 180,5);
      myGLCD.printNumI(RPM, 165, 215,5);
               
      myGLCD.printNumI(Temp, 410, 40, 3);
      myGLCD.printNumI(TempOil, 410, 75, 3);
      myGLCD.printNumI(TempFuel, 410, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3);
      myGLCD.printNumI(t, 410, 180, 3);
      myGLCD.printNumI(TempAir, 410, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(Barom, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


if (mySerial_gauge.available()&& InitGauge) {
  delay(100);
     int k=0;
     byte inbyte=0;
     
     while( mySerial_gauge.available() && k < 60) {
     inbyte = mySerial_gauge.read();
     MessageRxGauge[k] = inbyte;
     k++;   }
    
     Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} 
    Serial.println ("");
    
     //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег
    if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) {

  Fuel = MessageRxGauge[20]/2;
  kmAge = (MessageRxGauge[26]+(MessageRxGauge[27]*256))/10;
    }
    for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }
      
   
 /* 
if (mySerial_gauge.available()&& !InitGauge) {
   
     
     delay(50);
     int k=0;
     byte inbyte=0;
     
     while( mySerial_gauge.available() && k < 60) {
     inbyte = mySerial_gauge.read();
     MessageRxGauge[k] = inbyte;
     k++;   }
    
     Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} 
    Serial.println ("");

    if (MessageRxGauge[0]==0x55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1;
    mySerial_gauge.write (0x7F);
   
   Serial.println ("                       InitGauge  OK!!!!:  ");
   }
    for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива
   }

*/



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(190);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    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 Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(250,35,250,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() ;
     Watch ();
     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("MAF  mg/s:", 10, 215);
     myGLCD.print("Barom kPa:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     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() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  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, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  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 Watch (){
    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); //зеленый цвет цифры
  
    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);
    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); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

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

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

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   2 11 0 13 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B0 0 FF 9A C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 5 
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   FF 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 AF 0 FF 99 D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 5 FE 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 AF 0 FF 9A C C 1A 
Otpravil zapros Init
                         ReceiveGauge:   47 0 0 0 B1 0 FF 99 C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 5 FF 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 99 D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   1 6 1 0 85 AF 3 1B 48 C7 1 6 0 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 AF 0 FF 9A D C 1B 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 0 23 A1 4 0 0 0 0 0 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D2 0 0 B C9 0 0 2 45 0 0 0 0 4 36 0 0 0 0 32 C8 3 9B 4 29 3 55 E5 62 0 0 0 0 B D7 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A5 8 1 21 0 0 1 B7 B D0 3 9D 0 2 FD 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 0 4 0 B0 0 FF 9A C C 1B 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 0 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 99 C C 1B 47 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 45 0 0 0 0 4 3A 0 0 0 0 32 C8 3 9D 4 29 3 55 E5 62 0 0 0 0 B D7 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A1 8 1 21 0 0 1 B7 B CF 3 9B 0 2 FB 
Otpravil zapros 21 01
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   0 F 0 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 99 C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 0 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B1 0 FF 9B C 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D2 0 0 B C9 0 0 2 45 0 0 0 0 4 3A 0 0 0 0 32 C8 3 9B 4 29 3 55 E5 62 0 0 0 0 B D7 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A5 8 1 21 0 0 1 B7 B D0 3 9B 0 2 FF 
Otpravil zapros 21 01
                         ReceiveGauge:   C 1B 47 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 45 0 0 0 0 4 3A 0 0 0 0 32 C8 3 9B 4 29 3 56 E5 62 0 0 0 0 B D7 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A5 8 1 21 0 0 1 B7 B CF 3 9B 0 2 FE 
Otpravil zapros 21 01
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   2 11 0 13 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C7 0 0 2 57 0 0 0 0 4 3A 0 0 0 0 32 C8 3 9D 4 29 3 55 E5 62 0 0 0 0 B DF 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D0 3 9B 0 2 1B 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 59 0 0 0 0 4 37 0 0 0 0 32 C8 3 9D 4 29 3 55 E5 62 0 0 0 0 B DD 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D0 3 9B 0 2 1A 
Otpravil zapros 21 01
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   2 11 0 13 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B CF 0 0 B C9 0 0 2 5B 0 0 0 0 4 37 0 0 0 0 32 C8 3 9B 4 29 3 56 E5 62 0 0 0 0 B DF 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 AD 8 1 20 0 0 1 B7 B D0 3 9B 0 2 1F 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 5B 0 0 0 0 4 37 0 0 0 0 32 C8 3 9D 4 29 3 55 E5 62 0 0 0 0 B DD 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D1 3 9B 0 2 1D 
Otpravil zapros 21 01
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   2 11 0 13 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C7 0 0 2 5C 0 0 0 0 4 3A 0 0 0 0 32 C8 3 9B 4 29 3 55 E5 62 0 0 0 0 B DF 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D1 3 9D 0 2 21 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B CA 0 0 2 5C 0 0 0 0 4 37 0 0 0 0 32 C8 3 9B 4 29 3 55 E5 62 0 0 0 0 B DF 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D0 3 9B 0 2 1E 
Otpravil zapros 21 01
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   2 11 0 13 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 5D 0 0 0 0 4 39 0 0 0 0 32 C8 3 9B 4 29 3 55 E5 62 0 0 0 0 B DF 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 AD 8 1 20 0 0 1 B7 B D1 3 9D 0 2 27 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 5D 0 0 0 0 4 34 0 0 0 0 32 C8 3 9B 4 29 3 55 E5 62 0 0 0 0 B DD 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D0 3 9B 0 2 19 
Otpravil zapros 21 01
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   2 11 0 13 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 5E 0 0 0 0 4 37 0 0 0 0 32 C8 3 9B 4 29 3 55 E5 62 0 0 0 0 B DF 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D1 3 9D 0 2 22 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 5E 0 0 0 0 4 37 0 0 0 0 32 C8 3 9D 4 29 3 55 E5 62 0 0 0 0 B DD 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D1 3 9B 0 2 20 
Otpravil zapros 21 01
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   2 11 0 13 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 5E 0 0 0 0 4 36 0 0 0 0 32 C8 3 9D 4 29 3 55 E5 62 0 0 0 0 B DF 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D1 3 9B 0 2 21 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D2 0 0 B C7 0 0 2 5E 0 0 0 0 4 37 0 0 0 0 32 C8 3 9B 4 29 3 55 E5 62 0 0 0 0 B DD 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D1 3 9B 0 2 1D 
Otpravil zapros 21 01
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   2 11 0 13 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 5E 0 0 0 0 4 36 0 0 0 0 32 C8 3 9B 4 29 3 55 E5 62 0 0 0 0 B DF 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 B D1 3 9B 0 2 1F 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 B D1 0 0 B C9 0 0 2 5F 0 0 0 0 4 37 0 0 0 0 32 C8 3 9B 4 29 3 55 E5 62 0 0 0 0 B DF 0 0 0 0 9 2F 0 0 B DD A0 0 1 90 0 0 AD 8 1 20 0 0 1 B7 B D1 3 9D 0 2 27 

 

С задержкой завтра поиграюсь. Это круто

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

Это не может не радовать. Идем дальше. Попробуй закоментировать строчку 186. Она раз в секунду запросы шлет, похоже они мешают. Задержка должна быть норм, ее пока не трогай

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

вот вариант убрал запросы  на панель раз в секунду. И переделал задержку. Если будет неправильно резать сообщения, меняй задержку в строке  310   от 1 до 5, ну и в строке 302 можно 10мс попробовать поставить

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
              
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;           //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int kmAge = 0;         //суточный пробег
  
  
  int colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {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};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
   myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {

  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}
//  else    {if (millis() - prevPIDgauge> 1000) {PIDsGauge(); prevPIDgauge = millis();}}
    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();
    
   }
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
                   
      myGLCD.printNumF(LHor, 1, 165, 40, '.',5);
      myGLCD.printNumF(L100, 1, 165, 75,'.',5 );
      myGLCD.printNumI(h, 165, 145, 5 );
      myGLCD.printNumI(PumpRPM, 165, 180,5);
      myGLCD.printNumI(RPM, 165, 215,5);
               
      myGLCD.printNumI(Temp, 410, 40, 3);
      myGLCD.printNumI(TempOil, 410, 75, 3);
      myGLCD.printNumI(TempFuel, 410, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3);
      myGLCD.printNumI(t, 410, 180, 3);
      myGLCD.printNumI(TempAir, 410, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(Barom, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


if (mySerial_gauge.available()&& InitGauge) {
  delay(5);
     int k=0;
     byte inbyte=0;
     
     while( mySerial_gauge.available() && k < 60) {
     inbyte = mySerial_gauge.read();
     MessageRxGauge[k] = inbyte;
     k++; 
     delay(1);  }
    
     Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} 
    Serial.println ("");
    
     //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег
    if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) {

  Fuel = MessageRxGauge[20]/2;
  kmAge = (MessageRxGauge[26]+(MessageRxGauge[27]*256))/10;
    }
    for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }
      
   
 /* 
if (mySerial_gauge.available()&& !InitGauge) {
   
     
     delay(50);
     int k=0;
     byte inbyte=0;
     
     while( mySerial_gauge.available() && k < 60) {
     inbyte = mySerial_gauge.read();
     MessageRxGauge[k] = inbyte;
     k++;   }
    
     Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} 
    Serial.println ("");

    if (MessageRxGauge[0]==0x55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1;
    mySerial_gauge.write (0x7F);
   
   Serial.println ("                       InitGauge  OK!!!!:  ");
   }
    for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива
   }

*/



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(190);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    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 Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(250,35,250,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() ;
     Watch ();
     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("MAF  mg/s:", 10, 215);
     myGLCD.print("Barom kPa:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     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() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  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, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  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 Watch (){
    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); //зеленый цвет цифры
  
    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);
    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); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

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

похоже задержки здесь нам не друзья, вот результаты для анализа. первые мс это 302 а вторые мс это 310

302 строка мс     310 мс
1mc               1mc
Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   2 11 0 13 
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                         ReceiveGauge:   23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF AC 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 30 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 0 19 47 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 4 1 BC 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF AC 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
                         ReceiveGauge:   47 C6 1 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF A8 0 0 19 47 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 5B 0 0 C D8 0 0 2 65 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B DC 0 0 0 0 8 CD 0 0 D 1C A0 0 1 90 0 0 A9 8 0 20 0 0 1 8D C C7 3 A0 0 2 46 
Otpravil zapros 21 01
                         ReceiveGauge:   0 3C 2 0 4 1 B8 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 5B 0 0 C D8 0 0 2 65 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 CD 0 0 D 1C A0 0 1 90 0 0 A9 8 0 20 0 0 1 8D C C7 3 A0 0 2 C4 
Otpravil zapros 21 01
                         ReceiveGauge:   47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 5A 0 0 C D8 0 0 2 65 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B DD 0 0 0 0 8 CD 0 0 D 1C A0 0 1 90 0 0 A9 8 0 20 0 0 1 8D C C7 3 A0 0 2 46 
Otpravil zapros 21 01
                         ReceiveGauge:   AC 0 0 0 4 1 BC 0 FF A8 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 5B 0 0 C D7 0 0 2 65 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B DD 0 0 0 0 8 CD 0 0 D 1C A0 0 1 90 0 0 AD 8 0 20 0 0 1 8D C C7 3 A0 0 2 4A 
Otpravil zapros 21 01
                         ReceiveGauge:   47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BB 0 FF 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 5A 0 0 C D8 0 0 2 65 0 0 0 0 4 41 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B DC 0 0 0 0 8 CD 0 0 D 1C A0 0 1 90 0 0 AD 8 0 20 0 0 1 8D C C7 3 A0 0 2 4C 


5mc          1mc
Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   2 11 0 13 
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                         ReceiveGauge:   23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF A8 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 0 19 47 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 B8 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2C 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
                         ReceiveGauge:   7 2D 23 0 0 4 1 B8 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 55 0 0 C D1 0 0 2 64 0 0 0 0 4 41 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B DC 0 0 0 0 8 CF 0 0 D 1A A0 0 1 90 0 0 A9 8 0 20 0 0 1 8E C C9 3 A0 0 2 3E 
Otpravil zapros 21 01
                         ReceiveGauge:   E4 47 C6 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF A8 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 55 0 0 C D2 0 0 2 64 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B DD 0 0 0 0 8 CF 0 0 D 1A A0 0 1 90 0 0 A9 8 0 20 0 0 1 8E C C9 3 A0 0 2 3B 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF A8 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2C 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 56 0 0 C D0 0 0 2 65 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B DC 0 0 0 0 8 CE 0 0 D 1A A0 0 1 90 0 0 A9 8 0 20 0 0 1 8E C C9 3 A0 0 2 39 
Otpravil zapros 21 01
                         ReceiveGauge:   0 19 47 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 55 0 0 C D1 0 0 2 64 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B DD 0 0 0 0 8 CF 0 0 D 1A A0 0 1 90 0 0 A9 8 0 20 0 0 1 8E C C9 3 A0 0 2 3C 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 4 1 BC 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 


10mc          1mc 
Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   2 11 0 13 
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                         ReceiveGauge:   23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF AA 0 0 19 47 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2C 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BB 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2F 23 A1 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 4F 0 0 C CE 0 0 2 65 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 9A 0 0 0 0 8 D1 0 0 D 15 A0 0 1 90 0 0 A9 8 0 20 0 0 1 8F C C7 3 A0 0 2 ED 
Otpravil zapros 21 01
                         ReceiveGauge:   4 0 0 3 E4 47 C6 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BB 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 4F 0 0 C CE 0 0 2 64 0 0 0 0 4 41 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 8 D1 0 0 D 15 A0 0 1 90 0 0 AD 8 0 20 0 0 1 8E C C7 3 A0 0 2 B0 
Otpravil zapros 21 01
                         ReceiveGauge:   4 1 BB 0 0 4 1 BB 0 FF A8 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 4F 0 0 C CE 0 0 2 64 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 8 D1 0 0 D 15 A0 0 1 90 0 0 A9 8 0 20 0 0 1 8F C C9 3 A0 0 2 AF 
Otpravil zapros 21 01
                         ReceiveGauge:   E4 47 C6 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2C 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BB 0 FF AB 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 4F 0 0 C CE 0 0 2 64 0 0 0 0 4 3F 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 8 D1 0 0 D 15 A0 0 1 90 0 0 A9 8 0 20 0 0 1 8F C C9 3 A0 0 2 AD 
Otpravil zapros 21 01
                         ReceiveGauge:   0 19 47 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2B 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 4F 0 0 C CE 0 0 2 65 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 D1 0 0 D 15 A0 0 1 90 0 0 A9 8 0 20 0 0 1 8E C C9 3 A0 0 2 AC 
Otpravil zapros 21 01


1mc           5mc
Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   2 11 0 13 
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                         ReceiveGauge:   23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BB 0 FF A9 0 0 19 47 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 47 0 2 3 47 7 23 A1 4 0 0 0 0 0 0 0 4 BA AA 0 0 0 BC 3 C6 7 23 A1 4 0 0 0 0 0 0 0 4 BB AA 0 0 0 BC 3 C6 7 23 A1 4 0 0 0 0 0 0 0 
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
                         ReceiveGauge:   1 0 0 23 A1 4 0 0 0 0 0 0 0 4 BA AB 0 0 0 BC 3 C6 7 23 A1 4 0 0 0 0 0 0 0 4 0 AA 19 0 3C BC E4 C6 2E 23 A1 4 0 0 0 0 0 0 0 1 0 0 19 0 3C AF 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 4A 0 0 C C5 0 0 2 63 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 56 0 0 0 0 8 D2 0 0 D 12 A0 0 1 90 0 0 AD 8 0 20 0 0 1 8F C C7 3 A0 0 2 9B 
Otpravil zapros 21 01
                         ReceiveGauge:   E4 1 2F BA A9 0 0 0 BC 3 C6 2D 23 A1 4 0 0 0 0 0 0 1 FF 0 0 3C BC E4 1 23 A1 4 0 0 0 0 0 0 0 BA FF 0 47 0 2 3 C6 7 23 A1 4 0 0 0 0 0 0 0 4 BA 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 49 0 0 C C4 0 0 2 64 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 8 D3 0 0 D 12 A0 0 1 90 0 0 AD 8 0 20 0 0 1 8F C C9 3 A0 0 2 9F 
Otpravil zapros 21 01
                         ReceiveGauge:   AA 0 0 0 0 B9 FF 0 47 0 BC 3 C6 2B 23 A1 4 0 0 0 0 0 0 1 FF 0 0 3C BC 47 1 23 A1 4 0 0 0 0 0 0 0 4 0 0 19 0 3C AF E4 1 2C 23 A1 4 0 0 0 0 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 4A 0 0 C C4 0 0 2 63 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 D2 0 0 D 12 A0 0 1 90 0 0 A9 8 0 20 0 0 1 8F C C7 3 A0 0 2 9A 
Otpravil zapros 21 01
                         ReceiveGauge:   0 BA FF 4 0 A9 19 0 3C BC E4 C6 23 A1 4 0 0 0 0 0 0 0 1 FF 0 0 3C AF 47 7 23 A1 4 0 0 0 0 0 0 0 BA FF 0 47 0 BC 3 C6 7 23 A1 4 0 0 0 0 0 0 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 4A 0 0 C C4 0 0 2 64 0 0 0 0 4 3A 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 D2 0 0 D 12 A0 0 1 90 0 0 A9 8 0 20 0 0 1 8F C C7 3 A0 0 2 97 
Otpravil zapros 21 01
                         ReceiveGauge:   BA FF 0 0 0 0 BA FF 0 47 0 2 E4 C6 23 A1 4 0 0 0 0 0 0 4 B9 0 19 0 2 3 C6 2D 23 A1 4 0 0 0 0 0 0 4 BA AB 0 0 0 BC 3 C6 7 23 A1 4 0 0 0 0 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 4A 0 0 C C5 0 0 2 63 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 8 D2 0 0 D 12 A0 0 1 90 0 0 A9 8 0 20 0 0 1 8F C C7 3 A0 0 2 99 
Otpravil zapros 21 01
                         ReceiveGauge:   0 4 B9 4 0 0 0 0 BB A9 0 0 3C BC 47 7 23 A1 4 0 0 0 0 0 0 4 BA 0 47 0 2 E4 1 23 A1 4 0 0 0 0 0 0 0 1 0 0 19 0 3C AF E4 1 2C 23 A1 4 0 0 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 47 0 0 C C5 0 0 2 64 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 8 D3 0 0 D 12 A0 0 1 90 0 0 A9 8 0 20 0 0 1 8F C C7 3 A0 0 2 98 


1mc         10mc
Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   2 11 0 13 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BB 0 FF A9 
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                         ReceiveGauge:   0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 FF 47 2 47 23 A1 4 0 0 4 A9 0 BC C6 23 A1 4 0 0 4 A8 0 BC C6 23 A1 4 0 0 1 0 
Otpravil zapros Init
                         ReceiveGauge:   0 AF 1 FF 47 2 47 23 A1 4 0 0 0 FF 47 2 47 23 A1 4 0 0 4 AA 0 BC C6 23 A1 4 0 0 4 A9 0 BC C6 23 A1 4 0 0 1 0 0 AF 1 23 A1 4 0 0 1 0 0 AF 1 23 A1 4 
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 1 7 23 A1 4 0 0 0 19 3C E4 2E 23 A1 4 0 0 FF 47 2 47 23 A1 4 0 0 0 FF 47 2 47 23 A1 4 0 0 4 AA 0 BC C6 23 A1 4 0 0 4 A8 0 BC C6 23 A1 4 0 0 4 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 45 0 0 C C2 0 0 2 64 0 0 0 0 4 40 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 D4 0 0 D 10 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 C C7 3 A0 0 2 97 
Otpravil zapros 21 01
                         ReceiveGauge:   0 AF 1 0 19 3C E4 2D 23 A1 4 0 0 0 19 3C E4 23 A1 4 0 0 0 FF 47 2 47 23 A1 4 0 0 4 A9 0 BC C6 23 A1 4 0 0 4 AB 0 BC C6 23 A1 4 0 0 1 0 0 AF 1 23 A1 4 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 45 0 0 C C2 0 0 2 63 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 8 D4 0 0 D 10 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 C C7 3 A0 0 2 92 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 1 0 FF 47 BC C6 23 A1 4 0 0 4 AA 0 BC 1 23 A1 4 0 0 1 0 0 AF 1 23 A1 4 0 0 B8 0 0 3 7 23 A1 4 0 0 B8 0 0 3 7 23 A1 4 0 0 0 19 3C E4 2D 23 A1 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 46 0 0 C C2 0 0 2 63 0 0 0 0 4 42 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 56 0 0 0 0 8 D3 0 0 D 10 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 C C7 3 A0 0 2 94 
Otpravil zapros 21 01
                         ReceiveGauge:   4 0 0 A1 0 0 0 19 3C E4 2E 23 A1 4 0 0 0 47 2 47 23 A1 4 0 0 0 FF 47 BC C6 23 A1 4 0 0 4 AA 0 BC C6 23 A1 4 0 0 4 A8 0 BC C6 23 A1 4 0 0 1 0 0 AF 1 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 45 0 0 C C2 0 0 2 63 0 0 0 0 4 3F 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 D4 0 0 D D A0 0 1 90 0 0 A9 8 0 20 0 0 1 8F C C7 3 A0 0 2 91 
Otpravil zapros 21 01
                         ReceiveGauge:   23 A1 4 23 A1 4 0 0 1 0 0 AF 1 23 A1 4 0 0 B8 0 0 3 7 23 A1 4 0 0 0 19 3C E4 2E 23 A1 4 0 0 0 19 3C E4 2D 23 A1 4 0 0 0 47 2 47 23 A1 4 0 0 0 0 19 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 45 0 0 C C2 0 0 2 64 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 8 D4 0 0 D 10 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 C C9 3 A0 0 2 9A 
Otpravil zapros 21 01

5mc         5mc
Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   2 11 0 13 
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                         ReceiveGauge:   23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BB 0 FF A8 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF A8 0 0 19 47 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 3C AF E4 1 2D 23 A1 4 0 0 0 0 0 0 0 1 0 0 19 0 3C AF E4 1 2D 23 A1 4 0 0 0 0 0 0 0 B8 FF 0 47 0 2 3 47 7 23 A1 4 0 0 0 0 0 0 0 4 BA 
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
                         ReceiveGauge:   AC 0 0 23 A1 4 0 0 0 0 0 4 B7 AC 0 0 0 BC E4 C6 2D 23 A1 4 0 0 0 0 0 0 0 1 0 0 19 0 3C AF 47 1 23 A1 4 0 0 0 0 0 0 0 0 1 0 0 19 0 3C AF 47 1 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 33 0 0 C B5 0 0 2 65 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9A 0 0 0 0 8 D8 0 0 C FE A0 0 1 90 0 0 A9 8 1 20 0 0 1 92 C 9F 3 A0 0 2 83 
Otpravil zapros 21 01
                         ReceiveGauge:   23 A1 4 0 3C BC E4 C6 2D 23 A1 4 0 0 0 0 0 0 4 BC A9 19 0 3C AF E4 1 23 A1 4 0 0 0 0 0 0 0 B8 AB 0 0 0 BC 3 C6 7 23 A1 4 0 0 0 0 0 0 0 0 BB A8 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 33 0 0 C B6 0 0 2 65 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 8 D8 0 0 C FE A0 0 1 90 0 0 A9 8 1 20 0 0 1 92 C 9F 3 A0 0 2 4A 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 BC FF 0 47 0 2 AF 47 7 23 A1 4 0 0 0 0 0 0 0 1 FF 0 0 0 AF 47 7 23 A1 4 0 0 0 0 0 0 0 1 FF 0 47 0 2 AF 47 1 23 A1 4 0 0 0 0 0 0 0 0 1 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 33 0 0 C B5 0 0 2 65 0 0 0 0 4 3F 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 D8 0 0 C FE A0 0 1 90 0 0 A9 8 1 20 0 0 1 92 C 9F 3 A2 0 2 46 
Otpravil zapros 21 01
                         ReceiveGauge:   FF 0 47 0 47 0 2 3 47 7 23 A1 4 0 0 0 0 0 0 4 B7 AA 19 0 3C AF 47 1 23 A1 4 0 0 0 0 0 0 0 BB FF 0 47 0 2 3 47 7 23 A1 4 0 0 0 0 0 0 0 4 0 AA 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 33 0 0 C B5 0 0 2 64 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 8 D8 0 0 C FE A0 0 1 90 0 0 A9 8 1 20 0 0 1 92 C A1 3 A2 0 2 49 
Otpravil zapros 21 01
                         ReceiveGauge:   19 0 3C 1 0 0 19 0 2 3 47 2D 23 A1 4 0 0 0 0 0 0 1 0 0 47 0 2 3 C6 30 23 A1 4 0 0 0 0 0 0 0 BA FF 0 47 0 2 3 47 7 23 A1 4 0 0 0 0 0 0 0 4 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 33 0 0 C B6 0 0 2 64 0 0 0 0 4 41 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 8 D8 0 0 C FE A0 0 1 90 0 0 A9 8 1 20 0 0 1 92 C A1 3 A0 0 2 49 
Otpravil zapros 21 01
                         ReceiveGauge:   0 AA 19 0 0 1 0 0 19 0 2 AF C6 2F 23 A1 4 0 0 0 0 0 0 4 0 0 19 0 2 3 47 7 23 A1 4 0 0 0 0 0 0 0 1 0 0 19 0 3C AF E4 1 2D 23 A1 4 0 0 0 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 32 0 0 C B4 0 0 2 64 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 D8 0 0 C FE A0 0 1 90 0 0 A9 8 1 20 0 0 1 92 C A1 3 A0 0 2 42 
Otpravil zapros 21 01


5мс    закоментирована
Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   2 11 0 13 
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                         ReceiveGauge:   23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF A8 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AA 0 0 19 47 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 1 BA 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
                         ReceiveGauge:   0 FF AC 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 30 23 A1 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 15 0 0 C 9A 0 0 2 64 0 0 0 0 4 41 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 75 0 0 0 0 8 E0 0 0 C E5 A0 0 1 90 0 0 A9 8 1 20 0 0 1 95 C 80 3 A0 0 2 FA 
Otpravil zapros 21 01
                         ReceiveGauge:   4 0 0 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF A8 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 15 0 0 C 98 0 0 2 64 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 8 E0 0 0 C E5 A0 0 1 90 0 0 A9 8 1 20 0 0 1 95 C 7F 3 A2 0 2 E3 
Otpravil zapros 21 01
                         ReceiveGauge:   0 19 47 AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2C 23 A1 4 0 0 0 0 0 0 0 0 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 13 0 0 C 98 0 0 2 64 0 0 0 0 4 3F 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9F 0 0 0 0 8 E1 0 0 C E5 A0 0 1 90 0 0 AD 8 1 20 0 0 1 95 C 7F 3 A0 0 2 24 
Otpravil zapros 21 01
                         ReceiveGauge:   0 4 1 0 FF AB 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B7 0 FF AC 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 13 0 0 C 98 0 0 2 64 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 8 E1 0 0 C E5 A0 0 1 90 0 0 A9 8 1 20 0 0 1 95 C 80 3 A2 0 2 DA 
Otpravil zapros 21 01
                         ReceiveGauge:   2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 30 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF AB 0 0 19 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 13 0 0 C 98 0 0 2 64 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 E1 0 0 C E5 A0 0 1 90 0 0 A9 8 1 20 0 0 1 95 C 80 3 A0 0 2 DD 
Otpravil zapros 21 01
                         ReceiveGauge:   47 0 0 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2F 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B7 0 FF AA 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 15 0 0 C 97 0 0 2 64 0 0 0 0 4 41 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 E0 0 0 C E5 A0 0 1 90 0 0 AD 8 1 20 0 0 1 95 C 80 3 A2 0 2 E2 
Otpravil zapros 21 01
                         ReceiveGauge:   0 19 47 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B7 0 FF AC 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BC 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 13 0 0 C 98 0 0 2 64 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 8 E1 0 0 C E5 A0 0 1 90 0 0 A9 8 1 20 0 0 1 95 C 80 3 A2 0 2 DC 
Otpravil zapros 21 

закоментирована      закоментирована (без задержек вообще)
Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   2 11 0 
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                         ReceiveGauge:   13 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF A8 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2C 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A9 0 0 19 
Otpravil zapros Init
                         ReceiveGauge:   47 0 0 0 0 0 0 0 4 1 BA 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 4 1 B7 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2B 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D B 0 0 C 95 0 0 2 63 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 8 E3 0 0 C E0 A0 0 1 90 0 0 A9 8 0 20 0 0 1 96 C 8E 3 A0 0 2 DB 
Otpravil zapros 21 01
                         ReceiveGauge:   E4 47 C6 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2C 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D B 0 0 C 95 0 0 2 62 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 E3 0 0 C E0 A0 0 1 90 0 0 AD 8 0 20 0 0 1 96 C 8E 3 A0 0 2 E0 
Otpravil zapros 21 01
                         ReceiveGauge:   0 FF A9 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D D 0 0 C 95 0 0 2 62 0 0 0 0 4 41 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 E4 0 0 C E3 A0 0 1 90 0 0 A9 8 0 20 0 0 1 97 C 8E 3 A0 0 2 E1 
Otpravil zapros 21 01
                         ReceiveGauge:   2C 23 A1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF AA 0 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D B 0 0 C 94 0 0 2 62 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 8 E4 0 0 C E3 A0 0 1 90 0 0 A9 8 0 20 0 0 1 97 C 8E 3 A2 0 2 DB 
Otpravil zapros 21 01
                         ReceiveGauge:   0 19 47 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D D 0 0 C 94 0 0 2 62 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 8 E3 0 0 C E3 A0 0 1 90 0 0 AD 8 0 20 0 0 1 97 C 8E 3 A2 0 2 E2 
Otpravil zapros 21 01
                         ReceiveGauge:   A9 0 0 A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2C 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BB 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D B 0 0 C 95 0 0 2 62 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9A 0 0 0 0 8 E4 0 0 C E3 A0 0 1 90 0 0 A9 8 0 20 0 0 1 97 C 8E 3 A0 0 2 1E 
Otpravil zapros 21 01
                         ReceiveGauge:   A1 4 0 0 0 4 1 BA 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2E 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF AA 0 0 19 47 0 0 0 3C 2 BC AF 3 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D B 0 0 C 95 0 0 2 62 0 0 0 0 4 41 0 0 0 0 32 C8 3 A0 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 8 E4 0 0 C E3 A0 0 1 90 0 0 AD 8 0 20 0 0 1 97 C 8E 3 A0 0 2 E3 
Otpravil zapros 21 01
                         ReceiveGauge:   E4 47 C6 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF A9 0 0 19 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 BA 0 FF A8 0 





 


 

от 1 до 5 секунд результат одинаковый, первое сообщение приходить состоящее их двух целых сообщения 23............ а потом начинается бардак. если ставить 310 строку 10мс то к ReceiveGauge: 2 11 0 13 лепится кусок ответа идентификации.

 

MaksVV
Offline
Зарегистрирован: 06.08.2015
/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
              
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int waitbyte_gauge = 1;        // задержка между байтами в сообщении панели, мс
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;           //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int kmAge = 0;         //суточный пробег
  
  
  int colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {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};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
   myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {

  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}
//  else    {if (millis() - prevPIDgauge> 1000) {PIDsGauge(); prevPIDgauge = millis();}}
    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();
    
   }
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
                   
      myGLCD.printNumF(LHor, 1, 165, 40, '.',5);
      myGLCD.printNumF(L100, 1, 165, 75,'.',5 );
      myGLCD.printNumI(h, 165, 145, 5 );
      myGLCD.printNumI(PumpRPM, 165, 180,5);
      myGLCD.printNumI(RPM, 165, 215,5);
               
      myGLCD.printNumI(Temp, 410, 40, 3);
      myGLCD.printNumI(TempOil, 410, 75, 3);
      myGLCD.printNumI(TempFuel, 410, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3);
      myGLCD.printNumI(t, 410, 180, 3);
      myGLCD.printNumI(TempAir, 410, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(Barom, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


if (InitGauge) {
   
     byte inbyte=0;
     inbyte = mySerial_gauge.read();
     if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge);}
     if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
     if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}

     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     int k=0;
     while (dataMessageOK && k<34){ 
       
      MessageRxGauge[k] = mySerial_gauge.read();
      k++; 
      if (k==33) dataMessageEND = 1;
      delay (waitbyte_gauge);
     }
     
    
   if (dataMessageEND) { Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} 
    Serial.println ("");
    
     //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег
    
  Fuel = MessageRxGauge[17]/2;
  kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10;
    dataMessageEND = 0; dataMessageOK = 0;
    for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }
      
}
 /* 
if (mySerial_gauge.available()&& !InitGauge) {
   
     
     delay(50);
     int k=0;
     byte inbyte=0;
     
     while( mySerial_gauge.available() && k < 60) {
     inbyte = mySerial_gauge.read();
     MessageRxGauge[k] = inbyte;
     k++;   }
    
     Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} 
    Serial.println ("");

    if (MessageRxGauge[0]==0x55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1;
    mySerial_gauge.write (0x7F);
   
   Serial.println ("                       InitGauge  OK!!!!:  ");
   }
    for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива
   }

*/



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(190);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    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 Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(250,35,250,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() ;
     Watch ();
     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("MAF  mg/s:", 10, 215);
     myGLCD.print("Barom kPa:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     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() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  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, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  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 Watch (){
    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); //зеленый цвет цифры
  
    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);
    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); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

 

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

не канает. вот результат.

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
Otpravil zapros Init
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1C 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 9 2E 0 0 C 4D A0 0 1 90 0 0 A9 8 1 20 0 0 1 B6 C 1D 3 A2 0 
Otpravil zapros 21 01
Receive:   2 21 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2E 0 0 C 4D A0 0 1 90 0 0 A9 8 1 20 0 0 1 B6 C 1D 3 A2 0 
Otpravil zapros 21 01
Receive:   2 1E FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1A 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 9 2E 0 0 C 4D A0 0 1 90 0 0 AD 8 1 20 0 0 1 B6 C 1D 3 A2 0 2 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BA 0 FF 93 16 16 1A 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 43 
Receive:   23 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 C 1D 3 A2 0 2 62 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1B 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 A9 8 1 20 0 0 1 B8 C 1D 3 A2 0 2 22 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9D 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 AD 8 1 20 0 0 1 B7 C 1D 3 A2 0 2 68 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BA 0 FF 93 17 16 1A 47 0 4 0 0 C6 4 0 BA 0 FF 95 16 16 1A 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 C 1D 3 A2 0 2 21 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 C 1D 3 A2 0 2 21 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 60 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 1 20 0 0 1 B8 C 1E 3 A2 0 2 
Otpravil zapros 21 01
Receive:   21 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1B 0 0 2 60 0 0 0 0 4 42 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 9 2E 0 0 C 4D A0 0 1 90 0 0 A9 8 1 20 0 0 1 B6 C 1E 3 A2 0 2 20 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 60 0 0 0 0 4 44 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 C 1E 3 A2 0 2 
Otpravil zapros 21 01
Receive:   26 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1B 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 AD 8 1 20 0 0 1 B7 C 1E 3 A2 0 2 27 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1B 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 A9 8 1 20 0 0 1 B8 C 1E 3 A2 0 2 24 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 60 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 C 1E 3 A2 0 2 
Otpravil zapros 21 01
Receive:   22 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 5F 0 0 0 0 4 44 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 1 20 0 0 1 B7 C 1E 3 A2 0 2 25 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1A 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 AD 8 1 20 0 0 1 B7 C 1E 3 A2 0 2 
Otpravil zapros 21 01
Receive:   26 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1A 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B8 C 1D 3 A2 0 2 
Otpravil zapros 21 01
Receive:   20 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1B 0 0 2 5F 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B7 C 1E 3 A2 
Otpravil zapros 21 01
Receive:   0 2 1F FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1B 0 0 2 5F 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 AD 8 0 20 0 0 1 B8 C 1E 3 A2 0 2 
Otpravil zapros 21 01
Receive:   22 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1A 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B7 C 1D 3 A2 0 
Otpravil zapros 21 01
Receive:   2 20 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B8 C 1D 3 A2 0 2 
Otpravil zapros 21 01
Receive:   26 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 5F 0 0 0 0 4 42 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B7 C 1E 3 A2 0 
Otpravil zapros 21 01
Receive:   2 22 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1B 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B7 C 1E 3 A2 0 2 
Otpravil zapros 21 01
Receive:   20 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1A 0 0 2 60 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B8 C 1D 3 A2 0 2 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 23 1 0 B7 0 FF 95 17 16 1A 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 43 23 
Receive:   20 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 5F 0 0 0 0 4 42 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 AD 8 0 20 0 0 1 B7 C 1E 3 A2 0 2 26 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1A 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B7 C 1E 3 A2 0 2 20 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1B 0 0 2 5F 0 0 0 0 4 44 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B8 C 1E 3 A2 0 2 25 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B7 C 1E 3 A2 0 2 20 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1A 0 0 2 5F 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B8 C 1E 3 A2 0 2 
Otpravil zapros 21 01
Receive:   1C FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B7 C 1E 3 A2 0 
Otpravil zapros 21 01
Receive:   2 21 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5E 0 0 C 1B 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 2F 0 0 C 4F A0 0 1 90 0 0 AD 8 0 20 0 0 1 B7 C 1E 3 A2 
Otpravil zapros 21 01
Receive:   0 2 25 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1A 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B7 C 1F 3 A2 0 2 
Otpravil zapros 21 01
Receive:   21 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 5C 0 0 C 1A 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 31 0 0 C 4F A0 0 1 90 0 0 A9 8 0 20 0 0 1 B7 C 1F 3 A2 0 
Otpravil zapros 21 01

 

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

справил #1007

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

а че, всё почти работает кстати, там же 3 раза получили сообщения от панели. Круто..

Сообщение в сериале будет распечатываться без 23 А1 04   это так и должно быть 

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

результат

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B8 0 FF 95 16 16 1A 47 0 0 0 3C 2 BC AF 3 E4 47 C6 1 7 43 
Otpravil zapros Init
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9D 0 0 0 0 9 3B 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 13 3 A2 0 2 42 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 60 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3C 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 14 3 A2 0 2 FC 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3B 0 0 C 43 A0 0 1 90 0 0 AD 8 1 20 0 0 1 BC C 13 3 A2 0 2 3 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 60 0 0 0 0 4 44 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3B 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 13 3 A2 0 2 3 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4C 0 0 C D 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 14 3 A2 0 2 0 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3B 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 13 3 A2 0 
Otpravil zapros 21 01
Receive:   2 FE FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 9 3C 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 13 3 A2 0 2 2 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 60 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3C 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 14 3 A2 0 
Otpravil zapros 21 01
Receive:   2 FC FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9D 0 0 0 0 9 3C 0 0 C 43 A0 0 1 90 0 0 AD 8 1 20 0 0 1 BC C 14 3 A2 0 2 47 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 60 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9B 0 0 0 0 9 3C 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 14 3 A2 0 
Otpravil zapros 21 01
Receive:   2 3B FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 60 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3B 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 14 3 A2 0 2 FE 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3B 0 0 C 43 A0 0 1 90 0 0 AD 8 1 20 0 0 1 BC C 14 3 A2 0 2 
Otpravil zapros 21 01
Receive:   3 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 5F 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 14 3 A2 0 2 
Otpravil zapros 21 01
Receive:   0 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 5F 0 0 0 0 4 42 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 14 3 A2 0 2 
Otpravil zapros 21 01
Receive:   4 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A3 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3C 0 0 C 43 A0 0 1 90 0 0 AD 8 1 20 0 0 1 BC C 15 3 A2 0 
Otpravil zapros 21 01
Receive:   2 8 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 9 3B 0 0 C 43 A0 0 1 90 0 0 AD 8 1 20 0 0 1 BC C 13 3 A2 0 2 
Otpravil zapros 21 01
Receive:   6 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3B 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 14 3 A2 0 
Otpravil zapros 21 01
Receive:   2 0 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3B 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 15 3 A2 0 2 1 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3B 0 0 C 43 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 14 3 A2 0 2 1 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 60 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BD C 15 3 A2 0 2 3 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 60 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 15 3 A2 0 2 3 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 AD 8 1 20 0 0 1 BC C 14 3 A2 0 2 A 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 1 20 0 0 1 BC C 14 3 A2 0 2 4 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 15 3 A2 0 2 5 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 60 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 15 3 A2 0 2 
Otpravil zapros 21 01
Receive:   1 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 5F 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 16 3 A2 0 2 3 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 60 0 0 0 0 4 42 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 15 3 A2 0 2 
Otpravil zapros 21 01
Receive:   4 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 AD 8 0 20 0 0 1 BD C 14 3 A2 0 2 
Otpravil zapros 21 01
Receive:   7 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 60 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 AD 8 0 20 0 0 1 BD C 14 3 A2 0 2 
Otpravil zapros 21 01
Receive:   6 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4C 0 0 C E 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9D 0 0 0 0 9 3E 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 16 3 A2 0 
Otpravil zapros 21 01
Receive:   2 47 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 5F 0 0 0 0 4 42 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 AD 8 0 20 0 0 1 BD C 15 3 A2 
Otpravil zapros 21 01
Receive:   0 2 A FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C C 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 14 3 A2 0 2 
Otpravil zapros 21 01
Receive:   1 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C E 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 14 3 A2 0 
Otpravil zapros 21 01
Receive:   2 FF FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 14 3 A2 0 2 
Otpravil zapros 21 01
Receive:   1 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 AD 8 0 20 0 0 1 BC C 15 3 A2 0 
Otpravil zapros 21 01
Receive:   2 6 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 5F 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 14 3 A2 0 
Otpravil zapros 21 01
Receive:   2 FF FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 5F 0 0 0 0 4 43 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 15 3 A2 0 
Otpravil zapros 21 01
Receive:   2 6 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 5F 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 15 3 A2 0 2 
Otpravil zapros 21 01
Receive:   FF FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 15 3 A2 0 
Otpravil zapros 21 01
Receive:   2 4 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 16 3 A2 0 
Otpravil zapros 21 01
Receive:   2 5 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 AD 8 0 20 0 0 1 BD C 15 3 A2 0 2 
Otpravil zapros 21 01
Receive:   7 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9F 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 15 3 A2 
Otpravil zapros 21 01
Receive:   0 2 48 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 16 3 A2 0 
Otpravil zapros 21 01
Receive:   2 5 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 5F 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 AD 8 0 20 0 0 1 BD C 16 3 A2 0 
Otpravil zapros 21 01
Receive:   2 5 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 5F 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5D 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 15 3 A2 0 2 
Otpravil zapros 21 01
Receive:   0 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C C 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 16 3 A2 0 
Otpravil zapros 21 01
Receive:   2 1 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 5F 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 AD 8 0 20 0 0 1 BD C 16 3 A2 0 2 
Otpravil zapros 21 01
Receive:   2 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 16 3 A2 0 2 2 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 16 3 A2 0 2 5 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 60 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 16 3 A2 0 2 5 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 5F 0 0 0 0 4 41 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 16 3 A2 0 2 2 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 5F 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 16 3 A2 0 2 0 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4C 0 0 C D 0 0 2 5F 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5A 0 0 0 0 9 3E 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 16 3 A2 0 2 2 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C C 0 0 2 5F 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 58 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 16 3 A2 0 2 
Otpravil zapros 21 01
Receive:   FE FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C D 0 0 2 5F 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 9D 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BC C 16 3 A2 0 2 3F 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4D 0 0 C E 0 0 2 5F 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3D 0 0 C 45 A0 0 1 90 0 0 A9 8 0 20 0 0 1 BD C 16 3 A2 0 2 
Otpravil zapros 21 01
Receive:   4 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 4E 0 0 C D 0 0 2 5F 0 0 0 0 4 40 0 0 0 0 32 C8 3 A2 4 29 3 20 E5 62 0 0 0 0 B 5B 0 0 0 0 9 3C 0 0 C 45 A0 0 1 90 0 0 AD 8 0 20 0 0 1 BC C 16 3 A2 0 2 6 
Otpravil zapros 21 01

 

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

блин. теперь я понял почему ты поменял в формулах номера байтов. а то смотрю и думаю че за фигня вроде не те байты. хе хе хе... да еще ты обратил вниманеи что иногда в сообщениях с 7 добавляются несколько байт впереди? это не может помешать выводу данных с 7, ведь в таком сообщении где добавлены байты вывод будет другой. например вот Receive:   2 3B FF FF FF 80 F1 11 4C 61   счет байтов сбивается для вывода инфы

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

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

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

вывод не будет другой так как проверку сообщение не пройдет и не попадёт в тот цикл где формулы

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

согласен. сейчас запущу на минут 5 и гляну. переодичность запроса панели

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

в обмене 7 конакта там пару байт не влазит в сообщения, может задержку 210 мс сделать, тогда будут успевать залетать в одно сообщение

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

поменял задержку с 190 на 200. получил гдето 8 раз от панели. поставил 195 пришло за меньшее время пришло 11 от панели. так же выровнялось сообщение от 7 , теперь четко с FF FF FF FF. но есть не порядок с сообщениями панели вот смотри 3С 2 это пробег. он не должен меняться. я не еду. но он в некоторых сообщениях вообще отсутсвует а  в некоторых находится в другом метсе. выделенные это правильные ответы и части. 

ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B0 0 FF 8E 18 16 1B 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1 7 36
ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B5 0 FF 96 17 16 1A 47 4 0 47 0 23 C5 1 7 40 23 A1 4 0 0
ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 8D  0 23  2 BC AF 3 E4 47 C5 1 7 3C 23 A1 4 0 0 0
ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B8 0 FF 94 16 16 1A 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1 23 0
ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B8 0 FF 94 16  0 23 16 23 E4 47 0 1 0 B9 0 FF 95 16 16 1A 47
ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B8 0 FF 95 17 16 1A 47 0 0 0 3C 2 BC AF 3 E4 94 0 23 1A 4
ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B8 0 FF 94 16 16 1A 47 0 0 0 0 23 1 B8 23 2 0 23 AF 0 23
 и между ними пришли три таких 
ReceiveGauge:   23 7 B9 23 BC 0 23 3 0 23 0 0 7 2 0 23 16 A1 47 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1 7 43
ReceiveGauge:   23 0 B9 23 AF 0 23 1A 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1 7 42 23 A1 4 0 0 0 0 0 0 0 0
ReceiveGauge:   23 7 0 23 BC 0 23 E4 4 23 0 0 23 2 0 23 16 23 0 0 23 3C 0 23 1A 0 23 0 0 42 FF 0 23 16
 
 

закинул сктч для 12 контакта чтобы увидеть правильный ответ вот он

23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 AE 0 FF 8E 16 16 1B 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1 7 32

 

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

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
              
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;           //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int kmAge = 0;         //суточный пробег
  
  
  int colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {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};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
   myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {

  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}
//  else    {if (millis() - prevPIDgauge> 1000) {PIDsGauge(); prevPIDgauge = millis();}}
    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();
    
   }
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
                   
      myGLCD.printNumF(LHor, 1, 165, 40, '.',5);
      myGLCD.printNumF(L100, 1, 165, 75,'.',5 );
      myGLCD.printNumI(h, 165, 145, 5 );
      myGLCD.printNumI(PumpRPM, 165, 180,5);
      myGLCD.printNumI(RPM, 165, 215,5);
               
      myGLCD.printNumI(Temp, 410, 40, 3);
      myGLCD.printNumI(TempOil, 410, 75, 3);
      myGLCD.printNumI(TempFuel, 410, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3);
      myGLCD.printNumI(t, 410, 180, 3);
      myGLCD.printNumI(TempAir, 410, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(Barom, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


if (InitGauge) {
   
     byte inbyte=0;
     inbyte = mySerial_gauge.read();
     if (inbyte == 0x23) byte0=1;
     if (inbyte == 0xA1&& byte0) byte1=1;
     if (inbyte == 0x04 && byte0 && byte1) byte2=1;

     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     int k=0;
     while (dataMessageOK && k<34){ 
       
      MessageRxGauge[k] = mySerial_gauge.read();
      k++; 
      if (k==33) dataMessageEND = 1;
     }
     
    
   if (dataMessageEND) { Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} 
    Serial.println ("");
    
     //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег
    
  Fuel = MessageRxGauge[17]/2;
  kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10;
    dataMessageEND = 0; dataMessageOK = 0;
    for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }
      
}
 /* 
if (mySerial_gauge.available()&& !InitGauge) {
   
     
     delay(50);
     int k=0;
     byte inbyte=0;
     
     while( mySerial_gauge.available() && k < 60) {
     inbyte = mySerial_gauge.read();
     MessageRxGauge[k] = inbyte;
     k++;   }
    
     Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} 
    Serial.println ("");

    if (MessageRxGauge[0]==0x55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1;
    mySerial_gauge.write (0x7F);
   
   Serial.println ("                       InitGauge  OK!!!!:  ");
   }
    for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива
   }

*/



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(195);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    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 Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(250,35,250,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() ;
     Watch ();
     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("MAF  mg/s:", 10, 215);
     myGLCD.print("Barom kPa:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     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() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  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, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  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 Watch (){
    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); //зеленый цвет цифры
  
    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);
    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); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

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

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

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

закоментировать fastinit();? 

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

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
              
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int waitbyte_gauge = 0;        // задержка между байтами в сообщении панели, мс
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;           //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int kmAge = 0;         //суточный пробег
  
  
  int colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {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};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
 //   mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
   myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
 //   fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {

  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}
//  else    {if (millis() - prevPIDgauge> 1000) {PIDsGauge(); prevPIDgauge = millis();}}
    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();
    
   }
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
                   
      myGLCD.printNumF(LHor, 1, 165, 40, '.',5);
      myGLCD.printNumF(L100, 1, 165, 75,'.',5 );
      myGLCD.printNumI(h, 165, 145, 5 );
      myGLCD.printNumI(PumpRPM, 165, 180,5);
      myGLCD.printNumI(RPM, 165, 215,5);
               
      myGLCD.printNumI(Temp, 410, 40, 3);
      myGLCD.printNumI(TempOil, 410, 75, 3);
      myGLCD.printNumI(TempFuel, 410, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3);
      myGLCD.printNumI(t, 410, 180, 3);
      myGLCD.printNumI(TempAir, 410, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(Barom, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


if (InitGauge) {delay(50);
   
     
     if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge);}     
     if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
     else byte0=0;
     if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}
     else {byte0=0; byte1=0;}

     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     int k=0;
     while (dataMessageOK && k<34){ 
       
      MessageRxGauge[k] = mySerial_gauge.read();
      k++; 
      if (k==33) dataMessageEND = 1;
      delay (waitbyte_gauge);
     }
     
    
   if (dataMessageEND) { Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} 
    Serial.println ("");
    
     //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег
    
  Fuel = MessageRxGauge[17]/2;
  kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10;
    dataMessageEND = 0; dataMessageOK = 0; mySerial_gauge.flush();
    for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива
    
    }
      
}
 /* 
if (mySerial_gauge.available()&& !InitGauge) {
   
     
     delay(50);
     int k=0;
     byte inbyte=0;
     
     while( mySerial_gauge.available() && k < 60) {
     inbyte = mySerial_gauge.read();
     MessageRxGauge[k] = inbyte;
     k++;   }
    
     Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} 
    Serial.println ("");

    if (MessageRxGauge[0]==0x55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1;
    mySerial_gauge.write (0x7F);
   
   Serial.println ("                       InitGauge  OK!!!!:  ");
   }
    for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива
   }





      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(190);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     */
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    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 Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(250,35,250,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() ;
     Watch ();
     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("MAF  mg/s:", 10, 215);
     myGLCD.print("Barom kPa:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     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() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  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, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  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 Watch (){
    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); //зеленый цвет цифры
  
    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);
    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); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 
viki13viki
Offline
Зарегистрирован: 14.11.2016

результат куски от 0 до 5 мс . правильное сообщение 

 

0mc-------------------------------

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 AF 0 FF 8E 16 16 1B 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1 7 33 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 AD 0 FF 8D 17 16 1B 47 0 0 0 0 0 0 0 23 A1 4 0 0 0 0 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B1 0 FF 8C 16 16 1B 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1 7 33 
Otpravil zapros Init
                         ReceiveGauge:   0 E4 47 C5 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 AD 0 FF 8E 17 16 1B 47 0 0 0 3C 2 BC 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 93 17 16 1A 47 0 0 0 0 0 0 0 23 A1 4 0 0 0 4 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B8 0 FF 92 16 16 1A 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1 7 3F 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B4 0 FF 93 16 16 1A 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1 7 3C 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B6 0 FF 92 16 16 1A 47 0 0 0 0 0 0 0 23 A1 4 0 0 4 0 
                         ReceiveGauge:   0 2 BC AF 3 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B5 0 FF 94 17 16 1A 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1 7 3F 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B5 0 FF 94 16 16 1A 47 0 0 0 3C 2 BC AF 3 E4 47 C5 1A 47 0 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B5 0 FF 93 16 16 1A 47 0 0 0 4 0 B5 0 0 0 0 0 0 FF 95 
                         ReceiveGauge:   0 47 C5 1 7 23 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 1 7 3E 23 0 3C 2 BC FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
Otpravil zapros Init


1mc---------------------------------------------------------------

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 B1 0 FF A0 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1C 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B0 0 FF A1 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1D 
                         ReceiveGauge:   0 0 0 0 0 FF 0 FF 0 FF 0 FF 0 FF 0 FF 4 FF 1 FF AF FF 0 FF FF FF A1 FF 0 FF 0 FF 1B FF 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AF 0 FF A2 0 0 1B 47 0 0 0 4 0 0 0 23 A1 4 0 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B0 0 FF A1 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1D 
                         ReceiveGauge:   0 7 1C 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B1 0 FF A1 0 0 1B 47 0 0 0 3D 2 BC AF 3 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AF 0 FF A2 0 0 1B 47 0 0 0 0 0 0 0 23 A1 4 0 0 4 1 
                         ReceiveGauge:   0 BC AF 3 E4 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B0 0 FF A0 0 0 1B 47 0 0 0 3D 2 BC 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B0 0 FF 23 A1 4 0 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 1 7 25 23 0 3D 2 BC 23 A1 4 0 4 1 B7 0 0 0 0 0 FF A7 0 0 1A 47 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B7 0 FF A9 2 0 1A 47 0 0 0 0 0 0 0 23 A1 4 0 0 0 0 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AA 0 0 1A 47 0 0 0 0 0 4 1 4 0 0 0 1 B9 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A8 0 0 1A 47 0 0 0 0 0 0 0 23 A1 4 0 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 29 


2mc-----------------------------------------------------------------------

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF AA 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2A 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 0 0 0 0 0 0 0 0 0 FF AA 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B7 0 FF A8 0 0 1A 47 0 0 0 3D 2 BC AF FF A9 0 0 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 2A 23 A1 4 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A8 0 0 1A 47 0 0 0 3D 2 BC 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AA 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2D 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AA 0 0 1A 47 0 0 0 23 A1 4 0 23 A1 4 0 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A8 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2C 
Otpravil zapros Init
                         ReceiveGauge:   0 1 7 2C 23 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A6 0 0 1A 47 0 0 0 3D 2 BC 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 4 1 B7 0 FF AA 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2C 23 A1 4 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 29 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF A6 0 0 1A 47 0 0 0 A1 4 0 0 23 A1 4 0 0 0 0 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF AA 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1A 47 0 
Otpravil zapros Init


3mc-----------------------------------------------------------------------------

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B7 0 FF A8 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2A 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   1 B8 0 FF A9 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2C FF 23 A1 4 0 0 0 0 0 0 0 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A7 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2B 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 E4 47 C5 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B5 FF A9 0 47 0 0 3D BC AF E4 47 1 7 
Otpravil zapros Init
                         ReceiveGauge:   0 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AA 0 0 1A 47 0 0 0 3D BC AF E4 C5 1 2D 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 23 A1 4 0 47 C5 1 7 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B6 0 FF A9 0 0 1A 47 0 0 0 1 B5 0 FF 0 0 0 0 FF A9 0 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A7 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2B 
Otpravil zapros Init
                         ReceiveGauge:   0 C5 1 7 2B 23 A1 4 0 1A 47 0 0 B5 0 FF A9 0 1A 0 0 3D 2 AF 3 47 C5 7 29 23 A1 4 0 0 
Otpravil zapros Init


4mc-----------------------------------------------------------------------

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 29 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF 23 A1 4 0 2B 23 A1 4 23 A1 4 0 0 0 0 0 0 0 0 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B7 0 FF AA 0 0 1A 47 0 0 0 0 0 0 4 0 0 0 0 FF A9 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A8 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2C 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 29 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A6 0 0 1A 47 0 0 0 3D 2 BC 3 47 1 2A 23 A1 4 0 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF AA 0 0 1A 47 0 0 0 3D 2 AF E4 C5 7 23 A1 4 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 0 1 0 A9 0 47 0 3D BC 3 47 1 29 23 A1 4 0 0 0 0 0 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 23 A1 4 0 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A7 0 1A 0 0 2 AF E4 C5 7 23 A1 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 7 2C 23 A1 23 A1 4 0 0 0 0 0 0 1 0 A9 0 47 0 3D BC 3 47 1 2A 23 A1 4 0 0 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 47 C5 1 7 23 A1 4 0 1A 47 0 0 0 4 1 0 A9 0 47 0 3D BC 3 47 1 2C 23 A1 4 0 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 4 B8 FF 0 1A 0 0 2 AF E4 C5 7 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 B5 FF 0 1A 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 4 1 B8 0 FF AA 0 0 1A 47 0 0 0 3D 2 BC 3 47 1 2D 23 A1 4 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 23 A1 4 0 0 0 0 0 4 B9 FF 0 1A 0 0 2 AF E4 C5 7 23 A1 4 0 0 0 0 0 0 0 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 4 1 B9 0 FF A6 2 0 1A 47 0 0 0 3D 2 AF E4 C5 7 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 
Otpravil zapros Init
                         ReceiveGauge:   0 1 B5 0 FF A9 0 0 1A 47 0 0 3D BC 3 47 1 29 23 A1 4 0 0 0 0 0 0 0 0 0 0 1 0 A9 
Otpravil zapros Init


5mc------------------------------------------------------------------------------------------------

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF AA 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2D 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF A9 0 0 1A 47 0 0 0 0 0 0 0 23 A1 4 0 0 4 1 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF A9 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2C 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 0 0 0 4 A1 4 0 0 B6 0 FF 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 4 0 0 0 23 A1 4 0 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 A9 0 0 1A 0 0 4 1 0 3D 2 BC AF 3 E4 47 C5 1 7 2D 23 A1 4 0 0 0 0 0 0 0 0 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A8 0 0 1A 23 A1 4 0 23 A1 4 0 23 A1 4 0 0 0 0 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A7 0 0 1A 47 0 0 0 0 0 0 0 4 0 0 0 1 B8 0 
                         ReceiveGauge:   0 E4 47 C5 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B7 0 FF AA 0 0 1A 47 0 0 0 3D 2 BC 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B6 0 FF A9 0 0 1A 47 0 0 0 0 0 0 4 A1 4 0 0 1 B5 0 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 23 A1 4 0 23 A1 4 0 23 A1 4 0 0 0 0 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 0 0 0 0 4 0 0 0 1 B5 0 
                         ReceiveGauge:   0 E4 47 C5 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A8 0 0 1A 47 0 0 0 3D 2 BC 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A6 0 0 1A 47 0 0 0 0 0 0 4 A1 4 0 0 1 B9 0 
Otpravil zapros Init
Otpravil zapros Init

 

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

поправил 1020. Не знаю уже блин че и придумать 

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

результат

0мс.................................................................................

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AF 0 FF A0 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1B 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AE 0 FF A0 0 0 1B 47 0 0 0 0 0 0 0 0 0 0 0 0 0 4 
                         ReceiveGauge:   4 1 AE 0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AF 0 FF A1 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1C 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AE 0 FF A1 0 0 1B 47 0 0 0 A1 4 0 0 0 0 0 0 0 0 0 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B0 0 FF A0 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1C 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AE 0 FF A0 0 0 1B 47 0 0 0 23 A1 4 0 0 0 0 0 0 0 0 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   2 BC AF FF A0 0 E4 47 C5 1 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B0 0 FF A2 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1E 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B1 0 FF A1 0 0 1B 47 0 0 0 0 0 4 1 AE 0 FF A1 0 0 1B 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B0 0 FF A1 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1D 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 1B 47 0 23 A1 4 23 A1 4 23 A1 4 0 0 0 FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AD 0 FF A1 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1A 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 23 A1 4 AF 3 E4 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                         ReceiveGauge:   0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 3 E4 47 0 1A 47 1 7 28 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF A7 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2A 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B7 0 FF A8 0 23 A1 4 1 7 2B 23 A1 4 FF FF FF FF FF FF FF FF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 29 23 A1 3D 2 BC FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
Otpravil zapros Init


5мс.................................................................................................................................

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF AA 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2A 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF A9 0 0 1A 47 0 0 0 0 0 0 0 4 0 A7 1A 0 3D AF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 4 0 A9 1A 0 3D AF E4 1 2B 23 A1 4 0 0 0 1 0 0 1A 0 3D AF E4 1 2C 23 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 A8 0 0 0 0 1 0 0 1A 0 3D AF E4 1 2A 23 A1 4 0 0 0 0 0 0 0 B5 FF 0 47 0 2 3 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A7 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2B 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 0 1 FF 0 47 0 2 AF 47 1 23 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 29 23 A1 4 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 29 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A7 0 0 1A 47 0 0 0 0 1 0 0 1A 0 3D AF E4 1 2B 
                         ReceiveGauge:   0 0 0 0 0 0 0 1 0 0 1A 0 3D AF E4 1 28 23 A1 4 0 0 0 1 0 0 1A 0 3D AF E4 1 29 23 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 3D AF E4 1 23 A1 4 0 0 0 0 0 0 0 0 1 FF 0 47 0 2 AF 47 7 23 A1 4 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 4 0 A9 1A 0 3D BC E4 C5 29 23 A1 4 0 1 B5 0 0 0 0 1A 47 0 0 0 3D 2 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A7 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2B 

 

похоже что во сех вариантах на 5мс ему лучше чухается

 

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

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

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

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

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

попробовал опять общую задержку впендюрить. Скетч 1020 поправил

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

результат

0mc-------------------------------------------------------------
Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   47 C5 1 0 0 0 1C 23 A1 2 BC AF 4 0 0 E4 47 C5 47 0 0 0 0 0 4 0 0 23 A1 4 47 C5 1 23 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 23 A1 4 47 C5 1 0 1A 47 0 4 1 2 BC AF 0 0 1A 0 FF A8 23 A1 4 23 A1 4 BC 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 3D 2 0 0 0 23 A1 4 0 1A 47 23 A1 4 23 A1 4 0 FF A6 0 0 0 47 C5 1 0 0 4 4 0 0 BC 
Otpravil zapros Init


5mc------------------------------------------------------------------------------------
Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 1 B7 0 4 0 0 1 7 29 0 0 0 1 B6 0 4 0 0 23 A1 4 0 0 1A 23 A1 4 23 A1 4 1 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 23 A1 4 0 1A 47 23 A1 4 23 A1 4 23 A1 4 0 1A 47 0 0 0 23 A1 4 B6 0 FF 0 0 0 47 
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init
Otpravil zapros Init

 

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

не некатит задержка это вообще.  скетч 1020. 

строка 307, delay убирай, 

строки 322 и 321 поменяй местами -- вот тут я конкретно косякнул

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

а не, нифига не поменяется

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

уже сделал

строка 307, delay убирай, 

строки 322 и 321 поменяй местами

0мс

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AF 0 FF 9F 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1A 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AC 0 FF A2 0 0 1B 47 0 0 0 0 0 0 0 0 0 0 0 0 0 4 
                         ReceiveGauge:   0 4 1 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B0 0 FF A0 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1C 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AC 0 FF A2 0 0 1B 47 0 0 0 4 0 0 0 0 0 0 0 0 0 0 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B0 0 FF 9E 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1A 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AD 0 FF A1 0 0 1B 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 1A 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 AC 0 FF A1 0 0 1B 47 0 0 0 23 A1 4 0 0 0 0 0 0 0 0 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   2 BC AF A1 0 0 E4 47 C5 FF FF FF FF FF 1 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B8 0 FF A5 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 28 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B4 0 FF A8 0 0 1A 47 0 0 0 0 0 4 1 B4 0 FF A8 0 0 1A 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B6 0 FF A6 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 27 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 1A 47 0 23 A1 4 23 A1 4 23 A1 4 0 0 FF FF FF FF 0 FF FF FF FF FF FF FF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 23 A1 4 AF 3 E4 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 3 E4 47 1A 47 0 C5 1 7 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
Otpravil zapros Init

 

5мс

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A6 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2A 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF AA 0 0 1A 47 0 0 0 0 0 0 0 1 0 0 1A 0 3D AF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 1 FF 0 47 0 2 AF 47 1 23 A1 4 0 0 0 0 1 FF 0 47 0 2 AF 47 1 23 A1 
Otpravil zapros Init
Otpravil zapros Init
                         ReceiveGauge:   0 0 A6 0 0 0 0 1 FF 0 47 0 2 AF 47 1 23 A1 4 0 0 0 0 0 0 0 0 1 FF 0 47 0 2 AF 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B7 0 FF AA 0 0 1A 47 0 0 0 3D 2 BC AF 3 E4 47 C5 1 7 2C 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B9 0 FF A8 0 0 1A 47 0 0 0 0 1 0 0 1A 0 3D AF 47 1 23 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 B5 FF 0 47 0 2 3 47 7 23 A1 4 0 0 0 0 0 3D 2 BC 23 A1 4 0 0 0 0 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 0 0 1A 47 0 0 0 3D 2 AF 47 1 23 A1 4 0 0 A9 
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 1 0 1 7 2C 2 BC AF 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 1 B5 0 FF A9 
Otpravil zapros Init

заметь, первый ответ всегда верный

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

В общем сделал прием сообщения от контакта 12 абстрагированным от сеанса с 7 контактом, т.е. та задержка как бы не влияет. Я думаю что не 100 % все сообщения будут без ошибок, но для этого сделал проверку по контрольной сумме (раз такие байты есть в сообщении, грех не использовать). Т.е. если даже 20% сообщений без ошибок, этого нам хватит. Естественно, к формулам будет попадать сообщение только без ошибок. 

короче если это не заработает, то я даже не знаю. 

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool MessageParse = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
  
  int numberbyte = 0;
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int waitbyte_gauge = 4;  
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;           //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int kmAge = 0;         //суточный пробег
  
  
  int colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {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};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
    myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {

  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}
//  else    {if (millis() - prevPIDgauge> 1000) {PIDsGauge(); prevPIDgauge = millis();}}
    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();
    
   }
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
                   
      myGLCD.printNumF(LHor, 1, 165, 40, '.',5);
      myGLCD.printNumF(L100, 1, 165, 75,'.',5 );
      myGLCD.printNumI(h, 165, 145, 5 );
      myGLCD.printNumI(PumpRPM, 165, 180,5);
      myGLCD.printNumI(RPM, 165, 215,5);
               
      myGLCD.printNumI(Temp, 410, 40, 3);
      myGLCD.printNumI(TempOil, 410, 75, 3);
      myGLCD.printNumI(TempFuel, 410, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3);
      myGLCD.printNumI(t, 410, 180, 3);
      myGLCD.printNumI(TempAir, 410, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(Barom, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


MessageParse = 0;
while (InitGauge && !MessageParse) {

 if (!dataMessageOK) {   
     if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge); }    
     if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
     else byte0=0;
     if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}
     else {byte0=0; byte1=0;}
     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     numberbyte=0;}

 else {

   if (mySerial_gauge.available()>0)  { MessageRxGauge[numberbyte] = mySerial_gauge.read(); numberbyte++; delayMicroseconds (250);}
      
      if (numberbyte==34) {dataMessageEND = 1; dataMessageOK = 0;}
     
     }
      

   if (dataMessageEND) { 
    int crc =  ( ( unsigned int )MessageRxGauge[32] << 8 ) | MessageRxGauge[33]; // парсинг контрольной суммы из 2 последних байт 
    int CRC =200;
    for (int i = 0; i < 32; i++) CRC = CRC + MessageRxGauge[i];                 // подсчет контрольной суммы байт от 0 до 31

    Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");}
 
 //при получении сообщения БЕЗ ошибок с данными от панели приборов, запишем в переменные остаток топлива и пробег
    if (CRC==crc) {Serial.println ("    OK!!!");
    
///  Fuel = MessageRxGauge[17]/2;
//  kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10;
    }
    
  else Serial.println ("    ERROR!!!");   
   dataMessageEND = 0; MessageParse = 1; //mySerial_gauge.flush();

    for (int i = 0; i < 34; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }}



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(195);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    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 Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(250,35,250,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() ;
     Watch ();
     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("MAF  mg/s:", 10, 215);
     myGLCD.print("Barom kPa:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     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() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  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, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  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 Watch (){
    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); //зеленый цвет цифры
  
    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);
    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); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

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

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

Otpravil zapros Init
Otpravil zapros adress Gauge
 55 52 80 7F 2D A0 48 54 20 32 34 34 31 39 35 36 30 20 31 34 30 30 20 34 31 39 39 20 31 33 30 31 20 30 34 32 20 31 20 30 30 30 30 30 30 30 30 30 30 8 F0                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BE 0 FF 36 69 68 51 55 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F6     OK!!!
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 51 55 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F7     OK!!!
Otpravil zapros Init
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BB 0 FF 35 69 68 51 55 0 0 0 0 0 35 51 55 0 0 0 62 0 FE     ERROR!!!
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 51 55 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F7     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 96 0 0 2 71 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 B9 0 0 C ED A0 0 1 90 0 0 A9 8 1 20 0 0 1 84 C 0 3 A5 0 2 AB 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BE 0 FF 36 69 68 51 55 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F6     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 97 0 0 2 73 0 0 0 0 4 40 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A 9C 0 0 0 0 8 B9 0 0 C ED A0 0 1 90 0 0 A9 8 1 20 0 0 1 84 C 0 3 A5 0 2 64 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 51 55 0 0 0 68 0 0 0 FE AF 3 A2 47 C4 1     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 97 0 0 2 71 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DE 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 AD 8 1 20 0 0 1 85 C 0 3 A5 0 2 B1 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 34 69 68 51 55 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F5     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 97 0 0 2 71 0 0 0 0 4 40 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E2 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 1 3 A5 0 2 AF 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 51 55 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F7     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 96 0 0 2 71 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DE 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 0 3 A5 0 2 AD 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 69 68 51 55 0 0 0 3 47 1 F7 23 A1 4 0 0 0 0     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 97 0 0 2 71 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DE 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 AD 8 1 20 0 0 1 85 C 1 3 A5 0 2 B2 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 51 55 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F7     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 96 0 0 2 71 0 0 0 0 4 48 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DE 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 1 3 A5 0 2 B2 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 51 55 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F7     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 94 0 0 2 71 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 1 3 A5 0 2 AD 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BC 0 FF 35 69 68 50 55 0 0 0 0 0 0 AF 3 A2 47 C4 1 7 F3     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 96 0 0 2 71 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 1 3 A5 0 2 AF 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 51 55 0 0 0 FF 69 50 0 0 0 62 0 FE AF 3     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DE 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 1 3 A5 0 2 AC 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 55 0 62 FE AF 3 A2 47 C4 1 7 F5 23 A1 4 0 0     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 97 0 0 2 71 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 3 3 A5 0 2 B0 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BE 0 FF 36 69 68 50 55 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F5     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 97 0 0 2 71 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 3 3 A5 0 2 B0 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F7     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 96 0 0 2 72 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 3 3 A5 0 2 B3 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 69 68 50 56 0 0 0 51 0 0 0 FE AF 3 A2 47 C4 1     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DE 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 AD 8 1 20 0 0 1 85 C 4 3 A5 0 2 B2 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F7 23     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 48 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 3 3 A5 0 2 B4 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 50 56 0 0 0 62 23 A1 4 0 0 0 0 0 0 0     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 40 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 AD 8 1 20 0 0 1 85 C 1 3 A5 0 2 AE 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 34 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 23     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 96 0 0 2 71 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DE 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 1 20 0 0 1 85 C 3 3 A5 0 2 AF 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 68 68 51 56 0 0 0 62 23 A1 4 0 0 0 0 0 0 0     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 48 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 3 3 A5 0 2 B3 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 23     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 3 3 A5 0 2 AF 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 69 68 50 56 0 0 0 62 23 A1 4 0 0 0 0 0 0 0     ERROR!!!
Receive:   FF FF FF 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BD 0 FF 35 69 68 51 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F4     ERROR!!!
Receive:   FF FF FF 80 21 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DE 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 4 3 A5 0 2 DD 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F7     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 4 3 A5 0 2 AF 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BE 0 FF 35 69 68 50 56 0 0 0 3 C4 7 23 A1 4 0 0 0 0 0     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A 9C 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 5 3 A5 0 2 6D 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F6     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 AD 8 0 20 0 0 1 85 C 3 3 A5 0 2 B3 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BE 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F5     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 46 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 AD 8 0 20 0 0 1 85 C 4 3 A5 0 2 B5 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 68 68 50 56 0 0 0 47 1 F3 23 A1 4 0 0 0 0 0     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 5 3 A5 0 2 B0 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F6     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DE 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 5 3 A5 0 2 AD 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BD 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F4     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 41 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DE 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 5 3 A5 0 2 AF 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 69 68 51 56 0 0 0 56 0 62 FE AF 3 A2 47 C4 1 7     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 71 0 0 0 0 4 46 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A DD 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 5 3 A5 0 2 B0 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F6     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 AD 8 0 20 0 0 1 85 C 5 3 A5 0 2 B4 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BD 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F4     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 46 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 20 0 0 0 0 8 BA 0 0 C EF A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 5 3 A5 0 2 F3 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 34 69 68 51 56 0 0 0 0 0 0 AF 3 A2 47 C4 1 7 F5     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 A E0 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 AD 8 0 20 0 0 1 85 C 5 3 A5 0 2 B6 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BD 0 FF 35 69 68 50 56 0 0 0 35 68 56 0 0 62 0 FE AF 3 A2     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 48 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 20 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 5 3 A5 0 2 F8 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 4 0 BE 0 FF 35 68 68 50 56 0 0 0 62 0 FE     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 94 0 0 2 71 0 0 0 0 4 41 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 22 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 5 3 A5 0 2 F2 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 0 0 62 0 FE AF 3 A2 47 C4 1 7 F4 23 A1 4 0 0 0     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 20 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 6 3 A5 0 2 F4 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F6     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 94 0 0 2 70 0 0 0 0 4 48 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 22 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 AD 8 0 20 0 0 1 85 C 6 3 A5 0 2 FD 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BC 0 FF 35 68 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F2     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F5 0 0 D 94 0 0 2 70 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 24 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 6 3 A5 0 2 F9 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BD 0 FF 35 68 68 50 56 0 0 0 3 47 1 F3 23 A1 4 0 0 0 0     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 94 0 0 2 70 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 20 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 6 3 A5 0 2 F3 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BC 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F3     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 20 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 8 3 A5 0 2 F7 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BC 0 FF 35 69 68 4F 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F2     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 94 0 0 2 70 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 1E 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 6 3 A5 0 2 F1 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 69 68 50 56 0 0 0 68 0 0 0 FE AF 3 A2 47 C4 1     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 22 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 8 3 A5 0 2 F8 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 68 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F5     OK!!!
Receive:   FF FF FF 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F6     OK!!!
Receive:   FF FF FF 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 68 68 50 56 0 0 0 0 0 0 35 68 68 50 56 0 0 0     ERROR!!!
Receive:   FF FF FF 80 21 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 94 0 0 2 70 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 64 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 AD 8 0 20 0 0 1 85 C 8 3 A5 0 2 6C 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 C0 0 FF 35 68 68 4F 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F5     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 94 0 0 2 70 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 20 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 9 3 A5 0 2 F6 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BE 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F5     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 96 0 0 2 70 0 0 0 0 4 43 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 62 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 9 3 A5 0 2 39 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 35 68 68 50 56 0 0 0 47 7 23 A1 4 0 0 0 0 0 0     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 94 0 0 2 71 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 20 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 8 3 A5 0 2 F6 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BD 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F4     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 94 0 0 2 71 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 22 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 9 3 A5 0 2 F9 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF 34 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F5     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F0 0 0 D 94 0 0 2 70 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 22 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 9 3 A5 0 2 F5 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BC 0 FF 35 69 68 50 56 0 0 0 50 0 0 0 FE AF 3 A2 47 C4 1     ERROR!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F3 0 0 D 94 0 0 2 71 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 20 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 AD 8 0 20 0 0 1 85 C 9 3 A5 0 2 FB 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BE 0 FF 35 69 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F5     OK!!!
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D F2 0 0 D 93 0 0 2 70 0 0 0 0 4 44 0 0 0 0 32 C8 3 A5 4 29 3 20 E5 62 0 0 0 0 B 62 0 0 0 0 8 BA 0 0 C F2 A0 0 1 90 0 0 A9 8 0 20 0 0 1 85 C 9 3 A5 0 2 36 
Otpravil zapros 21 01
                         ReceiveGauge:   0 0 0 0 0 0 0 0 0 0 4 0 BC 0 FF 35 68 68 50 56 0 0 0 62 0 FE AF 3 A2 47 C4 1 7 F2     OK!!!

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

Значит средний расход за пройденый путь ты говорил формула такая. потраченое топливо разделить на проиденые километры и уножить на 100. Сделаем его L100M. Кака я понял его мы и будем использовать для нижней формулы остатков километров в баке. Как это реализовать в скетче?

И последнее это остаток километров в баке. твоя формула вроде эта S=1.00/(float)L100*Fuel*100. Fuel у нас есть, L100 у нас мгновенный(его я оставляю), как я понял будем использовать L100M. 

в меню будет так Fue Km/L: 200/16 где оставшиеся километры/литры   

                           L/100 Me:      7,5 где средний расход за пройденый путь

 Допишем  (еще не дописывал)

                Float L100M = 0;  средний за пройденый

                 KM = 0;              остаток киллометров

                 L100M = формула ;

                 КМ = 1.00/(float)L100M*Fuel*100 ;

И наконец-то будем заканчивать. вот скетч

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool MessageParse = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
  
  int numberbyte = 0;
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int waitbyte_gauge = 4;  
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;           //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int kmAge = 0;         //суточный пробег
  
  
  int colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  //float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {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};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
    myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {

  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}
//  else    {if (millis() - prevPIDgauge> 1000) {PIDsGauge(); prevPIDgauge = millis();}}
    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();
    
   }
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
                   
      myGLCD.printNumF(LHor, 1, 165, 40, '.',5);
      myGLCD.printNumF(L100, 1, 165, 75,'.',5 );
      myGLCD.printNumI(Fuel, 165, 110, 5 ); // литры
      //myGLCD.printNumI(KM, 165, 110, 50 ); //километры
      myGLCD.printNumI(h, 165, 145, 5 );  //средний пробег за поездку
      myGLCD.printNumI(PumpRPM, 165, 180,5);
      myGLCD.printNumI(RPM, 165, 215,5);
               
      myGLCD.printNumI(Temp, 410, 40, 3);
      myGLCD.printNumI(TempOil, 410, 75, 3);
      myGLCD.printNumI(TempFuel, 410, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3);
      myGLCD.printNumI(t, 410, 180, 3);
      myGLCD.printNumI(TempAir, 410, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(h, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


MessageParse = 0;
while (InitGauge && !MessageParse) {

 if (!dataMessageOK) {   
     if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge); }    
     if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
     else byte0=0;
     if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}
     else {byte0=0; byte1=0;}
     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     numberbyte=0;}

 else {

   if (mySerial_gauge.available()>0)  { MessageRxGauge[numberbyte] = mySerial_gauge.read(); numberbyte++; delayMicroseconds (250);}
      
      if (numberbyte==34) {dataMessageEND = 1; dataMessageOK = 0;}
     
     }
      

   if (dataMessageEND) { 
    int crc =  ( ( unsigned int )MessageRxGauge[32] << 8 ) | MessageRxGauge[33]; // парсинг контрольной суммы из 2 последних байт 
    int CRC =200;
    for (int i = 0; i < 32; i++) CRC = CRC + MessageRxGauge[i];                 // подсчет контрольной суммы байт от 0 до 31

    Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");}
 
 //при получении сообщения БЕЗ ошибок с данными от панели приборов, запишем в переменные остаток топлива и пробег
    if (CRC==crc) {Serial.println ("    OK!!!");
    
   Fuel = MessageRxGauge[17]/2;
   kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10;
    }
    
  else Serial.println ("    ERROR!!!");   
   dataMessageEND = 0; MessageParse = 1; //mySerial_gauge.flush();

    for (int i = 0; i < 34; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }}



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(195);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (0,255,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет зеленый 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (255,0,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет красный 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    //Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    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 Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(250,35,250,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("L/100 Ac:", 10, 75);
     myGLCD.print("Fue Km/L:", 10, 110);
     myGLCD.print("L/100 Me:", 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() ;
     Watch ();
     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("MAF  mg/s:", 10, 215);
     myGLCD.print("Humedad %:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     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() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  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, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  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 Watch (){
    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); //зеленый цвет цифры
  
    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);
    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); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

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

Ну уж эти кывыпы!!!  Сдались всё таки. По расходу  нужно сделать таким макаром. При включннии зажигания пробег записывается в переменную (kmAgeIGN), её можно использовать для показаний пробега за поездку (не путать с суточным):

if (kmAge>kmAgeIGN) kmTrip = kmAge - kmAgeIGN;

int 10km = 10;

Точно также с остатком топлива. При включннии зажигания остаток топлива записывается в переменную (FuelIGN), мониторя далее остаток топлива можно сделать показатель  - сколько топлива израсходовалось за поездку. 

FuelTrip = FuelIGN - Fuel;

Далее предлагаю такую логику для вычесления среднего расхода: каждые 10 км вычеслаяем средний расход: 

if (kmAge-kmAgeIGN>10km) {L100SR = (float)FuelTrip/(float)kmTrip*100.00; 10km = 10km + 10; и тут рандомно заносим этот расход в одну из 10 ячеек еепром }

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

Можно ещё сделать также средний расход на 100 км за поездку. 

 

 

 

 

viki13viki
Offline
Зарегистрирован: 14.11.2016
Я уже давно за тобой и твоими действиями и знаниями не успеваю. мне до тебя уже не до тянутся. Извени дружище но лимит моего понимания давно прошел. 
 при включении зажигания записываем в перемнную kmAgeIGN и FuelIGN. Не умею записывать 
.................................................................
 потраченые киллометры
  kmTrip = 0;
  kmTrip = kmAge - kmAgeIGN;    это понятно для вывода kmTrip
.................................................................
 потраченые литры
  FuelTrip = 0;
  FuelTrip = FuelIGN - Fuel;    это понятно для вывода FuelTrip
.................................................................
 здесь вообще не понимаю. не умею заносить и перещитывать ячейки.
  if (kmAge-kmAgeIGN>10km) {L100SR = kmTrip; 10km = 10km + 10; заносим в одну из 10и ячеек средний расход
 раз например в 15 км считаем среднее арифметическое между ячейками еепром. Не умею
 и вот здесь это значение уже выводим на экран 
.................................................................
 
средний расход за поездку
 L100Medio = 0; 
 L100Medio = (FuelTrip/kmTrip)*100; это понятно для вывода L100Medio
 или это L100SR (которое указано выше) должно быть а не L100Medio? 
.................................................................
столько прикольной инфы. прийдется немного меню переделать. 
 
MaksVV
Offline
Зарегистрирован: 06.08.2015

вот как то так

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool MessageParse = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
  
  int numberbyte = 0;
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int waitbyte_gauge = 4;  
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;            //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  float L100SR = 0;         //расход литров на 100км измеренный раз в интервал kmL  
  float L100SR_TFT = 0;     // расход литров на 100км который выводится на экран

  
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int FuelIGN = 0;      // количество топлвива в баке на момент включения зажигания
  int Fuel_last = 0;   // для формул
  bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания 
  int FuelTrip = 0;     // количество литров топлива, израсходованное за один цикл включения зажигания

  
 
  int kmAge = 0;             //суточный пробег
  int kmAgeIGN = 0;          //пробег который был в момент включения зажигания 
  int kmAge_last = 0;       // для формул
  bool flagkmAgeIGN = 0;     //флаг записан ли пробег в момент вкл. зажигания 
  int kmTrip = 0;            //пробег за один цикл включения зажигания
  int kmL = 10;               // интервал, через который будет происходить обновление среднего расхода на 100км
  int km = kmL;              // переменная для расчетов
  int kmeeprom = 10;         // интервал, через который будет происходить подсчет среднеарифмитического расхода  L100SR_TFT
  int kmTFT =  0;     // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT
  int kmREFUELING;            // пробег до заправки на остатке топлива 
  
  int colerror = 0;           //количество ошибок в правом верхнем углу третьего экрана
  //float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {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};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
   myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {



  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}
//  else    {if (millis() - prevPIDgauge> 1000) {PIDsGauge(); prevPIDgauge = millis();}}
    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();


if (kmTrip>kmTFT) {kmTFT = kmTrip + kmeeprom; 
// тут считаем среднеарифметический расход из ячеек еепром 
//  L100SR_TFT = 
}

FuelTrip = FuelIGN - Fuel;                          
if (kmAge>kmAgeIGN) kmTrip = kmAge - kmAgeIGN;    

if (kmTrip>km) {km=kmTrip+kmL; 

//L100SR = (float)FuelTrip/(float)kmTrip*100.00;

L100SR = (float)(Fuel_last-Fuel)/(float)(kmAge-kmAge_last) *100.00; // расход/100км  - обновляется раз в 10км
kmAge_last = kmAge; Fuel_last = Fuel;         // сохранение параметров с последнего измерениея
 

kmREFUELING=1.00/(float)L100SR*(float)Fuel*100.00;

// тут записываем рандомно L100SR в одну из ячеек еепром
}

   }
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
                   
      myGLCD.printNumF(LHor, 1, 165, 40, '.',5);
      myGLCD.printNumF(L100, 1, 165, 75,'.',5 );
      myGLCD.printNumI(Fuel, 165, 110, 5 ); // литры
      //myGLCD.printNumI(KM, 165, 110, 50 ); //километры
      myGLCD.printNumI(h, 165, 145, 5 );  //средний пробег за поездку
      myGLCD.printNumI(PumpRPM, 165, 180,5);
      myGLCD.printNumI(RPM, 165, 215,5);
               
      myGLCD.printNumI(Temp, 410, 40, 3);
      myGLCD.printNumI(TempOil, 410, 75, 3);
      myGLCD.printNumI(TempFuel, 410, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3);
      myGLCD.printNumI(t, 410, 180, 3);
      myGLCD.printNumI(TempAir, 410, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(h, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


MessageParse = 0;
while (InitGauge && !MessageParse) {

 if (!dataMessageOK) {   
     if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge); }    
     if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
     else byte0=0;
     if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}
     else {byte0=0; byte1=0;}
     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     numberbyte=0;}

 else {

   if (mySerial_gauge.available()>0)  { MessageRxGauge[numberbyte] = mySerial_gauge.read(); numberbyte++; delayMicroseconds (250);}
      
      if (numberbyte==34) {dataMessageEND = 1; dataMessageOK = 0;}
     
     }
      

   if (dataMessageEND) { 
    int crc =  ( ( unsigned int )MessageRxGauge[32] << 8 ) | MessageRxGauge[33]; // парсинг контрольной суммы из 2 последних байт 
    int CRC =200;
    for (int i = 0; i < 32; i++) CRC = CRC + MessageRxGauge[i];                 // подсчет контрольной суммы байт от 0 до 31

    Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");}
 
 //при получении сообщения БЕЗ ошибок с данными от панели приборов, запишем в переменные остаток топлива и пробег
    if (CRC==crc) {Serial.println ("    OK!!!");
    
   Fuel = MessageRxGauge[17]/2;
   kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10;

if (!flagkmAgeIGN) { kmAgeIGN = kmAge; flagkmAgeIGN =1;}
if (!flagFuelIGN) { FuelIGN = Fuel; flagFuelIGN =1;}
   
    }
    
  else Serial.println ("    ERROR!!!");   
   dataMessageEND = 0; MessageParse = 1; //mySerial_gauge.flush();

    for (int i = 0; i < 34; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }}



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(195);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (0,255,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет зеленый 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (255,0,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет красный 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    //Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    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 Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(250,35,250,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("L/100 Ac:", 10, 75);
     myGLCD.print("Fue Km/L:", 10, 110);
     myGLCD.print("L/100 Me:", 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() ;
     Watch ();
     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("MAF  mg/s:", 10, 215);
     myGLCD.print("Humedad %:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     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() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  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, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  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 Watch (){
    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); //зеленый цвет цифры
  
    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);
    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); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

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

viki13viki пишет:

 
средний расход за поездку
 L100Medio = 0; 
 L100Medio = (FuelTrip/kmTrip)*100; это понятно для вывода L100Medio
 или это L100SR (которое указано выше) должно быть а не L100Medio? 
.................................................................
столько прикольной инфы. прийдется немного меню переделать. 
 

хотелось вывести на экран такую цифру, которая будет ответом на вопрос - "сколько она у тебя жырёт?"

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

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

#1035 формулы поправил. Они находятся там, где ты с байтов брал литры и км, и в конце лупа

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

именно что по стилю езды лучше считать остаток килломеров в баке, так будет интереснее, так что? для этого лучше занести мою формулу  L100Medio = (FuelTrip/kmTrip)*100; и в твоей формуле kmREFUELING=1.00/(float)L100SR*(float)Fuel*100.00; надо просто заменить L100SR на L100Medio? и получим подстраиваемый результат? или оставить подсчитаный в интервал L100SR, так будет равномернее? без сильных скачков резултата на экране.

И последнее, чтобы я не запутался для вывода на экран

LHora  мгновенный расход в час. так и остался

L100  мгновенный на 100 км. так и остался

L100SR_TFT  средний расход

kmREFUELing   киллометров до заправки

FuelTrip     потрачено литров за поездку

kmTrip     пройдено киллометров за поездку

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

L100SR это расход /100км, обновляемый раз в 10 км

L100Medio можешь сделать расходом за поездку 

L100Medio = (FuelTrip/kmTrip)*100; - формула для этого правильная - вставить её в луп

по поводу переменных ты все правильно понял

 

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

понял. иду доделывать. позже отпишусь

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

я тоже с еепром не работал ещё. читай, там ниче сложного, библиотека есть

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

viki13viki пишет:

именно что по стилю езды лучше считать остаток килломеров в баке, так будет интереснее, так что? для этого лучше занести мою формулу  L100Medio = (FuelTrip/kmTrip)*100; и в твоей формуле kmREFUELING=1.00/(float)L100SR*(float)Fuel*100.00; надо просто заменить L100SR на L100Medio? и получим подстраиваемый результат? или оставить подсчитаный в интервал L100SR, так будет равномернее? без сильных скачков резултата на экране.

ну я уже вроде как в формулу всё и подствил уже для адекватного реагирования параметра пробег до заправки.

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

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

вот добавил еепром, не знаю работает ли, проверить бы надо

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #include <EEPROM.h> 
  
  #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);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool MessageParse = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
  
  int numberbyte = 0;
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int waitbyte_gauge = 4;  
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;            //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  float L100SR = 0;         //расход литров на 100км измеренный раз в интервал kmL  
  float L100SR_TFT = 0;     // расход литров на 100км который выводится на экран

  int L100_Eeprom[11]= {10,10,10,10,10,10,10,10,10,10,10};

  
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int FuelIGN = 0;      // количество топлвива в баке на момент включения зажигания
  int Fuel_last = 0;   // для формул
  bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания 
  int FuelTrip = 0;     // количество литров топлива, израсходованное за один цикл включения зажигания

  
 
  int kmAge = 0;             //суточный пробег
  int kmAgeIGN = 0;          //пробег который был в момент включения зажигания 
  int kmAge_last = 0;       // для формул
  bool flagkmAgeIGN = 0;     //флаг записан ли пробег в момент вкл. зажигания 
  int kmTrip = 0;            //пробег за один цикл включения зажигания
  int kmL = 10;               // интервал, через который будет происходить обновление среднего расхода на 100км
  int km = kmL;              // переменная для расчетов
  int kmeeprom = 10;         // интервал, через который будет происходить подсчет среднеарифмитического расхода  L100SR_TFT
  int kmTFT =  0;     // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT
  int kmREFUELING;            // пробег до заправки на остатке топлива 
  
  int colerror = 0;           //количество ошибок в правом верхнем углу третьего экрана
  //float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {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};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
   myGLCD.setFont(GroteskBold16x32);   

    for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
    for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];
    L100SR_TFT = (float)L100SR_TFT/110.00;
    
    currentPage = '0';       
    drawHomeScreen();  
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
    
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {



  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}
//  else    {if (millis() - prevPIDgauge> 1000) {PIDsGauge(); prevPIDgauge = millis();}}
    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();


if (kmTrip>kmTFT) {kmTFT = kmTrip + kmeeprom; 
// тут считаем среднеарифметический расход из ячеек еепром 
for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);

for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];


  L100SR_TFT = (float)L100SR_TFT/110.00;


}

FuelTrip = FuelIGN - Fuel;                          
if (kmAge>kmAgeIGN) kmTrip = kmAge - kmAgeIGN;    

if (kmTrip>km) {km=kmTrip+kmL; 

//L100SR = (float)FuelTrip/(float)kmTrip*100.00;

L100SR = (float)(Fuel_last-Fuel)/(float)(kmAge-kmAge_last) *100.00; // расход/100км  - обновляется раз в 10км
kmAge_last = kmAge; Fuel_last = Fuel;         // сохранение параметров с последнего измерениея
 

kmREFUELING=1.00/(float)L100SR*(float)Fuel*100.00;

// тут записываем рандомно L100SR в одну из 11 ячеек еепром
EEPROM.write(random(0, 10), kmREFUELING*10);  

}

   }
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
                   
      myGLCD.printNumF(LHor, 1, 165, 40, '.',5);
      myGLCD.printNumF(L100, 1, 165, 75,'.',5 );
      myGLCD.printNumI(Fuel, 165, 110, 5 ); // литры
      //myGLCD.printNumI(KM, 165, 110, 50 ); //километры
      myGLCD.printNumI(h, 165, 145, 5 );  //средний пробег за поездку
      myGLCD.printNumI(PumpRPM, 165, 180,5);
      myGLCD.printNumI(RPM, 165, 215,5);
               
      myGLCD.printNumI(Temp, 410, 40, 3);
      myGLCD.printNumI(TempOil, 410, 75, 3);
      myGLCD.printNumI(TempFuel, 410, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3);
      myGLCD.printNumI(t, 410, 180, 3);
      myGLCD.printNumI(TempAir, 410, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(h, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


MessageParse = 0;
while (InitGauge && !MessageParse) {

 if (!dataMessageOK) {   
     if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge); }    
     if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
     else byte0=0;
     if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}
     else {byte0=0; byte1=0;}
     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     numberbyte=0;}

 else {

   if (mySerial_gauge.available()>0)  { MessageRxGauge[numberbyte] = mySerial_gauge.read(); numberbyte++; delayMicroseconds (250);}
      
      if (numberbyte==34) {dataMessageEND = 1; dataMessageOK = 0;}
     
     }
      

   if (dataMessageEND) { 
    int crc =  ( ( unsigned int )MessageRxGauge[32] << 8 ) | MessageRxGauge[33]; // парсинг контрольной суммы из 2 последних байт 
    int CRC =200;
    for (int i = 0; i < 32; i++) CRC = CRC + MessageRxGauge[i];                 // подсчет контрольной суммы байт от 0 до 31

    Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");}
 
 //при получении сообщения БЕЗ ошибок с данными от панели приборов, запишем в переменные остаток топлива и пробег
    if (CRC==crc) {Serial.println ("    OK!!!");
    
   Fuel = MessageRxGauge[17]/2;
   kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10;

if (!flagkmAgeIGN) { kmAgeIGN = kmAge; flagkmAgeIGN =1;}
if (!flagFuelIGN) { FuelIGN = Fuel; flagFuelIGN =1;}
   
    }
    
  else Serial.println ("    ERROR!!!");   
   dataMessageEND = 0; MessageParse = 1; //mySerial_gauge.flush();

    for (int i = 0; i < 34; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }}



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(195);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (0,255,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет зеленый 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (255,0,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет красный 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    //Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    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 Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(250,35,250,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("L/100 Ac:", 10, 75);
     myGLCD.print("Fue Km/L:", 10, 110);
     myGLCD.print("L/100 Me:", 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() ;
     Watch ();
     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("MAF  mg/s:", 10, 215);
     myGLCD.print("Humedad %:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     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() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  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, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  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 Watch (){
    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); //зеленый цвет цифры
  
    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);
    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); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

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

сейчас проверю

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

не знаю как проверить или работает но, могу сказать что сделал первый кружок 1.3 км и среднем расходе были нули. добавил твои строки которые нашел с еепромом и сделал еще один кружок 1.3 км и мне показало средний расход 25.5 л/100. выключил зажигание и сново включил , сново нули. как думаешь работает? вот скетч со всеми моими подправками, меню и т.д. пока так. потом допилю

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #include <UTouch.h>
  #include <UTFT.h>
  #include <SPI.h>
  #include <EEPROM.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);
  
 
  
  extern uint8_t GroteskBold16x32[];
 
  int x, y;
  char currentPage;

  float h;
  float t;

  
  bool Dvoet = 0;

  //////////////////////////////////////////////////////////////////////////////
  //все что касается OBD2
  ///////////////////////////////////////////////////////////////////////////////
  #include <SoftwareSerial.h>
  SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
  #define mySerial_gauge Serial2
  
  #define TX_gauge 16
  #define TX 13

  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;

  bool InitGauge = 0;
  bool dataMessageOK=0;
  bool dataMessageEND = 0;
  bool MessageParse = 0;
  bool byte0 = 0;
  bool byte1 = 0;
  bool byte2 = 0; 
  
  int numberbyte = 0;
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int waitbyte_gauge = 4;  
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100M = 0;           //мгновенные расход на 100 км
  float L100 = 0;            //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  float L100SR = 0;         //расход литров на 100км измеренный раз в интервал kmL  
  float L100SR_TFT = 0;     // расход литров на 100км который выводится на экран

  int L100_Eeprom[11]= {10,10,10,10,10,10,10,10,10,10,10};
  
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible

  int Fuel = 0;         //остаток топлива
  int FuelIGN = 0;      // количество топлвива в баке на момент включения зажигания
  int Fuel_last = 0;   // для формул
  bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания 
  int FuelTrip = 0;     // количество литров топлива, израсходованное за один цикл включения зажигания
  
  
  
  int kmAge = 0;             //суточный пробег
  int kmAgeIGN = 0;          //пробег который был в момент включения зажигания 
  int kmAge_last = 0;       // для формул
  bool flagkmAgeIGN = 0;     //флаг записан ли пробег в момент вкл. зажигания 
  int kmTrip = 0;            //пробег за один цикл включения зажигания
  int kmL = 10;               // интервал, через который будет происходить обновление среднего расхода на 100км
  int km = kmL;              // переменная для расчетов
  int kmeeprom = 10;         // интервал, через который будет происходить подсчет среднеарифмитического расхода  L100SR_TFT
  int kmTFT =  0;     // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT
  int kmREFUELING;            // пробег до заправки на остатке топлива 
  
  int colerror = 0;           //количество ошибок в правом верхнем углу третьего экрана
  //float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
  byte MessageRxGauge[60] = {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};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
   myGLCD.setFont(GroteskBold16x32);   
    
    currentPage = '0';       
    drawHomeScreen();  
    
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    pinMode(TX_gauge, OUTPUT);
    fastinit();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //SETUP FIN
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //LOOP
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   void loop() {



  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (millis() - prevPID > PIDTime) {PIDs();  prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
    if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (500); 
     digitalWrite (TX_gauge, LOW);   delay (20);
     digitalWrite (TX_gauge, HIGH ); delay (15);
     digitalWrite (TX_gauge, LOW);   delay (5);
     digitalWrite (TX_gauge, HIGH);  delay (5);
     mySerial_gauge.begin(9600);}
//  else    {if (millis() - prevPIDgauge> 1000) {PIDsGauge(); prevPIDgauge = millis();}}
    receive ();
    if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis();}
    if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
    if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
    Menu();
    LCDDataPrint();

L100M = (FuelTrip/kmTrip)*100;
if (kmTrip>kmTFT) {kmTFT = kmTrip + kmeeprom; 
// тут считаем среднеарифметический расход из ячеек еепром 
for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];

  L100SR_TFT = (float)L100SR_TFT/110.00;
 
}

FuelTrip = FuelIGN - Fuel;                          
if (kmAge>kmAgeIGN) kmTrip = kmAge - kmAgeIGN;    

if (kmTrip>km) {km=kmTrip+kmL; 



L100SR = (float)(Fuel_last-Fuel)/(float)(kmAge-kmAge_last) *100.00; // расход/100км  - обновляется раз в 10км
kmAge_last = kmAge; Fuel_last = Fuel;         // сохранение параметров с последнего измерениея
 

kmREFUELING=1.00/(float)L100SR*(float)Fuel*100.00;

// тут записываем рандомно L100SR в одну из 11 ячеек еепром
EEPROM.write(random(0, 10), kmREFUELING*10); 
}

   }
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (millis() - prevData > Datadelay){  
     
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0, 3);
      
     if (currentPage == '0') {
                   
      myGLCD.printNumF(LHor, 1, 60, 40, '.',5);
      myGLCD.printNumF(L100, 1, 195, 40,'.',5 );
      myGLCD.printNumF(L100M, 1, 60, 75,'.',5 ); 
      myGLCD.printNumF(L100SR_TFT, 1, 195, 75,'.',5 );
      myGLCD.printNumI(kmREFUELING, 60, 110,5 ); 
      myGLCD.printNumI(Fuel, 195, 110,5);
      myGLCD.printNumI(kmTrip, 60, 145,5); 
      myGLCD.printNumI(FuelTrip, 195, 145,5);
      myGLCD.printNumI(PumpRPM, 195, 180,5);
      myGLCD.printNumI(RPM, 195, 215,5);
               
      myGLCD.printNumI(Temp, 415, 40, 3);
      myGLCD.printNumI(TempOil, 415, 75, 3);
      myGLCD.printNumI(TempFuel, 415, 110,3); 
      myGLCD.printNumI(sensors.getTempCByIndex(0), 415, 145 , 3);
      myGLCD.printNumI(t, 415, 180, 3);
      myGLCD.printNumI(TempAir, 415, 215, 3);
      
    }
   
    if (currentPage == '1') {
     
      myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3);
      myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
      myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
      myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
      myGLCD.printNumI(MAF, 170, 215, 4);
      myGLCD.printNumF(h, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
      myGLCD.printNumI(EGRmg, 395, 110, 4);  
      myGLCD.printNumF(EGRPul,1, 395, 145,'.',3);  
      myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
      myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3);
        
      }
     prevData = millis();
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }

 void PIDsGauge() {
   Serial.println ("                Otpravil zapros 02 11 na panel");
   mySerial_gauge.write (0x02);    delay (1);
   mySerial_gauge.write (0x11);    delay (1);
   mySerial_gauge.write(byte(0));  delay (1);
   mySerial_gauge.write (0x13);
 }
     

 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {

        ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)

while(!InitGauge){


if (mySerial_gauge.available()) {

    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
 if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
 if (inByte==0xF0) {
     mySerial_gauge.write (0x02);  delay (1);
     mySerial_gauge.write (0x11);  delay (1);
     mySerial_gauge.write (0x00);  delay (1);
     mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  } } }


MessageParse = 0;
while (InitGauge && !MessageParse) {

 if (!dataMessageOK) {   
     if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge); }    
     if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
     else byte0=0;
     if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}
     else {byte0=0; byte1=0;}
     if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
     numberbyte=0;}

 else {

   if (mySerial_gauge.available()>0)  { MessageRxGauge[numberbyte] = mySerial_gauge.read(); numberbyte++; delayMicroseconds (250);}
      
      if (numberbyte==34) {dataMessageEND = 1; dataMessageOK = 0;}
     
     }
      

   if (dataMessageEND) { 
    int crc =  ( ( unsigned int )MessageRxGauge[32] << 8 ) | MessageRxGauge[33]; // парсинг контрольной суммы из 2 последних байт 
    int CRC =200;
    for (int i = 0; i < 32; i++) CRC = CRC + MessageRxGauge[i];                 // подсчет контрольной суммы байт от 0 до 31

    Serial.print ("                         ReceiveGauge:   ");
    for (int i = 0; i < 34; i++) {
    Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");}
 
 //при получении сообщения БЕЗ ошибок с данными от панели приборов, запишем в переменные остаток топлива и пробег
    if (CRC==crc) {Serial.println ("    OK!!!");
    
   Fuel = MessageRxGauge[17]/2.00;
   kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10.00;

if (!flagkmAgeIGN) { kmAgeIGN = kmAge; flagkmAgeIGN =1;}
if (!flagFuelIGN) { FuelIGN = Fuel; flagFuelIGN =1;}
   
    }
    
  else Serial.println ("    ERROR!!!");   
   dataMessageEND = 0; MessageParse = 1; //mySerial_gauge.flush();

    for (int i = 0; i < 34; i++) MessageRxGauge[i]=0; // очистка байтов массива
    }}



      ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
     if (mySerial.available()) {
     delay(195);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


   if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
        myGLCD.clrScr();             
        drawscreen_three();      
        myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){
      Serial.println ("DTC is found!");
        myGLCD.clrScr();             
        drawscreen_three();       

   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (0,255,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет зеленый 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (255,0,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет красный 

      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей 
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр
 
if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля
if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо
       }
    }
   


    //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    //Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

 
    if  (MessageRx[21]<=0x0A) A = 277;
    if  (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[21]>=0x0D) A = 279;
    B = MessageRx[22]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempOil =  ((MessageRx[21]*26)-A)+cel;


    if  (MessageRx[61]<=0x0A) A = 277;
    if  (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[61]>=0x0D) A = 279;
    B = MessageRx[62]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempFuel =  ((MessageRx[61]*26)-A)+cel;
      
    timerenabledPID=0; 
   }
      for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
     }
     
     
   }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    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 Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     Watch ();
     myGLCD.drawLine(280,35,280,248); // линия вертикальная
     myGLCD.print("L/H     L/A", 10, 40);
     myGLCD.print("L/V     L/M", 10, 75);
     myGLCD.print("D/K     D/L", 10, 110);
     myGLCD.print("V/K     V/L", 10, 145);
     myGLCD.print("PUMP RPM", 10, 180);
     myGLCD.print("Engi RPM", 10, 215);
     myGLCD.print("Motor *C", 285, 40);
     myGLCD.print("Oil   *C", 285, 75);
     myGLCD.print("Fuel  *C", 285, 110);
     myGLCD.print("Inter *C", 285, 145);
     myGLCD.print("Exter *C", 285, 180);
     myGLCD.print("IntAir*C", 285, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     Watch ();
     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("MAF  mg/s:", 10, 215);
     myGLCD.print("Humedad %:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     Watch ();
     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() {
     Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  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, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.print("HOME", 1, 0); // центровка строки
    }

    void buttonHomeTouch(){
      if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
        drawFrame(1, 1, 65, 33);
        currentPage = '0';
        myGLCD.clrScr();
        drawHomeScreen(); 
       
      }}

     
     
  void buttonINF1() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("INF 1", 25, 265);
    }
   void buttonINF1Touch() {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();       
       
      } }

   
  void buttonINF2() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (180, 255, 300, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (180, 255, 300, 310);
     myGLCD.print("INF 2", 200, 265);
    }
  void buttonINF2Touch() {
    if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
        drawFrame(180, 255, 300, 310); 
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();   
                                                                      
      }}
  
  void buttonCHECK() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("CHECK", 375, 265);
    }
  void buttonCHECKTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();   
                                                                         
      } }

  
    void buttonERASE() {
    myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (10, 255, 120, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (10, 255, 120, 310);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
              
                                                                         
      }}
      
    void buttonREAD() {
     myGLCD.setColor(0,0,0);
     myGLCD.fillRoundRect (350, 255, 470, 310);
     myGLCD.setColor(0, 255, 0);
     myGLCD.drawRoundRect (350, 255, 470, 310);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        
                                                                           
      }}

  ////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка линий
  ///////////////////////////////////////////////////////////////////////////////////////
  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 Watch (){
    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); //зеленый цвет цифры
  
    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);
    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); }
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

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

так же косяк с потраченными км, показывает минуса с разными цифрами, 

так же средний расход за поездку, нули. может маленькая дистанция 1.3 км

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

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

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

формулу L100M не туда запихал. в строку  226 надо вставить, а то только раз в 10 км будет обновляться

 

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

думаю сегодня и завтра сделаю километров 50, и будет видно, что работает что нет.

 

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

подправил 1045. вставил L100M = (FuelTrip/kmTrip)*100; после лсд дата принт. и подправил кое что.

сделал еще кружок. L100M расход за проиденый путь, при старте показал 100.00 , при движении сменился на -100.0. мало проехал. ему по ходу нечего толком делить. проехал 1км и кончно будет 100. после поездки будет видно. как то бы сделать чтобы начинал отображать когда kmTrip будет больше  5 км . а то всегда при старте будет выдавать 100.00, не красиво налаживается на букву. Кстати FuelTrip и kmTrip тоже можно от 5км начать отображение. 

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

viki13viki пишет:
добавил твои строки которые нашел с еепромом ......выключил зажигание и сново включил , сново нули. как думаешь работает?

похоже не все нашел. Сравни функции сетап. У меня в сетапе в переменную L100SR_TFT сразу из еепрома значение записывается, а у тебя нет. Поэтому были нули