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

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

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

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

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

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

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

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

ок.  спасибо

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

а теперь раскоментируй только строку с инициализацией

mySerial_gauge.begin(9600);  строка 183. может после этого всё обламывается, типа два софтсериала глючат между собой, если да, то надо на хард переходить 

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

секунду......

результат

Otpravil zapros Init
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
Otpravil zapros 21 01
Otpravil zapros 21 01
Otpravil zapros 21 01
 
думаешь что это все? только хард?

 

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

вот оно, косяк то не в задержках, да, надо пробовать хард. Убедись 100% что если опять закоментировать, данные начинают идти?

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

меняется всё просто, переключаешь провода например на сериал 2.  в скетче название сериалов даже можно оставить, а перенаправить на хард так

#define mySerial Serial2

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

да. данные сново идут. 

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

блин лучше правда 12 контакт на хард вешать

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

короче вешай 12 контакт на хард Сериал2 например. Заливай скетч, 895# и исправвляй на хард, проверяй как данные идут

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

перецепить 12 контакт (10 pin и 11 pin )на TX2 -16 pin, RX2 -17 pin? я правильно понял. в скетче подправить номера пинов на 16 и 17 и прописать #define mySerial Serial2, и везде где есть просто сериал на Serial2, так?

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

viki13viki пишет:
перецепить 12 контакт (10 pin и 11 pin )на TX2 -16 pin, RX2 -17 pin? я правильно понял. в скетче подправить номера пинов на 16 и 17 и прописать #define mySerial Serial2

это да, так и надо

viki13viki пишет:
и везде где есть просто сериал на Serial2, так?  

это нет. Просто Serial не трогай, ведь это у нас просто вывод в монитор для визуального контроля, это вообще другое

 

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

только прописать надо такую строчку #define mySerial_gauge Serial2   ты же софтсериал панели будешь переключать, а он у нас называеться mySerial_gauge

а блин, в том же скетче просто meSerial был, которче так надо



#define TX 16

#define mySerial Serial2


void setup() {
delay (500);
Serial.begin(115200);
pinMode (TX, OUTPUT);

digitalWrite (TX, HIGH);
delay (500);
digitalWrite (TX, LOW);
delay (20);
digitalWrite (TX, HIGH );
delay (15);
digitalWrite (TX, LOW);
delay (5);
digitalWrite (TX, HIGH);
delay (5);

mySerial.begin(9600); 

}

void loop() {


if (mySerial.available()) {

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

 

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

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

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

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

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

с часами ок, хорошо. Хоть одна проблема ушла, а то тяжко чето твой бортовик эволюционирует. ПС. сообщение 964 поправил, скетч запостил

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

я чета запутался. мы же остаемся на тойже ардуине с основным скетчем, просто я перекидываю с 10 11 на 16 17 и это в основном скетче у нас идет mySerial_gauge а не просто сериал, просто сериал у нас теперь сидит на 12 13 это контакт 7. а 10 11 это у нас теперь mySerial_gauge. зачем тогда отдельный скетч? 

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

это да, но пока мы другой скетч временно заливаем (который рабочий с данными на панель), а там просто mySerial было. 

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

просто проверить работу адаптера на харде и как он с контактом 12 ОБД коннекнтится, скетч то мы знаем что рабочий

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

ааа.... понял. завтра забадяжу. туплю в конце дня

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

кстати в основном скетче. просто Serial у нас вообще ни начём не сидит, а используется только для вывода в сериал монитор , а 12,13 (контакт 7 обд) это софт сериал под именем mySerial

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

я имел в виду mySerial. завтра голова будет свежее.

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
 
 // SoftwareSerial mySerial_gauge (10, 11 ); //RХ,TХ
  
  #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 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();

    Baud_200init();
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //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(); 
  //  if (InitGauge){PIDsGauge();} 
      prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = 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 хард Serial2 (12 контакт ОБД) 
  
  int sh = 0;
while (mySerial_gauge.available()&& !InitGauge && sh < 50) {
  sh++;
    byte inByte = mySerial_gauge.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
    if (inByte==0x80) {
      mySerial_gauge.write (0x7F); delay (1);
      Serial.print ("Otpravil 7F  "); }
    if (inByte==0xF0) {PIDsGauge(); InitGauge=1;}
    
   }


if (mySerial_gauge.available()&& InitGauge) {
  delay(61);
     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 =          каким байтам равен остаток топлива?
  // kmAge =          каким байтам равен суточный пробег? 
    }
    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 Baud_200init(){
   Serial.println ("200BaudInit. Transmiting adress Gauges 0x8B");
     digitalWrite (TX_gauge, HIGH);  delay (200); 
     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);
  
  }




  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  //запрос чтения и стирания ошибок
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  
  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

ок

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

кстати почитал про одновременное использование двух портов софтсериала - никактит - у всех проблемы

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

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

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

И так. Перепаял на серила2. проверил работающим скетчем для 12 пина. вот результат, разбил для удобства

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 2 11 0 13 
23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF A4 F E 19 46 0 0 0 A 19 81 AF 3 1F 48 C8 1 6 30 
23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 BE 0 FF A4 E E 19 46 0 0 0 A 19 81 AF 3 1F 48 C8 1 6 2E 
23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 BF 0 FF A4 E E 19 46 0 0 0 A 19 81 AF 3 1F 48 C8 1 6 2F 
23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 BE 0 FF A3 F E 19 46 0 0 0 A 19 81 AF 3 1F 48 C8 1 6 2E 

потом залил твой последний скетч из поста 974, вот результат

200BaudInit. Transmiting adress Gauges 0x8B
Otpravil zapros Init
 55Receive:   0 FF FF 
 52 80Otpravil 7F   55 52 80Otpravil 7F   7F 7FOtpravil zapros Init
Receive:   FF FF 
Otpravil zapros Init
Receive:   FF FF 
Otpravil zapros Init
Receive:   FF FF 
Otpravil zapros Init
Receive:   FF FF 

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

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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Х
  SoftwareSerial mySerial_gauge (17, 16 ); //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 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(); if (InitGauge){PIDsGauge();} prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}
      if (!InitGauge) {
     Serial.println ("Otpravil zapros adress Gauge");
     digitalWrite (TX_gauge, HIGH);  delay (200); 
     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); }
   
 }  
      
     
    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 контакт ОБД)

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 =          каким байтам равен остаток топлива?
  // kmAge =          каким байтам равен суточный пробег? 
    }
    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();
    }
 

вот его результат. 7 контакт отображается на экране

 

Otpravil zapros Init
Receive:   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
Otpravil zapros adress Gauge
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 19 0 0 C 9D 0 0 2 70 0 0 0 0 4 3A 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 B 5F 0 0 0 0 8 DE 0 0 C E5 A0 0 1 90 0 0 A9 8 0 20 0 0 1 95 C 7F 3 9E 0 2 E8 
Otpravil zapros 21 01
Otpravil zapros adress Gauge
                         ReceiveGauge:   55 52 80 55 52 80 
                       InitGauge  OK!!!!:  
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 17 0 0 C 9C 0 0 2 6F 0 0 0 0 4 3C 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 B 5F 0 0 0 0 8 DF 0 0 C E5 A0 0 1 90 0 0 A9 8 0 20 0 0 1 95 C 7F 3 9E 0 2 E7 
Otpravil zapros 21 01
                Otpravil zapros 02 11 na panel
                         ReceiveGauge:   7F 2 11 0 13 
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 17 0 0 C 9C 0 0 2 6F 0 0 0 0 4 39 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 B 5F 0 0 0 0 8 DF 0 0 C E5 A0 0 1 90 0 0 A9 8 0 20 0 0 1 95 C 7D 3 9E 0 2 E2 
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 D 17 0 0 C 9C 0 0 2 6F 0 0 0 0 4 39 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 B 5F 0 0 0 0 8 DF 0 0 C E5 A0 0 1 90 0 0 AD 8 0 20 0 0 1 95 C 7F 3 9E 0 2 E8 
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 D 17 0 0 C 9C 0 0 2 6F 0 0 0 0 4 3A 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 B 60 0 0 0 0 8 DF 0 0 C E5 A0 0 1 90 0 0 A9 8 0 20 0 0 1 95 C 7F 3 9E 0 2 E6 
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 D 17 0 0 C 9B 0 0 2 70 0 0 0 0 4 3A 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 B 20 0 0 0 0 8 DF 0 0 C E5 A0 0 1 90 0 0 AD 8 0 20 0 0 1 95 C 7F 3 9E 0 2 AA 
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 D 17 0 0 C 9D 0 0 2 6F 0 0 0 0 4 39 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 B 1D 0 0 0 0 8 DF 0 0 C E5 A0 0 1 90 0 0 A9 8 0 20 0 0 1 95 C 7F 3 9E 0 2 A3 
Otpravil zapros 21 01

работает однако хе хе хе.... осталось добится получения данных от панели. 

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

странно, что у тебя видит на пине RX Serial2 (17 Пин ардуино) то, что отправляется на с 16 мина TX. Например при   проверке рабочим скечем, там сначала идёт 55 52 80 а затем мы с порта 16 отсылаем 7F и его по идее не должно быть видно, а этот байт виден. Также в основном скетче потом посылаем портом ТХ запросы 02 11 0 13 и их же видим в RX порту , так не должно быть это эхо какоето. 

ТЫ коряво конечно переделал на хард сериал. 

Когда пишеш Serial2 пины уже  назнычены на 16,17. А ты взял заинициализировал софт сериал на порты хардсериала)))

в итоге у тебя походу софт сериал всё таки работает))

строку 050 убери!!

 

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

так что нужно сделать? нужно поменять местами TX RX или в скетче поменять на 17 пин или убрать строчку SoftwareSerial mySerial_gauge (17, 16 ); //RХ,TХ. Скажи что нужно сделать

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

секунду сейчас уберу

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

да вообще её убрать или закоментируй

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

результат тот же

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

может у тебя замыкание между этими пинами ? блин фигня какаято , не должно так быть

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

может флюс. щас продизенфицирую. и попробую

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

неа. протер но все было чисто. результат тотже

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

ну не знаю щас в цикл while воткнем цикл луп с рабочего скетча пустьб вертится, посмотрим

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 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(); if (InitGauge){PIDsGauge();} prevPID = millis();}}
      else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}
 
   
 }  
      
     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);
    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 контакт ОБД)
/*
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 =          каким байтам равен остаток топлива?
  // kmAge =          каким байтам равен суточный пробег? 
    }
    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; // очистка байтов массива
   }

*/

while(1){


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.write (0x02);
     delay (1);
     mySerial.write (0x11);
     delay (1);
     mySerial.write(byte(0));
     delay (1);
     mySerial.write (0x13);
     delay (1);
   }
     
    }
}



 


      ////////////////// работа с К-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 и тишина

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

#988 исправил пробуй

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 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 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 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 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 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 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 
MaksVV
Offline
Зарегистрирован: 06.08.2015

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

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

а где данные начина с 23? почему то их нет хотя скетч такой же

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

в том то идело что нет, только идентификация идет

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

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

сбрасываемый счетчик пробега - kmAge = (MessageRxGauge[26]+(MessageRxGauge[27]*256))/10.00;

а вот бак солярка  - Fuel = MessageRxGauge[20]/2.00;

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

проверь наш рабочий скетч, 5 раз. каждыйраз ли данные начиная с 23 будут идти? ничего не понимаю, скетч один в один в большом скетче просто в цикле while всё тормозится, и этот цикл становится как луп с рабочего скетча

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

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

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

строки 349 - 355 сделай там вместо mySerial       нужно это    my.Serial_gauge

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

в скетче из 988 или моего последнего из 978? понял в 988. сейчас....

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

данные пошли, но 7 ничего. вот результат

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 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 FF 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 AF 0 FF 9B 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 9A C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 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 0 0 0 4 0 B2 0 FF 9A C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 AF 0 FF 9B D C 1B 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 9A C C 1B 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B1 0 FF 9B D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 9A C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 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 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 98 D 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 9A D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 98 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 B0 0 FF 9A D C 1B 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 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 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 AF 0 FF 9A C C 1B 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 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 B0 0 FF 9A 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 B1 0 FF 9A 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 B0 0 FF 9B 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 B2 0 FF 9A C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B0 0 FF 9B 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 B2 0 FF 9A C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B0 0 FF 9B D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 9A D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 3 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B1 0 FF 9B D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 9A C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 9A C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 98 D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 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 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 98 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 B0 0 FF 9A D 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 B3 0 FF 99 D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2 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 FF 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B2 0 FF 99 B 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 B0 0 FF 9A D 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 B2 0 FF 99 C C 1B 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B0 0 FF 9B 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 D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B0 0 FF 9B D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 9A D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 3 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B0 0 FF 9B D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 9A D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 3 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B1 0 FF 9B D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 9A C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B1 0 FF 9B D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 9A D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 3 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 9A D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 3 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 99 D C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B0 0 FF 9A D 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 B3 0 FF 99 C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 1 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 FF 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B3 0 FF 9A C C 1A 47 0 0 0 F 0 85 AF 3 1B 48 C7 1 6 2