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

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

когда мотор четырёх тактный, за 2 оборота, происходит один рабочий ход (только этот такт нас интересует), т.е. если 1000 об/мин до будет 500 тактов за минуту, ну и если 4 цилинровый мотор то умножаем на 4 ,т.е. 2000 тактов в минуту

MaksVV
Offline
Зарегистрирован: 06.08.2015
LHor = (float)RPM* (float)InjQua*2.00/1000.00*60.00/1000.00/0.85;

L100 = (float)LHor*100.00/(float)Speed;

вот формулы примерно такие 

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

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

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

потом отпишись как заработал расход и активный пассивный DTC

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

10 мнут и отпишусь

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

да. пасиве активе работает, координаты отображения угнал в право, так как было видно только .ve, но все четко работает, проверил несколько раз. расход в час вроде показывает корректно, качит гдето 0.8 -0.9 даешь газку поднимается . расход на 100 тронулся во дворе на первой метров 8 и тоже показывает 25 литров, примерно. завтра поеду на работу и уже точно скажу как работет расход. ТЫ ВЕЛИКИЙ ИЗ ВЕЛИКИХ. остался бак. завтра гляну вотльы на датчике. а вот с затираниями хоть с пробелом хоть с квадратом, тоже самое. почти финишная, завтра узнаем.

MaksVV
Offline
Зарегистрирован: 06.08.2015
короче я и с затиранием решил вопрос) вот надо таким макаром затирать:
 
 
myGLCD.printNumI(RPM, 165, 215);
if (RPM<1000) myGLCD.print(String(' '), 175,215); 
 
только координату подгони
 
viki13viki
Offline
Зарегистрирован: 14.11.2016

круто. щас попробую. и не мерцает?

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

неа, всё ништяк

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

ok :)

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

формула пробег до заправки 

S = 1.00/(float)L100*Fuel*100 

где Fuel количество топлива, л

только L100 надо средний высчитывать

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

типа сколько км до следующей заправки? как можно высчитать средний L100?

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

средний расход можно делать так: 

создаем массив переменных среднего расхода , например 100 шт. 

int L100sr[100];

int L;

раз в 5 сек пишем мгновенный расход каждый раз в следующую ячейку массива среднего расхода

когда записывается последняя 100-я ячейка считаем среднее арифметическое между ячейками. 

и записываем в одну из 10 ячеек еепром причём выбор ячейки еепром рандомно. 

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

 

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

попробую потом это раскурить. если смогу.

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

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

Надо думать алгоритм или искать готовый

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

это не проблема так как есть расход в час. кстати все работает супер. на горячую на холостых в час 0,7 и во время хода показывает рассход как положено и на ходу расход в час и на 100 выравниваются, что есть логично. затирания попробовал на rpm все супер, щас отстальные подкоректирую. вопрос если расход например от 0,7 и допустим 12,7 как правильно прописать затирание?  затирание нужно от третьего символа, тое есть от 12,_  ? if (L100<10) и координаты третьей позиции так ? 

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

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

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

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

myGLCD.printNumF(LHor, 1, 165, 40);
      if (LHor<10) myGLCD.print(String(' '), 215,40);
      if (LHor<100) myGLCD.print(String(' '), 230,40);
MaksVV
Offline
Зарегистрирован: 06.08.2015
вот так надо
 
myGLCD.printNumF(LHor, 1, 165, 40);
      if (LHor<10) myGLCD.print(String('  '), 215,40);
      if (LHor<100&&LHor>=10) myGLCD.print(String(' '), 230,40);
viki13viki
Offline
Зарегистрирован: 14.11.2016

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

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

просто например когда расход равен 9 у тебя обе строчки выполняются, т.к. 9 это и <10 и <100 

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

логично

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

активный выдавало на пасивынй , пасивный на активный, так правильно

   if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
      myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный 
   if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);  
      myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый 
viki13viki
Offline
Зарегистрирован: 14.11.2016

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

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

Оставь 50

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

Надо смотреть что в шине на момент когда не отреагировало на нажатие. Может блок не ответил а может косяк с выводом на lcd

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

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

MaksVV пишет:

формула пробег до заправки 

S = 1.00/(float)L100*Fuel*100 

где Fuel количество топлива, л

только L100 надо средний высчитывать

Fuel- это средний расход на 100, как я понял, который нужно выщитать.

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

я там написал же :  Fuel - количество оставшегося топлива в баке. Средний расход в формуле это L100. ну да, надо было написать L100SR . А как поплавнее, это и есть мгновенный расход. Ну можно поплавнее, например сделать вывод на экран раз в полсекунды. А так то , читай про библиотекуу еепром, учись туда в ячейки данные записывать и считывать. там легко. Потом будем средний расход мучать.  

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

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

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

короче проверил я в сериале. выдает вот это

Zapros error;  
Receive:   FF FF FF FF 82 F1 11 58 0 DC 
     NO DTC  
DTC is found!
Otpravil zapros Present
Receive:   FF FF 81 F1 11 7E 1 
Zapros erase;  
Receive:   FF FF FF 83 F1 11 54 FF 0 D8 
     DTC BORRADO  
все четко..........   а на экране не пишет NO DTC и DTC BORRADO. может что то очищает сразу с экрана? вот скетч, все байты вроде правильно прописаны, может я чета не вижу?
 
/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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 = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;           //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible
  int colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
 
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

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

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    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, 19, 15, 24, 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 > 3000)  { Watch (); prevWatch = curWatch;}
    if (curTemperature - prevTemperature > 60000)  { Temperature (); prevTemperature = curTemperature;}
    if (curDvoet - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
    receive ();
    Menu();
    LCDDataPrint();
    
              }
  
   //-----------------------------------------------------------------------------
   //прописываем где и какие данные мы хотим видеть 
   //-----------------------------------------------------------------------------
   //страница HOME
   //-------------------------------------------------------
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (curData - prevData > Datadelay){  
     if (currentPage == '0') {
        Watch ();
       myGLCD.setColor(255, 255, 255);
       myGLCD.printNumI(Speed, 350, 0);
      if (Speed<10) myGLCD.print(String(' '), 365,0);
      if (Speed<100) myGLCD.print(String(' '), 380,0);
        myGLCD.setColor(0, 0, 0); 
        myGLCD.fillRect (332, 33, 349, 0);
      
      //колонка с лева
        myGLCD.setColor(255, 255, 255);
      myGLCD.printNumF(LHor, 1, 165, 40);
      if (LHor<10) myGLCD.print(String(' '), 215,40);
      if (LHor<100&&LHor>=10) myGLCD.print(String(' '), 230,40);
      myGLCD.printNumF(L100, 1, 165, 75);
      if (L100<10) myGLCD.print(String(' '), 215,75);
      if (L100<100) myGLCD.print(String(' '), 230,75);
     // myGLCD.printNumI(LFuel, 165, 110);
      //if (LFuuel<100) myGLCD.print(String('-'), 199,110);
      myGLCD.printNumI(h, 165, 145);
      if (h<100) myGLCD.print(String(' '), 199,145);
      myGLCD.printNumI(PumpRPM, 165, 180);
      if (PumpRPM<1000) myGLCD.print(String(' '), 212,180);
      myGLCD.printNumI(RPM, 165, 215);
      if (RPM<1000) myGLCD.print(String(' '), 212,215);
      //-------------------------------------------
      
      //колока с права
        myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Temp, 410, 40);
      if (Temp<100) myGLCD.print(String(' '), 440,40); 
      myGLCD.printNumI(TempOil, 410, 75);
      if (TempOil<100) myGLCD.print(String(' '), 440,75);  
      myGLCD.printNumI(TempFuel, 410, 110); 
      if (TempFuel<100) myGLCD.print(String(' '), 440,110);
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
      if (sensors.getTempCByIndex(0)<100) myGLCD.print(String(' '), 440,145);
      myGLCD.printNumI(t, 410, 180);
      if (t<100) myGLCD.print(String(' '), 440,180);  
      myGLCD.printNumI(TempAir, 410, 215);
      if (TempAir<100) myGLCD.print(String(' '), 440,215);
      
    }
   
      //----------------------------------------------------------
      //страниц INF1
      //----------------------------------------------------------
    if (currentPage == '1') {
      Watch ();
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
       if (Speed<10) myGLCD.print(String(' '), 365,0);
       if (Speed<100) myGLCD.print(String(' '), 380,0);
        myGLCD.setColor(0, 0, 0); 
        myGLCD.fillRect (332, 33, 349, 0);
 
        myGLCD.setColor(255, 255, 255);
      myGLCD.printNumF(StaDaliv,1, 395, 40);
      if (StaDaliv<10) myGLCD.print(String(' '), 443,40);
      myGLCD.printNumF(DesInj,1, 395, 75);
      if (DesInj<10) myGLCD.print(String(' '), 443,75);
      myGLCD.printNumF(ActInj,1, 395, 110);
      if (DesInj<10) myGLCD.print(String(' '), 443,110); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
      if (DesaInjQua<10) myGLCD.print(String(' '), 443,145);  
      myGLCD.printNumF(InjQua,1, 395, 180);
      if (InjQua<10) myGLCD.print(String(' '), 443,180); 
      myGLCD.printNumI(MAF, 170, 215);
      if (MAF<1000) myGLCD.print(String(' '), 221,215);
      myGLCD.printNumF(Barom, 1, 415, 215);
      if (Barom<10) myGLCD.print(String(' '), 463,215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
      Watch ();
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0);
      if (Speed<10) myGLCD.print(String(' '), 365,0);
      if (Speed<100) myGLCD.print(String(' '), 380,0);
        myGLCD.setColor(0, 0, 0); 
        myGLCD.fillRect (332, 33, 349, 0);

        myGLCD.setColor(255, 255, 255);
      myGLCD.printNumF(BoostPres,1, 395, 40);
      if (BoostPres<10) myGLCD.print(String(' '), 443,40);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75);
      if (BoostPresCom<10) myGLCD.print(String(' '), 443,75); 
      myGLCD.printNumI(EGRmg, 395, 110);
      if (EGRmg<1000) myGLCD.print(String(' '), 443,110);  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
      if (DesaInjQua<10) myGLCD.print(String(' '), 443,145);  
      myGLCD.printNumF(SolenPul, 1, 395, 180);
      if (SolenPul<10) myGLCD.print(String(' '), 443,180);  
      myGLCD.printNumF(SolenPre, 0, 395, 215);
      if (SolenPre<10) myGLCD.print(String(' '), 443,215);
        
      }
      //----------------------------------------------------------
      //страниц CHECK
      //----------------------------------------------------------
      
   if (currentPage == '3') {
     Watch ();
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0);
      if (Speed<10) myGLCD.print(String(' '), 365,0);
      if (Speed<100) myGLCD.print(String(' '), 380,0);
        myGLCD.setColor(0, 0, 0); 
        myGLCD.fillRect (332, 33, 349, 0);
      } 
      prevData = curData;
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }
 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {
     if (mySerial.available()) {
     delay(190);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


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

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

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

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

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

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


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

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messageInit[i]);
    delay (5);
    } 
    delay (55);
 }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //стартовая инициализация
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void fastinit() {
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  //запрос чтения и стирания ошибок
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  
  void Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     vista();
     //Watch ();
     myGLCD.drawLine(250,35,250,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("Ltr/100 :", 10, 75);
     myGLCD.print("Fuel  L :", 10, 110);
     myGLCD.print("Humed  %:", 10, 145);
     myGLCD.print("PUMP RPM:", 10, 180);
     myGLCD.print("Engi RPM:", 10, 215);
     myGLCD.print("Motor *C:", 255, 40);
     myGLCD.print("Oil   *C:", 255, 75);
     myGLCD.print("Fuel  *C:", 255, 110);
     myGLCD.print("Inter *C:", 255, 145);
     myGLCD.print("Exter *C:", 255, 180);
     myGLCD.print("IntAir*C:", 255, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     vista();
     //Watch ();
     myGLCD.print("Start of Delivery  *CA:", 10, 40);
     myGLCD.print("Desir inject Start *CA:", 10, 75);
     myGLCD.print("Actua Inject Start *CA:", 10, 110);
     myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
     myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
     myGLCD.print("MAF  mg/s:", 10, 215);
     myGLCD.print("Barom kPa:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     vista();
     //Watch ();
     myGLCD.print("Boost Press       Bar:", 10, 40);
     myGLCD.print("Boost Press Com   Bar:", 10, 75);
     myGLCD.print("EGR command      mg/s:", 10, 110);
     myGLCD.print("EGR Pulse Ratio     %:", 10, 145);
     myGLCD.print("Solenoide Pulse     %:", 10, 180);
     myGLCD.print("Solenoide Boost     %:", 10, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
  //----------------------------------------------------------------------------
   void drawscreen_three() {
     vista();
     //Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
   

     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void drawFrame(int x1, int y1, int x2, int y2) {
     myGLCD.setColor(255, 0, 0);
     myGLCD.drawRoundRect (x1, y1, x2, y2);
     while (myTouch.dataAvailable())
     myTouch.read();
     myGLCD.setColor(255, 255, 255); 
   }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прорисовка кнопок и координат тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void buttonHome() {
     myGLCD.setColor(0,0,0); // цвет кнопки -серый
     myGLCD.fillRoundRect (1, 1, 80, 33);      // расположение кнопки прямоугольника
     myGLCD.setColor(255, 255,255); // цвет текста зеленый
     myGLCD.drawRoundRect (1, 1, 65, 33);      // кнопка будет рамкой
     myGLCD.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); }
 
  
 }
  void Temperature (){
    myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
    myGLCD.setFont(GroteskBold16x32);
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

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

 

 

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

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

// строка ниже используется для настройки даты и времени часов
136     // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
137     // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
138     // (год, месяц, день, часы, минуты, секунды)
139     rtc.adjust(DateTime(2017, 7, 118, 17, 41, 0));

а батарейка то вставлена в часы ? 

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

 я никак не пойму вот этих строк 

190       if (Speed<10) myGLCD.print(String(' '), 365,0);
191       if (Speed<10) myGLCD.print(String(' '), 380,0);

 

198       if (LHor<10) myGLCD.print(String(' '), 215,40);
199       if (LHor<100&&LHor>=10) myGLCD.print(String(' '), 230,40);

 

201       if (L100<10) myGLCD.print(String(' '), 215,75);
202       if (L100<10) myGLCD.print(String(' '), 230,75);

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

 

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

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

136     // раскоментировать, выставить времая и дату, залить в ардуино. в скетче закоментировать
137     // обратно. иначе каждый раз будет по новой выствлятся это же время и дата
138     // (год, месяц, день, часы, минуты, секунды)
139     // rtc.adjust(DateTime(2017, 7, 18, 17, 41, 0));

 

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

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

190       if (Speed<10) myGLCD.print(String(' '), 365,0);
191       if (Speed<100) myGLCD.print(String(' '), 380,0);

 

198       if (LHor<10) myGLCD.print(String(' '), 215,40);
199       if (LHor<100&&LHor>=10) myGLCD.print(String(' '), 230,40);

 

201       if (L100<10) myGLCD.print(String(' '), 215,75);
202       if (L100<100) myGLCD.print(String(' '), 230,75);

выставил так как ты сказал

190       if (Speed<10) myGLCD.print(String('  '), 365,0);
 
198       if (LHor<10) myGLCD.print(String('  '), 215,40);
 
201       if (L100<10) myGLCD.print(String('  '), 215,75);

 

итог ,вот о каких глюках я тебе говорил. появляется какие то 8224

 

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

MaksVV
Offline
Зарегистрирован: 06.08.2015
Просто я к чему говорю, у тебя есть строка  If (L100<10) надо чтоб ты понимал что ты делаешь. в этой строке ты добавляешь  пробел.

Смысл вставлять вторую строку типа If (L100<100) если ты там опять добавляешь один же пробел. Т.е. во-первых условие неправильное, если уж вставляешь вторую строку надо диапазон значния правильно выбирать типа (меньше ста и больше или равно 10) ну и во-вторых вставлять другое количество пробелов. Просто не люблю когда пргограмма работет абы как, только не так как задумано. Понятно если глюк какойто, надо чето решать. Ну тогда вообще убрать эту строку и всё. Не думаю, что у тебя расход более 99 л/100км будет показывать. 

Изначально задумывалось так.

расход от 0...9 л ставим два пробела

расход 10...99 ставим одим пробел

расход >99 не ставим пробелов вообще 

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

if (L100<10) myGLCD.print {(String(' '), 215,75); myGLCD.print (String(' '), 230,75);}
if (L100>=10 && L100<100) myGLCD.print (String(' '), 215,75);

И не забывай что когда ты проверяешь в if  диапазон числа таким образом

if (L100<10) 
if (L100>10) 

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

if (L100<10) .....
if (L100>=10) ....

или так 

if (L100<10) ....
else .....

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

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

типа число от 10 до 99 одна строчка выполняется и печатаются только один (правый) пробел. 

ну оставь по своему. 

 

 

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

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

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

как я рад тебя слышать. 

сейчас попробую так 

1 if (L100<10) myGLCD.print {(String(' '), 215,75); (String(' '), 230,75);}
2

if (L100>=10 && L100<100) myGLCD.print (String(' '), 215,75);

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

пропайка не помогла. ищу библу.

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

библиотеку брал RTClib или конкретно под свой модуль?

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

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

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

ок, сейчас........

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

по поводу, что не с первого раза Borrado  и  NO DTC  на экран выводится, попробуй так 

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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 = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;           //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible
  int colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
 
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

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

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    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, 19, 15, 24, 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 > 3000)  { Watch (); prevWatch = curWatch;}
    if (curTemperature - prevTemperature > 60000)  { Temperature (); prevTemperature = curTemperature;}
    if (curDvoet - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
    receive ();
    Menu();
    LCDDataPrint();
    
              }
  
   //-----------------------------------------------------------------------------
   //прописываем где и какие данные мы хотим видеть 
   //-----------------------------------------------------------------------------
   //страница HOME
   //-------------------------------------------------------
   void LCDDataPrint(){
    unsigned long curData = millis();  
      
   if (curData - prevData > Datadelay){  
     if (currentPage == '0') {
        Watch ();
       myGLCD.setColor(255, 255, 255);
       myGLCD.printNumI(Speed, 350, 0);
      if (Speed<10) myGLCD.print(String(' '), 365,0);
      if (Speed<100) myGLCD.print(String(' '), 380,0);
        myGLCD.setColor(0, 0, 0); 
        myGLCD.fillRect (332, 33, 349, 0);
      
      //колонка с лева
        myGLCD.setColor(255, 255, 255);
      myGLCD.printNumF(LHor, 1, 165, 40);
      if (LHor<10) myGLCD.print(String(' '), 215,40);
      if (LHor<100) myGLCD.print(String(' '), 230,40);
      myGLCD.printNumF(L100, 1, 165, 75);
      if (L100<10) myGLCD.print(String(' '), 215,75);
      if (L100<100) myGLCD.print(String(' '), 230,75);
     // myGLCD.printNumI(LFuel, 165, 110);
      //if (LFuuel<100) myGLCD.print(String('-'), 199,110);
      myGLCD.printNumI(h, 165, 145);
      if (h<100) myGLCD.print(String(' '), 199,145);
      myGLCD.printNumI(PumpRPM, 165, 180);
      if (PumpRPM<1000) myGLCD.print(String(' '), 212,180);
      myGLCD.printNumI(RPM, 165, 215);
      if (RPM<1000) myGLCD.print(String(' '), 212,215);
      //-------------------------------------------
      
      //колока с права
        myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Temp, 410, 40);
      if (Temp<100) myGLCD.print(String(' '), 440,40); 
      myGLCD.printNumI(TempOil, 410, 75);
      if (TempOil<100) myGLCD.print(String(' '), 440,75);  
      myGLCD.printNumI(TempFuel, 410, 110); 
      if (TempFuel<100) myGLCD.print(String(' '), 440,110);
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
      if (sensors.getTempCByIndex(0)<100) myGLCD.print(String(' '), 440,145);
      myGLCD.printNumI(t, 410, 180);
      if (t<100) myGLCD.print(String(' '), 440,180);  
      myGLCD.printNumI(TempAir, 410, 215);
      if (TempAir<100) myGLCD.print(String(' '), 440,215);
      
    }
   
      //----------------------------------------------------------
      //страниц INF1
      //----------------------------------------------------------
    if (currentPage == '1') {
      Watch ();
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
       if (Speed<10) myGLCD.print(String(' '), 365,0);
       if (Speed<100) myGLCD.print(String(' '), 380,0);
        myGLCD.setColor(0, 0, 0); 
        myGLCD.fillRect (332, 33, 349, 0);
 
        myGLCD.setColor(255, 255, 255);
      myGLCD.printNumF(StaDaliv,1, 395, 40);
      if (StaDaliv<10) myGLCD.print(String(' '), 443,40);
      myGLCD.printNumF(DesInj,1, 395, 75);
      if (DesInj<10) myGLCD.print(String(' '), 443,75);
      myGLCD.printNumF(ActInj,1, 395, 110);
      if (DesInj<10) myGLCD.print(String(' '), 443,110); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
      if (DesaInjQua<10) myGLCD.print(String(' '), 443,145);  
      myGLCD.printNumF(InjQua,1, 395, 180);
      if (InjQua<10) myGLCD.print(String(' '), 443,180); 
      myGLCD.printNumI(MAF, 170, 215);
      if (MAF<1000) myGLCD.print(String(' '), 221,215);
      myGLCD.printNumF(Barom, 1, 415, 215);
      if (Barom<10) myGLCD.print(String(' '), 463,215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
    if (currentPage == '2') {
      Watch ();
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0);
      if (Speed<10) myGLCD.print(String(' '), 365,0);
      if (Speed<100) myGLCD.print(String(' '), 380,0);
        myGLCD.setColor(0, 0, 0); 
        myGLCD.fillRect (332, 33, 349, 0);

        myGLCD.setColor(255, 255, 255);
      myGLCD.printNumF(BoostPres,1, 395, 40);
      if (BoostPres<10) myGLCD.print(String(' '), 443,40);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75);
      if (BoostPresCom<10) myGLCD.print(String(' '), 443,75); 
      myGLCD.printNumI(EGRmg, 395, 110);
      if (EGRmg<1000) myGLCD.print(String(' '), 443,110);  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
      if (DesaInjQua<10) myGLCD.print(String(' '), 443,145);  
      myGLCD.printNumF(SolenPul, 1, 395, 180);
      if (SolenPul<10) myGLCD.print(String(' '), 443,180);  
      myGLCD.printNumF(SolenPre, 0, 395, 215);
      if (SolenPre<10) myGLCD.print(String(' '), 443,215);
        
      }
      //----------------------------------------------------------
      //страниц CHECK
      //----------------------------------------------------------
      
   if (currentPage == '3') {
     Watch ();
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0);
      if (Speed<10) myGLCD.print(String(' '), 365,0);
      if (Speed<100) myGLCD.print(String(' '), 380,0);
        myGLCD.setColor(0, 0, 0); 
        myGLCD.fillRect (332, 33, 349, 0);
      } 
      prevData = curData;
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }
 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
    void receive () {
     if (mySerial.available()) {
     delay(190);
     int k=0;
     byte inbyte=0;
     
     while( mySerial.available() && k < 110) {
     inbyte = mySerial.read();
     MessageRx[k] = inbyte;
     k++;   }
    
     Serial.print ("Receive:   ");
    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");


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

   if (currentPage == '3'){
  
 //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
     
        myGLCD.clrScr();             
        drawscreen_three();      

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



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

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

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


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

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


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

  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //отправка запроса на диагностическое соединение
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initialization() {
    Serial.println ("Otpravil zapros Init");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messageInit[i]);
    delay (5);
    } 
    delay (55);
 }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //стартовая инициализация
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void fastinit() {
    digitalWrite (TX, HIGH);  // makes K-line high 3
    delay(360);             // wait for K-line to be clear 3
    digitalWrite (TX, LOW);  // makes K-line low  3
    delay(25);
    digitalWrite (TX, HIGH); // makes K-line high  3
    delay(25);               //last delay before first message
    mySerial.begin(10400);  // baud rate of the OBD
    }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  //запрос чтения и стирания ошибок
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  
  void Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     vista();
     //Watch ();
     myGLCD.drawLine(250,35,250,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("Ltr/100 :", 10, 75);
     myGLCD.print("Fuel  L :", 10, 110);
     myGLCD.print("Humed  %:", 10, 145);
     myGLCD.print("PUMP RPM:", 10, 180);
     myGLCD.print("Engi RPM:", 10, 215);
     myGLCD.print("Motor *C:", 255, 40);
     myGLCD.print("Oil   *C:", 255, 75);
     myGLCD.print("Fuel  *C:", 255, 110);
     myGLCD.print("Inter *C:", 255, 145);
     myGLCD.print("Exter *C:", 255, 180);
     myGLCD.print("IntAir*C:", 255, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     vista();
     //Watch ();
     myGLCD.print("Start of Delivery  *CA:", 10, 40);
     myGLCD.print("Desir inject Start *CA:", 10, 75);
     myGLCD.print("Actua Inject Start *CA:", 10, 110);
     myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
     myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
     myGLCD.print("MAF  mg/s:", 10, 215);
     myGLCD.print("Barom kPa:", 255, 215);
     buttonHome() ;
     buttonINF2() ;
     buttonCHECK() ;
     }
  //-------------------------------------------------
   void drawscreen_two() {
     line() ;
     vista();
     //Watch ();
     myGLCD.print("Boost Press       Bar:", 10, 40);
     myGLCD.print("Boost Press Com   Bar:", 10, 75);
     myGLCD.print("EGR command      mg/s:", 10, 110);
     myGLCD.print("EGR Pulse Ratio     %:", 10, 145);
     myGLCD.print("Solenoide Pulse     %:", 10, 180);
     myGLCD.print("Solenoide Boost     %:", 10, 215);
  
     buttonHome() ;
     buttonINF1() ;
     buttonCHECK() ;
   }
  //----------------------------------------------------------------------------
   void drawscreen_three() {
     vista();
     //Watch ();
     myGLCD.setColor(255, 0, 0); // цвет линии красный
     myGLCD.drawLine(1,35,479,35); // линия горизонтальная
     myGLCD.drawLine(1,248,479,248); // линия горизонтальная
   

     buttonHome();
     buttonERASE();
     buttonREAD();
   }

  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //координаты тача
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void drawFrame(int x1, int y1, int x2, int y2) {
     myGLCD.setColor(255, 0, 0);
     myGLCD.drawRoundRect (x1, y1, x2, y2);
     while (myTouch.dataAvailable())
     myTouch.read();
     myGLCD.setColor(255, 255, 255); 
   }

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

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

 

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

поехали. это единственная конфигурация которая у меня работет корректно

myGLCD.printNumF(LHor, 1, 165, 40);
        if (LHor<10) myGLCD.print(String(' '), 215,40);
        if (LHor<100&&LHor>=10) myGLCD.print(String(' '), 230,40);
       myGLCD.printNumF(L100, 1, 165, 75);
        if (L100<10) myGLCD.print(String(' '), 215,75);
        if (L100<100&&L100>=10) myGLCD.print(String(' '), 230,75);
с "нет ошибок" "стерты ошибки" сработало. но идет как бы двойная очистка, нажимаешь читать и идет одна прорисовка пустого экрана и после вторая прорисовка с "нет ошибок". происходит быстро. думаю косяк в том что гдето сначало выводится ответ и сразу очистка, поэтому и не выводило, может я и ошибаюсь. но сейчас все выводит, стабильно на вторую прорисовку. 
MaksVV
Offline
Зарегистрирован: 06.08.2015

Т.е. все таки со второго нажатия выводит? Или с одного нажатия но с двумя прорисовками?

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

Щас посмотрел, у тебя опять цикл Watch () в находится в цикле распечатки параметров на экран. Я ж убирал его оттуда.

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

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

/////////////////////////////////////////////////////////////////////////////////////////
  //библиотеки
  ///////////////////////////////////////////////////////////////////////////////////////////
  #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); //(10)RХ,(11)TХ ардуино
  #define TX 11   //передача запросов с ардуино
  
  //длинна конкретных сообщений
  int length5 = 5;
  int length6 = 6;
  int length8 = 8;
  int length7 = 7;

  
  bool Init = 0;
  int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
  int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
  int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
  int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
  
  float L100 = 0;           //расход литров на 100км
  float LHor = 0;           //расход топлива литров в час
  int MAF = 0;              //26,27 байты   Sensor de flujo de aire en masa
  float BoostPres = 0;      //28,29 байты   Presión de refuerzo
  int RPM = 0;              //32,33 байты   Velocidad del motor
  int EGRmg = 0;            //34,35 байты   Comando EGR (Comando de recirculación de gases de escape)
  float BoostPresCom = 0;   //38,39 байты   Comando de presión de refuerzo
  int Speed = 0;            //44,45 байты   Velocidad del vehículo
  float DesaInjQua = 0;     //50,51 байты   Cantidad de inyección deseada
  float InjQua = 0;         //52,53 байты   Cantidad de la inyección
  float StaDaliv = 0;       //54,55 байты   Inicio de la entrega
  int PumpRPM = 0;          //56,57 байты   Velocidad de la bomba
  float EGRPul = 0;         //62,63 байты   Relación de impulsos EGR (recirculación de gases de escape
  float SolenPul = 0;       //64,65 байты   Velocidad de solenoide de control de nivel de remolino Relación de impulsos
  float SolenPre = 0;       //70,71 байты   Relación de impulsos Presión Electroválvula de presión
  float DesInj = 0;         //72,73 байты   Inyección deseada Inicio
  float ActInj = 0;         //16,17 байты   Inicio de la inyección real
  int TempAir = 0;          //74,75 байты   Temperatura del aire de admisión
  int Temp = 0;             //14,15 байты   Temperatura del refrigerante
  int TempOil = 0;          //18,19 байты   Temperatura del aceite del motor
  int TempFuel = 0;         //58,59 байты   Temperatura del combustible
  int colerror = 0;         //количество ошибок в правом верхнем углу третьего экрана
  float Barom = 0;          // барометр 
  
  byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
 
  byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
  byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
  byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 2101
  byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
  byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок


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

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

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

    void setup() {
    Serial.begin(115200);
    mySerial.begin(10400);
    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, 20, 15, 40, 0));
    Watch();             //часы и дата
    Temperature ();      //наружняя температура
    pinMode(TX, OUTPUT);   //пин 10 ардуино, отправка запросов к ЕБУ
    fastinit();    //инициализация
    }

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

   void loop() {
    unsigned long curPID = millis ();
    unsigned long curpres = millis ();
    unsigned long curTemperature = millis();
    unsigned long curWatch = millis();  
    unsigned long curDvoet = millis();  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид 2101, если страница 3 -  шлем запрос присутствия 
      if (curPID - prevPID > PIDTime) {PIDs(); prevPID = curPID;}}                                     //для запроса пидов
      else if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}}                        //для запроса присутствия
    if (curWatch - prevWatch > 3000)  { Watch (); prevWatch = curWatch;}                               //для часов
    if (curTemperature - prevTemperature > 60000)  { Temperature (); prevTemperature = curTemperature;}  //для наружней температуры
    if (curDvoet - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;} //для двоеточия часы
    receive ();   //получение данных
    Menu();       //тач кнопки и координаны тача
    LCDDataPrint();  //прорисовка данных на экране
    
              }
  
   ////////////////////////////////////////////////////////////////////////////////
   //прописываем где и какие данные мы хотим видеть на страницах
   ////////////////////////////////////////////////////////////////////////////////
   //страница HOME
   
   void LCDDataPrint(){
    unsigned long curData = millis();  
       if (curData - prevData > Datadelay){  
        if (currentPage == '0') {
       myGLCD.setColor(255, 255, 255);
       myGLCD.printNumI(Speed, 350, 0);
        if (Speed<10) myGLCD.print(String(' '), 365,0);
        if (Speed<100) myGLCD.print(String(' '), 380,0);
       myGLCD.setColor(0, 0, 0); 
       myGLCD.fillRect (332, 33, 349, 0);
     //----------------------------------------------------------- 
     //колонка с лева
       myGLCD.setColor(255, 255, 255);
       myGLCD.printNumF(LHor, 1, 165, 40);
        if (LHor<10) myGLCD.print(String(' '), 215,40);
        if (LHor<100&&LHor>=10) myGLCD.print(String(' '), 230,40);
       myGLCD.printNumF(L100, 1, 165, 75);
        if (L100<10) myGLCD.print(String(' '), 215,40);
        if (L100<100&&L100>=10) myGLCD.print(String(' '), 230,40);
     // myGLCD.printNumI(LFuel, 165, 110);
      //if (LFuuel<100) myGLCD.print(String('-'), 199,110);
       myGLCD.printNumI(h, 165, 145);
        if (h<100) myGLCD.print(String(' '), 199,145);
       myGLCD.printNumI(PumpRPM, 165, 180);
        if (PumpRPM<1000) myGLCD.print(String(' '), 212,180);
       myGLCD.printNumI(RPM, 165, 215);
        if (RPM<1000) myGLCD.print(String(' '), 212,215);
     //----------------------------------------------------------
     //колока с права
       myGLCD.setColor(255, 255, 255);
       myGLCD.printNumI(Temp, 410, 40);
        if (Temp<100) myGLCD.print(String(' '), 440,40); 
       myGLCD.printNumI(TempOil, 410, 75);
        if (TempOil<100) myGLCD.print(String(' '), 440,75);  
       myGLCD.printNumI(TempFuel, 410, 110); 
        if (TempFuel<100) myGLCD.print(String(' '), 440,110);
       myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
        if (sensors.getTempCByIndex(0)<100) myGLCD.print(String(' '), 440,145);
      myGLCD.printNumI(t, 410, 180);
        if (t<100) myGLCD.print(String(' '), 440,180);  
      myGLCD.printNumI(TempAir, 410, 215);
        if (TempAir<100) myGLCD.print(String(' '), 440,215);
       }
      /////////////////////////////////////////////////////////////
      //страниц INF1
    
       if (currentPage == '1') {
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0);
       if (Speed<10) myGLCD.print(String(' '), 365,0);
       if (Speed<100) myGLCD.print(String(' '), 380,0);
      myGLCD.setColor(0, 0, 0); 
      myGLCD.fillRect (332, 33, 349, 0);
 
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumF(StaDaliv,1, 395, 40);
       if (StaDaliv<10) myGLCD.print(String(' '), 443,40);
      myGLCD.printNumF(DesInj,1, 395, 75);
       if (DesInj<10) myGLCD.print(String(' '), 443,75);
      myGLCD.printNumF(ActInj,1, 395, 110);
       if (DesInj<10) myGLCD.print(String(' '), 443,110); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
       if (DesaInjQua<10) myGLCD.print(String(' '), 443,145);  
      myGLCD.printNumF(InjQua,1, 395, 180);
       if (InjQua<10) myGLCD.print(String(' '), 443,180); 
      myGLCD.printNumI(MAF, 170, 215);
       if (MAF<1000) myGLCD.print(String(' '), 221,215);
      myGLCD.printNumF(Barom, 1, 415, 215);
       if (Barom<10) myGLCD.print(String(' '), 463,215);
      }
      //////////////////////////////////////////////////////////////
      //страниц INF2
     
       if (currentPage == '2') {
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0);
       if (Speed<10) myGLCD.print(String(' '), 365,0);
       if (Speed<100) myGLCD.print(String(' '), 380,0);
      myGLCD.setColor(0, 0, 0); 
      myGLCD.fillRect (332, 33, 349, 0);

      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumF(BoostPres,1, 395, 40);
       if (BoostPres<10) myGLCD.print(String(' '), 443,40);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75);
       if (BoostPresCom<10) myGLCD.print(String(' '), 443,75); 
      myGLCD.printNumI(EGRmg, 395, 110);
       if (EGRmg<1000) myGLCD.print(String(' '), 443,110);  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);
       if (DesaInjQua<10) myGLCD.print(String(' '), 443,145);  
      myGLCD.printNumF(SolenPul, 1, 395, 180);
       if (SolenPul<10) myGLCD.print(String(' '), 443,180);  
      myGLCD.printNumF(SolenPre, 0, 395, 215);
       if (SolenPre<10) myGLCD.print(String(' '), 443,215);
      }
      ///////////////////////////////////////////////////////////////////
      //страниц CHECK
      
       if (currentPage == '3') {
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(Speed, 350, 0);
       if (Speed<10) myGLCD.print(String(' '), 365,0);
       if (Speed<100) myGLCD.print(String(' '), 380,0);
      myGLCD.setColor(0, 0, 0); 
      myGLCD.fillRect (332, 33, 349, 0);
       } 
      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 DTC"
     if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
     myGLCD.clrScr();            
     drawscreen_three(); 
     myGLCD.print("NO DTC", 165, 145);
     Serial.println ("     NO DTC  ");
     }
     //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
     if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
     myGLCD.clrScr();            
     drawscreen_three();
     myGLCD.print("DTC BORRADO", 165, 145);
     Serial.println ("     DTC BORRADO  ");
     }
     // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
     if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58){
     Serial.println ("DTC is found!");

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

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

      if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
      if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}
      if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y));
       else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y));
 
      if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
      if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;}
      if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); 
       else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));}
       }
     }
   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
   //прописываем формулы к данным
   
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    Barom = MessageRx[39];
    L100 = (float)LHor*100.0/(float)Speed;
    LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    // есили не устраивают формулы последних четырех температур то их закоментировать и раскоментировать
    // формулы ниже. Эти формулы болле точные и разработаны пользователем этого форума MaksVV.
    /*
    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);  // ждем 360 секунд для очистки канала
    delay(360);            
    digitalWrite (TX, LOW);  // опускаем линию на 25 м/с
    delay(25);
    digitalWrite (TX, HIGH); // поднимаем линию на 25 м/с
    delay(25);               
    mySerial.begin(10400);  // переходим на скорость 10400 boud
    }

  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  //запрос чтения и стирания ошибок
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  
  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() {
     Watch();
     line() ;  //прорисовка линий
     vista();  //цвет и шрифт
     myGLCD.drawLine(250,35,250,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("Ltr/100 :", 10, 75);
     myGLCD.print("Fuel Ltr:", 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() {
     Watch();
     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() {
     Watch();
     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() {
     Watch();
     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); }
    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();
    }
 

 

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

попробуй закоментировать строчки с 278 по 288 (вывод скорости на экран), и проверь как выводиться NO DTC

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

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

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

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

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

подожди я ж убрал строчки 703, 704  и 685, 686. Короче у нас миллион проблем из-за того, что я переделываю скетч, начинаю думать что допустим что-то исправил, ты без палева возвращаешь всё на место по тем или иным причинам, потом из за этого соответсвенно появляются всё новые и новые косяки, я уже на это не думаю т.к. вроде исправил, потом смотрю дак там опять ничё не исправлено потому что. 

 

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

вот эту строчку я так сделал,

if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){

а она у тебя опять такая прежняя стала

if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58){

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

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