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

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

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

MaksVV
Онлайн
Зарегистрирован: 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);
 
  //шрифты + не стандартный шрифт GroteskBold16x32.с
  extern uint8_t SmallFont[];
  extern uint8_t BigFont[];
  extern uint8_t SevenSegNumFont[];
  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 PresTime = 8000;    // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;       // задержка между отправкой байт в сообщении, мс
  int Datadelay = 10;    // задержка между отрисовкой данных на LCD, мс
   
  int MAF = 0;           //26,27 байты
  float BoostPres = 0;     //28,29 байты
  int RPM = 0;           //32,33 байты
  int EGRmg = 0;         //34,35 байты
  float BoostPresCom = 0;  //38,39 байты
  int Speed = 0;        //44,45 байты
  float DesaInjQua = 0;   //50,51 байты
  float InjQua = 0;    //52,53 байты
  float StaDaliv = 0;  //54,55 байты
  int PumpRPM = 0;   //56,57 байты
  float EGRPul = 0;    //62,63 байты
  float SolenPul = 0;  //64,65 байты
  float SolenPre = 0;  //70,71 байты
  float DesInj = 0;    //72,73 байты 
  float ActInj = 0;    //16,17 байты
  int TempAir = 0;   //74,75 байты
  int Temp = 0;      //14,15 байты
  int TempOil = 0;   //18,19 байты
  int TempFuel = 0;   //58,59 байты


  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
 
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


  
 
  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)> 120 // здесь задержка - ожидание правильного ответа пидов, мс

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

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

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void loop() {
    
    
    unsigned long curpres = 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 (!timerenabledPID){PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1;}
      else if (TIMEREXPIRED_PID) timerenabledPID=0;
      }
      else if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}}
    if (curWatch - prevWatch > 60000)  { Watch_Temperature (); prevWatch = curWatch;}
    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){  
        
        if (currentPage == '0') {
       
       myGLCD.setColor(0, 255, 0);
       
       //if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
       //if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
       myGLCD.printNumI(Speed, 350, 0);
      
      myGLCD.setColor(255, 255, 255); 
      
      //if (--<10) {myGLCD.print("  ", 166, 40); }; //затираем вторую цифру и третью
      //if (-->10) {myGLCD.print(" ", 182, 40); }; //затирает третюю цифру
      //myGLCD.printNumI(--, 165, 40);
      
      //if (--<10) {myGLCD.print("  ", 166, 75); }; //затираем вторую цифру и третью
      //if (-->10) {myGLCD.print(" ", 182, 75); }; //затирает третюю цифру
      //myGLCD.printNumI(--, 165, 75);
      
     // if (Speed<10) {myGLCD.print("  ", 166, 110); }; //затираем вторую цифру и третью
     // if (Speed>10) {myGLCD.print(" ", 182, 110); }; //затирает третюю цифру
     // myGLCD.printNumI(Speed, 165, 110);

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

      
      //if (PumpRPM>10) {myGLCD.print(" ", 212, 180); }; //затираем четвертую цифру
      myGLCD.printNumI(PumpRPM, 165, 180);
        
      //if (RPM>100) {myGLCD.print(" ", 212, 215);};   //затираем четвертую цифру
      myGLCD.printNumI(RPM, 165, 215);
      
      //-------------------------------------------
      //if (Temp<10) {myGLCD.print("  ", 426, 40); }; //затираем вторую цифру и третью
      //if (Temp>10) {myGLCD.print(" ", 442, 40); }; //затирает третюю цифру
      myGLCD.printNumI(Temp, 410, 40);
      
      //if (TempOil<10) {myGLCD.print("  ", 426, 75); }; //затираем вторую цифру и третью
      //if (TempOil>10) {myGLCD.print(" ", 442, 75); }; //затирает третюю цифру  
      myGLCD.printNumI(TempOil, 410, 75);
      
      //if (TempFuel<10) {myGLCD.print("  ", 426, 110); }; //затираем вторую цифру и третью
      //if (TempFuel>10) {myGLCD.print(" ", 442, 110); }; //затирает третюю цифру  
      myGLCD.printNumI(TempFuel, 410, 110);
  
  //    myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
      
      myGLCD.printNumI(t, 410, 180);
      
      //if (TempAir<10) {myGLCD.print("  ", 426, 215); }; //затираем вторую цифру и третью
      //if (TempAir>10) {myGLCD.print(" ", 442, 215); }; //затирает третюю цифру  
      myGLCD.printNumI(TempAir, 410, 215);
     
      
    }
   
   //----------------------------------------------------------
      if (currentPage == '1') {
        myGLCD.setColor(0, 255, 0);
        
        //if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
        //if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
      //if (StaDaliv<10) {myGLCD.print("  ", 411, 40); }; //затираем вторую цифру и третью
      //if (StaDaliv>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
      myGLCD.printNumF(StaDaliv,1, 395, 40);
      
      //if (DesInj<10) {myGLCD.print("  ", 411, 75); }; //затираем вторую цифру и третью
      //if (DesInj>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру  
      myGLCD.printNumF(DesInj,1, 395, 75);
      
      //if (ActInj<10) {myGLCD.print("  ", 411, 110); }; //затираем вторую цифру и третью
      //if (ActInj>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру  
      myGLCD.printNumF(ActInj,1, 395, 110);
      
      //if (DesaInjQua<10) {myGLCD.print("  ", 411, 145); }; //затираем вторую цифру и третью
      //if (DesaInjQua>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
      
      //if (InjQua<10) {myGLCD.print("  ", 411, 180); }; //затираем вторую цифру и третью
      //if (InjQua>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру  
      myGLCD.printNumF(InjQua,1, 395, 180);
      
      //if (MAF<10) {myGLCD.print("  ", 411, 215); }; //затираем вторую цифру и третью
      //if (MAF>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру  
      myGLCD.printNumI(MAF, 395, 215); 
      }
      //----------------------------------------------------------
     
      if (currentPage == '2') {
        
        myGLCD.setColor(0, 255, 0);
        
        //if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
        //if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
      //if (BoostPres<10) {myGLCD.print("  ", 411, 40); }; //затираем вторую цифру и третью
      //if (BoostPres>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
      myGLCD.printNumF(BoostPres,1, 395, 40);
      
      //if (BoostPresCom<10) {myGLCD.print("  ", 411, 75); }; //затираем вторую цифру и третью
      //if (BoostPresCom>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру  
      myGLCD.printNumF(BoostPresCom,1, 395, 75);
      
      //if (EGRmg<10) {myGLCD.print("  ", 411, 110); }; //затираем вторую цифру и третью
      //if (EGRmg>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру 
      //if (EGRmg>100) {myGLCD.print(" ", 443, 110); }; //затирает четвертую цифру 
      myGLCD.printNumI(EGRmg, 395, 110);
      
      //if (EGRPul<10) {myGLCD.print("  ", 411, 145); }; //затираем вторую цифру и третью
      //if (EGRPul>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
      
      //if (SolenPul<10) {myGLCD.print("  ", 411, 180); }; //затираем вторую цифру и третью
      //if (SolenPul>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру  
      myGLCD.printNumF(SolenPul, 1, 395, 180);
      
      //if (SolenPre<10) {myGLCD.print("  ", 411, 215); }; //затираем вторую цифру и третью
      //if (SolenPre>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру  
      myGLCD.printNumF(SolenPre, 0, 395, 215);
        
      }
      //----------------------------------------------------------
      
      if (currentPage == '3') {
        myGLCD.setColor(0, 255, 0);
        
        //if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
        //if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
        myGLCD.printNumI(Speed, 350, 0);
          
       myGLCD.setColor(255, 255, 255);
        
       
      } 
      prevData = curData;
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 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(60);
     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[0]==0x83 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0xC1 && MessageRx[4]==0x6B && MessageRx[5]==0x8F && MessageRx[6]==0x40) {Init=1;
   timerenabledInit=0;  
   Serial.println ("     Initialization OK!!!!:  ");
   }

   if (currentPage == '3'){
   //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58 && MessageRx[7]==0x00 && MessageRx[8]==0xDC){
     
     myGLCD.print("NO ERROR", 165, 145);
     Serial.println ("     NO ERROR  ");
     }
    
    // при получении отличающего сообщения конвертировать байты и выдать номер ошибки
   if (MessageRx[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58){
     // здесь пишем номер байта и конвертируем в номеро ошибок, если одна и больше
     Serial.println ("     OSHIBKA ESTY ");
   }
   
   // при получении этого сообщения выдавать на третий экран "BORRADO" стерто
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
     
     myGLCD.print("BORRADO", 165, 145);
     Serial.println ("     BORRADOR  ");
    }}
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    
   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() ;
     vista();
     myGLCD.drawLine(239,35,239,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("Ltr/100 :", 10, 75);
     myGLCD.print("Fuel  L :", 10, 110);
     myGLCD.print("Humed  %:", 10, 145);
     myGLCD.print("PUMP RPM:", 10, 180);
     myGLCD.print("Engi RPM:", 10, 215);
     myGLCD.print("Motor *C:", 255, 40);
     myGLCD.print("Oil   *C:", 255, 75);
     myGLCD.print("Fuel  *C:", 255, 110);
     myGLCD.print("Inter *C:", 255, 145);
     myGLCD.print("Exter *C:", 255, 180);
     myGLCD.print("IntAir*C:", 255, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     vista();
     myGLCD.print("Start of Delivery  *CA:", 10, 40);
     myGLCD.print("Desir inject Start *CA:", 10, 75);
     myGLCD.print("Actua Inject Start *CA:", 10, 110);
     myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
     myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
     myGLCD.print("Mass Air Flow     mg/s:", 10, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     vista();
     myGLCD.print("Boost Press       Bar:", 10, 40);
     myGLCD.print("Boost Press Com   Bar:", 10, 75);
     myGLCD.print("EGR command      mg/s:", 10, 110);
     myGLCD.print("EGR Pulse Ratio     %:", 10, 145);
     myGLCD.print("Solenoide Pulse     %:", 10, 180);
     myGLCD.print("Solenoide Boost     %:", 10, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
  //----------------------------------------------------------------------------
   void drawscreen_three() {
     vista();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     
     buttonHome();
     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(0, 255, 0); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.setFont(GroteskBold16x32);                      // размер шрифта
     myGLCD.setBackColor(0,0,0);            // цвет фона области где будет надпись и кнопки
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
        myGLCD.clrScr();             
        drawscreen_three();         //потом заменить на дейсвие
                                                                         
      }}
      
    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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        myGLCD.clrScr();             
        drawscreen_three();       //потом заменить на дейсвие
                                                                           
      }}

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

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

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

 

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

пишет zapros init и правельный ответ постоянно. получается что он после инита не посылает 2100.....

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

Он пишет в сериале надпись?  Initialization OK!!!!: 

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

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

viki13viki
Offline
Зарегистрирован: 14.11.2016
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 
Otpravil zapros Init
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
Otpravil zapros Init
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
Otpravil zapros Init
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
Otpravil zapros Init
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
Otpravil zapros Init
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
Otpravil zapros Init
Receive:   FF FF 83 F1 11 C1 6B 8F 40 
 
MaksVV
Онлайн
Зарегистрирован: 06.08.2015

помоему вот так должно быть нет??? 

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

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

ну дак конечно, ай ай яй

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

уж пора бы научиться

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

пардон сеньер. пошло но рвет сообщения

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

а унас есть всегда одинаковый байт в конце ответа на 2101?

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

нет, они разные. ноут ссел, подзаряжу чуток

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

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

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

ты мне скажи у тебя при работающем скетке писалось в сериале?  Initialization OK!!!!:  

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

Он походу и запросы инита постоянно слал и PIDs

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

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

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

щас вот так отвечает

Otpravil zapros Init
Receive:   0 FF FF 83 F1 11 C1 6B 8F 40 
     Initialization OK!!!!:  
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 
Otpravil zapros 21 01
Receive:   0 0 D 6E 0 0 C FD 0 0 2 69 0 0 0 0 4 3E 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3F 0 0 0 0 8 D5 0 0 D 4C A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D F 3 A4 0 2 77 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 0 0 
Receive:   C FC 0 0 2 68 0 0 0 0 4 41 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3E 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D 11 3 A4 0 2 76 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 0 0 C FD 0 0 
Otpravil zapros 21 01
Receive:   2 68 0 0 0 0 4 41 0 0 0 0 32 C8 3 A3 4 29 3 20 E5 62 0 0 0 0 11 3E 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D C 3 A4 0 2 71 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 
Receive:   0 0 C FD 0 0 2 69 0 0 0 0 4 40 0 0 0 0 32 C8 3 A3 4 29 3 20 E5 62 0 0 0 0 11 3E 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 AD 8 0 20 0 0 1 90 D F 3 A4 0 2 78 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 
Otpravil zapros 21 01
Receive:   6E 0 0 C FD 0 0 2 68 0 0 0 0 4 3F 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 10 FC 0 0 0 0 8 D5 0 0 D 4C A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D F 3 A4 0 2 33 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6C 0 0 C 
Receive:   FE 0 0 2 68 0 0 0 0 4 40 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3E 0 0 0 0 8 D5 0 0 D 4C A0 0 1 90 0 0 AD 8 0 20 0 0 1 90 D F 3 A4 0 2 7A 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6C 0 0 
Otpravil zapros 21 01
Receive:   C FD 0 0 2 68 0 0 0 0 4 41 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3F 0 0 0 0 8 D5 0 0 D 4C A0 0 1 90 0 0 AD 8 0 20 0 0 1 90 D F 3 A4 0 2 7B FF FF FF 
Otpravil zapros 21 01
Receive:   FF FF FF 80 21 11 4C 61 1 0 0 0 0 0 0 0 0 
Receive:   D 6C 0 0 C FD 0 0 2 68 0 0 0 0 4 41 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3F 0 0 0 0 8 D5 0 0 D 4C A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D F 3 A4 0 2 A7 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 0 0 C FD 0 
Otpravil zapros 21 01
Receive:   0 2 68 0 0 0 0 4 41 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3F 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D F 3 A4 0 2 76 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 0 
Receive:   0 C FD 0 0 2 68 0 0 0 0 4 40 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3E 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D F 3 A4 0 2 74 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 
Otpravil zapros 21 01
Receive:   0 0 C FD 0 0 2 68 0 0 0 0 4 41 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 10 FD 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D F 3 A4 0 2 33 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 0 0 
Receive:   C FD 0 0 2 68 0 0 0 0 4 41 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3E 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 AD 8 0 20 0 0 1 90 D F 3 A4 0 2 79 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 0 0 
Otpravil zapros 21 01
Receive:   C FB 0 0 2 68 0 0 0 0 4 42 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3F 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D C 3 A4 0 2 72 FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 0 0 C FC 
Receive:   0 0 2 69 0 0 0 0 4 40 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3E 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D F 3 A4 0 2 74 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 
Otpravil zapros 21 01
Receive:   0 0 D 6E 0 0 C FD 0 0 2 68 0 0 0 0 4 42 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3E 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 AD 8 0 20 0 0 1 90 D F 3 A4 0 2 7A FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 
Receive:   0 0 C FD 0 0 2 69 0 0 0 0 4 3C 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 11 3F 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 A9 8 0 20 0 0 1 90 D F 3 A4 0 2 72 
Otpravil zapros 21 01
Receive:   FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 D 6E 0 0 C FD 0 0 
Zapros error;  
Otpravil zapros Present
Receive:   2 68 0 0 0 0 4 41 0 0 0 0 32 C8 3 A4 4 29 3 20 E5 62 0 0 0 0 10 FC 0 0 0 0 8 D5 0 0 D 49 A0 0 1 90 0 0 AD 8 0 20 0 0 1 90 D F 3 A4 0 2 36 FF FF FF FF 82 F1 11 58 0 DC FF FF 81 F1 11 7E 1 
Zapros error;  
Receive:   FF FF FF FF 82 F1 11 58 0 DC 
     NO ERROR  
Otpravil zapros Present
Receive:   FF FF 81 F1 11 7E 1 
Zapros erase;  
Receive:   FF FF FF 83 F1 11 54 FF 0 D8 
     BORRADOR  
Otpravil zapros Present
Receive:   FF FF 81 F1 11 7E 1 
Otpravil zapros Present
Receive:   FF FF 81 F1 11 7E 1 
Otpravil zapros Present
Receive:   FF FF 81 F1 11 7E 1 
Otpravil zapros Present
Receive:   FF FF 81 F1 11 7E 1 
Otpravil zapros Present
Receive:   FF FF 81 F1 11 7E 1 
Otpravil zapros Present
Receive:   FF FF 81 F1 11 7E 1 
Otpravil zapros Present
Receive:   FF FF 81 F1 11 7E 1 

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

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

и всё таки проверка на удачный инит видать не проходила, скорее всего не было надписи Initialization OK!!!!: 

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

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

 

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

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

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

но 200км туда и 200 обратно все работало четко. быстро обновлялось и связь ни равалсь ни разу  единственный косяк это с третим экраном

MaksVV
Онлайн
Зарегистрирован: 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);
 
  //шрифты + не стандартный шрифт GroteskBold16x32.с
  extern uint8_t SmallFont[];
  extern uint8_t BigFont[];
  extern uint8_t SevenSegNumFont[];
  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 = 10;    // задержка между отрисовкой данных на LCD, мс
   
  int MAF = 0;           //26,27 байты
  float BoostPres = 0;     //28,29 байты
  int RPM = 0;           //32,33 байты
  int EGRmg = 0;         //34,35 байты
  float BoostPresCom = 0;  //38,39 байты
  int Speed = 0;        //44,45 байты
  float DesaInjQua = 0;   //50,51 байты
  float InjQua = 0;    //52,53 байты
  float StaDaliv = 0;  //54,55 байты
  int PumpRPM = 0;   //56,57 байты
  float EGRPul = 0;    //62,63 байты
  float SolenPul = 0;  //64,65 байты
  float SolenPre = 0;  //70,71 байты
  float DesInj = 0;    //72,73 байты 
  float ActInj = 0;    //16,17 байты
  int TempAir = 0;   //74,75 байты
  int Temp = 0;      //14,15 байты
  int TempOil = 0;   //18,19 байты
  int TempFuel = 0;   //58,59 байты


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

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

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void loop() {
    
    unsigned long curPID = millis ();
    unsigned long curpres = 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 > 60000)  { Watch_Temperature (); prevWatch = curWatch;}
    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){  
        
        if (currentPage == '0') {
       
       myGLCD.setColor(0, 255, 0);
       
       //if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
       //if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
       myGLCD.printNumI(Speed, 350, 0);
      
      myGLCD.setColor(255, 255, 255); 
      
      //if (--<10) {myGLCD.print("  ", 166, 40); }; //затираем вторую цифру и третью
      //if (-->10) {myGLCD.print(" ", 182, 40); }; //затирает третюю цифру
      //myGLCD.printNumI(--, 165, 40);
      
      //if (--<10) {myGLCD.print("  ", 166, 75); }; //затираем вторую цифру и третью
      //if (-->10) {myGLCD.print(" ", 182, 75); }; //затирает третюю цифру
      //myGLCD.printNumI(--, 165, 75);
      
     // if (Speed<10) {myGLCD.print("  ", 166, 110); }; //затираем вторую цифру и третью
     // if (Speed>10) {myGLCD.print(" ", 182, 110); }; //затирает третюю цифру
     // myGLCD.printNumI(Speed, 165, 110);

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

      
      //if (PumpRPM>10) {myGLCD.print(" ", 212, 180); }; //затираем четвертую цифру
      myGLCD.printNumI(PumpRPM, 165, 180);
        
      //if (RPM>100) {myGLCD.print(" ", 212, 215);};   //затираем четвертую цифру
      myGLCD.printNumI(RPM, 165, 215);
      
      //-------------------------------------------
      //if (Temp<10) {myGLCD.print("  ", 426, 40); }; //затираем вторую цифру и третью
      //if (Temp>10) {myGLCD.print(" ", 442, 40); }; //затирает третюю цифру
      myGLCD.printNumI(Temp, 410, 40);
      
      //if (TempOil<10) {myGLCD.print("  ", 426, 75); }; //затираем вторую цифру и третью
      //if (TempOil>10) {myGLCD.print(" ", 442, 75); }; //затирает третюю цифру  
      myGLCD.printNumI(TempOil, 410, 75);
      
      //if (TempFuel<10) {myGLCD.print("  ", 426, 110); }; //затираем вторую цифру и третью
      //if (TempFuel>10) {myGLCD.print(" ", 442, 110); }; //затирает третюю цифру  
      myGLCD.printNumI(TempFuel, 410, 110);
  
  //    myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
      
      myGLCD.printNumI(t, 410, 180);
      
      //if (TempAir<10) {myGLCD.print("  ", 426, 215); }; //затираем вторую цифру и третью
      //if (TempAir>10) {myGLCD.print(" ", 442, 215); }; //затирает третюю цифру  
      myGLCD.printNumI(TempAir, 410, 215);
     
      
    }
   
   //----------------------------------------------------------
      if (currentPage == '1') {
        myGLCD.setColor(0, 255, 0);
        
        //if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
        //if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
      //if (StaDaliv<10) {myGLCD.print("  ", 411, 40); }; //затираем вторую цифру и третью
      //if (StaDaliv>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
      myGLCD.printNumF(StaDaliv,1, 395, 40);
      
      //if (DesInj<10) {myGLCD.print("  ", 411, 75); }; //затираем вторую цифру и третью
      //if (DesInj>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру  
      myGLCD.printNumF(DesInj,1, 395, 75);
      
      //if (ActInj<10) {myGLCD.print("  ", 411, 110); }; //затираем вторую цифру и третью
      //if (ActInj>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру  
      myGLCD.printNumF(ActInj,1, 395, 110);
      
      //if (DesaInjQua<10) {myGLCD.print("  ", 411, 145); }; //затираем вторую цифру и третью
      //if (DesaInjQua>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
      
      //if (InjQua<10) {myGLCD.print("  ", 411, 180); }; //затираем вторую цифру и третью
      //if (InjQua>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру  
      myGLCD.printNumF(InjQua,1, 395, 180);
      
      //if (MAF<10) {myGLCD.print("  ", 411, 215); }; //затираем вторую цифру и третью
      //if (MAF>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру  
      myGLCD.printNumI(MAF, 395, 215); 
      }
      //----------------------------------------------------------
     
      if (currentPage == '2') {
        
        myGLCD.setColor(0, 255, 0);
        
        //if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
        //if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
      //if (BoostPres<10) {myGLCD.print("  ", 411, 40); }; //затираем вторую цифру и третью
      //if (BoostPres>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
      myGLCD.printNumF(BoostPres,1, 395, 40);
      
      //if (BoostPresCom<10) {myGLCD.print("  ", 411, 75); }; //затираем вторую цифру и третью
      //if (BoostPresCom>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру  
      myGLCD.printNumF(BoostPresCom,1, 395, 75);
      
      //if (EGRmg<10) {myGLCD.print("  ", 411, 110); }; //затираем вторую цифру и третью
      //if (EGRmg>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру 
      //if (EGRmg>100) {myGLCD.print(" ", 443, 110); }; //затирает четвертую цифру 
      myGLCD.printNumI(EGRmg, 395, 110);
      
      //if (EGRPul<10) {myGLCD.print("  ", 411, 145); }; //затираем вторую цифру и третью
      //if (EGRPul>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
      
      //if (SolenPul<10) {myGLCD.print("  ", 411, 180); }; //затираем вторую цифру и третью
      //if (SolenPul>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру  
      myGLCD.printNumF(SolenPul, 1, 395, 180);
      
      //if (SolenPre<10) {myGLCD.print("  ", 411, 215); }; //затираем вторую цифру и третью
      //if (SolenPre>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру  
      myGLCD.printNumF(SolenPre, 0, 395, 215);
        
      }
      //----------------------------------------------------------
      
      if (currentPage == '3') {
        myGLCD.setColor(0, 255, 0);
        
        //if (Speed<10) {myGLCD.print("  ", 366, 0); }; //затираем вторую цифру
        //if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
        myGLCD.printNumI(Speed, 350, 0);
          
       myGLCD.setColor(255, 255, 255);
        
       
      } 
      prevData = curData;
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 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(60);
     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[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58 && MessageRx[7]==0x00 && MessageRx[8]==0xDC){
     
     myGLCD.print("NO ERROR", 165, 145);
     Serial.println ("     NO ERROR  ");
     }
    
    // при получении отличающего сообщения конвертировать байты и выдать номер ошибки
   if (MessageRx[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58){
     // здесь пишем номер байта и конвертируем в номеро ошибок, если одна и больше
     Serial.println ("     OSHIBKA ESTY ");
   }
   
   // при получении этого сообщения выдавать на третий экран "BORRADO" стерто
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
     
     myGLCD.print("BORRADO", 165, 145);
     Serial.println ("     BORRADOR  ");
    }}
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    
   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() ;
     vista();
     myGLCD.drawLine(239,35,239,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("Ltr/100 :", 10, 75);
     myGLCD.print("Fuel  L :", 10, 110);
     myGLCD.print("Humed  %:", 10, 145);
     myGLCD.print("PUMP RPM:", 10, 180);
     myGLCD.print("Engi RPM:", 10, 215);
     myGLCD.print("Motor *C:", 255, 40);
     myGLCD.print("Oil   *C:", 255, 75);
     myGLCD.print("Fuel  *C:", 255, 110);
     myGLCD.print("Inter *C:", 255, 145);
     myGLCD.print("Exter *C:", 255, 180);
     myGLCD.print("IntAir*C:", 255, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     vista();
     myGLCD.print("Start of Delivery  *CA:", 10, 40);
     myGLCD.print("Desir inject Start *CA:", 10, 75);
     myGLCD.print("Actua Inject Start *CA:", 10, 110);
     myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
     myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
     myGLCD.print("Mass Air Flow     mg/s:", 10, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     vista();
     myGLCD.print("Boost Press       Bar:", 10, 40);
     myGLCD.print("Boost Press Com   Bar:", 10, 75);
     myGLCD.print("EGR command      mg/s:", 10, 110);
     myGLCD.print("EGR Pulse Ratio     %:", 10, 145);
     myGLCD.print("Solenoide Pulse     %:", 10, 180);
     myGLCD.print("Solenoide Boost     %:", 10, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
  //----------------------------------------------------------------------------
   void drawscreen_three() {
     vista();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     
     buttonHome();
     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(0, 255, 0); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.setFont(GroteskBold16x32);                      // размер шрифта
     myGLCD.setBackColor(0,0,0);            // цвет фона области где будет надпись и кнопки
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
        myGLCD.clrScr();             
        drawscreen_three();         //потом заменить на дейсвие
                                                                         
      }}
      
    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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        myGLCD.clrScr();             
        drawscreen_three();       //потом заменить на дейсвие
                                                                           
      }}

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

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

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

 

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

и задержку в receive можно около 200 попробовать

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

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

от 0 допустим при ходит только 55 байт и потом увелиивая задержку до 30 показывает

FF FF FF режет и

тут уже весь ответ.

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

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

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

вроде разобрался с ошибками, и так.......

ошибка Р0115  ответ 85 F1 11 58 01 01 15 E1 D7    ошибка здесь это 01 15   --Р0115

ошибка Р1110 ответ 85 F1 11 58 01 11 10 E4 E5     ошибка здесь это 11 10   --Р1110

не знаю за что отвечает байт 7..........

обе ошибки вместе   ответ 88 F1 11 58 02 01 15 A1 11 10 E4 A0  здесь тоже самое ошибки 01 15, 11 10

четвертый байт показывает количество ошибок. на ошибки приходится по два байта, третий байт в  каждой ошибки не заню за что отвечает. но вижу что ошибка Р1110 сохранила свой байт Е4 а вот Р0115 изменила с Е1 на А1. тем не мение расшифровка выглядит так....... переводим в бинарник каждый байт пример  01 15  --Р0115, получаем 0000 0001, 0001 0101 теперь орасшифровываем

      Р0115                                                      Р1110

00 буква,                          Р                   00 буква,                          Р

00 первая цифра             0                  01 первая цифра             1

0001 вторая цифра         1                  0001 вторая цифра         1

0001 третя цифра           1                  0001 третя цифра           1

0101 четвертая цифра   5                  0000 четвертая цифра   5

а вот и расшифровщик

первый символ

бит 1,2 : 0  0  =  P - Powertrain             
               0  1  =  C - Chassis
               1  0  =  B - Body
               1  1  =  U - Network

второй символ

бит 3,4: 0  0 =   0
              0  1 =   1
              1  0  =  2
              1  1  =  3

         третий  /////// четвертый//// пятый   символы

биты 5,6,7,8  ////// 9,10,11,12//// 13,14,15,16:  0  0  0  0 =   0
                                                                            0  0  0  1 =   1    
                                                                            0  0  1  0  =  2
                                                                            0  0  1  1 =   3
                                                                            0  1  0  0 =   4
                                                                            0  1  0  1  =  5
                                                                            0  1  1  0  =  6
                                                                            0  1  1  1  =  7
                                                                            1  0  0  0  =  8
                                                                            1  0  0  1  =  9

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

 

 

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

Байт после ошибки может показывать ее статус - активная, неактивная и т.д. Температуру чтоб показывало расскоментируй строку 208 скетч #552. А по поводу часов, ты в сетапе Watch_Temperature () ты не убрал случайно? Эта функция должна там быть чтоб часы сразу показать. 

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

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

1. косяк с прорисовкой даты и врем , прорисовывается где через сикунд 40 ИСПРАВЛЕНО!

2. вписать расшифровку ошибок в скетч

3. разобратся с расходом в час и на 100км

4. разобраться с остатком топлива в литрах.

5. разобратся с затиранием последних цифр.

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

вот скетч

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

  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 = 100;      // задержка между отрисовкой данных на 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


  
  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);
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
 
    drawHomeScreen();  
    currentPage = '0'; 
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 8, 19, 00, 0));
    Watch ();
    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 > 10000)  { 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();
    
              }
  
   //-----------------------------------------------------------------------------
   //прописываем где и какие данные мы хотим видеть 
   //-----------------------------------------------------------------------------
   //страница HOME
   //-------------------------------------------------------
   void LCDDataPrint(){
     Watch ();
    unsigned long curData = millis();  
      
      if (curData - prevData > Datadelay){  
        
        if (currentPage == '0') {
       
       myGLCD.setColor(255, 255, 255);
       myGLCD.printNumI(Speed, 350, 0);
      
      myGLCD.setColor(255, 255, 255); 
      
      myGLCD.printNumF(LHor, 1, 165, 40);
      myGLCD.printNumF(L100, 1, 165, 75);
     // myGLCD.printNumI(Speed, 165, 110);
      myGLCD.printNumI(h, 165, 145);
      myGLCD.printNumI(PumpRPM, 165, 180);
      myGLCD.printNumI(RPM, 165, 215);
      //-------------------------------------------
      myGLCD.printNumI(Temp, 410, 40); 
      myGLCD.printNumI(TempOil, 410, 75);  
      myGLCD.printNumI(TempFuel, 410, 110);
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
      myGLCD.printNumI(t, 410, 180);  
      myGLCD.printNumI(TempAir, 410, 215);
      
    }
   
      //----------------------------------------------------------
      //страниц INF1
      //----------------------------------------------------------
      if (currentPage == '1') {
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
      
      myGLCD.printNumF(StaDaliv,1, 395, 40); 
      myGLCD.printNumF(DesInj,1, 395, 75); 
      myGLCD.printNumF(ActInj,1, 395, 110); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145);  
      myGLCD.printNumF(InjQua,1, 395, 180); 
      myGLCD.printNumI(MAF, 395, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
      if (currentPage == '2') {
        Watch ();
        
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
      myGLCD.printNumF(BoostPres,1, 395, 40);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75); 
      myGLCD.printNumI(EGRmg, 395, 110);  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);  
      myGLCD.printNumF(SolenPul, 1, 395, 180);  
      myGLCD.printNumF(SolenPre, 0, 395, 215);
        
      }
      //----------------------------------------------------------
      //страниц CHECK
      //----------------------------------------------------------
      
      if (currentPage == '3') {
        Watch ();
        
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
       
      } 
      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[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58 && MessageRx[7]==0x00 && MessageRx[8]==0xDC){
     
     myGLCD.print("NO ERROR", 165, 145);
     Serial.println ("     NO ERROR  ");
     }
    
    // при получении отличающего сообщения конвертировать байты и выдать номер ошибки
   if (MessageRx[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58){
     // здесь пишем номер байта и конвертируем в номеро ошибок, если одна и больше
     Serial.println ("     OSHIBKA ESTY ");
   }
   
   // при получении этого сообщения выдавать на третий экран "BORRADO" стерто
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
     
     myGLCD.print("BORRADO", 165, 145);
     Serial.println ("     BORRADOR  ");
    }}
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    L100 =  (14.6*6.8*4.54*Speed*0.621371)/(3600*MAF/100);
    LHor = ((InjQua*4)*3.6)/100.0;
    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() ;
     vista();
     myGLCD.drawLine(239,35,239,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("Ltr/100 :", 10, 75);
     myGLCD.print("Fuel  L :", 10, 110);
     myGLCD.print("Humed  %:", 10, 145);
     myGLCD.print("PUMP RPM:", 10, 180);
     myGLCD.print("Engi RPM:", 10, 215);
     myGLCD.print("Motor *C:", 255, 40);
     myGLCD.print("Oil   *C:", 255, 75);
     myGLCD.print("Fuel  *C:", 255, 110);
     myGLCD.print("Inter *C:", 255, 145);
     myGLCD.print("Exter *C:", 255, 180);
     myGLCD.print("IntAir*C:", 255, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     vista();
     myGLCD.print("Start of Delivery  *CA:", 10, 40);
     myGLCD.print("Desir inject Start *CA:", 10, 75);
     myGLCD.print("Actua Inject Start *CA:", 10, 110);
     myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
     myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
     myGLCD.print("Mass Air Flow     mg/s:", 10, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     vista();
     myGLCD.print("Boost Press       Bar:", 10, 40);
     myGLCD.print("Boost Press Com   Bar:", 10, 75);
     myGLCD.print("EGR command      mg/s:", 10, 110);
     myGLCD.print("EGR Pulse Ratio     %:", 10, 145);
     myGLCD.print("Solenoide Pulse     %:", 10, 180);
     myGLCD.print("Solenoide Boost     %:", 10, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
  //----------------------------------------------------------------------------
   void drawscreen_three() {
     vista();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     
     buttonHome();
     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.setFont(GroteskBold16x32);                      // размер шрифта
     myGLCD.setBackColor(0,0,0);            // цвет фона области где будет надпись и кнопки
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
        myGLCD.clrScr();             
        drawscreen_three();         //потом заменить на дейсвие
                                                                         
      }}
      
    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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        myGLCD.clrScr();             
        drawscreen_three();       //потом заменить на дейсвие
                                                                           
      }}

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

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

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

 

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

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

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

Попробуй поставить задержку перед Watch_Temperature() в сетапе

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

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

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

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

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

не помогает ни 10 ни 100 . могу скажать что при первом запуске прописовывается сразу а потом при переходах на страницы и так же возврат на хоме уже тормозит прорисовка на 40 сек

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

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

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

Короче надо разделить watch и ,temperature. ,И тогда watch можно часто запрашивать и после прорисовки каждой страницы. А то с температурой тормозить будет, пусть температура в отдельной функции считается 

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

Откопируй функцию и все ее переменные. Одну назови вотч вторую температура. В одной оставь все про темп, в другой все про дату и часы. Только переменные таймера не забудь у каждой функции свои. Пишу с планшета, скетч не удобно править. Задержку на вотч можно секунд 5 поставить и затолкать также эту функцию к прорисовке каждой страницы. А функцию температура пусть также раз в минуту считает

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

ок. пробую

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

вывел в сетуп всесто Watch_Temperature ();

    Watch ();
    Temperature ();

в лупе

    if (curWatch - prevWatch > 60000)  { Watch (); prevWatch = curWatch;}
    if (curWatch - prevWatch > 60000)  { Temperature (); prevWatch = curWatch;}

функцию часов и даты переименовал

void Watch (){

создал для температуры

    void Temperature (){
    myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
    myGLCD.setFont(GroteskBold16x32);
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }

Не помогло.....

блин забыл ты же говорил всунуть на каждую страницу ....... секунду

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

Переменные cur и prev для каждой функции свои должны ыть. Ну и задержка разная

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

да. мгновенная прорисовка. первый пункт минус

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

MaksVV пишет:

Переменные cur и prev для каждой функции свои должны ыть. Ну и задержка разная

щас гляну

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

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

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

вотч засунул в прорисовки экрана. щас кур и прев исправлю

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

кур и прев создал для температуры свою. задержку поставить 10 сек на ватч и 5 на температуру?

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

На темп 60000 на вотч 10000

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

И распечатку данных на ЛСД с 10 мс сделай на 100 мс, все равно данные медленней обновляются, не фиг проц грузить за зря

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

все гуд. подправил скетч в 576 посте. первый пункт минус

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

исправил на 100

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

вывел на третий экра заголовок cantidades de errores: 0 тут будет отображатся 7-ой байт, colerror = MessageRx[7];, будетпоказывать количество ошибок. так же добавил в столбик заголовки error 1: до error 5:, ошибки будут выводится после них, если нет ошибок будет писать после них no error. ну и кое что мелкое поменял. освеженный скетч, чтобы не искать предыдщий

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

  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 = 100;      // задержка между отрисовкой данных на 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);
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myTouch.InitTouch();
    myTouch.setPrecision(PREC_MEDIUM);
 
    drawHomeScreen();  
    currentPage = '0'; 
    Wire.begin();
    rtc.begin();
    dht.begin();
    sensors.begin();
    // строка ниже используется для настройки даты и времени часов 
    // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
    // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
    // (год, месяц, день, часы, минуты, секунды)
    //rtc.adjust(DateTime(2017, 7, 8, 19, 00, 0));
    Watch ();
    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 > 10000)  { 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();
    
              }
  
   //-----------------------------------------------------------------------------
   //прописываем где и какие данные мы хотим видеть 
   //-----------------------------------------------------------------------------
   //страница HOME
   //-------------------------------------------------------
   void LCDDataPrint(){
     Watch ();
    unsigned long curData = millis();  
      
      if (curData - prevData > Datadelay){  
        
        if (currentPage == '0') {
       
       myGLCD.setColor(255, 255, 255);
       myGLCD.printNumI(Speed, 350, 0);
      
      myGLCD.setColor(255, 255, 255); 
      
      myGLCD.printNumF(LHor, 1, 165, 40);
      myGLCD.printNumF(L100, 1, 165, 75);
     // myGLCD.printNumI(Speed, 165, 110);
      myGLCD.printNumI(h, 165, 145);
      myGLCD.printNumI(PumpRPM, 165, 180);
      myGLCD.printNumI(RPM, 165, 215);
      //-------------------------------------------
      myGLCD.printNumI(Temp, 410, 40); 
      myGLCD.printNumI(TempOil, 410, 75);  
      myGLCD.printNumI(TempFuel, 410, 110);
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
      myGLCD.printNumI(t, 410, 180);  
      myGLCD.printNumI(TempAir, 410, 215);
      
    }
   
      //----------------------------------------------------------
      //страниц INF1
      //----------------------------------------------------------
      if (currentPage == '1') {
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
      
      myGLCD.printNumF(StaDaliv,1, 395, 40); 
      myGLCD.printNumF(DesInj,1, 395, 75); 
      myGLCD.printNumF(ActInj,1, 395, 110); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145);  
      myGLCD.printNumF(InjQua,1, 395, 180); 
      myGLCD.printNumI(MAF, 170, 215);
      myGLCD.printNumF(Barom, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
      if (currentPage == '2') {
        Watch ();
        
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
      myGLCD.printNumF(BoostPres,1, 395, 40);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75); 
      myGLCD.printNumI(EGRmg, 395, 110);  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);  
      myGLCD.printNumF(SolenPul, 1, 395, 180);  
      myGLCD.printNumF(SolenPre, 0, 395, 215);
        
      }
      //----------------------------------------------------------
      //страниц CHECK
      //----------------------------------------------------------
      
      if (currentPage == '3') {
        Watch ();
        
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
        myGLCD.printNumI(colerror, 380, 40);
          
        myGLCD.setColor(255, 255, 255);
        
       
      } 
      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[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58 && MessageRx[7]==0x00 && MessageRx[8]==0xDC){
     
     myGLCD.print("NO ERROR", 255, 145);
     Serial.println ("     NO ERROR  ");
     }
    
    // при получении отличающего сообщения конвертировать байты и выдать номер ошибки
   if (MessageRx[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58){
     colerror = MessageRx[7];
     
     // здесь пишем номер байта и конвертируем в номеро ошибок, если одна и больше
     
     Serial.println ("     OSHIBKA ESTY ");
   }
   
   // при получении этого сообщения выдавать на третий экран "BORRADO" стерто
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
     
     myGLCD.print("BORRADO", 255, 145);
     Serial.println ("     BORRADOR  ");
    }}
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    Barom = MessageRx[39];
    L100 =  (14.6*6.8*4.54*Speed*0.621371)/(3600*MAF/100);
    LHor = ((InjQua*4)*3.6)/100.0;
    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() ;
     vista();
     myGLCD.drawLine(239,35,239,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("Ltr/100 :", 10, 75);
     myGLCD.print("Fuel  L :", 10, 110);
     myGLCD.print("Humed  %:", 10, 145);
     myGLCD.print("PUMP RPM:", 10, 180);
     myGLCD.print("Engi RPM:", 10, 215);
     myGLCD.print("Motor *C:", 255, 40);
     myGLCD.print("Oil   *C:", 255, 75);
     myGLCD.print("Fuel  *C:", 255, 110);
     myGLCD.print("Inter *C:", 255, 145);
     myGLCD.print("Exter *C:", 255, 180);
     myGLCD.print("IntAir*C:", 255, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     vista();
     myGLCD.print("Start of Delivery  *CA:", 10, 40);
     myGLCD.print("Desir inject Start *CA:", 10, 75);
     myGLCD.print("Actua Inject Start *CA:", 10, 110);
     myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
     myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
     myGLCD.print("MAF  mg/s:", 10, 215);
     myGLCD.print("Barom kPa:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     vista();
     myGLCD.print("Boost Press       Bar:", 10, 40);
     myGLCD.print("Boost Press Com   Bar:", 10, 75);
     myGLCD.print("EGR command      mg/s:", 10, 110);
     myGLCD.print("EGR Pulse Ratio     %:", 10, 145);
     myGLCD.print("Solenoide Pulse     %:", 10, 180);
     myGLCD.print("Solenoide Boost     %:", 10, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
  //----------------------------------------------------------------------------
   void drawscreen_three() {
     vista();
     line();
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
     myGLCD.print("Cantidades de errores:", 10, 40);
     myGLCD.print("ERROR 1:", 50, 75);
     myGLCD.print("ERROR 2:", 50, 110);
     myGLCD.print("ERROR 3:", 50, 145);
     myGLCD.print("ERROR 4:", 50, 180);
     myGLCD.print("ERROR 5:", 50, 215);

     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.setFont(GroteskBold16x32);                      // размер шрифта
     myGLCD.setBackColor(0,0,0);            // цвет фона области где будет надпись и кнопки
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("ERASE", 25, 265);
    }
    
    void buttonERASETouch () {
    if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
        drawFrame(10, 255, 120, 310); 
        Erase();           //потом заменить на дейсвие
        myGLCD.clrScr();             
        drawscreen_three();         //потом заменить на дейсвие
                                                                         
      }}
      
    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.setFont(GroteskBold16x32);
     myGLCD.setBackColor(0,0,0);
     myGLCD.print("READ", 375, 265);
    }
    
    void buttonREADTouch() {
    if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
        drawFrame(350, 255, 470, 310); 
        Read();        //потом заменить на дейсвие   
        myGLCD.clrScr();             
        drawscreen_three();       //потом заменить на дейсвие
                                                                           
      }}

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

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

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

 

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

на счет третьего байта похоже ты прав, это статус activo "A" и en activo "E". тоже интересно выводить после каждой ошибки Активна и Не активна. Пытаюсь сообразить как все расшифровки просисать.

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

а ты че, испанский уважаешь?

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

я в исании живу уже 13 лет.