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

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

Не проходит проверку он у тебя когда более 1 дтс

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

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

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

Проверку 4 байта просто убери и все

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

viki13viki пишет:

убрал иду проверю

А что ты тогда убрал? Непонятно

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

убрал пер вый проверочный байт 85. сделал три ошибки

 FF FF FF FF 8B F1 11 58 3 1 15 E1 11 10 E4 4 0 E4 CC 

все пошло на экране , подогнал координаты буквы и цыфры, 

вот что получаем , а получаем DEC

ERROR: 1 :  p 1 21         P0115

ERROR: 2 :  p 1716        P1110

ERROR: 3 :  p 4 0           Pне помню

 

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

Надо добавить прописывание нуля, если байт менее или равен 0х0F

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

А еррор точно во всех строках 1?

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

испарвил. просто копировал

но не внрное отображение ERROR: 1 :  p 1 21         P0115

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

поправлю позже

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

ок. сенкс

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

скинь последнюю версию той части скетча

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

короче как то так, корректируй координаты под свои 

for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 130, (75+y));
if (!bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(":  P", 140, (75+y));
if (bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(":  C", 140, (75+y));
if (!bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(":  B", 140, (75+y));
if (bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(":  U", 140, (75+y));
if (MessageRx[9+(i*3)]<=0x0F) {myGLCD.print("0", 180, (75+y)); nolA = 1;}
if (nolA) myGLCD.print(String (MessageRx[9+(i*3)],HEX), 190, (75+y));
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 180, (75+y));
if (MessageRx[10+(i*3)]<=0x0F) {myGLCD.print("0", 180, (75+y)); nolB = 1;}
if (nolB) myGLCD.print(String (MessageRx[10+(i*3)],HEX), 190, (75+y));
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 180, (75+y));}

 

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

последняя версия

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

  float h;
  float t;

  
  bool Dvoet = 0;

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

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

  
  bool Init = 0;

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


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

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

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

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

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

   void loop() {
    
    unsigned long curPID = millis ();
    unsigned long curpres = millis ();
    unsigned long curTemperature = millis();
    unsigned long curWatch = millis();  
    unsigned long curDvoet = millis();  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (curPID - prevPID > PIDTime) {PIDs(); prevPID = curPID;}}
      else if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}}
    if (curWatch - prevWatch > 10000)  { Watch (); prevWatch = curWatch;}
    if (curTemperature - prevTemperature > 60000)  { Temperature (); prevTemperature = curTemperature;}
    if (curDvoet - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
    receive ();
    Menu();
    LCDDataPrint();
    
              }
  
   //-----------------------------------------------------------------------------
   //прописываем где и какие данные мы хотим видеть 
   //-----------------------------------------------------------------------------
   //страница HOME
   //-------------------------------------------------------
   void LCDDataPrint(){
     
    unsigned long curData = millis();  
      
      if (curData - prevData > Datadelay){  
        
        if (currentPage == '0') {
       
       myGLCD.setColor(255, 255, 255);
       myGLCD.printNumI(Speed, 350, 0);
      
      myGLCD.setColor(255, 255, 255); 
      
      myGLCD.printNumF(LHor, 1, 165, 40);
      myGLCD.printNumF(L100, 1, 165, 75);
     // myGLCD.printNumI(Speed, 165, 110);
      myGLCD.printNumI(h, 165, 145);
      myGLCD.printNumI(PumpRPM, 165, 180);
      myGLCD.printNumI(RPM, 165, 215);
      //-------------------------------------------
      myGLCD.printNumI(Temp, 410, 40); 
      myGLCD.printNumI(TempOil, 410, 75);  
      myGLCD.printNumI(TempFuel, 410, 110);
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
      myGLCD.printNumI(t, 410, 180);  
      myGLCD.printNumI(TempAir, 410, 215);
      
    }
   
      //----------------------------------------------------------
      //страниц INF1
      //----------------------------------------------------------
      if (currentPage == '1') {
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
      
      myGLCD.printNumF(StaDaliv,1, 395, 40); 
      myGLCD.printNumF(DesInj,1, 395, 75); 
      myGLCD.printNumF(ActInj,1, 395, 110); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145);  
      myGLCD.printNumF(InjQua,1, 395, 180); 
      myGLCD.printNumI(MAF, 170, 215);
      myGLCD.printNumF(Barom, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
      if (currentPage == '2') {
       
        
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
      myGLCD.printNumF(BoostPres,1, 395, 40);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75); 
      myGLCD.printNumI(EGRmg, 395, 110);  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);  
      myGLCD.printNumF(SolenPul, 1, 395, 180);  
      myGLCD.printNumF(SolenPre, 0, 395, 215);
        
      }
      //----------------------------------------------------------
      //страниц CHECK
      //----------------------------------------------------------
      
      if (currentPage == '3') {
      
        
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
        
          
        myGLCD.setColor(255, 255, 255);
        
       
      } 
      prevData = curData;
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }
 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


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


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

   if (currentPage == '3'){
   //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9 ]==0xDC){
     myGLCD.print("NO ERROR", 165, 145);
     Serial.println ("     NO ERROR  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
   if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58){
      for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      myGLCD.setColor(255, 255, 255);
      myGLCD.print("ERROR: ", 30, (75+y));
      myGLCD.printNumI((i+1), 130, (75+y));
        if (bitRead(MessageRx[9],6)==0 && bitRead(MessageRx[9],7)==0) myGLCD.print(": P", 160, (75+y));
        if (bitRead(MessageRx[9],6)==1 && bitRead(MessageRx[9],7)==0) myGLCD.print(": C", 160, (75+y));
        if (bitRead(MessageRx[9],6)==0 && bitRead(MessageRx[9],7)==1) myGLCD.print(": B", 160, (75+y));
        if (bitRead(MessageRx[9],6)==1 && bitRead(MessageRx[9],7)==1) myGLCD.print(": U", 160, (75+y));
      myGLCD.printNumI(MessageRx[9+(i*3)], 230, (75+y));
      myGLCD.printNumI(MessageRx[10+(i*3)], 262, (75+y));}
        Serial.println ("     OSHIBKA ESTY ");
   }
   
   // при получении этого сообщения выдавать на третий экран "BORRADO" стерто
   if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
     myGLCD.print("BORRADO", 165, 145);
     Serial.println ("     BORRADOR  ");
    }}
   
   //прописываем формулы к данным
   else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01)    {
    Barom = MessageRx[39];
    L100 =  (14.6*6.8*4.54*Speed*0.621371)/(3600*MAF/100);
    LHor = ((InjQua*4)*3.6)/100.0;
    MAF =  ((MessageRx[29]*256)+MessageRx[30])/10;
    BoostPres =  ((MessageRx[31]*256)+MessageRx[32])/1000.0;
    RPM =  (MessageRx[35]*256)+MessageRx[36];
    EGRmg =  ((MessageRx[37]*256)+MessageRx[38])/10.0;
    BoostPresCom =  ((MessageRx[41]*256)+MessageRx[42])/1000.0;
    Speed =  ((MessageRx[47]*256)+MessageRx[48])/100;
    DesaInjQua =  ((MessageRx[53]*256)+MessageRx[54])/100.0;
    InjQua =  ((MessageRx[55]*256)+MessageRx[56])/100.0;
    StaDaliv =  ((MessageRx[57]*256)+MessageRx[58])/100.0;
    PumpRPM =  (MessageRx[59]*256)+MessageRx[60];
    EGRPul =  ((MessageRx[65]*256)+MessageRx[66])/100.0;
    SolenPul =  ((MessageRx[67]*256)+MessageRx[68])/100.0;
    SolenPre =  ((MessageRx[73]*256)+MessageRx[74])/100.0;
    DesInj =  ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
    ActInj =  ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
    //TempAir =  ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
    //Temp =  ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
    //TempOil =  ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
    //TempFuel =  ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
    
    int A = 0;
    if  (MessageRx[77]<=0x0A) A = 277;
    if  (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[77]>=0x0D) A = 279;
    double B = MessageRx[78]/10.0;
    double cel , drob ;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      TempAir =  ((MessageRx[77]*26)-A)+cel;
    
    if  (MessageRx[17]<=0x0A) A = 277;
    if  (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
    if  (MessageRx[17]>=0x0D) A = 279;
    B = MessageRx[18]/10.0;
    drob = modf(B, &cel);
    if (drob>0.6) cel++;
      Temp =  ((MessageRx[17]*26)-A)+cel;

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


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

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

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

  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  //запрос чтения и стирания ошибок
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  
  void Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     vista();
     Watch ();
     myGLCD.drawLine(239,35,239,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("Ltr/100 :", 10, 75);
     myGLCD.print("Fuel  L :", 10, 110);
     myGLCD.print("Humed  %:", 10, 145);
     myGLCD.print("PUMP RPM:", 10, 180);
     myGLCD.print("Engi RPM:", 10, 215);
     myGLCD.print("Motor *C:", 255, 40);
     myGLCD.print("Oil   *C:", 255, 75);
     myGLCD.print("Fuel  *C:", 255, 110);
     myGLCD.print("Inter *C:", 255, 145);
     myGLCD.print("Exter *C:", 255, 180);
     myGLCD.print("IntAir*C:", 255, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     vista();
     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); }
 
    myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
    myGLCD.print("Km/h", 410, 0);
  
 }
  void Temperature (){
    myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
    myGLCD.setFont(GroteskBold16x32);
    h = dht.readHumidity();
    t = dht.readTemperature();
    sensors.requestTemperatures();
    }
 

 

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

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

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

  float h;
  float t;

  
  bool Dvoet = 0;

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

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

  
  bool Init = 0;

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


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

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

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

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

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

   void loop() {
    
    unsigned long curPID = millis ();
    unsigned long curpres = millis ();
    unsigned long curTemperature = millis();
    unsigned long curWatch = millis();  
    unsigned long curDvoet = millis();  
    TimewaitPID = millis ();
    TimewaitInit = millis ();
    
    if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
                else if (TIMEREXPIRED_Init) timerenabledInit=0;}
    else {
      if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
      if (curPID - prevPID > PIDTime) {PIDs(); prevPID = curPID;}}
      else if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}}
    if (curWatch - prevWatch > 10000)  { Watch (); prevWatch = curWatch;}
    if (curTemperature - prevTemperature > 60000)  { Temperature (); prevTemperature = curTemperature;}
    if (curDvoet - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
    receive ();
    Menu();
    LCDDataPrint();
    
              }
  
   //-----------------------------------------------------------------------------
   //прописываем где и какие данные мы хотим видеть 
   //-----------------------------------------------------------------------------
   //страница HOME
   //-------------------------------------------------------
   void LCDDataPrint(){
     
    unsigned long curData = millis();  
      
      if (curData - prevData > Datadelay){  
        
        if (currentPage == '0') {
       
       myGLCD.setColor(255, 255, 255);
       myGLCD.printNumI(Speed, 350, 0);
      
      myGLCD.setColor(255, 255, 255); 
      
      myGLCD.printNumF(LHor, 1, 165, 40);
      myGLCD.printNumF(L100, 1, 165, 75);
     // myGLCD.printNumI(Speed, 165, 110);
      myGLCD.printNumI(h, 165, 145);
      myGLCD.printNumI(PumpRPM, 165, 180);
      myGLCD.printNumI(RPM, 165, 215);
      //-------------------------------------------
      myGLCD.printNumI(Temp, 410, 40); 
      myGLCD.printNumI(TempOil, 410, 75);  
      myGLCD.printNumI(TempFuel, 410, 110);
      myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
      myGLCD.printNumI(t, 410, 180);  
      myGLCD.printNumI(TempAir, 410, 215);
      
    }
   
      //----------------------------------------------------------
      //страниц INF1
      //----------------------------------------------------------
      if (currentPage == '1') {
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
      
      myGLCD.printNumF(StaDaliv,1, 395, 40); 
      myGLCD.printNumF(DesInj,1, 395, 75); 
      myGLCD.printNumF(ActInj,1, 395, 110); 
      myGLCD.printNumF(DesaInjQua,1, 395, 145);  
      myGLCD.printNumF(InjQua,1, 395, 180); 
      myGLCD.printNumI(MAF, 170, 215);
      myGLCD.printNumF(Barom, 1, 415, 215);
      }
      //----------------------------------------------------------
      //страниц INF2
      //----------------------------------------------------------
     
      if (currentPage == '2') {
       
        
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
          
        myGLCD.setColor(255, 255, 255);
        
      myGLCD.printNumF(BoostPres,1, 395, 40);  
      myGLCD.printNumF(BoostPresCom,1, 395, 75); 
      myGLCD.printNumI(EGRmg, 395, 110);  
      myGLCD.printNumF(DesaInjQua,1, 395, 145);  
      myGLCD.printNumF(SolenPul, 1, 395, 180);  
      myGLCD.printNumF(SolenPre, 0, 395, 215);
        
      }
      //----------------------------------------------------------
      //страниц CHECK
      //----------------------------------------------------------
      
      if (currentPage == '3') {
      
        
        myGLCD.setColor(255, 255, 255);
        myGLCD.printNumI(Speed, 350, 0);
        
          
        myGLCD.setColor(255, 255, 255);
        
       
      } 
      prevData = curData;
    }
   }
  
  ///////////////////////////////////////////////////////////////////////////
  
  //отправка запроса пид 2101
  void PIDs() {
    Serial.println ("Otpravil zapros 21 01");
    for (int i = 0; i < length6; i++) {
    mySerial.write(messagePids[i]);
    delay (waitbyte); } 
   }
 
 //отправка запроса присутствия
 void present() {
  Serial.println ("Otpravil zapros Present");
    for (int i = 0; i < length5; i++) {
    mySerial.write(messagePresent[i]);
    delay (waitbyte); }
   }


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


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

   if (currentPage == '3'){
   //при получении этого сообщения выдавать на третий экран "NO ERROR"
   if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9 ]==0xDC){
     myGLCD.print("NO ERROR", 165, 145);
     Serial.println ("     NO ERROR  ");
     }
    
    // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
  /* if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58){
      for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      myGLCD.setColor(255, 255, 255);
      myGLCD.print("ERROR: ", 30, (75+y));
      myGLCD.printNumI((i+1), 130, (75+y));
        if (bitRead(MessageRx[9],6)==0 && bitRead(MessageRx[9],7)==0) myGLCD.print(": P", 160, (75+y));
        if (bitRead(MessageRx[9],6)==1 && bitRead(MessageRx[9],7)==0) myGLCD.print(": C", 160, (75+y));
        if (bitRead(MessageRx[9],6)==0 && bitRead(MessageRx[9],7)==1) myGLCD.print(": B", 160, (75+y));
        if (bitRead(MessageRx[9],6)==1 && bitRead(MessageRx[9],7)==1) myGLCD.print(": U", 160, (75+y));
      myGLCD.printNumI(MessageRx[9+(i*3)], 230, (75+y));
      myGLCD.printNumI(MessageRx[10+(i*3)], 262, (75+y));}
        Serial.println ("     OSHIBKA ESTY ");
   }
   */
   for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
      myGLCD.print("ERROR ", 50, (75+y));
      myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(": U", 170, (75+y));

if (MessageRx[9+(i*3)]<=0x0F) {myGLCD.print("0", 230, (75+y)); nolA = 1;}
if (nolA) myGLCD.print(String (MessageRx[9+(i*3)]), 246, (75+y)); 
    else myGLCD.print(String (MessageRx[9+(i*3)]), 230, (75+y)); 

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

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


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

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

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

  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  //запрос чтения и стирания ошибок
  ///////////////////////////////////////////////////////////////////////////////////////////////////////
  
  void Read() {
    Serial.println ("Zapros error;  ");
    for (int i = 0; i < length8; i++) {
    mySerial.write(messageREAD[i]);
    delay (waitbyte); } 
    }
    
  void Erase() {
    Serial.println ("Zapros erase;  ");
    for (int i = 0; i < length7; i++) {
    mySerial.write(messageERASE[i]);
    delay (waitbyte); } 
    }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  //прорисовка экранов и работа тачскрина
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void Menu () {
      if (myTouch.dataAvailable()) {
         myTouch.read();
         x=myTouch.getX(); 
         y=myTouch.getY();
      if (currentPage == '0') {
      buttonHomeTouch();
      buttonINF1Touch();
      buttonINF2Touch();
      buttonCHECKTouch();     }
      if (currentPage == '1') { 
     buttonHomeTouch();
     buttonINF2Touch();
     buttonCHECKTouch();     }
      if (currentPage == '2') { 
     buttonHomeTouch();
     buttonINF1Touch();
     buttonCHECKTouch();      }
      if (currentPage == '3') { 
      buttonHomeTouch();
      buttonREADTouch();
      buttonERASETouch(); }}}
  
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //прописывает заголовки на страницах
  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   void drawHomeScreen() {
     line() ;
     vista();
     Watch ();
     myGLCD.drawLine(239,35,239,248); // линия вертикальная
     myGLCD.print("Ltr/Hor :", 10, 40);
     myGLCD.print("Ltr/100 :", 10, 75);
     myGLCD.print("Fuel  L :", 10, 110);
     myGLCD.print("Humed  %:", 10, 145);
     myGLCD.print("PUMP RPM:", 10, 180);
     myGLCD.print("Engi RPM:", 10, 215);
     myGLCD.print("Motor *C:", 255, 40);
     myGLCD.print("Oil   *C:", 255, 75);
     myGLCD.print("Fuel  *C:", 255, 110);
     myGLCD.print("Inter *C:", 255, 145);
     myGLCD.print("Exter *C:", 255, 180);
     myGLCD.print("IntAir*C:", 255, 215);
     buttonHome() ;
     buttonINF1() ;
     buttonINF2() ;
     buttonCHECK() ;
   }
  //-------------------------------------------------
    void drawscreen_one() {
     line() ;
     vista();
     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); }
 
    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

а где проверка по байтам сообщения с ошибками в последнем скетче?

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

подгоняй координаты 

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;
      myGLCD.print("ERROR ", 0, (75+y));
      myGLCD.printNumI((i+1), 100, (75+y));
if (!bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(": P", 120, (75+y));
if (bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(": C", 120, (75+y));
if (!bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(": B", 120, (75+y));
if (bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(": U", 120, (75+y));

if (MessageRx[9+(i*3)]<=0x0F) {myGLCD.print("0", 180, (75+y)); nolA = 1;}
if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 190, (75+y)); 
    else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 180, (75+y)); 

if (MessageRx[10+(i*3)]<=0x0F) {myGLCD.print("0", 212, (75+y)); nolB = 1;} 
if (nolB) myGLCD.print(String (MessageRx[10+(i*3)],HEX), 222, (75+y)); 
    else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 212, (75+y));} 

    }

 

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

Закоментировал. Случайно.

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

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

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

да я увиидел

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

да. очередная победа. единственное в третей ошибке пропал 0

ERROR 1: P0115

ERROR 2: P1110

ERROR 3: P040

щас еще раз пойду и проверю.

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

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

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

вот эту часть надо вот так , а то P для всех ошибок рисуется по первой, а надо для каждой своё

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

 

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

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

ERROR 1: P040

ERROR 2: P1110

ERROR 3: P0115

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

if (MessageRx[9+(i*3)]<=0x00) {myGLCD.print("00", 180, (75+y)); nolA = 1;}

if (MessageRx[10+(i*3)]<=0x00) {myGLCD.print("00", 212, (75+y)); nolB = 1;}

но это мое предположение. х.з...... чуток позже попробую

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

нет, разнеси байты по координатам подальше друг от друга

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

и выложи код , как у тебя 

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

ок.

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

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

if (MessageRx[9+(i*3)]<=0x0F) {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)]<=0x0F) {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));} //двигает воторой байт целяком 
       }
    }
вот образец для ориентеровки

ERROR 1: P040

ERROR 2: P1110

ERROR 3: P0115

помогло вот это, то что я предлагал. но не знаю или это правильно. но получил 0400.

if (MessageRx[10+(i*3)]<=0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}

сделал так вроде все нормально отображает.

if (MessageRx[9+(i*3)]<=0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx[9+(i*3)]<=0x0F) {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) {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 соо
       }
    }

 

 

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

тогда уж вот так 

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 соо

 

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

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

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

по поводу активный пассивный DTC можно две строчки добавить вот сюда 

for (int i=0; i<MessageRx[8]; i++ ) {
      int y = i*35;
      bool nolA=0; bool nolB =0;
if (!bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) setColor (0,255,0); // если пассивный DTC делаем цвет такой то
if (bitRead(MessageRx[11+(i*3)],7) && !bitRead(MessageRx[11+(i*3)],6)) setColor (255,0,0); // если активный DTC делаем цвет такой то

 

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

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

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

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

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

ок. гляну

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

привет MaksVV. наконц то засунул все в коробку. сегодня попробовал твои поправки. с нулями все ок. с активен не активаен всегда красное. нас в принцыпе интересует только первая буква в третьем байте. он либо А либо Е, Activo _ En activo. изучаю вопрос затирания. на сколько я понял ты предлагешь попробовать перед каждым обновляемом месте ставить черный квадрат fillRect?

сделал так

myGLCD.setColor(0, 0, 0);
      myGLCD.fillRect (160, 215, 235, 245);
      myGLCD.setColor(255, 255, 255);
      myGLCD.printNumI(RPM, 165, 215);

мерцает........

и никак не получается с расходом. с расходом в час вроде придумал так, не знаю или правильно, но, форсунка впрыскивает 7м/г в сек. четыре горшка 7*4=28 м/г в секунду, вот формула LHor = ((InjQua*4)*3.6)/100.0; получил 1 литр в час. вроде коррекно, должно быть пол мотора 2.0. но на скорости больше 5.5 литров не показывает, значит не совсем корректно. с на 100 пробовал разные формулы но я там запутываюсь с галонами , милями и т.д. вообщем пока каша. чуток осталось до финала...........

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

А там точно в секунду? Бывает мг/такт.

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

я так думал. посмотрел mg/strk. ты прав такт.

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

Допустим 1000 об/мин значит 500тактов/мин.
Если ест 7мг/такт. Умножаем. 3500 мг/мин или 3.5 г/мин или 210 г/час или 0,21 кг/час. Чето мало

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

А еще на 4 цилиндра то 0.84 кг/час — самый раз.
Итого Расход в час = Gт * rpm/2 /1000*60/1000* число_цил. Если разделим на плотность топлива получим л/час. Если разделим на скорость и умножим на 100 получим л/100км.

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

Нужно потом еще с еепром поработать. Т.е. запоминать средний расход на 100 км

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

Надо переживать эту информацию. Вечером перевариваю. Есть ещё одна вещь, пытаюсь найти остаток топлива, при прослушал опком при заходе в некую страницу инфы, опком не делает ни инициализация ни посылок в порту тишина но, он получает всю информацию с панели приборов включая топливо. Как он это получает? Полу CAN? Что ли?

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

....

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

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

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

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

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

Это ты к панели подключаешься опкомом? Или в параметрах двс есть остаток топлива?

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

Да так можно сделать. Хорошо бы выше 5 вольт не поднималось

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

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

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

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

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

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

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

число циклов это как?

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

вот строчки по поводу активный, пассивный DTC . должно работать 

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("Active", 235, (75+y));} // если DTC активный делаем цвет красный 
if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);  
myGLCD.print("Passive", 235, (75+y));} // если DTC пассивный, делаем цвет зеленый 

далее остальное