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

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

ты имеешь в виду твой пост 1594?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

viki13viki   Да. Исправьте размер и пересоберите тот же самый скетч, что сыплет таймаутами. Залейте и посмотрите как будет работать.

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

по умолчанию уже стоит #define _SS_MAX_RX_BUFF 100 // RX buffer size

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Поиск тут корявый - да нашел пост об этом http://arduino.ru/forum/proekty/bortovoi-kompyuter-dlya-opel-zafira?page=10#comment-294279

Softwareserial ловит стартбит по прерыванию. Видимо какая то из библиотек их запрещает на время и часть ответа ЕБУ летит мимо цели. Аппаратный serial работает немного иначе и может с ним не будет такого косяка.

Глянул код по диагонали:

MaksVV я правильно вижу - что на каждый байт от ЕБУ проворачивается основной луп ??? Часы обновляются раз в три секунды ???

Может так будет правильнее:

...
receivePCM ();                     // приём сообщений от PCM
if (header != 4) {
  Menu ();               
  if (curmillis - prevWatch > 3000)  { Watch (); prevWatch = curmillis;}
  if (curmillis - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 290, 5);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curmillis; Dvoet=!Dvoet;}                
}
                }// end loop
...

И процесс приёма пакета не будет отвлекаться в критический момент ?

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

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

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

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

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

 байты от ЭБУ летят с задержкой между ними по 1мс. Таков уж протокол. Поэтому сообщение в 80мс меньше чем за 200мс не принять по идее

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

1536 нормально отображает? не мигает? В нем нет цикла тача. Видимо тач все и тормозит. Добавь туда тач и проверь стало ли глючить

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Если идёт тело пакета (самый критический момент) зачем бегать по меню, часам и двоеточиям ???

ИМХО с моими двумя строчками из 1604 думаю всё взлетит. Хотел выделить эти две строки жирным, но не вышло - они внутри тега strong получились 

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

Командир там понимаешь есть два обмена к-лайн. ВВторой мы ещё тут не добавли  (со щитком приборов). По меню то не нада летать, а вот второй к-лайн нада читать чтоб без ошибок. 

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

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

Komandir пишет:

Если идёт тело пакета (самый критический момент) зачем бегать по меню, часам и двоеточиям ???

ИМХО с моими двумя строчками из 1604 думаю всё взлетит.

не, там надо цикл  Menu() в это время отменять, но тогда тач хрен дотыкаешься

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

да 1536 мелкий шрифт, не мигает норм отображает. не тач не причем закоменчен шрифт, он и тормозил 99 проциков. а и френд закоменчен

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

MaksVV пишет:

не там надо цикл  Menu() в это время отменять, но тогда тач хрен дотыкаешься

80 мс и хрен дотыкаешься ???

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

дак в 1536  не вставлен  цикл тача, работает там тач чтоли? 

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

Komandir пишет:
80 мс и хрен дотыкаешься ???

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Но это 5 раз в секунду по любому

в 1536 Menu убит

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

нет, не так. Алгоритм такой по кругу

Запрос. Ответ от эбу (160мс...200мс). Задержка между посылками 80мс(тут тач робит), запрос,  Ответ от эбу (160мс...200мс)

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

вот и выяснили тормозило две вещи шрифт  и тач. Так что .... 

я ещё 1579 писал 

MaksVV пишет:
Пробуй также опять по очереди убирать из лупа menu(),  строку с watch,  строку с двоеточием. 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вам надо определить что максимально критично - верные данные или тач.

С аппаратным сериалом можно вечно сидеть в таче и по прерыванию забирать данные от ЕБУ.

С программным надо все равно приоритет для данных отдавать.

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

да друзья разкоментил в 1536 меню    Menu (); и изображение на экране пропало..........

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

viki13viki сделайте как я писал в 1604 и посмотрите как будет тач себя вести ?

MaksVV зачем задержка между байтами если Вы проверяете available ?

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

уже пробовал ошибка компиляц  

expected primary-expression before '<' token

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

там все <strong> надо убрать это я хотел ЖИРНЫМ выделить, а оно в код попало

должно быть 

if (header != 4) {

и закрывающая

}

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

viki13viki, как твой рабочий скетч без шрифта , нормально робит?

Есть четыре варианта.

1. Немного улучшить твой рабочий скетч оставив его также на delay, но только  по лучше не 195.

2. Попробовать по новой схеме но на хард сериале. 

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

4. добавить ещё одну ардуино. которая будет тачить и экранить 

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

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

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

Komandir пишет:
MaksVV зачем задержка между байтами если Вы проверяете available ?

да, но без неё не работало, точно помню. Надо ещё раз заморочиться по тестировать. Давно дело было.  

 

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

на моем если убрать шриф то и тач работает и не мигает. ща скажу точно проверю. 

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

viki13viki разобрались с компиляцией 1604 ?

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

тогда вариант 1 будет  норм

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

Komandir пишет:

viki13viki разобрались с компиляцией 1604 ?

дак выяснили что тормозят не те функции, надо таким макаром menu() банить , а вижу исправил

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

не с компиляцией не разробрался

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

)

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

да Макс наверное модифицировать по возможности мой это лучший вариант.

вот мой рабочий

/////////////////////////////////////////////////////////////////////////////////////////
 //библиотеки
 ///////////////////////////////////////////////////////////////////////////////////////////
 #include <Adafruit_GFX.h>
 //#include <MCUFRIEND_kbv.h>
 #include <UTFTGLUE.h>//use GLUE class and constructor
 #include "TouchScreen.h"
 #include <stdint.h>
 #include <SPI.h>
 #include <EEPROM.h>
 MCUFRIEND_kbv tft;
 //#include "Fonts/Gobold_Bold14pt7b.h";
 
 #define MINPRESSURE 200
 #define MAXPRESSURE 1000
 
 //pin 20 SCL , 21 SDA датчик реального времени
 #include <Wire.h>
 #include "RTClib.h"
 RTC_DS3231 rtc;       
 
 //датчик наружней температуры
 #include <OneWire.h>
 #define ONE_WIRE_BUS 22   
 OneWire oneWire(ONE_WIRE_BUS);
 #include <DallasTemperature.h>
 DallasTemperature sensors(&oneWire);
 
 //датчик внутринней температуры и влаги
 #include "DHT.h"
 #define DHTPIN 26   
 #define DHTTYPE DHT22 
 DHT dht(DHTPIN, DHTTYPE);
 
 ///////////////////////////////////////////////////////////////////////////////////
 //пины экрана и тача
 ///////////////////////////////////////////////////////////////////////////////////
 UTFTGLUE myGLCD(0x1581,A2,A1,A3,A4,A0); //all dummy args
 
 const int XP = 6, XM = A2, YP = A1, YM = 7; 
 const int TS_LEFT = 136, TS_RT = 907, TS_TOP = 139, TS_BOT = 942;
 TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
 uint16_t ID;
 int x, y;
 char currentPage;
 float h;
 float t;
 bool Dvoet = 0;
 //////////////////////////////////////////////////////////////////////////////
 //все что касается OBD2
 ///////////////////////////////////////////////////////////////////////////////
 #include <SoftwareSerial.h>
 #define mySerial_gauge Serial2
 #define TX_gauge 16
 #define TX 13
 SoftwareSerial mySerial   (12, 13); //RХ,TХ
 
 int length5 = 5;
 int length6 = 6;
 int length8 = 8;
 int length7 = 7;

 bool Init = 0;
 bool InitGauge = 0;
 bool dataMessageOK=0;
 bool dataMessageEND = 0;
 bool MessageParse = 0;
 bool byte0 = 0;
 bool byte1 = 0;
 bool byte2 = 0; 
 
 int numberbyte = 0;
 int PIDTime = 120;       // задержка ожидания запроса следующего pid 2101, мс
 int PresTime = 8000;     // задержка между посылками запросов присутствия, мс 
 int waitbyte = 1;        // задержка между отправкой байт в сообщении, мс
 int waitbyte_gauge = 4;  
 int Datadelay = 50;      // задержка между отрисовкой данных на LCD, мс
 
 float L100M = 0;           //расход на 100 км измеренный за поездку
 float L100 = 0;            //мгновенный расход литров на 100км
 float LHor = 0;           //мгновенный расход топлива литров в час
 float L100SR = 0;         //расход литров на 100км измеренный раз в интервал kmL  
 float L100SR_TFT = 0;     // самый средний из расходов на 100км, он выводится на экран

 int L100_Eeprom[11]= {10,10,10,10,10,10,10,10,10,10,10};
 int FuelZamer[10]= {0};  // массив для измерения уровня (количества) топлива 
 int ZamerNumber = 0;     // номер замера уровня (количества) топлива 
 int n_eeprom = 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
 
 //все что касается топлива
 float Fuel = 0;  //остаток топлива 
 float Fuel2 = 0;  //остаток мгновенного топлива байт 16 , датчика в баке
 int FuelIGN = 0;      // количество топлвива в баке на момент включения зажигания
 int Fuel_last = 0;   // для формул
 bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания 
 float FuelTrip = 0;     // количество литров топлива, израсходованное за один цикл включения зажигания
 
 //все что касается километража
 float kmAge = 0;             //пробег, полученный со щитка приборов
 int kmAgeIGN = 0;          //пробег который был в момент включения зажигания 
 int kmAge_last = 0;       // для формул
 bool flagkmAgeIGN = 0;     //флаг записан ли пробег в момент вкл. зажигания 
 float kmTrip = 0;            //пробег за один цикл включения зажигания
 int kmL = 10;               // интервал, через который будет происходить обновление среднего расхода на 100км
 int km = 0;              // переменная для расчетов
 int kmeeprom = 10;         // интервал, через который будет происходить подсчет среднеарифмитического расхода  L100SR_TFT
 int kmTFT =  0;     // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT
 int kmREFUELING = 0;            // пробег до заправки на остатке топлива 
 
 int colerror = 0;           //количество ошибок в правом верхнем углу третьего экрана
 //float Barom = 0;          // барометр 
 
 byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения
 byte MessageRxGauge[60] = {0};  // массив байтов принимаемого сообщения от щитка приборов
 
 byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04};    // запрос инициализации
 byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1};      // запрос присутствия 
 byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6};    // запрос пид 2101
 byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};    // запрос ошибок
 byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};    // стирание ошибок

 unsigned long prevPID = 0;
 unsigned long prevPIDgauge = 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() {
   uint16_t ID = myGLCD.readID();
    if (ID == 0xD3D3) ID = 0x9486; // write-only shield
    myGLCD.begin(ID);  
   
   Serial.begin(115200);
   mySerial.begin(10400);
   Wire.begin();
   rtc.begin();
   dht.begin();
   sensors.begin();
   myGLCD.InitLCD(3);
   myGLCD.clrScr();
   //myGLCD.setFont(&Gobold_Bold14pt7b); 
   
   //загрузка стартовой страницы
   currentPage = '0';       
   drawHomeScreen();  

   //подсчет среднеарифметического усредненного расхода
   for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
   for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];
   L100SR_TFT = (float)L100SR_TFT/110.0;
   if (L100SR_TFT<0) L100SR_TFT = 0;
   if (L100SR_TFT>99) L100SR_TFT = 99;
   
   // строка ниже используется для настройки даты и времени часов 
   // раскоментировать, выставить времая и дату, залить в ардуино. в скетче закоментировать
   // обратно и залить еще раз, иначе каждый раз будет по новой выствлятся это же время и дата
   // (год, месяц, день, часы, минуты, секунды)
   //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));

   Temperature ();
   pinMode(TX, OUTPUT);
   pinMode(TX_gauge, OUTPUT);
   fastinit();
 }

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

  void loop() {
    
   TimewaitPID = millis ();
   TimewaitInit = millis ();
   
   if (!Init) { if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
   else if (TIMEREXPIRED_Init) timerenabledInit=0;}
  
   else { if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 -  шлем запрос присутствия 
   if (millis() - prevPID > PIDTime) { PIDs();  prevPID = millis(); }}
   else if (millis() - prevpres > PresTime) {present(); prevpres = millis();}}  
      
if (!InitGauge) {Serial.println ("Otpravil zapros adress Gauge");
    
   digitalWrite (TX_gauge, HIGH);  delay (500); 
   digitalWrite (TX_gauge, LOW);   delay (20);
   digitalWrite (TX_gauge, HIGH ); delay (15);
   digitalWrite (TX_gauge, LOW);   delay (5);
   digitalWrite (TX_gauge, HIGH);  delay (5);
   mySerial_gauge.begin(9600);}

   receive ();
   if (millis() - prevWatch > 3000)  { Watch (); prevWatch = millis(); Trip ();}
   if (millis() - prevTemperature > 60000)  { Temperature (); prevTemperature = millis();}
   if (millis() - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 290, 5);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;}
   Menu();
   LCDDataPrint();}

 /////////////////////////////////////////////////////////////////////////////////////////////////////////
 //BOID TRIP//////////////////////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////////////////////////////////
 void Trip () {
 
 if (flagkmAgeIGN){

 FuelTrip = FuelIGN - Fuel;                          
  if (kmAge>kmAgeIGN) kmTrip = kmAge - kmAgeIGN;
  if (kmAge<kmAgeIGN) kmTrip = 2000 - (kmAgeIGN - kmAge);  // 2000 это через сколько км у тебя суточный пробег сбрасывается на ноль, поменяй если другое число
  if (kmAge==kmAgeIGN) kmTrip = 0;
 
 //подсчет расхода на 100км за поездку
 L100M = ((float)FuelTrip*100.00)/(float)kmTrip;
  if (L100M<0) L100M = 0;
  if (L100M>99) L100M = 99;

 // ниже цикл считает среднеарифметический расход из еепром раз в пробег, указанный в переменной kmeeprom
  if (kmTrip-kmTFT>kmeeprom) {kmTFT = kmTrip; 

 // тут считаем среднеарифметический усредненного расход из ячеек еепром 
  for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
  for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];
  L100SR_TFT = (float)L100SR_TFT/110.00;
  if (L100SR_TFT<0) L100SR_TFT = 0;
  if (L100SR_TFT>99) L100SR_TFT = 99;}
 
 // ниже цикл считает расход топлива за пробег, указанный в переменной kmL, здесь же запись в ячейки еепром 
  if (kmTrip-km>kmL) {km=kmTrip; 

 L100SR = ((float)(Fuel_last-Fuel)*100.00)/(float)kmL; // расход/100км  - обновляется раз в 10км, меняется км в int kmL = 10;
 Fuel_last = Fuel;      // сохранение параметров с последнего измерениея 
  if (L100SR<0) L100SR = 0;
  if (L100SR>99) L100SR = 99;

 //расчет остатка километров в баке
 if (L100SR>0) kmREFUELING=((float)Fuel*100.0)/(float)L100SR; //если средний расход больше нуля, то расчитывать км в баке из него
 else kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;    //если ноль или ментше то расчитывать км в баке с устредненного расхода

 // тут записываем  L100SR последовательно в одну из 11 ячеек еепром
 //EEPROM.write (12,n_eeprom);      // ЗДЕСЬ ВНИМАТЕЛЬНО. ЗАГРУЗИТЬ ПРОШИВКУ С ЭТОЙ СТРОКОЙ ОДИН РАЗ, ПОТОМ ЗАКОМЕНТИРОВАТЬ И ЕЩЁ РАЗ ЗАГРУЗИТЬ
 n_eeprom = EEPROM.read (12);    // в ячейке 12 хранится № текущей ячейки для записи расхода, чтобы где остановился при выкл питания, от туда и продолжил
 EEPROM.write(n_eeprom, L100SR*10); 
 n_eeprom++; if (n_eeprom>10) n_eeprom=0;
 EEPROM.write (12,n_eeprom); }}}
 
 /////////////////////////////////////////////////////////////////////////////////////////////////////////
 //BOID LCDDATAPRINT. прописываем данные и их расположение и цвет/////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////////////////////////////////
  void LCDDataPrint(){
   unsigned long curData = millis();  
     
  if (millis() - prevData > Datadelay){  
     myGLCD.setColor(255, 255, 255);      //цвет текста
     myGLCD.printNumI(Speed, 350, 7, 3);
  //----------------------------------------------------------
  //страниц HOME
  //----------------------------------------------------------
  if (currentPage == '0') {
     myGLCD.printNumF(LHor, 1, 60, 40, '.',5);
     myGLCD.printNumF(L100, 1, 210, 40,'.',5 );
     myGLCD.printNumF(L100M, 1, 60, 75,'.',5 );
     myGLCD.printNumF(L100SR_TFT, 1, 210, 75,'.',5 );
     myGLCD.printNumI(kmREFUELING, 60, 110,5 ); 
     //if (Fuel<53) 
     myGLCD.printNumF(Fuel, 1, 210, 110,'.',5);
     //else myGLCD.print("MAX", 210, 110); 
     myGLCD.printNumF(kmTrip, 1, 60, 145,'.',5);
     myGLCD.printNumF(FuelTrip, 1, 210, 145,'.',5);
     myGLCD.printNumI(PumpRPM, 210, 180,5);
     myGLCD.printNumI(RPM, 210, 215,5);
     myGLCD.printNumF(Fuel2, 1, 0, 215,'.',5);      
     myGLCD.printNumI(Temp, 415, 40, 3);
     myGLCD.printNumI(TempOil, 415, 75, 3);
     myGLCD.printNumI(TempFuel, 415, 110,3); 
     myGLCD.printNumI(sensors.getTempCByIndex(0), 415, 145 , 3);
     myGLCD.printNumI(t, 415, 180, 3);
     myGLCD.printNumI(TempAir, 415, 215, 3); }
   //----------------------------------------------------------
   //страниц INF1
   //----------------------------------------------------------
   if (currentPage == '1') {
     myGLCD.printNumF(StaDaliv,1, 360, 40,'.', 3);
     myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
     myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
     myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
     myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
     myGLCD.printNumI(MAF, 170, 215, 4);
     myGLCD.printNumF(h, 1, 418, 215); }
   //----------------------------------------------------------
   //страниц INF2
   //----------------------------------------------------------
   if (currentPage == '2') {    
     myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
     myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
     myGLCD.printNumI(EGRmg, 395, 110, 4);  
     myGLCD.printNumF(EGRPul,1, 410, 145,'.', 3);  
     myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
     myGLCD.printNumF(SolenPre, 0, 410, 215,'.', 3); }
    prevData = millis(); }}
 
 ///////////////////////////////////////////////////////////////////////////
 //BOID PIDs//отправка запроса пид 2101/////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////
 void PIDs() {
   Serial.println ("Otpravil zapros 21 01");
   for (int i = 0; i < length6; i++) {
   mySerial.write(messagePids[i]);
   delay (waitbyte); }}

 ///////////////////////////////////////////////////////////////////////////
 //BOID PIDsGAUGR//отправка запроса на панель приборов//////////////////////
 ///////////////////////////////////////////////////////////////////////////
 void PIDsGauge() {
  Serial.println ("                Otpravil zapros 02 11 na panel");
  mySerial_gauge.write (0x02);    delay (1);
  mySerial_gauge.write (0x11);    delay (1);
  mySerial_gauge.write(byte(0));  delay (1);
  mySerial_gauge.write (0x13); }
 
 ///////////////////////////////////////////////////////////////////////////
 //BOID PIDsGAUGR//отправка запроса присутствия/////////////////////////////
 ///////////////////////////////////////////////////////////////////////////
 void present() {
  Serial.println ("Otpravil zapros Present");
   for (int i = 0; i < length5; i++) {
   mySerial.write(messagePresent[i]);
   delay (waitbyte); }}
 
 /////////////////////////////////////////////////////////////////////////////////////////////
 //получение данных от ЭБУ, разборка входящих сообщений
 /////////////////////////////////////////////////////////////////////////////////////////////
  void receive () {
  ///////////////////////////////////////////////////////////////////////
  ////////////////// работа с К-Line софт сериал 16-17 (12 контакт ОБД)
  ///////////////////////////////////////////////////////////////////////
  while(!InitGauge){
   if (mySerial_gauge.available()) {
   byte inByte = mySerial_gauge.read();
   Serial.print(" ");
   Serial.print(inByte,HEX);
  if (inByte==0x80) {mySerial_gauge.write (0x7F); delay (1);}
  if (inByte==0xF0) {
    mySerial_gauge.write (0x02);  delay (1);
    mySerial_gauge.write (0x11);  delay (1);
    mySerial_gauge.write (0x00);  delay (1);
    mySerial_gauge.write (0x13);  delay (1); InitGauge=1;  }}}
  
  MessageParse = 0;
  while (InitGauge && !MessageParse) {
   if (!dataMessageOK) {   
    if (mySerial_gauge.read() == 0x23) {byte0=1; delay (waitbyte_gauge); }    
    if (mySerial_gauge.read() == 0xA1 && byte0) {byte1=1; delay (waitbyte_gauge);}
    else byte0=0;
    if (mySerial_gauge.read() == 0x04 && byte0 && byte1) {byte2=1; delay (waitbyte_gauge);}
    else {byte0=0; byte1=0;}
    if (byte0 && byte1 && byte2) {dataMessageOK = 1; byte0=0; byte1=0; byte2=0;}
    numberbyte=0;}
    
else { if (mySerial_gauge.available()>0)  { MessageRxGauge[numberbyte] = mySerial_gauge.read(); numberbyte++; delayMicroseconds (250);}  
    if (numberbyte==34) {dataMessageEND = 1; dataMessageOK = 0; }}
     
  if (dataMessageEND) { 
   int crc =  ( ( unsigned int )MessageRxGauge[32] << 8 ) | MessageRxGauge[33]; // парсинг контрольной суммы из 2 последних байт 
   int CRC =200;
   for (int i = 0; i < 32; i++) CRC = CRC + MessageRxGauge[i];                 // подсчет контрольной суммы байт от 0 до 31

   Serial.print ("                         ReceiveGauge:   ");
   for (int i = 0; i < 34; i++) {
   Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");}

  //при получении сообщения БЕЗ ошибок с данными от панели приборов, запишем в переменные остаток топлива и пробег
   if (CRC==crc) {Serial.println ("    OK!!!");
 
 Fuel2 = MessageRxGauge[16]/2.0; 
 if (!flagFuelIGN) {  Fuel = MessageRxGauge[16]/2.00;  kmREFUELING=((float)Fuel*100.00)/(float)L100SR_TFT;} //стартовая запись литров в баке для подсчета затраченных литро
 else Fuel = MessageRxGauge[17]/2.0; //для устреднения болтания в баке закоментировать эту строку, а раскоментировать ниже
 
 //для усреднения болтания топлива в баке, раскоментировать, высчитывает среднее
 /*else { FuelZamer[ZamerNumber] = MessageRxGauge[17]/2.00;
 if (ZamerNumber==9) {
 Fuel = 0 ;
 for (int i = 0; i < 10; i++) Fuel = Fuel + FuelZamer[i];
 Fuel = (float)Fuel/10.0;}
 ZamerNumber++; if (ZamerNumber>9) ZamerNumber = 0;}
*/

  kmAge = (MessageRxGauge[23]+(MessageRxGauge[24]*256))/10.0; //суточный пробег с панели приборов

  //бак у меня на 59 литров, а датчик показывает максимально 53 литра. для этого эта формула
  //если у вас тоже датчик имеет лимит то подправте 53 на свой лимит. 
  //если ваш датчик показывает одинаково с полным баком то закоментировать три нижние строки. 
  if (Fuel<53){
  if (!flagkmAgeIGN) { kmAgeIGN = kmAge; flagkmAgeIGN =1;}
  if (!flagFuelIGN) { FuelIGN = Fuel; Fuel_last = Fuel; flagFuelIGN = 1; }}}
   
  else Serial.println ("    ERROR!!!");   
  dataMessageEND = 0; MessageParse = 1; //mySerial_gauge.flush();
  for (int i = 0; i < 34; i++) MessageRxGauge[i]=0; }}  // очистка байтов массива 

   ////////////////////////////////////////////////////////////////////
   ////////////////// работа с К-Line софт сериал 12-13 (7 контакт ОБД)
   ////////////////////////////////////////////////////////////////////
   if (mySerial.available()) {
   delay(195);
   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 (0,255,0);
     myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет зеленый 
  if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (255,0,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;
   //ниже идут расчетные формулы более точные чем те что закоментированы выше
   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); }

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //стартовая инициализация 7 пина ОБД
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 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 (currentPage == '0') {
     TouchHOME();
     TouchINF1();
     TouchINF2();
     TouchCHECK(); }
    if (currentPage == '1') { 
     TouchHOME();
     TouchINF2();
     TouchCHECK(); }
    if (currentPage == '2') { 
     TouchHOME();
     TouchINF1();
     TouchCHECK(); }
    if (currentPage == '3') { 
     TouchHOME();
     TouchREAD();
     TouchERASE(); }}   
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //прописывает заголовки и кнопки на страницах
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void drawHomeScreen() {
    line() ;
    Watch ();
    myGLCD.setColor(255, 0, 0); // цвет линии и текста красный
    myGLCD.drawLine(295,35,295,248); // линия вертикальная
    myGLCD.drawLine(145,35,145,178); // линия вертикальная
    myGLCD.drawLine(80,178,80,247); // линия вертикальная
    myGLCD.print("L/H", 10, 40);
    myGLCD.print("L/A", 148, 40);
    myGLCD.print("L/V", 10, 75);
    myGLCD.print("L/M", 148, 75);
    myGLCD.print("D/K", 10, 110);
    myGLCD.print("D/L", 148, 110);
    myGLCD.print("V/K", 10, 145);
    myGLCD.print("V/L", 148, 145);
    myGLCD.print("PUMP RPM", 82, 180);
    myGLCD.print("ENGI   RPM", 82, 215);
    myGLCD.print("D/La", 10, 180);
    myGLCD.print("Motor C", 300, 40);
    myGLCD.print("OIL       C", 300, 75);
    myGLCD.print("FUEL    C", 300, 110);
    myGLCD.print("DENTR  C", 300, 145);
    myGLCD.print("FUERA  C", 300, 180);
    myGLCD.print("INTAIR C", 300, 215); 
    myGLCD.drawRoundRect (15, 255, 145, 310);
    myGLCD.print("INF 1", 55, 270);
    myGLCD.drawRoundRect (175, 255, 305, 310);
    myGLCD.print("INF 2", 215, 270);
    myGLCD.drawRoundRect (335, 255, 465, 310);
    myGLCD.print("CHECK", 365, 270);
    myGLCD.drawRoundRect (1, 1, 77, 37);
    myGLCD.print("HOME", 10, 7);
    myGLCD.print("Km/h", 410, 7);
  }
 //-------------------------------------------------
   void drawscreen_one() {
    line() ;
    Watch ();
    myGLCD.setColor(255, 0, 0); // цвет линии и текста красный
    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("Humedad %:", 255, 215);
    myGLCD.drawRoundRect (175, 255, 305, 310);
    myGLCD.print("INF 2", 215, 270);
    myGLCD.drawRoundRect (335, 255, 465, 310);
    myGLCD.print("CHECK", 365, 270);
    myGLCD.drawRoundRect (1, 1, 77, 37);
    myGLCD.print("HOME", 10, 7);
    myGLCD.print("Km/h", 410, 7);
    }
 //-------------------------------------------------
  void drawscreen_two() {
    line() ;
    Watch ();
    myGLCD.setColor(255, 0, 0); // цвет линии и текста красный
    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);
    myGLCD.drawRoundRect (15, 255, 145, 310);
    myGLCD.print("INF 1", 55, 270);
    myGLCD.drawRoundRect (335, 255, 465, 310);
    myGLCD.print("CHECK", 365, 270);
    myGLCD.drawRoundRect (1, 1, 77, 37);
    myGLCD.print("HOME", 10, 7);
    myGLCD.print("Km/h", 410, 7);
    }
 //----------------------------------------------------------------------------
  void drawscreen_three() {
    Watch ();
    myGLCD.setColor(255, 0, 0); // цвет линии красный
    myGLCD.drawLine(1,35,479,35); // линия горизонтальная
    myGLCD.drawLine(1,248,479,248); // линия горизонтальная
    myGLCD.drawRoundRect (15, 255, 145, 310);
    myGLCD.print("ERASE", 55, 270);
    myGLCD.drawRoundRect (335, 255, 465, 310);
    myGLCD.print("READ", 365, 270);
    myGLCD.drawRoundRect (1, 1, 77, 37);
    myGLCD.print("HOME", 10, 5);
    myGLCD.print("Km/h", 410, 3);
   }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//кнопки тач . координаты и переходы
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TouchHOME(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {if (p.x > 140 && p.x < 320 && p.y > 140 && p.y < 260 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (1, 1, 77, 37);
        currentPage = '0';           
        myGLCD.clrScr();             
        drawHomeScreen();
        x = 0;
        y = 0;
        p.z = 0;}}}

void TouchINF1(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {
      if (p.x > 150 && p.x < 450 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (15, 255, 145, 310);
        currentPage = '1';           
        myGLCD.clrScr();             
        drawscreen_one();
        x = 0;
        y = 0;
        p.z = 0;}}}
    
void TouchINF2(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {
    if (p.x > 450 && p.x < 680 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (175, 255, 305, 310);
        currentPage = '2';           
        myGLCD.clrScr();             
        drawscreen_two();
        x = 0;
        y = 0;
        p.z = 0;}}}

void TouchCHECK(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {
if (p.x > 690 && p.x < 950 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (335, 255, 465, 310);
        currentPage = '3';           
        myGLCD.clrScr();             
        drawscreen_three();
        x = 0;
        y = 0;
        p.z = 0;}}}

void TouchREAD(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {
if (p.x > 690 && p.x < 950 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (335, 255, 465, 310);
        Read();
        x = 0;
        y = 0;
        p.z = 0;}}}

void TouchERASE(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {
if (p.x > 150 && p.x < 450 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (15, 255, 145, 310);
        Erase();
        x = 0;
        y = 0;
        p.z = 0;}}}
 ////////////////////////////////////////////////////////////////////////////////////////
 //прорисовка линий
 ///////////////////////////////////////////////////////////////////////////////////////
 void line() {
    myGLCD.setColor(255, 0, 0); // цвет линии красный
    myGLCD.drawLine(1,35,479,35); // линия горизонтальная
    myGLCD.drawLine(1,73,479,73); // линия горизонтальная
    myGLCD.drawLine(1,108,479,108); // линия горизонтальная
    myGLCD.drawLine(1,143,479,143); // линия горизонтальная
    myGLCD.drawLine(1,178,479,178); // линия горизонтальная
    myGLCD.drawLine(1,212,479,212); // линия горизонтальная
    myGLCD.drawLine(1,248,479,248); }// линия горизонтальная


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

 void Temperature (){
   h = dht.readHumidity();
   t = dht.readTemperature();
   sensors.requestTemperatures(); 
   }

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018
...
receivePCM ();                     // приём сообщений от PCM
if (header != 4) {
  Menu ();               
  if (curmillis - prevWatch > 3000)  { Watch (); prevWatch = curmillis;}
  if (curmillis - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 290, 5);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curmillis; Dvoet=!Dvoet;}                
}
                }// end loop
...

Меню отключается только в момент приёма тела пакета

Тач может обрести некую задумчивость ...

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

Командир ты серьезно? это сработало..... Блин все четко работает....

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Тач сильно тормозит ?

Хоть бы одним газом увидеть - как оно выглядит :-)

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

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

вот скетч 

 #include <Adafruit_GFX.h>
 #include <MCUFRIEND_kbv.h>
 #include <UTFTGLUE.h>//use GLUE class and constructor
 #include "TouchScreen.h"
 #include <stdint.h>
 #include <SPI.h>
 #include <EEPROM.h>
 MCUFRIEND_kbv tft;
 //#include "Fonts/Gobold_Bold14pt7b.h";

#define MINPRESSURE 200
#define MAXPRESSURE 1000

//pin 20 SCL , 21 SDA датчик реального времени
 #include <Wire.h>
 #include "RTClib.h"
 RTC_DS3231 rtc;       

UTFTGLUE myGLCD(0x1581,A2,A1,A3,A4,A0); //all dummy args
 
 const int XP = 6, XM = A2, YP = A1, YM = 7; 
 const int TS_LEFT = 136, TS_RT = 907, TS_TOP = 139, TS_BOT = 942;
 TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
 uint16_t ID;
 int x, y;
 char currentPage;
 float h;
 float t;
 bool Dvoet = 0;
 

#include <SoftwareSerial.h>
 #define TX_PCM 13
 SoftwareSerial K_LINE_PCM   (12, TX_PCM); //RХ,TХ

#define PCM_address  0x11        // адрес PCM 
#define DIAG_address 0xF1        // адрес диагностики

#define debugPCM                 // раскоментировать эту строку для отладки в Serial порту обмена с PCM
//#define debugGAUGE             // раскоментировать эту строку для отладки в Serial порту обмена co щитком приборов

 
 uint32_t curmillis = 0;         // снимок текущего времени 
 uint32_t prevRequest  = 0;      // таймер периодических запосов на PCM
 uint16_t RequestPeriod = 3500;  // периодичность запросов на PCM

 uint32_t prevRESETheader=0; // таймер сброса сообщения, если данные оборвались посередине сообщения 
 bool RESETheader_timer;     // таймер сброса сообщения, если данные оборвались посередине сообщения 
 
 uint32_t prev_NOanswer=0;   // таймер контроля неответов от ЭБУ после подачи запросов
 bool NOanswer_timer = 0;    // таймер контроля неответов от ЭБУ после подачи запросов
 byte noanswers = 0;         // количество подряд неответов от ЭБУ 
 
 uint32_t timerdelay = 0;    // таймер ожидания байт (для успевания появления данных в буфере UART)
 bool Delay = 0;             // таймер ожидания байт (для успевания появления данных в буфере UART)
 byte waitbyte_RX = 1;       // задержка, мс для успевания появления данных в буфере RX 
                             // (подрегулировать в зависимости от уровня жизнидеятельности на Марсе) 
 #define TIMER_DELAY Delay = 0; timerdelay = curmillis  // включение этого таймера
  
byte delaybyte_TX  = 1;   // задержка между отправкой байт в запросах, мс
byte header = 0;          // состояние заголовка
byte message_size = 0;    // размер тела сообщения
byte j = 3;               // инкремент
byte n = 3;               // количество старт байт
const byte bufsize = 150; // размер буфера принятого сообщения
byte MessageRx_PCM [bufsize] = {0}; // буфер принятого сообщения
byte crc =0;              // байт контрольной суммы 

  
// возможные варианты запросов на ЭБУ:
enum REQUEST {
 INIT,    
 PID,     
 DTCERASE,
 DTCREAD,
 PRESENT,
 };

// текстовки запросов для отладки 
char* textRequest[] = {
 "INIT",    
 "PID_2101",     
 "DTC_ERASE",
 "DTC_READ",
 "PRESENT",
    } ;

 // сами запросы
 byte PCM_Message_TX[][5] = {
 {1,  0x81,           0,0,0},      // запрос инициализации
 {2,  0x21,0x01,        0,0},      // запрос пид 2101
 {3,  0x14,0xFF,0x00,     0},      // запрос на стирание ошибок
 {4,  0x18,0x00,0xFF,0x00  },      // запрос на чтение ошибок
 {1,  0x3E,           0,0,0},      // запрос присутствия 
                            };

byte request = INIT;               // переменная, показывающая какой запрос будем делать

//-------------------------------------------переменные бортовика

 float L100M = 0;           //расход на 100 км измеренный за поездку
 float L100 = 0;            //мгновенный расход литров на 100км
 float LHor = 0;           //мгновенный расход топлива литров в час
 float L100SR = 0;         //расход литров на 100км измеренный раз в интервал kmL  
 float L100SR_TFT = 0;     // самый средний из расходов на 100км, он выводится на экран

 int L100_Eeprom[11]= {10,10,10,10,10,10,10,10,10,10,10};
 int FuelZamer[10]= {0};  // массив для измерения уровня (количества) топлива 
 int ZamerNumber = 0;     // номер замера уровня (количества) топлива 
 int n_eeprom = 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
 
 //все что касается топлива
 float Fuel = 0;  //остаток топлива 
 float Fuel2 = 0;  //остаток мгновенного топлива байт 16 , датчика в баке
 int FuelIGN = 0;      // количество топлвива в баке на момент включения зажигания
 int Fuel_last = 0;   // для формул
 bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания 
 float FuelTrip = 0;     // количество литров топлива, израсходованное за один цикл включения зажигания
 
 //все что касается километража
 float kmAge = 0;             //пробег, полученный со щитка приборов
 int kmAgeIGN = 0;          //пробег который был в момент включения зажигания 
 int kmAge_last = 0;       // для формул
 bool flagkmAgeIGN = 0;     //флаг записан ли пробег в момент вкл. зажигания 
 float kmTrip = 0;            //пробег за один цикл включения зажигания
 int kmL = 10;               // интервал, через который будет происходить обновление среднего расхода на 100км
 int km = 0;              // переменная для расчетов
 int kmeeprom = 10;         // интервал, через который будет происходить подсчет среднеарифмитического расхода  L100SR_TFT
 int kmTFT =  0;     // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT
 int kmREFUELING = 0;            // пробег до заправки на остатке топлива 
 
 unsigned long prevWatch = 0;
 unsigned long prevDvoet = 0;
 unsigned long prevData  = 0;

 
void setup() {
   uint16_t ID = myGLCD.readID();
   if (ID == 0xD3D3) ID = 0x1581; // write-only shield
   myGLCD.begin(ID);  
   myGLCD.InitLCD(3);
   myGLCD.clrScr();
 //  myGLCD.setFont(&Gobold_Bold14pt7b);  

   Wire.begin();
   rtc.begin();
   
   //загрузка стартовой страницы
   currentPage = '0';       
   drawHomeScreen();  

   //подсчет среднеарифметического усредненного расхода
   for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
   for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT +  L100_Eeprom [i];
   L100SR_TFT = (float)L100SR_TFT/110.0;
   if (L100SR_TFT<0) L100SR_TFT = 0;
   if (L100SR_TFT>99) L100SR_TFT = 99;
   
   // строка ниже используется для настройки даты и времени часов 
   // раскоментировать, выставить времая и дату, залить в ардуино. в скетче закоментировать
   // обратно и залить еще раз, иначе каждый раз будет по новой выствлятся это же время и дата
   // (год, месяц, день, часы, минуты, секунды)
   //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
 
 
 #if defined debugPCM or debugGAUGE   
   Serial.begin(115200);
 #endif
   K_LINE_PCM.begin(10400);
   pinMode(TX_PCM, OUTPUT);
  
             }


    void loop() 
                {
curmillis = millis();              // снимок текущего времени

if (curmillis - prevRequest > RequestPeriod && header == 0) 
    {
  if (request == INIT) fastinit();                                          // при необходимости делаем переподключение к PCM
  else {sendMessagePCM(request); if (request == PID) RequestPeriod = 600; } // отправляем на PCM текущий запрос
  prevRequest = curmillis;
    }

receivePCM ();                     // приём сообщений от PCM
if (header != 4) {
  Menu ();              
  if (curmillis - prevWatch > 3000)  { Watch (); prevWatch = curmillis;}
  if (curmillis - prevDvoet > 500)  { if (!Dvoet) {myGLCD.print(":", 290, 5);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curmillis; Dvoet=!Dvoet;}               
}
                }// end loop



 void fastinit() {
   digitalWrite (TX_PCM, HIGH);  // bus idle
   delay(1500);              
   digitalWrite (TX_PCM, LOW);  // first part fastinit  (25 ms LOW)
   delay(25);
   digitalWrite (TX_PCM, HIGH); // second part fastinit (25 ms HIGH)
   delay(25);               
   K_LINE_PCM.begin(10400);
   sendMessagePCM(INIT);        // send start communication message 
      }  
 
  
  void receivePCM () {

 if (K_LINE_PCM.available() ){
    
 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; MessageRx_PCM[0]=K_LINE_PCM.read();  
         if (MessageRx_PCM[0]!=0xFF && bitRead (MessageRx_PCM[0],7)){header = 1; RESETheader_timer = 1; prevRESETheader = curmillis; 
               #ifdef debugPCM
                  Serial.print (F("Receive PCM: ")); printDebugRX(MessageRx_PCM[0]);
               #endif               
                                                }
                          }                  

 // второй старт байт
 if (header == 1 && Delay){TIMER_DELAY ; MessageRx_PCM[1]=K_LINE_PCM.read(); 
 #ifdef debugPCM
      printDebugRX (MessageRx_PCM[1]);
 #endif
      if (MessageRx_PCM[1]==DIAG_address){ header = 2;} 
      else {
        #ifdef debugPCM 
        Serial.println(F(" PCM Message fail address")); 
        #endif
        header = 0; RESETheader_timer = 0;}} 

 // третий старт байт
 if (header == 2 && Delay){ 
  TIMER_DELAY ;
  MessageRx_PCM[2]=K_LINE_PCM.read(); 
  #ifdef debugPCM
  printDebugRX (MessageRx_PCM[2]);
  #endif
  if (MessageRx_PCM[2]==PCM_address){ message_size = MessageRx_PCM[0]; prevRESETheader = curmillis;
       if (MessageRx_PCM[0] !=0x80) {header = 4;  bitWrite (message_size, 7 , 0);j=3;n=3;}
       else {header = 3; j=4;n=4;}
       if (message_size > bufsize) message_size = bufsize;  crc = 0;} 
  else {header = 0; 
        #ifdef debugPCM 
        Serial.println(F("PCM Message fail address")); 
        #endif
        RESETheader_timer = 0;}
  
                          }  
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
if (header == 3 && Delay){
  TIMER_DELAY ; prevRESETheader = curmillis;
  MessageRx_PCM[3]=K_LINE_PCM.read(); 
  #ifdef debugPCM
  printDebugRX(MessageRx_PCM[3]);
  #endif
  message_size = MessageRx_PCM[3]; 
  if (message_size > bufsize) message_size = bufsize;  
  crc = 0; header = 4;  
                         }

  // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n+1) {
 MessageRx_PCM[j] = K_LINE_PCM.read(); prevRESETheader = curmillis;
 if (j<message_size+n) crc+= MessageRx_PCM[j]; // подсчёт КС
 
 if (j==message_size+n) header = 5; 
 TIMER_DELAY ; 
 #ifdef debugPCM
 printDebugRX(MessageRx_PCM[j]);
 #endif  
 j++;                                             } 
 }

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  
 #ifdef debugPCM
 Serial.println();
 #endif  
 NOanswer_timer = 0; noanswers = 0;    // сбрасываем таймер контроля неответов 

for(byte i = 0; i<n; i++) crc+=MessageRx_PCM[i]; // прибавляем к контрольной сумме старт байты

 // если контрольная сумма верна: 
if ( crc == MessageRx_PCM[message_size+n]) 
{  
  #ifdef debugPCM
  Serial.print (F("Received message is OK! Checksum is correct!"));  Serial.print (F("  ")); Serial.println (millis()); // Если КС совпала, тут чёнибудь нужное делаем
  printDebugRX_CSgood(); 
  #endif
      if (MessageRx_PCM[n]==0xC1 && MessageRx_PCM[n+1]==0x6B && MessageRx_PCM[n+2]==0x8F) {
              if (currentPage!=3) {request = PID; RequestPeriod = 70;} else request = DTCREAD, RequestPeriod = 3000; prevRequest = curmillis; // receive good INIT
                                                                                          }
 else if (MessageRx_PCM[n]==0x58) Troublecodes (); // DTC
 else if (MessageRx_PCM[n]==0x54 && MessageRx_PCM[n+1]==0xFF && MessageRx_PCM[n+2]==0x00){ request = DTCREAD; RequestPeriod = 3000; prevRequest = curmillis;} // DTC are cleared
 else if (MessageRx_PCM[n]==0x61 && MessageRx_PCM[n+1]==0x01) {dataVars() ; RequestPeriod = 70; prevRequest = curmillis; }           // receive DataStream
 
 
 }   

// если контрольная сумма не совпала: 
#ifdef debugPCM
  else Serial.println("CRC fail!!!" );
#endif
message_size = 0; header=0; RESETheader_timer = 0; j=3; crc = 0;
}

// таймер ожидания байт (для успевания появления данных в буфере UART)
if (!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1; 

// таймер сброса целостности сообщения (если данные оборвались посередине сообщения)
if (RESETheader_timer && curmillis - prevRESETheader > 200) { 
  #ifdef debugPCM 
  Serial.println(F("Message fail timeout")); 
  #endif 
  RESETheader_timer = 0; header = 0;}   
 
// если нет ответа после запроса: +1 к счетчику неответов. Если накопилось 6 и более: делаем реинит.  
if (request!=INIT && NOanswer_timer && curmillis - prev_NOanswer > RequestPeriod - RequestPeriod/10) 
         {
     NOanswer_timer = 0; noanswers++; 
     if (noanswers>=6) { noanswers = 0; request = INIT; RequestPeriod = 3500;}
         }
}// end receivePCM


void Troublecodes () 
{
  if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1]==0x00){
    myGLCD.clrScr();             
    drawscreen_three();      
    myGLCD.print("NO DTC", 165, 145);
    Serial.println ("     NO DTC  "); }
    
  //при получении этого сообщения выдавать на третий экран "DTC BORRADO"
  if (MessageRx_PCM[n]==0x54 && MessageRx_PCM[n+1]==0xFF && MessageRx_PCM[n+2]==0x00){
    myGLCD.clrScr();             
    drawscreen_three();      
    myGLCD.print("DTC BORRADO", 165, 145);
    Serial.println ("     DTC BORRADO  "); }
   
  // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
  if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1]>0){
     Serial.println ("DTC is found!");
     myGLCD.clrScr();             
     drawscreen_three();       

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

  if (MessageRx_PCM[n+9-7+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
  if (MessageRx_PCM[n+9-7+(i*3)]<=0x0F&&MessageRx_PCM[n+9-7+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;} 
  if (nolA)myGLCD.print(String (MessageRx_PCM[n+9-7+(i*3)],HEX), 246, (75+y)); 
  else myGLCD.print(String (MessageRx_PCM[n+9-7+(i*3)],HEX), 230, (75+y));

  if (MessageRx_PCM[n+10-7+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
  if (MessageRx_PCM[n+10-7+(i*3)]<=0x0F&&MessageRx_PCM[n+10-7+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;}
  if (nolB)myGLCD.print(String (MessageRx_PCM[n+10-7+(i*3)]),HEX, 278, (75+y)); 
  else myGLCD.print(String (MessageRx_PCM[n+10-7+(i*3)],HEX), 262, (75+y));}} 



}



void dataVars() 
{
  //Barom = MessageRx_PCM[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_PCM[n+22]*256)+MessageRx_PCM[n+23])/10;
   BoostPres =  ((MessageRx_PCM[n+24]*256)+MessageRx_PCM[n+25])/1000.0;
   RPM =  (MessageRx_PCM[n+35-7]*256)+MessageRx_PCM[n+36-7];
   EGRmg =  ((MessageRx_PCM[n+37-7]*256)+MessageRx_PCM[n+38-7])/10.0;
   BoostPresCom =  ((MessageRx_PCM[n+41-7]*256)+MessageRx_PCM[n+42-7])/1000.0;
   Speed =  ((MessageRx_PCM[n+47-7]*256)+MessageRx_PCM[n+48-7])/100;
   DesaInjQua =  ((MessageRx_PCM[n+53-7]*256)+MessageRx_PCM[n+54-7])/100.0;
   InjQua =  ((MessageRx_PCM[n+55-7]*256)+MessageRx_PCM[n+56-7])/100.0;
   StaDaliv =  ((MessageRx_PCM[n+57-7]*256)+MessageRx_PCM[n+58-7])/100.0;
   PumpRPM =  (MessageRx_PCM[n+59-7]*256)+MessageRx_PCM[n+60-7];
   EGRPul =  ((MessageRx_PCM[n+65-7]*256)+MessageRx_PCM[n+66-7])/100.0;
   SolenPul =  ((MessageRx_PCM[n+67-7]*256)+MessageRx_PCM[n+68-7])/100.0;
   SolenPre =  ((MessageRx_PCM[n+73-7]*256)+MessageRx_PCM[n+74-7])/100.0;
   DesInj =  ((MessageRx_PCM[n+75-7]*3)+(MessageRx_PCM[n+76-7])/100.0)+0.3;
   ActInj =  ((MessageRx_PCM[n+19-7]*3)+(MessageRx_PCM[n+20-7])/100.0)+0.3;
   //TempAir =  ((MessageRx_PCM[n+77-7]*26)-278)+MessageRx_PCM[n+78-7]/10.0;
   //Temp =  ((MessageRx_PCM[n+17-7]*26)-278)+MessageRx_PCM[n+18-7]/10.0;
   //TempOil =  ((MessageRx_PCM[n+21-7]*26)-278)+MessageRx_PCM[n+22-7]/10.0;
   //TempFuel =  ((MessageRx_PCM[n+61-7]*26)-278)+MessageRx_PCM[n+62-7]/10.0;
   //ниже идут расчетные формулы более точные чем те что закоментированы выше
   int A = 0;
   if  (MessageRx_PCM[n+77-7]<=0x0A) A = 277;
   if  (MessageRx_PCM[n+77-7]==0x0B || MessageRx_PCM[n+77-7]==0x0C) A = 278;
   if  (MessageRx_PCM[n+77-7]>=0x0D) A = 279;
   double B = MessageRx_PCM[n+78-7]/10.0;
   double cel , drob ;
   drob = modf(B, &cel);
   if (drob>0.6) cel++;
     TempAir =  ((MessageRx_PCM[n+77-7]*26)-A)+cel;
   
   if  (MessageRx_PCM[n+17-7]<=0x0A) A = 277;
   if  (MessageRx_PCM[n+17-7]==0x0B || MessageRx_PCM[n+17-7]==0x0C) A = 278;
   if  (MessageRx_PCM[n+17-7]>=0x0D) A = 279;
   B = MessageRx_PCM[n+18-7]/10.0;
   drob = modf(B, &cel);
   if (drob>0.6) cel++;
     Temp =  ((MessageRx_PCM[n+17-7]*26)-A)+cel;


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


   if  (MessageRx_PCM[n+61-7]<=0x0A) A = 277;
   if  (MessageRx_PCM[n+61-7]==0x0B || MessageRx_PCM[n+61-7]==0x0C) A = 278;
   if  (MessageRx_PCM[n+61-7]>=0x0D) A = 279;
   B = MessageRx_PCM[n+62-7]/10.0;
   drob = modf(B, &cel);
   if (drob>0.6) cel++;
     TempFuel =  ((MessageRx_PCM[n+61-7]*26)-A)+cel;   


myGLCD.setColor(255, 255, 255);      //цвет текста
     myGLCD.printNumI(Speed, 350, 7, 3);
  //----------------------------------------------------------
  //страниц HOME
  //----------------------------------------------------------
  if (currentPage == '0') {
     myGLCD.printNumF(LHor, 1, 60, 40, '.',5);
     myGLCD.printNumF(L100, 1, 210, 40,'.',5 );
     myGLCD.printNumF(L100M, 1, 60, 75,'.',5 );
     myGLCD.printNumF(L100SR_TFT, 1, 210, 75,'.',5 );
     myGLCD.printNumI(kmREFUELING, 60, 110,5 ); 
     //if (Fuel<53) 
     myGLCD.printNumF(Fuel, 1, 210, 110,'.',5);
     //else myGLCD.print("MAX", 210, 110); 
     myGLCD.printNumF(kmTrip, 1, 60, 145,'.',5);
     myGLCD.printNumF(FuelTrip, 1, 210, 145,'.',5);
     myGLCD.printNumI(PumpRPM, 210, 180,5);
     myGLCD.printNumI(RPM, 210, 215,5);
     myGLCD.printNumF(Fuel2, 1, 0, 215,'.',5);      
     myGLCD.printNumI(Temp, 415, 40, 3);
     myGLCD.printNumI(TempOil, 415, 75, 3);
     myGLCD.printNumI(TempFuel, 415, 110,3); 
  //   myGLCD.printNumI(sensors.getTempCByIndex(0), 415, 145 , 3);
     myGLCD.printNumI(t, 415, 180, 3);
     myGLCD.printNumI(TempAir, 415, 215, 3); }
   //----------------------------------------------------------
   //страниц INF1
   //----------------------------------------------------------
   if (currentPage == '1') {
     myGLCD.printNumF(StaDaliv,1, 360, 40,'.', 3);
     myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
     myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); 
     myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);  
     myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); 
     myGLCD.printNumI(MAF, 170, 215, 4);
     myGLCD.printNumF(h, 1, 418, 215); }
   //----------------------------------------------------------
   //страниц INF2
   //----------------------------------------------------------
   if (currentPage == '2') {    
     myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);  
     myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); 
     myGLCD.printNumI(EGRmg, 395, 110, 4);  
     myGLCD.printNumF(EGRPul,1, 410, 145,'.', 3);  
     myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);  
     myGLCD.printNumF(SolenPre, 0, 410, 215,'.', 3); }
 
}



 void sendMessagePCM(const byte &command)
{
 #ifdef debugPCM                         
Serial.print (F("Send request "));  Serial.print (textRequest[command]); Serial.print (F(" to PCM  ")); Serial.println (millis());
 #endif
if (command != INIT) {NOanswer_timer = 1; prev_NOanswer = curmillis;}  //т.к. сейчас будем делать запрос, то запускаем таймер контроля неответов 
  byte size =  PCM_Message_TX[command][0];
  const byte siZe = size+4;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);}
    if (i==1) Mes[i] = PCM_address;
    if (i==2) Mes[i] = DIAG_address;    
    if (i==3) {for (byte t=1; t<size+1; t++ ) {
           Mes[i]=PCM_Message_TX [command][t]; 
           Checksum+=Mes[i] ; 
           K_LINE_PCM.write (Mes[i]); 
           if (command == INIT) delay (5); delay (delaybyte_TX);  
           K_LINE_PCM.read(); 
           i++;}}
    if (i!=siZe-1) Checksum+=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE_PCM.write (Mes[i]);
   if (command == INIT) delay (5); else delay (delaybyte_TX);
    K_LINE_PCM.read();
                             }
}// end sendMessagePCM



#if defined debugPCM or debugGAUGE
void printDebugRX (const byte &inbyte) {if (inbyte<=15) Serial.print(F("0")); Serial.print (inbyte, HEX);  Serial.print (F(" "));}
#endif

#ifdef debugPCM
void printDebugRX_CSgood(){
if (MessageRx_PCM[n]==0xC1 && MessageRx_PCM[n+1]==0x6B && MessageRx_PCM[n+2]==0x8F) {Serial.println (F("   Initialization OK!!!!")); }
 else if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1]==0x00) {Serial.println (F("     NO DTC  "));}
 else if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1] >0x00) {Serial.println (F("     DTC is found!"));} 
 else if (MessageRx_PCM[n]==0x54 && MessageRx_PCM[n+1]==0xFF && MessageRx_PCM[n+2]==0x00){Serial.println (F("     DTC CLEARED  "));}
 else if (MessageRx_PCM[n]==0x61 && MessageRx_PCM[n+1]==0x01) {Serial.println (F("     Receive PCM DATAstream"));}}
#endif                          



void Menu () {
     
    if (currentPage == '0') {
     TouchHOME();
     TouchINF1();
     TouchINF2();
     TouchCHECK(); }
    if (currentPage == '1') { 
     TouchHOME();
     TouchINF2();
     TouchCHECK(); }
    if (currentPage == '2') { 
     TouchHOME();
     TouchINF1();
     TouchCHECK(); }
    if (currentPage == '3') { 
     TouchHOME();
     TouchREAD();
     TouchERASE(); }}   
 
 
  void drawHomeScreen() {
    line() ;
    Watch ();
    myGLCD.setColor(255, 0, 0); // цвет линии и текста красный
    myGLCD.drawLine(295,35,295,248); // линия вертикальная
    myGLCD.drawLine(145,35,145,178); // линия вертикальная
    myGLCD.drawLine(80,178,80,247); // линия вертикальная
    myGLCD.print("L/H", 10, 40);
    myGLCD.print("L/A", 148, 40);
    myGLCD.print("L/V", 10, 75);
    myGLCD.print("L/M", 148, 75);
    myGLCD.print("D/K", 10, 110);
    myGLCD.print("D/L", 148, 110);
    myGLCD.print("V/K", 10, 145);
    myGLCD.print("V/L", 148, 145);
    myGLCD.print("PUMP RPM", 82, 180);
    myGLCD.print("ENGI   RPM", 82, 215);
    myGLCD.print("D/La", 10, 180);
    myGLCD.print("Motor C", 300, 40);
    myGLCD.print("OIL       C", 300, 75);
    myGLCD.print("FUEL    C", 300, 110);
    myGLCD.print("INTER  C", 300, 145);
    myGLCD.print("EXTER  C", 300, 180);
    myGLCD.print("INTAIR C", 300, 215); 
    myGLCD.drawRoundRect (15, 255, 145, 310);
    myGLCD.print("INF 1", 55, 270);
    myGLCD.drawRoundRect (175, 255, 305, 310);
    myGLCD.print("INF 2", 215, 270);
    myGLCD.drawRoundRect (335, 255, 465, 310);
    myGLCD.print("CHECK", 365, 270);
    myGLCD.drawRoundRect (1, 1, 77, 37);
    myGLCD.print("HOME", 10, 7);
    myGLCD.print("Km/h", 410, 7);
  }
 //-------------------------------------------------
   void drawscreen_one() {
    line() ;
    Watch ();
    myGLCD.setColor(255, 0, 0); // цвет линии и текста красный
    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("Humedad %:", 255, 215);
    myGLCD.drawRoundRect (175, 255, 305, 310);
    myGLCD.print("INF 2", 215, 270);
    myGLCD.drawRoundRect (335, 255, 465, 310);
    myGLCD.print("CHECK", 365, 270);
    myGLCD.drawRoundRect (1, 1, 77, 37);
    myGLCD.print("HOME", 10, 7);
    myGLCD.print("Km/h", 410, 7);
    }
 //-------------------------------------------------
  void drawscreen_two() {
    line() ;
    Watch ();
    myGLCD.setColor(255, 0, 0); // цвет линии и текста красный
    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);
    myGLCD.drawRoundRect (15, 255, 145, 310);
    myGLCD.print("INF 1", 55, 270);
    myGLCD.drawRoundRect (335, 255, 465, 310);
    myGLCD.print("CHECK", 365, 270);
    myGLCD.drawRoundRect (1, 1, 77, 37);
    myGLCD.print("HOME", 10, 7);
    myGLCD.print("Km/h", 410, 7);
    }
 //----------------------------------------------------------------------------
  void drawscreen_three() {
    Watch ();
    myGLCD.setColor(255, 0, 0); // цвет линии красный
    myGLCD.drawLine(1,35,479,35); // линия горизонтальная
    myGLCD.drawLine(1,248,479,248); // линия горизонтальная
    myGLCD.drawRoundRect (15, 255, 145, 310);
    myGLCD.print("ERASE", 55, 270);
    myGLCD.drawRoundRect (335, 255, 465, 310);
    myGLCD.print("READ", 365, 270);
    myGLCD.drawRoundRect (1, 1, 77, 37);
    myGLCD.print("HOME", 10, 5);
    myGLCD.print("Km/h", 410, 3);
   }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//кнопки тач . координаты и переходы
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TouchHOME(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {if (p.x > 140 && p.x < 320 && p.y > 140 && p.y < 260 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (1, 1, 77, 37);
        currentPage = '0';     
        request = PID; RequestPeriod = 600; prevRequest = curmillis; // на PCM в этом окне посылается запрос текущих параметров
        myGLCD.clrScr();             
        drawHomeScreen();
        x = 0;
        y = 0;
        p.z = 0;}}}

void TouchINF1(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {
      if (p.x > 150 && p.x < 450 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (15, 255, 145, 310);
        currentPage = '1';    
        request = PID; RequestPeriod = 600; prevRequest = curmillis; // на PCM в этом окне посылается запрос текущих параметров       
        myGLCD.clrScr();             
        drawscreen_one();
        x = 0;
        y = 0;
        p.z = 0;}}}
    
void TouchINF2(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {
    if (p.x > 450 && p.x < 680 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (175, 255, 305, 310);
        currentPage = '2';     
        request = PID; RequestPeriod = 600; prevRequest = curmillis; // на PCM в этом окне посылается запрос текущих параметров      
        myGLCD.clrScr();             
        drawscreen_two();
        x = 0;
        y = 0;
        p.z = 0;}}}

void TouchCHECK(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {
if (p.x > 690 && p.x < 950 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (335, 255, 465, 310);
        currentPage = '3';  
       request = DTCREAD; RequestPeriod = 3000; prevRequest = curmillis; // на PCM в этом окне посылается запрос чтения ошибок  
        myGLCD.clrScr();             
        drawscreen_three();
        x = 0;
        y = 0;
        p.z = 0;}}}

void TouchREAD(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {
if (p.x > 690 && p.x < 950 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (335, 255, 465, 310);
        request = DTCREAD; RequestPeriod = 3000; prevRequest = curmillis; // на PCM при нажатии этой кнопки посылается запрос чтения ошибок  
        x = 0;
        y = 0;
        p.z = 0;}}}

void TouchERASE(){
TSPoint p = ts.getPoint();
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
    {
if (p.x > 150 && p.x < 450 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      { myGLCD.drawRoundRect (15, 255, 145, 310);
       request = DTCERASE; RequestPeriod = 3000;  prevRequest = curmillis; // на PCM при нажатии этой кнопки посылается запрос удаления ошибок 
        x = 0;
        y = 0;
        p.z = 0;}}}
 ////////////////////////////////////////////////////////////////////////////////////////
 //прорисовка линий
 ///////////////////////////////////////////////////////////////////////////////////////
 void line() {
    myGLCD.setColor(255, 0, 0); // цвет линии красный
    myGLCD.drawLine(1,35,479,35); // линия горизонтальная
    myGLCD.drawLine(1,73,479,73); // линия горизонтальная
    myGLCD.drawLine(1,108,479,108); // линия горизонтальная
    myGLCD.drawLine(1,143,479,143); // линия горизонтальная
    myGLCD.drawLine(1,178,479,178); // линия горизонтальная
    myGLCD.drawLine(1,212,479,212); // линия горизонтальная
    myGLCD.drawLine(1,248,479,248); // линия горизонтальная
             }


void Watch (){
   DateTime now = rtc.now();
   int m = now.minute(); 
   int hour = now.hour();
   int mon = now.month();
   int date = now.day();
 
   myGLCD.setColor(255, 255, 255); //белый цвет цифры
 
   if (date<10) { 
   myGLCD.print("0", 85, 7); 
   myGLCD.printNumI(now.day(), 100, 7); } 
   else if (date >=10) {
   myGLCD.printNumI(now.day(), 85, 7); }
   myGLCD.print("/", 115, 7);
   if ( mon<10) {
   myGLCD.print("0", 130, 7); 
   myGLCD.printNumI(now.month(), 145, 7);} 
   else if (mon >=10) {
   myGLCD.printNumI(now.month(), 130, 7);}  
   myGLCD.print("/", 160, 7);
   myGLCD.printNumI(now.year(), 175, 7);
   if (hour<10) {
   myGLCD.print("0",255, 7); 
   myGLCD.printNumI(now.hour(), 270, 7); } 
   else if(hour>=10){ 
   myGLCD.printNumI(now.hour(), 255, 7); } 
   if (m<10) {
   myGLCD.print("0",300, 7); 
   myGLCD.printNumI(now.minute(), 315, 7); } 
   else if (m>=10){ 
   myGLCD.printNumI(now.minute(), 300, 7); }
    }          

остался шрифт :) ща разберусь

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

что выглядит?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Мне бы фото / видео ...

Я сижу и чиню "черную коробку" ! с чужим кодом 

MaksVV Вы не богаты алгоритмами поддержания скорости круиз-контроля ?

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

ща доработаю шриф и сниму видео и кину на ютуб, потом кину сюда. Макс тебе в очередной раз огромное сапсибо. ТЫ ГЕНИЙ я два года уже об этом говорю. Командир тебе тоже огромное спасибо за подсказку.  ждите видео

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

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

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

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

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

лог

Send request INIT to PCM  5052
Receive PCM: 83 F1 11 C1 6B 8F 40 
Received message is OK! Checksum is correct!  5139
   Initialization OK!!!!
Send request PID_2101 to PCM  5211
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 3A 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 70 03 9E 00 02 21 
Received message is OK! Checksum is correct!  5445
     Receive PCM DATAstream
Send request PID_2101 to PCM  5842
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 70 03 9F 00 02 20 
Received message is OK! Checksum is correct!  6075
     Receive PCM DATAstream
Send request PID_2101 to PCM  6549
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 38 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 70 03 9E 00 02 21 
Received message is OK! Checksum is correct!  6786
     Receive PCM DATAstream
Send request PID_2101 to PCM  7183
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 70 03 9E 00 02 1F 
Received message is OK! Checksum is correct!  7420
     Receive PCM DATAstream
Send request PID_2101 to PCM  7818
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 72 03 9E 00 02 22 
Received message is OK! Checksum is correct!  8052
     Receive PCM DATAstream
Send request PID_2101 to PCM  8450
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 72 03 9E 00 02 23 
Received message is OK! Checksum is correct!  8684
     Receive PCM DATAstream
Send request PID_2101 to PCM  9081
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 08 93 0C 72 03 9F 00 02 23 Message fail timeout
Send request PID_2101 to PCM  9684
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E6 00 00 0C 97 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 72 03 9E 00 02 21 
Received message is OK! Checksum is correct!  9927
     Receive PCM DATAstream
Send request PID_2101 to PCM  10324
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9F 00 02 24 
Received message is OK! Checksum is correct!  10555
     Receive PCM DATAstream
Send request PID_2101 to PCM  10952
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 73 03 9E 00 02 27 
Received message is OK! Checksum is correct!  11191
     Receive PCM DATAstream
Send request PID_2101 to PCM  11588
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 97 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9E 00 02 21 
Received message is OK! Checksum is correct!  11819
     Receive PCM DATAstream
Send request PID_2101 to PCM  12216
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 08 01 20 00 00 01 93 0C 73 03 9F 02 22 Message fail timeout
Send request PID_2101 to PCM  12818
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9E 00 02 23 
Received message is OK! Checksum is correct!  13066
     Receive PCM DATAstream
Send request PID_2101 to PCM  13463
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 26 
Received message is OK! Checksum is correct!  13696
     Receive PCM DATAstream
Send request PID_2101 to PCM  14093
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 97 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 72 03 9E 00 02 22 
Received message is OK! Checksum is correct!  14330
     Receive PCM DATAstream
Send request PID_2101 to PCM  14728
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9F 00 02 21 
Received message is OK! Checksum is correct!  14960
     Receive PCM DATAstream
Send request PID_2101 to PCM  15357
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 00 00 01 93 0C 73 03 9F 00 02 23 Message fail timeout
Send request PID_2101 to PCM  15960
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9F 00 02 1F 
Received message is OK! Checksum is correct!  16201
     Receive PCM DATAstream
Send request PID_2101 to PCM  16599
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 38 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 73 03 9E 00 02 27 
Received message is OK! Checksum is correct!  16837
     Receive PCM DATAstream
Send request PID_2101 to PCM  17234
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9E 00 02 24 
Received message is OK! Checksum is correct!  17465
     Receive PCM DATAstream
Send request PID_2101 to PCM  17862
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 73 03 9E 00 02 23 
Received message is OK! Checksum is correct!  18101
     Receive PCM DATAstream
Send request PID_2101 to PCM  18498
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 00 01 93 0C 75 03 9E 00 02 23 Message fail timeout
Send request PID_2101 to PCM  19101
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 96 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 24 
Received message is OK! Checksum is correct!  19344
     Receive PCM DATAstream
Send request PID_2101 to PCM  19741
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9F 00 02 25 
Received message is OK! Checksum is correct!  19978
     Receive PCM DATAstream
Send request PID_2101 to PCM  20375
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 96 00 00 02 71 00 00 00 00 04 33 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9F 00 02 23 
Received message is OK! Checksum is correct!  20608
     Receive PCM DATAstream
Send request PID_2101 to PCM  21005
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 30 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9F 00 02 20 
Received message is OK! Checksum is correct!  21240
     Receive PCM DATAstream
Send request PID_2101 to PCM  21638
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 00 00 01 93 0C 75 03 9E 00 02 25 Message fail timeout
Send request PID_2101 to PCM  22240
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 73 03 9E 00 02 21 
Received message is OK! Checksum is correct!  22481
     Receive PCM DATAstream
Send request PID_2101 to PCM  22879
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 22 
Received message is OK! Checksum is correct!  23117
     Receive PCM DATAstream
Send request PID_2101 to PCM  23515
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 75 03 9E 00 02 26 
Received message is OK! Checksum is correct!  23745
     Receive PCM DATAstream
Send request PID_2101 to PCM  24142
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 25 
Received message is OK! Checksum is correct!  24381
     Receive PCM DATAstream
Send request PID_2101 to PCM  24778
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 36 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 00 00 01 93 0C 75 03 9F 00 02 26 Message fail timeout
Send request PID_2101 to PCM  25380
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9F 00 02 26 
Received message is OK! Checksum is correct!  25628
     Receive PCM DATAstream
Send request PID_2101 to PCM  26025
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 33 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9F 00 02 24 
Received message is OK! Checksum is correct!  26256
     Receive PCM DATAstream
Send request PID_2101 to PCM  26653
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 97 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 22 
Received message is OK! Checksum is correct!  26894
     Receive PCM DATAstream
Send request PID_2101 to PCM  27291
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 23 
Received message is OK! Checksum is correct!  27524
     Receive PCM DATAstream
Send request PID_2101 to PCM  27921
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 70 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 00 01 93 0C 75 03 9E 00 02 29 Message fail timeout
Send request PID_2101 to PCM  28523
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 76 03 9E 00 02 25 
Received message is OK! Checksum is correct!  28762
     Receive PCM DATAstream
Send request PID_2101 to PCM  29159
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 96 00 00 02 71 00 00 00 00 04 36 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 75 03 9E 00 02 28 
Received message is OK! Checksum is correct!  29398
     Receive PCM DATAstream
Send request PID_2101 to PCM  29795
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 75 03 9E 00 02 1F 
Received message is OK! Checksum is correct!  30027
     Receive PCM DATAstream
Send request PID_2101 to PCM  30425
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 75 03 9E 00 02 24 
Received message is OK! Checksum is correct!  30659
     Receive PCM DATAstream
Send request PID_2101 to PCM  31056
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 20 00 00 01 93 0C 76 03 9F 00 02 23 Message fail timeout
Send request PID_2101 to PCM  31657
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9F 00 02 24 
Received message is OK! Checksum is correct!  31888
     Receive PCM DATAstream
Send request PID_2101 to PCM  32285
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 25 
Received message is OK! Checksum is correct!  32522
     Receive PCM DATAstream
Send request PID_2101 to PCM  32919
Send request PID_2101 to PCM  33523
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 76 03 9E 00 02 2B 
Received message is OK! Checksum is correct!  33766
     Receive PCM DATAstream
Send request PID_2101 to PCM  34163
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 A9 00 01 93 0C 76 03 9E 00 02 26 Message fail timeout
Send request PID_2101 to PCM  34765
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 76 03 9F 00 02 28 
Received message is OK! Checksum is correct!  35009
     Receive PCM DATAstream
Send request PID_2101 to PCM  35406
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 22 
Received message is OK! Checksum is correct!  35643
     Receive PCM DATAstream
Send request PID_2101 to PCM  36040
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 76 03 9F 00 02 27 
Received message is OK! Checksum is correct!  36273
     Receive PCM DATAstream
Send request PID_2101 to PCM  36670
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 94 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9F 00 02 24 
Received message is OK! Checksum is correct!  36907
     Receive PCM DATAstream
Send request PID_2101 to PCM  37304
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 94 00 00 02 71 00 00 00 00 04 33 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 A9 01 93 0C 76 03 9F 00 02 24 Message fail timeout
Send request PID_2101 to PCM  37905
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 24 
Received message is OK! Checksum is correct!  38148
     Receive PCM DATAstream
Send request PID_2101 to PCM  38545
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 38 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 27 
Received message is OK! Checksum is correct!  38780
     Receive PCM DATAstream
Send request PID_2101 to PCM  39178
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 38 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 28 
Received message is OK! Checksum is correct!  39414
     Receive PCM DATAstream
Send request PID_2101 to PCM  39812
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 26 
Received message is OK! Checksum is correct!  40044
     Receive PCM DATAstream
Send request PID_2101 to PCM  40441
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 00 00 01 93 0C 77 03 9E 00 02 27 Message fail timeout
Send request PID_2101 to PCM  41043
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 77 03 9E 00 02 26 
Received message is OK! Checksum is correct!  41275
     Receive PCM DATAstream
Send request PID_2101 to PCM  41672
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 94 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 77 03 9F 00 02 29 
Received message is OK! Checksum is correct!  41905
     Receive PCM DATAstream
Send request PID_2101 to PCM  42302
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 38 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 77 03 9F 00 02 2A 
Received message is OK! Checksum is correct!  42534
     Receive PCM DATAstream
Send request PID_2101 to PCM  42932
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 79 03 9F 00 02 26 
Received message is OK! Checksum is correct!  43168
     Receive PCM DATAstream
Send request PID_2101 to PCM  43566
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 A9 00 01 93 0C 77 03 9E 00 02 24 Message fail timeout
Send request PID_2101 to PCM  44169
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 77 03 9E 00 02 23 
Received message is OK! Checksum is correct!  44410
     Receive PCM DATAstream
Send request PID_2101 to PCM  44808
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 77 03 9E 00 02 24 
Received message is OK! Checksum is correct!  45038
     Receive PCM DATAstream
Send request PID_2101 to PCM  45435
Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 33 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DC 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 77 03 9E 00 02 23 
Received message is OK! Checksum is correct!  45674
     Receive PCM DATAstream

 

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

не прописываею шрифт только размер прописываю myGLCD.setTextSize(2); не мигает но шрифт меньше чем нужен и шире.

любой адафрутовский шриф myGLCD.setFont(&FreeSerifItalic12pt7b); блин мигает.....

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

MaksVV машина Subaru c электронной педалью акселератора.

железо уже сделано: 32U4 общается с ЭБУ, с GPS, выводит на OLED по I2C, отслеживает нажатия SKRHABE10, отслеживает уровень от родной педали, отслеживает сигналы от датчика скорости, выставляет уровень замещающий родную педаль через ЦАП по I2C. Сброс по тормозу, сцеплению, нейтрали - аппартный.

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

viki13viki дисплей прямого отображения что ли ? Нельзя ли формировать картинку в буфере и целиком за раз обновлять ?

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

извени я не програмист, я художник и музыкант:( 

b707
Offline
Зарегистрирован: 26.05.2017

viki13viki пишет:

не прописываею шрифт только размер прописываю myGLCD.setTextSize(2); не мигает но шрифт меньше чем нужен и шире.

любой адафрутовский шриф myGLCD.setFont(&FreeSerifItalic12pt7b); блин мигает.....

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

бороться - либо борать более быстрый МК. либо кардинально переписывать библиотеку.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

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

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

тоесть Командир найти в библе адафруита стандартный шрифт и перерисовать его на свой? вопрос где он лежит в font лежат шрифты но там нет стандарт или чета похожее......... я бы поигрался бы и перерисовл , я же художник:) , порылся бы как это сделать...... на сколько я понимаю так как он работает через конветрер  <UTFTGLUE.h> то он использует стандартный шрифт UTFT библы? правильно?