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

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

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

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

короче ппц как у тебя скетч загадочно меняется. ещё куда то две строчки делись вот здесь

 

if (currentPage == '3'){
334      //при получении этого сообщения выдавать на третий экран "NO DTC"
335      if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
336      myGLCD.clrScr();           
337      drawscreen_three();
338      myGLCD.print("NO DTC", 165, 145);
339      Serial.println ("     NO DTC  ");
340      }
341      //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
342      if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
343      myGLCD.clrScr();           
344      drawscreen_three();
345      myGLCD.print("DTC BORRADO", 165, 145);
346      Serial.println ("     DTC BORRADO  ");
347      }
348      // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
349      if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58){
350      Serial.println ("DTC is found!");
351  
352       for (int i=0; i<MessageRx[8]; i++ ) {
353       int y = i*35;
354      bool nolA=0; bool nolB =0;
355       if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
356      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный
357       if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0); 
358      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый
359  
360      myGLCD.print("ERROR ", 50, (75+y));
361      myGLCD.printNumI((i+1), 150, (75+y));
362       if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
363       if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
364       if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
365       if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y));
366  
367       if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
368       if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}
369       if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y));
370        else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y));
371  
372       if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
373       if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;}
374       if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y));
375        else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));}
376        }
377      }

в строке 351 где вот это ? 

myGLCD.clrScr();  

drawscreen_three();

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

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

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

viki13viki пишет:

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

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

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

viki13viki пишет:

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

потому что я туда их добавил,  а ты убрал зачем то 

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

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

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

Заметь, ещё в скетче из сообщения #636 проверка по байтам правильная была, потом эта проверка сначала у тебя назад исправилась в "последних" версиях, потом и Watch() опять куда то убежал. 

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

короче бери скетч из сообщения #740. Ставь как надо Watch(). Сделай рабочую "затирку" при распечатке параметров на экран и больше НИЧЕГО не меняй. 

Я ведь там взял убрал из функций чтения кнопок Erase и  Read 

очистку экрана;

прорисовку экрана №3 

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

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

очистку экрана; 

прорисовка экрана №3 

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

Понял.

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

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

#include <RTC.h>
RTC	time;

void setup() {
	delay(300);
	Serial.begin(9600);
//	инициализация модуля RTC
	time.begin(RTC_DS3231);	}		// на базе чипа DS3231						модуль подключается к аппаратным выводам I2C


void loop(){
	if(millis()%1000==0){ // если прошла 1 секунда
	  Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
	  delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
	}
}

библиотека RTC https://yadi.sk/d/6yVyfrrw3LExcD

 

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

Ок. Сенкс.

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

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

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

viki13viki пишет:

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

 
 
 

короче я вспомнил чё у меня было. я не убрал строку настройки часов, у тебя она тоже была всё время раскомментирована. Ты один раз её оставь чтоб часы настроить, потом закоментируй (можешь вообще убрать) и ещё раз скетч залей, а то при каждом старте ардуины у тебя часы настроиваются заново на то время которое указано в той строке. Хех вот даже в скетче у тебя ответ на вопрос ))))

 // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 19, 15, 24, 0));

 

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

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

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

вот такой скетч попробуй, я конечно тут ппц всего навырезал, может ниче не заработает ))

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

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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(10, 11); //RХ,TХ
  #define TX 11

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

  
  bool Init = 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 colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
 
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 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, 19, 15, 24, 0));
    
    Temperature ();
    
    pinMode(TX, OUTPUT);
    fastinit();
  }

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

   void loop() {
    unsigned long curPID = millis ();
    unsigned long curpres = millis ();
    unsigned long curTemperature = millis();
    unsigned long curWatch = millis();  
    unsigned long curDvoet = millis();  
    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 (curPID - prevPID > PIDTime) {PIDs(); prevPID = curPID;}}
      else if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}}
    if (curWatch - prevWatch > 3000)  { Watch (); prevWatch = curWatch;}
    if (curTemperature - prevTemperature > 60000)  { Temperature (); prevTemperature = curTemperature;}
    if (curDvoet - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
    receive ();
    Menu();
    LCDDataPrint();
    
              }
  
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (curData - 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);
      if (StaDaliv<10) myGLCD.print(String(' '), 443,40);
      myGLCD.printNumF(DesInj,1, 395, 75);
      if (DesInj<10) myGLCD.print(String(' '), 443,75);
      myGLCD.printNumF(ActInj,1, 395, 110);
      if (DesInj<10) myGLCD.print(String(' '), 443,110); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
      if (DesaInjQua<10) myGLCD.print(String(' '), 443,145);  
      myGLCD.printNumF(InjQua,1, 395, 180);
      if (InjQua<10) myGLCD.print(String(' '), 443,180); 
      myGLCD.printNumI(MAF, 170, 215);
      if (MAF<1000) myGLCD.print(String(' '), 221,215);
      myGLCD.printNumF(Barom, 1, 415, 215);
      if (Barom<10) myGLCD.print(String(' '), 463,215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
          
      myGLCD.printNumF(BoostPres,1, 395, 40);
      if (BoostPres<10) myGLCD.print(String(' '), 443,40);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75);
      if (BoostPresCom<10) myGLCD.print(String(' '), 443,75); 
      myGLCD.printNumI(EGRmg, 395, 110);
      if (EGRmg<1000) myGLCD.print(String(' '), 443,110);  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
      if (DesaInjQua<10) myGLCD.print(String(' '), 443,145);  
      myGLCD.printNumF(SolenPul, 1, 395, 180);
      if (SolenPul<10) myGLCD.print(String(' '), 443,180);  
      myGLCD.printNumF(SolenPre, 0, 395, 215);
      if (SolenPre<10) myGLCD.print(String(' '), 443,215);
        
      }
     prevData = curData;
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }
 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {
     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); }
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

 

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

viki13viki пишет:

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

да нет, стопудняк просто надо сначала залить с этой строкой (настроить время), потом строку убрать и ЕЩЁ РАЗ залить скетч без этой строки, заработает, вот увидишь 

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

Ок. Завтра попробую. Новый скетч и часы.

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

MaksVV отчитываюсь. с часами вопрос решен, будешь смеятся, сегодня вспонил поговорку , доверяй но проверяй. проверил новую батарейку, а она всего 2.7 вольта , поехал в магазин с тестером, показал, поменяли , новая имеет 3.4 вольта. поставил в бортовик и все заработало. вопрос не нужно ли задержку curWatch - prevWatch > 3000 поставить на 1000? дальше.... новый скетч сработал на УРА!!! подстроил остальные страницы как первая. все выровнял , подогнал и теперь все выранивается с правой сторорны а при увеличении уходит в лево. КРАСОТА.......  ошибки все четко стирание, чтение, посивная, активная. единственное что добавил это в Watch(): строки

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

  float h;
  float t;

  
  bool Dvoet = 0;

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

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

  
  bool Init = 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 colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
 
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 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);
    fastinit();
  }

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

   void loop() {
    unsigned long curPID = millis ();
    unsigned long curpres = millis ();
    unsigned long curTemperature = millis();
    unsigned long curWatch = millis();  
    unsigned long curDvoet = millis();  
    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 (curPID - prevPID > PIDTime) {PIDs(); prevPID = curPID;}}
      else if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}}
    if (curWatch - prevWatch > 3000)  { Watch (); prevWatch = curWatch;}
    if (curTemperature - prevTemperature > 60000)  { Temperature (); prevTemperature = curTemperature;}
    if (curDvoet - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
    receive ();
    Menu();
    LCDDataPrint();
    
              }
  
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (curData - 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 = curData;
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }
 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {
     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.setColor(0, 255, 0); //зеленый цвет цифры
    myGLCD.print("Km/h", 410, 0);
 
  
 }
  void Temperature (){
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

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

 

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

показания датчика топлива такие.

15.5 ltr = 5.65 v  , здесь литер получается 0.36 v

24 ltr = 4.68 v    , здесь литер получается 0.19 v

35 ltr = 3.9 v     , здесь литер получается 0.11 v

завтра еще раз замеряю. 

 

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

В watch() можешь убрать выбор зел цвета в строках которые ты добавил. Там выше итак зеленый выбирается. А км/ч я видать снес когда шашкой махал )) на напряжению сделай замеры при вкл. Зажигании ( когда 12в в сети ) и когда двс работает (когда 14в сети) надо понять отличаются ли показания при этих двух режимах.

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

понял. одну минуту

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

viki13viki пишет:

показания датчика топлива такие.

15.5 ltr = 5.65 v  , здесь литер получается 0.36 v

24 ltr = 4.68 v    , здесь литер получается 0.19 v

35 ltr = 3.9 v     , здесь литер получается 0.11 v

завтра еще раз замеряю. 

 

 

Это вроде как геометрическая прогрессия? Эх плохо помню математику. 

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

Скорее всего при 0л будет напряжение 12в

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

Блин не охото так городить огород с аналоговым замером топлива. Как опком все таки инфу получает о остатке топлива,  ты подключи опком не в разъем , а проводками, плюс минус и к.лайн. свяжется ли он со щитком приборов? Мне кажется там отдельная шина какая нибудь которая сидит на другом пине обд2

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

заведен 24 лит  5 в ...........  17 литр  5.9 в 

не заведен 24 лит  4.7 в.......17 литр  5.4 в

примерно так. немного меняется. это по опкому я кабель на сегодня спрятал за магнитолу

 

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

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

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

завтра попробую опком на проводатх. но опком опрашивает  7 пин. но в сериале тишина. 

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

блин с часами рано порадовался. отстают. сейчас поставлю в 20.00 правильно и завтра в 8.00 посмотрю на сколько отстанут. посталю задержку на 1000 а не на 3000. может из за этого....

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

Какая модель часов у тебя?

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

Да не из-за этого. Эта задержка вывода значения часов на экран. То бишь было раз в 3 сек а ты хочешь раз в 1 сек. Ниче не поменяется

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

DS3231 AT24C32 IIC

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

Блин не должны они отставать. Эти считаются точные. 

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

Завтра утром увидем

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

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

 Делаем несколько контрольных точек. Получаем несколько диапазонов. В процессе работы мереем. Если значение попадает между контрольными точками  (а оно естесственно так в большинтсве случаев и будет) то через функцию map преобразуем количество литров опираясь на значения рядом контрольных точек. Чем больше точек, тем выше точность. 

Единственная засада, наше подключение может повлиять на штатные показания датчика (то есть при нашем подключении напруга на проводе поменяется и датчик начнет врать)

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

вот например по первой ссылке гугла.  Т.е к лайн приборки может висеть на 12 контакте

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

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

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

Тоже мысль. Посмотрю завтра как опком вытягивает. Было бы легче.

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

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

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

 в опкоме может быть один адаптер к-лайн. А переключение между пинами осуществляет реле. Поэтому он так себя ведёт. 

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

Привет. Уже дома. Посплю После с дороги. Потом я Отпишусь о работе бортового в течении трех суток и 3600км.

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

и так... проехал 3600 км. бортовик проработал всю дорогу без проблем. спас меня в дороге. как ? а вот так, я по дороге через германию ехал в люксембург погулять, в инете посмотрел по чем соляра в люксембурге 0.95 центов а в германии 1.65 евро. я заправился еще  в испании по 1.04 ерво. жалко было тарится по немецким тарифам и у меня оставалось в притык до люксембурга где дешевка. и вот я контролируя расход чтобы он не привешал 5-6.5 литров на сто доехал до люксембурга и залили дешево. без этого контроля расхода я бы не доехал, не зная какой расход, и пришлось бы у немцев тарится. вот так то... 

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

Неплохо. поофтопим. Цены на топливо конечно не гуманны. В Германии если на наши деньги 115 руб. За Литр. Это ппц. Конечно у них и з/п другие, но горючка все равно дорогая. У нас литр 40 руб стоит. А можно и по 36 найти. Рад что бортовик у тебя работает. У меня мондео 4 универсал дизель на классическом автомате.Штатный бортовик показывает 6.8 средний по трассе. Седня 1200 км ездил.

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

Средний расход за 3600 км. Гружен под завязку, 5 чемоданов и куча мелочи, жена, двое детей и теща, постоянно 130 км/ч. Расход 6,2 л/100. Считаю хороший результат. :)

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

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

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

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

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

Доброе время суток. Я вернулся. Продолжаем. Как изветсно нам отсталось  остаток топлива . Как мы помним опком берет с приборной панели по 12 линии ОБД и является протоколом KW82. Сегодня я просулшал 12 линию, по ходу она может работать не зависимо от 7 линии, по которой у нас идет вся диагностика. У меня есть еще один К-линия адатер, его и буду использовать для 12 линии ОБД. Но для начала нужно разобраться в прослушаных данных. Использовал все туже нашу прослушку, вот она 

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 
int Delay = 0;
void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
}

void loop() {

if (mySerial.available()) {
delay (51);
unsigned long curTimedelay = millis ();
   Delay = curTimedelay-prevTimedelay;
Serial.println (""); Serial.print (Delay); Serial.println ("ms");
prevTimedelay = millis();  
while( mySerial.available()) {
    byte inByte = mySerial.read();
    Serial.print(" ");
    Serial.print(inByte,HEX);
   }
     
    }
}

но задержку изменил с 51 на 60 мс, так как рвало сообщения не правильно. Вот результат прослушки 12 линии ОБД

8829ms
 0 0
95ms
 55
98ms
 52 80 7F
89ms
 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
75ms
 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
71ms
 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
67ms
 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
76ms
 30 30 30 30 30 30 30 8 F0 2 B0 0 B2 6 F0 AA 10 14
67ms
 10 1 D4 6 F0 AA 10 14 10 1 D4 6 F0 AA 10 14 10 1 D4
79ms
 6 F0 AA 10 14 10 1 D4 6 F0 AA 10 14 10 1 D4 6 F0 AA 10 14
70ms
 10 1 D4 2 11 0 13 23 A1 4 0 0 0 0 0 0 0 0 0 0 4
68ms
 0 B8 0 FF 60 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 57
70ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B5 0 FF 61 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 55
99ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B9 0 FF 60 43 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 59
99ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B6 0 FF 60 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 55
98ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B9 0 FF 60 43 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6
72ms
 59 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B8 0 FF 61 42
67ms
 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 58 23 A1 4 0 0
69ms
 0 0 0 0 0 0 0 0 4 0 B9 0 FF 60 43 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 59
89ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B8 0 FF 61 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 58
99ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B9 0 FF 60 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 58
100ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B8 0 FF 60 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 57
98ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B9 0 FF 5F 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 57
98ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B5 0 FF 60 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 54
100ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B9 0 FF 5F 43 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 58
98ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B6 0 FF 60 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 55
100ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B8 0 FF 5F 43 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 57
99ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B5 0 FF 60 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 54
99ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B9 0 FF 5F 43 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 58
99ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B6 0 FF 61 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 56
100ms
 23 A1 4 0 0 0 0 0 0 0 0 0 0 4 0 B7 0 FF 61 42 42 1A 47 0 0 0 16 10 9C AE 3 4 49 CE 1 6 57
75ms
 2 B2 0 B4 6 F0 AA 10 14 10 1 D4

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

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

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

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






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

int bytenumber = 0;


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

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

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

int length44 = 44;
byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x6B, 0x03,
0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 
0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC};
                       //  A8 F1 11 5A 81 04 90 6F 62 03 91 6B 03
                       //  92 6B 03 93 01 03 94 6A 03 95 02 03 96 66 03 97 69 
                       //  03 98 6A 03 99 44 03 9A 02 03 9F 6A FF AC 

int length100 = 100;

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


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

int waitbyte=5;

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

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

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

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

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



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

      Serial.print ("Recieve:   ");

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

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

Может MaksVV появится и поможет в этой каше разобраться. Очень на это надеюсь так-как голова у него гениальная. А пока пробую разобраться сам.