переводчик (драйвера экрана) либо UTFT.h (для твоего старого экрана), либо UTFTGLUE.h либо MCUFRIEND_kbv.h . Вместе их не надо. Последние две подходят для твоего нового экрана.
UTFTGLUE совместима по функциям с твоим новым экраном, но вроде как тормозит. MCUFRIEND_kbv.h имеет другие функции и фиг знает тормозит или нет.
и напиши простой скетч с периодическим выводом на экран статических переменных (пусть они будут, но не обновляются от эбу, чтоб скетч был простой, а просто ++ каждый вывод на экран, ну хотябы пара переменных пусть наращивается). Будет ли мигать?
дак щас вообще не инитится эбу. это нужно подправить. а потом с миганиме разбератся буду. он же уже работал, после какихто последних подправок перестал общатся с эбу. нужно вернуть состояние когда он работал, пусть мигает, я буду копать. мне главное чтобы твоя система работала. остальное я уже разберусь
вот тебе скетч для проверки экрана, тормозит или нет
uint32_t prevData = 0;
uint32_t curmillis = 0;
#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>
UTFTGLUE myGLCD(0x1581a,A2,A1,A3,A4,A0);
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; // пробег до заправки на остатке топлива
void setup() {
Serial.begin(115200);
myGLCD.InitLCD(3);
myGLCD.clrScr();
}
void loop() {
curmillis = millis();
LCDDataPrint();
}
void LCDDataPrint(){
if (curmillis - prevData > 50){
MAF++;
RPM ++;
EGRmg++;
Speed++;
PumpRPM++;
TempAir++;
Temp++;
TempOil++;
TempFuel++;
myGLCD.setColor(255, 255, 255); //цвет текста
//myGLCD.setBackColor(0,0,0); //затирание текста
//myGLCD.setTextColor(0xFFFF, 0x0000);
myGLCD.printNumI(Speed, 350, 7, 3);
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 );
myGLCD.printNumF(Fuel, 1, 210, 110,'.',5);
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(TempAir, 415, 215, 3);
prevData = curmillis;
// Serial.println(millis());
}}
да я выше написал. сабака бы его нюхала. все работает нужно ща доработать увеличить шрифт.я закоментил френад а помом по обибкам увидел шрифты. закоментил и все стало пучком . ща с шрифтом разберусь.....
тогда так. Вернул обновление данных на экране только по получению данных от PCM. Убрал шрифт, потом с ним разберёшся. По идее все символы маленькие должны стать.
#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
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.print(F("Message fail timeout ")); Serial.println(millis());
#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); }
}
ты читаешь вообще , что я пишу? Я же тебе объяснил, что обновление данных на экран запихал в момент, когда получаем данные PID 2101 от PCM. Данные идут в Serial ? если да , то и экран должен обновляться. Конечно LCDDataPrint(); дало ошибку. Эту функцию я удалил потому что.
все это очень странно. где опять засада. Вставь Serial.println ("YA V DATAVARS!!!") в начале в функции dataVars() . Чтоб посмотреть заходит ли туда программа
что то опять тормозит процесс причём конкретно. поправил отладку 1563 чтоб узнать насколько тормозит. Залей и сделай лог. Пробуй также опять по очереди убирать из лупа menu(), строку с watch, строку с двоеточием.
Я не вкуривал что за железки используются как тач и дисплей, но если в их библиотеках есть работа с прерваниями, то софтовый сериал так и будет себя вести на длинных посылках ...
у меня байты каждый проход лупа из буфера считываются. Соотвественно глубоко пофиг, что посылка длинная.
Просто я сам же сделал таймер на миллис на случай сбоев, чтоб не зависало - если байты перестают поступать посередине сообщения, то оно сбрасывается, и начинается читалка по новой. И вот после добавления экрана этот таймер начал срабатывать.
У меня уже попкорн кончился от Вашего кино с конями ...
Вы представляете сколько времени Ваш скетч находится внутри софтсериала ?
Попробуте в исходниках SoftwareSerial.h изменить #define _SS_MAX_RX_BUFF 64 на #define _SS_MAX_RX_BUFF 81 (или вместо 81 - сколько байт посылает ЕБУ в одном ответе) и перекомпилировать проект.
(По умолчанию буфер у SoftwareSerial 64 байта и он явно переполняется, а Вы чуть чуть не успеваете их забирать ...)
мы это уже проходили. Это нужно было делать в первой версии скетча, когда использовался delay195, то есть мы дожидались от ЭБУ ВСЕХ байт сообщения , которые накапливались в буфере софтсериала, и т.к. это больше 64, то увеличивали буфер. Т.е. сообщение принималось в одной итерации лупа. Сейчас же я уже написал вам, что буфер опустошается СРАЗУ после поступления в него байт сообщения. Т.е. сообщение принимается за много проходов лупа. Поэтому он не заполняется и на 10%. Проблема в том, что для надёжности я ввел таймер, который через определённый таймаут сбрасывает приём конкретного сообщения, если байты прекратили поступать. а прекратить они могли поступать, если в лупе что-то другое подвисает. И похер хард тут или софт Сериал.
Если такой таймер не ввести и поступление байт по той или иной причине прекратится, когда сообщение ещё полностью не принято, то байты уже следующего сообщения будут интерпретироваться как последние недостающие байты текущего принимаемого сообения и мы так никогда в итоге не найдём больше начальную шапку последующих сообщений. Будет дальнейший сбой приёма.
по хорошему нужно отдельную дуню на приём данных из К-лайн, которой в лупе ничего другого не будет мешать и уже она тоже по Сериал (или ещё как) будет передавать данные ардуине, отвечающей за всё остальное, датчики t , экран и т.д.
Потому что все эти библиотеки периферии гавно полное.
У меня 32U4 на 16 МГц по 10 раз в секунду успевает принять ~100 байт от GPS и полностью обновить картинку на OLED 128х64 по I2C. Так что два камня для Вашего проекта это много.
Из Вашего лога вижу что принято то 76, то 77, то 78 байт - теряется всего от 5 до 3 байт. Это прямая логика Вам подсказывает, что Вы опустошаете буфер в лупе. А если какая то библа забирает время по прерыванию ??? Запретить прерывания полностью, то же нельзя, т.к. Softserial сам на прерывании ловит байты. Вообщем я бы проверил идею с размером буфера - делов то на пару минут.
переводчик (драйвера экрана) либо UTFT.h (для твоего старого экрана), либо UTFTGLUE.h либо MCUFRIEND_kbv.h . Вместе их не надо. Последние две подходят для твоего нового экрана.
UTFTGLUE совместима по функциям с твоим новым экраном, но вроде как тормозит. MCUFRIEND_kbv.h имеет другие функции и фиг знает тормозит или нет.
Вот описание драйверов экрана MCUFRIEND_kbv.h
я закоменчу френда. но нужно чтобы скетч заработал. перекинешь сюда чтобы не бегать на прошлую страницу когда подправишь
попробовал еще раза 1536
если закоментить френда то ошибка компиляции
no matching function for call to 'UTFTGLUE::setFont(const GFXfont*)'
делай это
и напиши простой скетч с периодическим выводом на экран статических переменных (пусть они будут, но не обновляются от эбу, чтоб скетч был простой, а просто ++ каждый вывод на экран, ну хотябы пара переменных пусть наращивается). Будет ли мигать?
дак щас вообще не инитится эбу. это нужно подправить. а потом с миганиме разбератся буду. он же уже работал, после какихто последних подправок перестал общатся с эбу. нужно вернуть состояние когда он работал, пусть мигает, я буду копать. мне главное чтобы твоя система работала. остальное я уже разберусь
дак закоменти в лупе LCDDataprint() и всё.
вот тебе скетч для проверки экрана, тормозит или нет
uint32_t prevData = 0; uint32_t curmillis = 0; #include <Adafruit_GFX.h> #include <UTFTGLUE.h> UTFTGLUE myGLCD(0x1581a,A2,A1,A3,A4,A0); 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; // пробег до заправки на остатке топлива void setup() { Serial.begin(115200); myGLCD.InitLCD(3); myGLCD.clrScr(); } void loop() { curmillis = millis(); LCDDataPrint(); } void LCDDataPrint(){ if (curmillis - prevData > 50){ MAF++; RPM ++; EGRmg++; Speed++; PumpRPM++; TempAir++; Temp++; TempOil++; TempFuel++; myGLCD.setColor(255, 255, 255); //цвет текста //myGLCD.setBackColor(0,0,0); //затирание текста //myGLCD.setTextColor(0xFFFF, 0x0000); myGLCD.printNumI(Speed, 350, 7, 3); 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 ); myGLCD.printNumF(Fuel, 1, 210, 110,'.',5); 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(TempAir, 415, 215, 3); prevData = curmillis; // Serial.println(millis()); }}не мигает не тормозит , цифры меняются красиво
я нашел причину. шрифт сабака такая. закоментил и все гладко работает не мигает
кстати изза шрифта как раз и тормозит наверное
закоменти в сетапе и самом верху строчки связанные со шрифтом Gobold
да я выше написал. сабака бы его нюхала. все работает нужно ща доработать увеличить шрифт.я закоментил френад а помом по обибкам увидел шрифты. закоментил и все стало пучком . ща с шрифтом разберусь.....
залил вот это
#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 LCDDataPrint(); 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); } } void LCDDataPrint(){ if (curmillis - prevData > 100){ myGLCD.setColor(255, 255, 255); //цвет текста //myGLCD.setBackColor(0,0,0); //затирание текста //myGLCD.setTextColor(0xFFFF, 0x0000); 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 = curmillis; }}не мигает. но все данные по нулям. датапринт раскометировал
тогда так. Вернул обновление данных на экране только по получению данных от PCM. Убрал шрифт, потом с ним разберёшся. По идее все символы маленькие должны стать.
#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 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.print(F("Message fail timeout ")); Serial.println(millis()); #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); } }с твоим не выводится инфа на экран. только часы и дата. в лупе отсутствует . я добалил LCDDataPrint(); дало ошибку
ты читаешь вообще , что я пишу? Я же тебе объяснил, что обновление данных на экран запихал в момент, когда получаем данные PID 2101 от PCM. Данные идут в Serial ? если да , то и экран должен обновляться. Конечно LCDDataPrint(); дало ошибку. Эту функцию я удалил потому что.
в сериал то идут данные а на экране нету
все это очень странно. где опять засада. Вставь Serial.println ("YA V DATAVARS!!!") в начале в функции dataVars() . Чтоб посмотреть заходит ли туда программа
сек. да да провтыкал
блин вставь после скобки {
нет не заходит
а тебе не очем не говорит надпись Message fail timeout ? Блин это ппц
поправь значение 1563 строка 331 поставь 500 например.
извени со мной дети мои на работе. не внимательный. все внимание чтобы дети че не натворили.
ставил 300 400 500 все тотже тайм аут
так как скетч возрос, видимо не успевает он длинные сообщения за 200 мс принимать
даже на 1000 не помогает
А почему программный UART ? Может он не выдерживает задержки и теряется ?
но сегодня был какойто момент когда заработало но мигало...... ща гляну может найду
не нахожу . я вообще уже в них запутался какой когда был. по ходу который работал был мой когда я засомневался что не тот залил
что то опять тормозит процесс причём конкретно. поправил отладку 1563 чтоб узнать насколько тормозит. Залей и сделай лог. Пробуй также опять по очереди убирать из лупа menu(), строку с watch, строку с двоеточием.
Ок. Завтра утром
также вернул 1536 (блин как похоже 1563 1536 надо же ) . Попытался вернуть на тот момент когда связь была, только шрифт закоментил.
Так какой проверить 1536 или 1563?
MaksVV почему програмный порт для связи с железкой ???
Это вопрос к иаксу, он спец программист.
вопрос не ко мне))) ТС выбрал софт сериал. Но траблы совсем не из за этого.
проверь оба
Я не вкуривал что за железки используются как тач и дисплей, но если в их библиотеках есть работа с прерваниями, то софтовый сериал так и будет себя вести на длинных посылках ...
у меня байты каждый проход лупа из буфера считываются. Соотвественно глубоко пофиг, что посылка длинная.
Просто я сам же сделал таймер на миллис на случай сбоев, чтоб не зависало - если байты перестают поступать посередине сообщения, то оно сбрасывается, и начинается читалка по новой. И вот после добавления экрана этот таймер начал срабатывать.
viki13viki ,ну если есть возможность , перебрось на хард сериал К-лайник PCM. По идее да, стабильнее он работать должен.
Нет возможности. Если таки припечет то разберу панель и перекину.
Так и будете стучаться головой о сетенку. С железом должна общаться железка.
У меня два года прежний скетчь работал, и нчего. Не бился головой. Потом будет видно, может и перекину
суть проблемы тут явно не в софтсериале. Обычно софт нельзя применять на больших скоростях. А у нас 10400.
У меня уже попкорн кончился от Вашего кино с конями ...
Вы представляете сколько времени Ваш скетч находится внутри софтсериала ?
Попробуте в исходниках SoftwareSerial.h изменить #define _SS_MAX_RX_BUFF 64 на #define _SS_MAX_RX_BUFF 81 (или вместо 81 - сколько байт посылает ЕБУ в одном ответе) и перекомпилировать проект.
(По умолчанию буфер у SoftwareSerial 64 байта и он явно переполняется, а Вы чуть чуть не успеваете их забирать ...)
мы это уже проходили. Это нужно было делать в первой версии скетча, когда использовался delay195, то есть мы дожидались от ЭБУ ВСЕХ байт сообщения , которые накапливались в буфере софтсериала, и т.к. это больше 64, то увеличивали буфер. Т.е. сообщение принималось в одной итерации лупа. Сейчас же я уже написал вам, что буфер опустошается СРАЗУ после поступления в него байт сообщения. Т.е. сообщение принимается за много проходов лупа. Поэтому он не заполняется и на 10%. Проблема в том, что для надёжности я ввел таймер, который через определённый таймаут сбрасывает приём конкретного сообщения, если байты прекратили поступать. а прекратить они могли поступать, если в лупе что-то другое подвисает. И похер хард тут или софт Сериал.
Если такой таймер не ввести и поступление байт по той или иной причине прекратится, когда сообщение ещё полностью не принято, то байты уже следующего сообщения будут интерпретироваться как последние недостающие байты текущего принимаемого сообения и мы так никогда в итоге не найдём больше начальную шапку последующих сообщений. Будет дальнейший сбой приёма.
Если нужно, через час буду на работе, проверю два скетча которые ты упомянул выше, и могу скинуть старый скетчь чтобы ты глянул, может че увидешь...
ок
по хорошему нужно отдельную дуню на приём данных из К-лайн, которой в лупе ничего другого не будет мешать и уже она тоже по Сериал (или ещё как) будет передавать данные ардуине, отвечающей за всё остальное, датчики t , экран и т.д.
Потому что все эти библиотеки периферии гавно полное.
1536 работает, отображает на экране, без тача. отчет
Send request INIT to PCM 5051 Receive PCM: 83 F1 11 C1 6B 8F 40 Received message is OK! Checksum is correct! 5131 Initialization OK!!!! Send request PID_2101 to PCM 5201 Send request PID_2101 to PCM 5803 Send request PID_2101 to PCM 6404 Receive PCM: 80 21 PCM Message fail address Receive PCM: AA 00 PCM Message fail address Receive PCM: E5 00 PCM Message fail address Receive PCM: C8 03 PCM Message fail address Receive PCM: 9F 04 PCM Message fail address Receive PCM: E5 62 PCM Message fail address Receive PCM: E6 00 PCM Message fail address Receive PCM: CE 00 PCM Message fail address Receive PCM: A0 00 PCM Message fail address Receive PCM: 90 00 PCM Message fail address Receive PCM: A9 08 PCM Message fail address Receive PCM: 8D 0C PCM Message fail address Receive PCM: 9F 00 PCM Message fail address Send request PID_2101 to PCM 7005 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 73 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E6 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7C 03 9F 00 02 39 Received message is OK! Checksum is correct! 7227 Receive PCM DATAstream Send request PID_2101 to PCM 7566 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 73 00 00 00 00 04 36 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7C 03 9F 00 02 34 Received message is OK! Checksum is correct! 7774 Receive PCM DATAstream Send request PID_2101 to PCM 8113 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 73 00 00 00 00 04 36 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CE 00 00 0D 33 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8D 0C 7C 03 9F 00 02 30 Received message is OK! Checksum is correct! 8326 Receive PCM DATAstream Send request PID_2101 to PCM 8665 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 73 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CE 00 00 0D 33 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8D 0C 7D 03 9F 00 02 34 Received message is OK! Checksum is correct! 8881 Receive PCM DATAstream Send request PID_2101 to PCM 9220 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 73 00 00 00 00 04 36 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CE 00 00 0D 33 A0 00 01 90 00 00 AD 08 01 20 00 00 01 8D 0C 7D 03 9F 00 02 35 Received message is OK! Checksum is correct! 9492 Receive PCM DATAstream Send request PID_2101 to PCM 9831 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 73 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8D 0C 7D 03 9F 00 02 37 Received message is OK! Checksum is correct! 10033 Receive PCM DATAstream Send request PID_2101 to PCM 10372 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 69 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7D 03 9F 00 02 35 Received message is OK! Checksum is correct! 10582 Receive PCM DATAstream Send request PID_2101 to PCM 10920 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 73 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7C 03 9F 00 02 35 Received message is OK! Checksum is correct! 11140 Receive PCM DATAstream Send request PID_2101 to PCM 11479 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 73 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7C 03 9F 00 02 34 Received message is OK! Checksum is correct! 11693 Receive PCM DATAstream Send request PID_2101 to PCM 12033 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 73 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E6 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7D 03 9F 00 02 3A Received message is OK! Checksum is correct! 12324 Receive PCM DATAstream Send request PID_2101 to PCM 12663 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E1 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 AD 08 01 20 00 00 01 8E 0C 7D 03 9F 00 02 38 Received message is OK! Checksum is correct! 12881 Receive PCM DATAstream Send request PID_2101 to PCM 13220 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 73 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CE 00 00 0D 33 A0 00 01 90 00 00 AD 08 01 20 00 00 01 8D 0C 7D 03 9F 00 02 36 Received message is OK! Checksum is correct! 13436 Receive PCM DATAstream Send request PID_2101 to PCM 13776 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8D 0C 7D 03 9F 00 02 32 Received message is OK! Checksum is correct! 13992 Receive PCM DATAstream Send request PID_2101 to PCM 14331 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 69 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7F 03 9F 00 02 37 Received message is OK! Checksum is correct! 14545 Receive PCM DATAstream Send request PID_2101 to PCM 14885 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 69 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 AD 08 01 20 00 00 01 8E 0C 7F 03 9E 00 02 38 Received message is OK! Checksum is correct! 15102 Receive PCM DATAstream Send request PID_2101 to PCM 15442 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 69 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7D 03 9F 00 02 35 Received message is OK! Checksum is correct! 15718 Receive PCM DATAstream Send request PID_2101 to PCM 16057 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7F 03 9F 00 02 37 Received message is OK! Checksum is correct! 16270 Receive PCM DATAstream Send request PID_2101 to PCM 16610 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 69 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7F 03 9F 00 02 37 Received message is OK! Checksum is correct! 16823 Receive PCM DATAstream Send request PID_2101 to PCM 17163 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 67 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E6 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7F 03 9F 00 02 39 Received message is OK! Checksum is correct! 17380 Receive PCM DATAstream Send request PID_2101 to PCM 17720 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 69 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7F 03 9F 00 02 37 Received message is OK! Checksum is correct! 17932 Receive PCM DATAstream Send request PID_2101 to PCM 18272 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 00 00 0D 69 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7F 03 9F 00 02 39 Received message is OK! Checksum is correct! 18574 Receive PCM DATAstream Send request PID_2101 to PCM 18913 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7F 03 9F 00 02 33 Received message is OK! Checksum is correct! 19123 Receive PCM DATAstream Send request PID_2101 to PCM 19463 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CF 00 00 0D 35 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 7F 03 9F 00 02 33 Received message is OK! Checksum is correct! 19676 Receive PCM DATAstream Send request PID_2101 to PCM 20016 Send request PID_2101 to PCM 20617 Send request PID_2101 to PCM 21218 Send request PID_2101 to PCM 21819 Send request PID_2101 to PCM 22420 Send request PID_2101 to PCM 23021 Send request INIT to PCM 28072 Receive PCM: 83 F1 11 C1 6B 8F 40 Received message is OK! Checksum is correct! 28193 Initialization OK!!!! Send request PID_2101 to PCM 28264 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 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 0B E2 00 00 00 00 08 CF 00 00 0D 38 A0 00 01 90 00 00 AD 08 01 20 00 00 01 8E 0C 7F 03 9F 00 02 39 Received message is OK! Checksum is correct! 28467 Receive PCM DATAstream Send request PID_2101 to PCM 28807 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 00 00 02 72 00 00 00 00 04 36 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CF 00 00 0D 38 A0 00 01 90 00 00 AD 08 01 20 00 00 01 8E 0C 7F 03 9F 00 02 39 Received message is OK! Checksum is correct! 29024 Receive PCM DATAstream Send request PID_2101 to PCM 29364 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CF 00 00 0D 38 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 80 03 9F 00 02 37 Received message is OK! Checksum is correct! 29578 Receive PCM DATAstream Send request PID_2101 to PCM 29918 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CF 00 00 0D 38 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 80 03 9F 00 02 37 Received message is OK! Checksum is correct! 30133 Receive PCM DATAstream Send request PID_2101 to PCM 30473 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 69 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 38 A0 00 01 90 00 00 AD 08 01 20 00 00 01 8E 0C 81 03 9F 00 02 40 Received message is OK! Checksum is correct! 30686 Receive PCM DATAstream Send request PID_2101 to PCM 31025 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E2 00 00 00 00 08 CF 00 00 0D 38 A0 00 01 90 00 00 A9 08 01 20 00 00 01 8E 0C 81 03 9F 00 02 38 Received message is OK! Checksum is correct! 31362 Receive PCM DATAstream Send request PID_2101 to PCM 31702 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 00 00 02 72 00 00 00 00 04 36 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 0B E4 00 00 00 00 08 CF 00 00 0D 38 A0 00 01 90 00 00 AD 08 01 20 00 00 01 8E 0C 80 03 9F 00 02 3C Received message is OK! Checksum is correct! 31915 Receive PCM DATAstream Send request PID_2101 to PCM 32254 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 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 0B E4 00 00 00 00 08 CF 00 00 0D 38 A0 00 01 90 00 00 AD 08 01 20 00 00 01 8E 0C 81 03 9F 00 02 3D Received message is OK! Checksum is correct! 32470 Receive PCM DATAstream Send request PID_2101 to PCM 32809 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 00 0D 67 00 00 02 12 00 00 7F FF 04 33 00 00 00 9C 32 C8 03 9F 04 29 03 20 16 38 00 00 00 00 0B C2 0B 45 0A FC 09 38 00 57 0D 35 A0 00 01 90 19 64 A9 08 01 20 00 00 01 AE 0C 81 03 9F 00 02 86 Received message is OK! Checksum is correct! 33026 Receive PCM DATAstream Send request PID_2101 to PCM 33366 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 00 E9 0D 67 00 00 02 52 00 00 11 EA 04 21 00 00 03 79 0A A8 03 9F 04 29 03 20 E8 C1 00 00 00 00 0B DD 01 4A 01 51 08 D1 01 C1 0D 38 A0 00 00 64 00 00 A9 08 01 20 13 9E 01 91 0C 7A 03 9F 00 02 58 Received message is OK! Checksum is correct! 33583 Receive PCM DATAstream Send request PID_2101 to PCM 33923 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 01 6F 0D 67 00 00 02 58 00 00 11 C0 04 29 00 00 03 1A 0B 15 03 9F 04 2C 03 20 EE 1B 00 00 00 00 0B D7 02 A6 02 BB 08 F8 01 8B 0D 38 A0 00 00 64 02 45 AD 08 01 30 19 64 01 9F 0C 72 03 9F 00 02 15 Received message is OK! Checksum is correct! 34212 Receive PCM DATAstream Send request PID_2101 to PCM 34552 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 01 84 0D 66 00 00 02 5A 00 00 11 5A 04 2A 00 00 03 21 0B 09 03 9F 04 2B 03 20 EC E9 00 00 00 00 0B DC 02 56 02 81 08 F3 01 90 0D 38 A0 00 00 64 01 A7 A9 08 01 30 19 64 01 9D 0C 6B 03 9F 00 02 5D Received message is OK! Checksum is correct! 34753 Receive PCM DATAstream Send request PID_2101 to PCM 35093 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 01 8A 0D 67 00 00 02 5C 00 00 11 9E 04 2D 00 00 03 20 0B 0E 03 9F 04 2B 03 20 ED 0E 00 00 00 00 0B D7 02 81 02 7E 08 F3 01 90 0D 38 A0 00 00 64 01 A1 A9 08 01 30 19 64 01 9D 0C 65 03 9F 00 02 EE Received message is OK! Checksum is correct! 35304 Receive PCM DATAstream Send request PID_2101 to PCM 35644 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 01 87 0D 67 00 00 02 5C 00 00 11 65 04 30 00 00 03 1F 0B 14 03 9F 04 2C 03 20 ED 3D 00 00 00 00 0B DA 02 82 02 91 08 F5 01 8F 0D 38 A0 00 00 64 01 D5 A9 08 01 30 19 64 01 9E 0C 61 03 9F 00 02 31 Received message is OK! Checksum is correct! 35858 Receive PCM DATAstream Send request PID_2101 to PCM 36198 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 01 88 0D 67 00 00 02 62 00 00 11 12 04 2D 00 00 03 1B 0B 34 03 9F 04 2D 03 20 ED F1 00 00 00 00 0B DF 02 A4 02 B3 08 F7 01 8E 0D 38 A0 00 00 64 02 3B A9 08 01 30 19 64 01 9F 0C 5E 03 9F 00 02 64 Received message is OK! Checksum is correct! 36411 Receive PCM DATAstream Send request PID_2101 to PCM 36751 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 01 80 0D 67 00 00 02 67 00 00 11 51 04 2D 00 00 03 1C 0B 51 03 9F 04 2D 03 20 EF 13 00 00 00 00 0B DF 03 1B 02 E6 08 FA 01 8D 0D 38 A0 00 00 64 02 A9 A9 08 01 30 19 64 01 A0 0C 59 03 9F 00 02 F9 Received message is OK! Checksum is correct! 36960 Receive PCM DATAstream Send request PID_2101 to PCM 37300 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 01 7B 0D 67 00 00 02 6D 00 00 10 DD 04 30 00 00 03 1E 0B 60 03 9F 04 2E 03 20 EF A1 00 00 00 00 0B DD 03 37 03 00 08 FC 01 8E 0D 38 A0 00 00 64 03 2A A9 08 01 30 19 64 01 A1 0C 57 03 9F 00 02 E1 Received message is OK! Checksum is correct! 37571 Receive PCM DATAstream Send request PID_2101 to PCM 37911 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 01 79 0D 67 00 00 02 75 00 00 11 17 04 30 00 00 03 1E 0B 71 03 9F 04 2F 03 20 F0 50 00 00 00 00 0B E2 03 65 03 27 08 FE 01 8F 0D 38 A0 00 00 64 03 8F AD 08 01 30 19 64 01 A2 0C 52 03 9F 00 02 A6 Received message is OK! Checksum is correct! 38128 Receive PCM DATAstream Send request PID_2101 to PCM 38468 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E5 01 74 0D 67 00 00 02 7E 00 00 11 17 04 30 00 00 03 1C 0B 93 03 9F 04 30 03 20 F1 B6 00 00 00 00 0B E6 03 B3 03 6C 09 02 01 8F 0D 35 A0 00 00 64 04 56 A9 08 01 30 19 64 01 A3 0C 51 03 9F 00 02 8F Received message is OK! Checksum is correct! 38684 Receive PCM DATAstream Send request PID_2101 to PCM 39024 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 01 77 0D 67 00 00 02 8C 00 00 11 27 04 32 00 00 03 1B 0B BA 03 9F 04 31 03 20 F3 42 00 00 00 00 0B E9 03 83 03 B5 09 06 01 8D 0D 35 A0 00 00 64 05 35 A9 08 01 30 19 63 01 A5 0C 4E 03 9F 00 02 61 Received message is OK! Checksum is correct! 39239 Receive PCM DATAstream Send request PID_2101 to PCM 39579 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E1 01 7B 0D 67 00 00 02 97 00 00 11 39 04 2D 00 00 03 27 0B A1 03 9F 04 30 03 20 F1 D6 00 00 00 00 0B EC 03 2D 03 70 09 01 01 93 0D 35 A0 00 00 64 04 74 AD 08 01 30 19 64 01 A3 0C 4D 03 9F 00 02 A8 Received message is OK! Checksum is correct! 39792 Receive PCM DATAstream Send request PID_2101 to PCM 40132 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E3 01 75 0D 67 00 00 02 9A 00 00 11 0C 04 2D 00 00 03 1F 0B A5 03 9F 04 31 03 20 F2 45 00 00 00 00 0B EE 03 57 03 75 09 01 01 8F 0D 33 A0 00 00 64 04 83 A9 08 01 30 19 64 01 A4 0C 4B 03 9F 00 02 1C Received message is OK! Checksum is correct! 40430 Receive PCM DATAstream Send request PID_2101 to PCM 40770 Send request PID_2101 to PCM 41371 Receive PCM: 80 21 PCM Message fail address Receive PCM: AA 00 PCM Message fail address Receive PCM: E3 01 PCM Message fail address Receive PCM: 9C 00 PCM Message fail address Receive PCM: 81 03 PCM Message fail address Receive PCM: 9F 04 PCM Message fail address Receive PCM: F0 D4 PCM Message fail address Receive PCM: EC 02 PCM Message fail address Receive PCM: EF 03 PCM Message fail address Receive PCM: FD 01 PCM Message fail address Receive PCM: 90 0D PCM Message fail address Receive PCM: A0 00 PCM Message fail address Receive PCM: E1 A9 PCM Message fail address Receive PCM: A2 0C PCM Message fail address Receive PCM: 9F 00 PCM Message fail address Send request PID_2101 to PCM 41972 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D E1 01 77 0D 69 00 00 02 9C 00 00 11 64 04 30 00 00 03 21 0B 83 03 9E 04 2F 03 20 F0 EE 00 00 00 00 0B EB 02 FC 03 44 09 00 01 90 0D 33 A0 00 00 64 03 F0 A9 08 01 30 19 62 01 A2 0C 47 03 9F 00 02 D3 Received message is OK! Checksum is correct! 42187 Receive PCM DATAstream Send request PID_2101 to PCM 42527 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D DF 01 7E 0D 69 00 00 02 9B 00 00 11 3F 04 2D 00 00 03 22 0B 70 03 9F 04 2F 03 20 F0 4A 00 00 00 00 0B EC 02 E1 03 25 08 FC 01 91 0D 33 A0 00 00 64 03 93 A9 08 01 30 19 61 01 A0 0C 45 03 9E 00 02 5A Received message is OK! Checksum is correct! 42742 Receive PCM DATAstream Send request PID_2101 to PCM 43082 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D DF 01 7E 0D 6B 00 00 02 9C 00 00 11 6E 04 2C 00 00 03 21 0B 72 03 9F 04 2F 03 20 F0 45 00 00 00 00 0B EC 03 05 03 24 08 FC 01 90 0D 33 A0 00 01 DC 03 6C AD 08 01 30 19 5F 01 A1 0C 44 03 9F 00 02 FF Received message is OK! Checksum is correct! 43294 Receive PCM DATAstream Send request PID_2101 to PCM 43634 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D DE 01 77 0D 6B 00 00 02 9D 00 00 11 11 04 2C 00 00 03 20 0B 64 03 9F 04 2E 03 20 EF D1 00 00 00 00 0B EE 02 F5 03 0E 08 F9 01 90 0D 30 A0 00 05 AD 03 4E A9 08 01 30 19 5C 01 A0 0C 44 03 9F 00 02 9A Received message is OK! Checksum is correct! 43908 Receive PCM DATAstream Send request PID_2101 to PCM 44248 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D DE 01 79 0D 6B 00 00 02 9C 00 00 0F AA 04 33 00 00 03 20 0B 5F 03 9F 04 2E 03 20 EF 9C 00 00 00 00 0B E9 02 F3 03 04 08 F8 01 8F 0D 2E A0 00 09 C9 03 30 A9 08 01 30 19 55 01 9F 0C 41 03 9F 00 02 E1 Received message is OK! Checksum is correct! 44463 Receive PCM DATAstream Send request PID_2101 to PCM 44803 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D DC 01 77 0D 6E 00 00 02 9F 00 00 0C 96 04 30 00 00 03 1F 0B 5B 03 9F 04 2E 03 20 EF 87 00 00 00 00 0B F0 02 F1 03 00 08 F9 01 8F 0D 2E A0 00 09 B5 03 21 AD 08 01 30 19 49 01 A0 0C 44 03 9F 00 02 8A Received message is OK! Checksum is correct! 45016 Receive PCM DATAstream Send request PID_2101 to PCM 45356 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D DC 01 78 0D 6E 00 00 02 9F 00 00 0C 20 04 30 00 00 03 20 0B 55 03 9E 04 2E 03 20 EF 3D 00 00 00 00 0C 30 03 2D 02 F2 08 F8 01 8F 0D 2B A0 00 0A 04 03 15 A9 08 01 30 19 49 01 9F 0C 45 03 9F 00 02 70 Received message is OK! Checksum is correct! 45570 Receive PCM DATAstream Send request PID_2101 to PCM 45910 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D DC 01 76 0D 6C 00 00 02 A1 00 00 0B B4 04 30 00 00 03 20 0B 53 03 9F 04 2D 03 20 EF 23 00 00 00 00 0C 2D 03 2D 02 ED 08 F6 01 90 0D 2B A0 00 0A 19 02 EB A9 08 01 30 19 41 01 9E 0C 47 03 9F 00 02 BF Received message is OK! Checksum is correct! 46118 Receive PCM DATAstream Send request PID_2101 to PCM 46458 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D DA 01 76 0D 6E 00 00 02 A1 00 00 0B 30 04 30 00 00 03 1F 0B 54 03 9F 04 2E 03 20 EF 33 00 00 00 00 0C 2D 03 29 02 F6 08 F8 01 8F 0D 2B A0 00 0A 21 03 0C A9 08 01 30 19 40 01 9F 0C 47 03 9F 00 02 7C Received message is OK! Checksum is correct! 46754 Receive PCM DATAstream Send request PID_2101 to PCM 47094 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D DA 01 75 0D 6E 00 00 02 A3 00 00 0B 37 04 30 00 00 03 20 0B 4D 03 9F 04 2D 03 20 EE FE 00 00 00 00 0C 30 03 2C 02 E6 08 F5 01 8F 0D 26 A0 00 0A 21 02 D3 A9 08 01 30 19 3B 01 9E 0C 48 03 9F 00 02 F6 Received message is OK! Checksum is correct! 47305 Receive PCM DATAstream Send request PID_2101 to PCM 47645 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D8 01 79 0D 6E 00 00 02 A2 00 00 0B 4C 04 32 00 00 03 21 0B 4E 03 9F 04 2D 03 20 EE FE 00 00 00 00 0C 2E 03 13 02 E5 08 F4 01 90 0D 26 A0 00 0A 11 02 DF A9 08 01 30 19 3C 01 9E 0C 48 03 9F 00 02 F1 Received message is OK! Checksum is correct! 47860 Receive PCM DATAstream Send request PID_2101 to PCM 48200 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D8 01 7F 0D 6F 00 00 02 A1 00 00 0B 5A 04 30 00 00 03 20 0B 4D 03 9F 04 2D 03 20 EE F8 00 00 00 00 0C 2E 03 13 02 E5 08 F4 01 90 0D 26 A0 00 0A 12 02 D3 A9 08 01 30 19 38 01 9D 0C 48 03 9F 00 02 EB Received message is OK! Checksum is correct! 48412 Receive PCM DATAstream Send request PID_2101 to PCM 48752 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D6 01 80 0D 6F 04 12 02 A1 00 00 0B 64 04 30 00 00 03 20 11 2F 03 9F 04 50 03 20 F6 4F 00 00 00 00 0C 32 05 6E 07 DC 09 88 01 91 0D 26 A0 00 05 D0 19 64 AC 08 01 30 19 64 01 E0 0C 48 03 9F 00 02 3A Received message is OK! Checksum is correct! 48967 Receive PCM DATAstream Send request PID_2101 to PCM 49307 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D8 01 D1 0D 6E 10 7F 02 A4 00 00 0E F9 04 10 00 00 06 5A 14 62 03 9F 05 15 03 20 07 BE 00 00 00 00 0C 30 08 0E 08 50 09 A7 03 12 0D 24 A0 00 00 7A 19 64 A8 08 01 30 19 64 01 EC 0C 45 03 9F 00 02 99 Received message is OK! Checksum is correct! 49508 Receive PCM DATAstream Send request PID_2101 to PCM 49848 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D8 01 E7 0D 6F 00 00 02 A8 00 00 0E F0 04 4B 00 00 06 3B 0A A1 03 9F 04 59 03 20 E5 54 00 00 00 00 0C 30 00 00 00 00 08 E1 02 F1 0D 24 A0 00 09 D1 00 00 A9 08 01 30 19 64 01 99 0C 41 03 9F 00 02 5A Received message is OK! Checksum is correct! 50125 Receive PCM DATAstream Send request PID_2101 to PCM 50465 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D6 01 4F 0D 74 00 00 02 A5 00 00 0B C6 04 44 00 00 03 CF 0A B3 03 9F 04 29 03 20 E8 CF 00 00 00 00 0B EC 01 79 01 73 08 C5 01 D4 0D 24 A0 00 0A D2 00 00 AD 08 01 30 19 64 01 86 0C 40 03 9F 00 02 E0 Received message is OK! Checksum is correct! 50668 Receive PCM DATAstream Send request PID_2101 to PCM 51008 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 96 0D 72 00 00 02 A3 00 00 0A C4 04 36 00 00 03 1E 0B 30 03 9F 04 2C 03 20 ED CC 00 00 00 00 0B F0 02 D0 03 0E 08 F8 01 89 0D 21 A0 00 0A 9A 03 15 A9 08 01 30 19 64 01 9F 0C 40 03 9F 00 02 B6 Received message is OK! Checksum is correct! 51226 Receive PCM DATAstream Send request PID_2101 to PCM 51566 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 83 0D 72 00 00 02 A4 00 00 0A 6A 04 32 00 00 03 23 0B 38 03 9F 04 2D 03 20 EE 20 00 00 00 00 0B F0 02 F0 02 BC 08 F0 01 92 0D 21 A0 00 0A 47 02 58 A9 08 01 30 19 64 01 9D 0C 41 03 9F 00 02 65 Received message is OK! Checksum is correct! 51779 Receive PCM DATAstream Send request PID_2101 to PCM 52119 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 81 0D 72 00 00 02 A5 00 00 0A 90 04 30 00 00 03 20 0B 44 03 9F 04 2D 03 20 EE B4 00 00 00 00 0B EE 03 13 02 D8 08 F1 01 90 0D 1F A0 00 09 DC 02 AC A9 08 01 30 19 64 01 9C 0C 43 03 9F 00 02 49 Received message is OK! Checksum is correct! 52334 Receive PCM DATAstream Send request PID_2101 to PCM 52674 Send request PID_2101 to PCM 53275 Receive PCM: 80 21 PCM Message fail address Receive PCM: AA 00 PCM Message fail address Receive PCM: D3 01 PCM Message fail address Receive PCM: 88 0D PCM Message fail address Receive PCM: A5 00 PCM Message fail address Receive PCM: 9F 04 PCM Message fail address Receive PCM: EE 6F PCM Message fail address Receive PCM: D8 08 PCM Message fail address Receive PCM: F0 01 PCM Message fail address Receive PCM: 90 0D PCM Message fail address Receive PCM: A0 00 PCM Message fail address Receive PCM: B5 02 PCM Message fail address Receive PCM: B9 A9 PCM Message fail address Receive PCM: 9C 0C PCM Message fail address Receive PCM: 9F 00 PCM Message fail address Receive PCM: CE Message fail timeout Send request PID_2101 to PCM 53876 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 88 0D 75 00 00 02 A5 00 00 0A F1 04 30 00 00 03 1F 0B 3D 03 9F 04 2D 03 20 EE 75 00 00 00 00 0C 32 03 08 02 D5 08 F1 01 90 0D 1C A0 00 09 A2 02 A0 A9 08 01 30 19 5A 01 9C 0C 45 03 9F 00 02 51 Received message is OK! Checksum is correct! 54095 Receive PCM DATAstream Send request PID_2101 to PCM 54435 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 87 0D 75 00 00 02 A5 00 00 0B 60 04 30 00 00 03 20 0B 36 03 9F 04 2D 03 20 EE 65 00 00 00 00 0C 2E 02 FA 02 C9 08 EE 01 90 0D 1C A0 00 09 B0 02 7F AD 08 01 30 19 57 01 9C 0C 45 03 9F 00 02 76 Received message is OK! Checksum is correct! 54650 Receive PCM DATAstream Send request PID_2101 to PCM 54990 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 88 0D 74 00 00 02 A3 00 00 0B 8E 04 2C 00 00 03 20 0B 42 03 9F 04 2D 03 20 EE 9F 00 00 00 00 0C 32 02 FB 02 CD 08 F0 01 90 0D 1C A0 00 09 D4 02 8B A9 08 01 30 19 54 01 9C 0C 45 03 9F 00 02 18 Received message is OK! Checksum is correct! 55198 Receive PCM DATAstream Send request PID_2101 to PCM 55538 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 8D 0D 77 00 00 02 A3 00 00 0B 3E 04 2D 00 00 03 1F 0B 3E 03 9F 04 2D 03 20 EE 84 00 00 00 00 0C 2D 02 BD 02 CF 08 F0 01 8F 0D 1A A0 00 09 D7 02 B3 A9 08 01 30 19 4F 01 9C 0C 45 03 9F 00 02 93 Received message is OK! Checksum is correct! 55753 Receive PCM DATAstream Send request PID_2101 to PCM 56093 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 88 0D 77 00 00 02 A3 00 00 0B 2C 04 2C 00 00 03 21 0B 3C 03 9F 04 2D 03 20 EE 75 00 00 00 00 0C 2E 02 B7 02 CC 08 EF 01 90 0D 17 A0 00 09 D2 02 88 AD 08 01 30 19 47 01 9B 0C 47 03 9F 00 02 2E Received message is OK! Checksum is correct! 56367 Receive PCM DATAstream Send request PID_2101 to PCM 56707 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D CF 01 89 0D 77 00 00 02 A5 00 00 0B 3E 04 2D 00 00 03 1F 0B 40 03 9F 04 2D 03 20 EE 8F 00 00 00 00 0C 32 02 BE 02 D2 08 F0 01 8F 0D 17 A0 00 09 E3 02 94 A9 08 01 30 19 4A 01 9C 0C 45 03 9F 00 02 88 Received message is OK! Checksum is correct! 56920 Receive PCM DATAstream Send request PID_2101 to PCM 57260 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 8D 0D 78 00 00 02 A5 00 00 0B 29 04 2C 00 00 03 1F 0B 3D 03 9F 04 2D 03 20 EE 7A 00 00 00 00 0C 30 02 C5 02 D3 08 F0 01 8F 0D 17 A0 00 09 E0 02 A7 A9 08 01 30 19 51 01 9C 0C 47 03 9F 00 02 80 Received message is OK! Checksum is correct! 57474 Receive PCM DATAstream Send request PID_2101 to PCM 57814 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 8F 0D 7A 00 00 02 A4 00 00 0B 5A 04 2D 00 00 03 20 0B 3D 03 9F 04 2D 03 20 EE 7A 00 00 00 00 0C 30 03 0D 02 CD 08 EF 01 90 0D 17 A0 00 09 E8 02 8B AD 08 01 30 19 4A 01 9B 0C 47 03 9F 00 02 E1 Received message is OK! Checksum is correct! 58031 Receive PCM DATAstream Send request PID_2101 to PCM 58371 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 88 0D 7B 00 00 02 A4 00 00 0B 37 04 30 00 00 03 1F 0B 3E 03 9F 04 2D 03 20 EE 7F 00 00 00 00 0C 30 03 11 02 CE 08 EF 01 8F 0D 15 A0 00 09 F1 02 8B A9 08 01 30 19 40 01 9B 0C 47 03 9E 00 02 BE Received message is OK! Checksum is correct! 58584 Receive PCM DATAstream Send request PID_2101 to PCM 58924 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 9F 0D 7A 0B 61 02 A3 00 00 0D 98 04 27 00 00 03 70 16 CF 03 9F 04 80 03 20 FB E3 00 00 00 00 0B EC 05 32 07 A6 09 69 01 CF 0D 15 A0 00 04 AF 19 64 A8 08 01 30 19 64 01 D2 0C 47 03 9F 00 02 C2 Received message is OK! Checksum is correct! 59215 Receive PCM DATAstream Send request PID_2101 to PCM 59555 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 E2 0D 7B 01 C0 02 A7 00 00 10 59 04 11 00 00 06 97 0A B4 03 9F 04 67 03 20 E6 F0 00 00 00 00 0C 30 01 28 01 25 09 31 03 57 0D 15 A0 00 09 C4 00 00 A9 08 01 30 19 64 01 BB 0C 41 03 9F 00 02 74 Received message is OK! Checksum is correct! 59772 Receive PCM DATAstream Send request PID_2101 to PCM 60112 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 A5 0D 7B 04 DC 02 A7 00 00 0B 45 04 3A 00 00 05 F4 0C 63 03 9F 04 75 03 20 EE FB 00 00 00 00 0C 30 02 D8 03 B7 09 41 03 0E 0D 12 A0 00 09 35 05 58 A8 08 01 30 19 64 01 BD 0C 3E 03 9E 00 02 66 Received message is OK! Checksum is correct! 60324 Receive PCM DATAstream Send request PID_2101 to PCM 60664 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 BD 0D 7D 00 00 02 A9 00 00 0C C3 04 3C 00 00 04 9B 0A 9E 03 9F 04 34 03 20 E5 CE 00 00 00 00 0C 32 00 65 00 66 08 CD 02 63 0D 12 A0 00 0A 80 00 00 A9 08 01 30 19 64 01 89 0C 3D 03 9F 00 02 5F Received message is OK! Checksum is correct! 60879 Receive PCM DATAstream Send request PID_2101 to PCM 61219 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 68 0D 7B 00 00 02 A6 00 00 0B 0C 04 39 00 00 03 64 0A EE 03 9F 04 2A 03 20 EA D9 00 00 00 00 0C 30 01 C4 02 10 08 D4 01 AF 0D 12 A0 00 0A 9C 00 54 A9 08 01 30 19 64 01 8F 0C 3D 03 9F 00 02 3A Received message is OK! Checksum is correct! 61432 Receive PCM DATAstream Send request PID_2101 to PCM 61772 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 90 0D 7F 00 00 02 A6 00 00 0A 93 04 37 00 00 03 1B 0B 66 03 9F 04 2E 03 20 EF 92 00 00 00 00 0C 30 02 F7 03 00 08 F2 01 8B 0D 12 A0 00 0A 67 02 DC AD 08 01 30 19 64 01 9C 0C 3E 03 9F 00 02 62 Received message is OK! Checksum is correct! 61982 Receive PCM DATAstream Send request PID_2101 to PCM 62322 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 97 0D 7D 00 00 02 A4 00 00 0A A2 04 30 00 00 03 1F 0B 44 03 9F 04 2D 03 20 EE 84 00 00 00 00 0C 2E 02 C3 02 D1 08 EE 01 8F 0D 12 A0 00 0A 1C 02 92 A9 08 01 30 19 5D 01 9A 0C 3E 03 9F 00 02 37 Received message is OK! Checksum is correct! 62596 Receive PCM DATAstream Send request PID_2101 to PCM 62936 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 93 0D 7F 00 00 02 A4 00 00 0A EE 04 30 00 00 03 20 0B 3B 03 9F 04 2D 03 20 EE 4A 00 00 00 00 0B F0 02 BA 02 CB 08 EC 01 91 0D 12 A0 00 09 E9 02 85 A9 08 01 30 19 54 01 9B 0C 40 03 9F 00 02 AA Received message is OK! Checksum is correct! 63149 Receive PCM DATAstream Send request PID_2101 to PCM 63489 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 95 0D 7F 00 00 02 A4 00 00 0A EE 04 30 00 00 03 21 0B 3A 03 9F 04 2D 03 20 EE 4A 00 00 00 00 0C 32 02 B4 02 C7 08 EC 01 91 0D 10 A0 00 09 C1 02 79 AD 08 01 30 19 57 01 99 0C 41 03 9F 00 02 B5 Received message is OK! Checksum is correct! 63702 Receive PCM DATAstream Send request PID_2101 to PCM 64041 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 96 0D 7F 00 00 02 A4 00 00 0B 4F 04 2C 00 00 03 20 0B 3F 03 9F 04 2D 03 20 EE 7A 00 00 00 00 0C 2E 03 19 02 CE 08 EC 01 90 0D 0D A0 00 09 CB 02 88 A9 08 01 30 19 4C 01 9A 0C 41 03 9F 00 02 B8 Received message is OK! Checksum is correct! 64256 Receive PCM DATAstream Send request PID_2101 to PCM 64595 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 91 0D 80 00 00 02 A5 00 00 0B 0D 04 2D 00 00 03 20 0B 39 03 9F 04 2D 03 20 EE 4A 00 00 00 00 0C 30 03 10 02 C5 08 EB 01 90 0D 0D A0 00 09 C1 02 73 A9 08 01 30 19 4B 01 99 0C 43 03 9F 00 02 0E Received message is OK! Checksum is correct! 64811 Receive PCM DATAstream Send request PID_2101 to PCM 65150 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 91 0D 80 00 00 02 A6 00 00 0B 0D 04 2D 00 00 03 21 0B 3B 03 9F 04 2D 03 20 EE 65 00 00 00 00 0C 30 02 90 02 BB 08 E9 01 91 0D 0B A0 00 09 B0 02 49 A9 08 01 30 19 47 01 99 0C 43 03 9E 00 02 5F Received message is OK! Checksum is correct! 65451 Receive PCM DATAstream Send request PID_2101 to PCM 65790 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 93 0D 80 00 00 02 A5 00 00 0B 5D 04 30 00 00 03 1F 0B 3E 03 9F 04 2D 03 20 EE 7A 00 00 00 00 0C 2E 03 21 02 D4 08 EB 01 8F 0D 0B A0 00 09 BE 02 8E A9 08 01 30 19 43 01 9A 0C 44 03 9F 00 02 C4 Received message is OK! Checksum is correct! 65995 Receive PCM DATAstream Send request PID_2101 to PCM 66335 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 95 0D 82 00 00 02 A4 00 00 0B 4C 04 2D 00 00 03 21 0B 38 03 9F 04 2D 03 20 EE 50 00 00 00 00 0C 32 02 8E 02 C0 08 E9 01 91 0D 0B A0 00 09 C7 02 55 A9 08 01 30 19 38 01 99 0C 44 03 9E 00 02 A6 Received message is OK! Checksum is correct! 66554 Receive PCM DATAstream Send request PID_2101 to PCM 66894 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 93 0D 82 00 00 02 A4 00 00 0B 1B 04 30 00 00 03 20 0B 3C 03 9E 04 2D 03 20 EE 6A 00 00 00 00 0C 30 02 92 02 CB 08 EC 01 90 0D 0B A0 00 09 C0 02 85 A9 08 01 30 19 3A 01 99 0C 43 03 9F 00 02 CA Received message is OK! Checksum is correct! 67108 Receive PCM DATAstream Send request PID_2101 to PCM 67448 Send request PID_2101 to PCM 68049 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 98 0D 83 00 00 02 A5 00 00 0B 83 04 30 00 00 03 20 0B 3C 03 9F 04 2D 03 20 EE 45 00 00 00 00 0C 32 02 8F 02 C4 08 E8 01 90 0D 08 A0 00 09 DB 02 70 A9 08 01 30 19 36 01 99 0C 43 03 9F 00 02 0A Received message is OK! Checksum is correct! 68256 Receive PCM DATAstream Send request PID_2101 to PCM 68596 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 98 0D 83 00 00 02 A3 00 00 0B 60 04 30 00 00 03 21 0B 35 03 9F 04 2D 03 20 EE 35 00 00 00 00 0C 30 02 A8 02 C1 08 E8 01 90 0D 08 A0 00 09 F1 02 7C A9 08 01 30 19 39 01 99 0C 43 03 9F 00 02 08 Received message is OK! Checksum is correct! 68870 Receive PCM DATAstream Send request PID_2101 to PCM 69210 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 93 0D 83 00 00 02 A4 00 00 0B 72 04 30 00 00 03 22 0B 32 03 9E 04 2D 03 20 EE 16 00 00 00 00 0C 30 02 8E 02 C5 08 E8 01 90 0D 06 A0 00 0A 00 02 73 A9 08 01 30 19 34 01 98 0C 43 03 9E 00 02 DC Received message is OK! Checksum is correct! 69423 Receive PCM DATAstream Send request PID_2101 to PCM 69763 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D1 01 99 0D 83 00 00 02 A4 00 00 0B 45 04 30 00 00 03 20 0B 36 03 9E 04 2D 03 20 EE 3A 00 00 00 00 0C 30 02 AA 02 C2 08 E9 01 90 0D 06 A0 00 0A 03 02 6A A9 08 01 30 19 30 01 99 0C 43 03 9F 00 02 EB Received message is OK! Checksum is correct! 69978 Receive PCM DATAstream Send request PID_2101 to PCM 70318 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 97 0D 85 00 00 02 A4 00 00 0B 72 04 32 00 00 03 1E 0B 3A 03 9F 04 2D 03 20 EE 9F 00 00 00 00 0C 30 02 C1 02 D5 08 EB 01 8F 0D 06 A0 00 0A 0C 02 9E A9 08 01 30 19 2A 01 99 0C 44 03 9F 00 02 E7 Received message is OK! Checksum is correct! 70532 Receive PCM DATAstream Send request PID_2101 to PCM 70872 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 99 0D 85 00 00 02 A4 00 00 0B 75 04 30 00 00 03 21 0B 36 03 9F 04 2D 03 20 EE 40 00 00 00 00 0C 30 03 03 02 C2 08 E7 01 90 0D 03 A0 00 0A 1D 02 79 AD 08 01 30 19 23 01 98 0C 44 03 9F 00 02 9C Received message is OK! Checksum is correct! 71080 Receive PCM DATAstream Send request PID_2101 to PCM 71420 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 98 0D 85 00 00 02 A6 00 00 0B 29 04 2C 00 00 03 1F 0B 40 03 9E 04 2D 03 20 EE 8F 00 00 00 00 0C 30 03 1A 02 D3 08 EB 01 8F 0D 03 A0 00 0A 1B 02 97 A9 08 01 30 19 23 01 99 0C 45 03 9F 00 02 E8 Received message is OK! Checksum is correct! 71714 Receive PCM DATAstream Send request PID_2101 to PCM 72054 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 9A 0D 86 00 00 02 A4 00 00 0B 53 04 30 00 00 03 1F 0B 43 03 9E 04 2D 03 20 EE 9F 00 00 00 00 0C 32 03 17 02 D6 08 EB 01 8F 0D 03 A0 00 0A 24 02 9A A9 08 01 30 19 1C 01 99 0C 44 03 9F 00 02 30 Received message is OK! Checksum is correct! 72267 Receive PCM DATAstream Send request PID_2101 to PCM 72607 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 9C 0D 86 00 00 02 A5 00 00 0B 14 04 2D 00 00 03 22 0B 3B 03 9F 04 2D 03 20 EE 65 00 00 00 00 0C 32 03 0F 02 CA 08 EA 01 8F 0D 03 A0 00 0A 24 02 7F AD 08 01 30 19 1D 01 98 0C 44 03 9F 00 02 87 Received message is OK! Checksum is correct! 72822 Receive PCM DATAstream Send request PID_2101 to PCM 73162 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 99 0D 86 00 00 02 A5 00 00 0B 3A 04 2C 00 00 03 20 0B 37 03 9F 04 2D 03 20 EE 45 00 00 00 00 0C 30 02 8C 02 C4 08 E9 01 8F 0D 01 A0 00 0A 12 02 8E A9 08 01 30 19 1A 01 99 0C 44 03 9F 00 02 EB Received message is OK! Checksum is correct! 73374 Receive PCM DATAstream Send request PID_2101 to PCM 73714 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 99 0D 86 00 00 02 A6 00 00 0A FC 04 2D 00 00 03 20 0B 3E 03 9F 04 2D 03 20 EE 7F 00 00 00 00 0C 2E 02 96 02 CF 08 E8 01 90 0D 01 A0 00 0A 08 02 91 A9 08 01 30 19 1A 01 98 0C 44 03 9F 00 02 FA Received message is OK! Checksum is correct! 73929 Receive PCM DATAstream Send request PID_2101 to PCM 74269 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 98 0D 86 00 00 02 A2 00 00 0A F5 04 30 00 00 03 22 0B 32 03 9F 04 2D 03 20 EE 00 00 00 00 00 0C 30 02 EC 02 BC 08 E6 01 91 0D 01 A0 00 09 FD 02 49 A9 08 01 30 19 14 01 98 0C 44 03 9E 00 02 51 Received message is OK! Checksum is correct! 74486 Receive PCM DATAstream Send request PID_2101 to PCM 74826 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 9B 0D 88 00 00 02 A3 00 00 0B 29 04 2E 00 00 03 22 0B 2F 03 9F 04 2C 03 20 EE 0B 00 00 00 00 0C 32 02 9D 02 B9 08 E6 01 91 0D 01 A0 00 09 F4 02 4F A9 08 01 30 19 11 01 98 0C 44 03 9E 00 02 3B Received message is OK! Checksum is correct! 75100 Receive PCM DATAstream Send request PID_2101 to PCM 75440 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 9B 0D 88 00 00 02 A3 00 00 0B 60 04 2D 00 00 03 21 0B 37 03 9F 04 2D 03 20 EE 45 00 00 00 00 0C 2E 02 AA 02 C6 08 E6 01 90 0D 01 A0 00 09 ED 02 64 A9 08 01 30 19 10 01 98 0C 44 03 9F 00 02 D6 Received message is OK! Checksum is correct! 75652 Receive PCM DATAstream Send request PID_2101 to PCM 75992 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 95 0D 89 00 00 02 A3 00 00 0B 64 04 30 00 00 03 20 0B 35 03 9F 04 2D 03 20 EE 35 00 00 00 00 0C 2E 02 A9 02 C1 08 E6 01 90 0D 01 A0 00 09 ED 02 67 A9 08 01 30 19 08 01 98 0C 44 03 9E 00 02 B9 Received message is OK! Checksum is correct! 76207 Receive PCM DATAstream Send request PID_2101 to PCM 76547 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 96 0D 88 00 00 02 A6 00 00 0B 41 04 2D 00 00 03 20 0B 36 03 9F 04 2D 03 20 EE 55 00 00 00 00 0C 32 02 B0 02 C7 08 E8 01 90 0D 01 A0 00 09 DB 02 79 A9 08 01 30 19 03 01 98 0C 44 03 9F 00 02 C6 Received message is OK! Checksum is correct! 76760 Receive PCM DATAstream Send request PID_2101 to PCM 77100 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 96 0D 88 00 00 02 A5 00 00 0B 0D 04 2A 00 00 03 20 0B 37 03 9F 04 2D 03 20 EE 65 00 00 00 00 0C 2E 03 11 02 CA 08 E6 01 90 0D 01 A0 00 09 DA 02 7C A9 08 01 30 19 00 01 98 0C 44 03 9F 00 02 FF Received message is OK! Checksum is correct! 77314 Receive PCM DATAstream Send request PID_2101 to PCM 77654 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 9A 0D 89 00 00 02 A5 00 00 0B 1B 04 2D 00 00 03 20 0B 34 03 9F 04 2D 03 20 EE 50 00 00 00 00 0C 30 03 05 02 C6 08 E6 01 90 0D 01 A0 00 09 DF 02 76 A9 08 01 30 18 FD 01 99 0C 44 03 9F 00 02 EB Received message is OK! Checksum is correct! 77942 Receive PCM DATAstream Send request PID_2101 to PCM 78282 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 96 0D 89 00 00 02 A4 00 00 0B 56 04 2D 00 00 03 21 0B 38 03 9F 04 2D 03 20 EE 50 00 00 00 00 0C 32 03 05 02 C6 08 E7 01 90 0C FE A0 00 09 EC 02 97 AD 08 01 30 18 EF 01 98 0C 44 03 9F 00 02 48 Received message is OK! Checksum is correct! 78500 Receive PCM DATAstream Send request PID_2101 to PCM 78840 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 94 0D 89 00 00 02 A5 00 00 0B 3A 04 30 00 00 03 21 0B 36 03 9E 04 2D 03 20 EE 3A 00 00 00 00 0C 30 03 02 02 C2 08 E6 01 90 0C FC A0 00 09 F5 02 6A A9 08 01 30 18 FF 01 98 0C 44 03 9E 00 02 F0 Received message is OK! Checksum is correct! 79053 Receive PCM DATAstream Send request PID_2101 to PCM 79393 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 95 0D 89 00 00 02 A4 00 00 0A FC 04 30 00 00 03 20 0B 3B 03 9F 04 2D 03 20 EE 65 00 00 00 00 0C 2E 02 F8 02 CA 08 E5 01 90 0C FC A0 00 09 F1 02 64 A9 08 01 30 18 F7 01 98 0C 44 03 9E 00 02 C9 Received message is OK! Checksum is correct! 79604 Receive PCM DATAstream Send request PID_2101 to PCM 79944 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 9C 0D 89 00 00 02 A4 00 00 0B 5A 04 32 00 00 03 20 0B 39 03 9F 04 2D 03 20 EE 55 00 00 00 00 0C 30 02 F4 02 C7 08 E6 01 8F 0C FC A0 00 09 FF 02 79 A9 08 01 30 18 F2 01 98 0C 44 03 9F 00 02 39 Received message is OK! Checksum is correct! 80156 Receive PCM DATAstream Send request PID_2101 to PCM 80496 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 9E 0D 89 00 00 02 A3 00 00 0B 5A 04 30 00 00 03 20 0B 39 03 9F 04 2D 03 20 EE 55 00 00 00 00 0C 2E 02 F2 02 C7 08 E6 01 8F 0C FC A0 00 09 F7 02 79 AD 08 01 30 18 F3 01 98 0C 43 03 9F 00 02 30 Received message is OK! Checksum is correct! 80711 Receive PCM DATAstream Send request PID_2101 to PCM 81051 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 99 0D 8B 00 00 02 A3 00 00 0B 26 04 30 00 00 03 20 0B 37 03 9F 04 2D 03 20 EE 45 00 00 00 00 0C 2D 02 AD 02 C4 08 E4 01 90 0C FC A0 00 09 E9 02 79 A9 08 01 30 18 E8 01 98 0C 44 03 9E 00 02 80 Received message is OK! Checksum is correct! 81323 Receive PCM DATAstream Send request PID_2101 to PCM 81662 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 9D 0D 8B 00 00 02 A4 00 00 0B 34 04 30 00 00 03 1F 0B 3E 03 9E 04 2D 03 20 EE 7F 00 00 00 00 0C 30 02 B9 02 CF 08 E4 01 90 0C FC A0 00 09 E1 02 6A A9 08 01 30 18 EA 01 98 0C 44 03 9F 00 02 D8 Received message is OK! Checksum is correct! 81878 Receive PCM DATAstream Send request PID_2101 to PCM 82217 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 98 0D 8B 00 00 02 A3 00 00 0B 45 04 30 00 00 03 20 0B 3C 03 9F 04 2D 03 20 EE 6F 00 00 00 00 0C 2D 02 B1 02 CC 08 E6 01 90 0C F9 A0 00 09 E2 02 88 AD 08 01 30 18 E2 01 97 0C 43 03 9F 00 02 DD Received message is OK! Checksum is correct! 82436 Receive PCM DATAstream Send request PID_2101 to PCM 82776 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 96 0D 89 00 00 02 A4 00 00 0B 6E 04 2D 00 00 03 20 0B 3F 03 9F 04 2D 03 20 EE 55 00 00 00 00 0C 2E 02 AB 02 C7 08 E6 01 90 0C F9 A0 00 09 DF 02 79 A9 08 01 30 18 E0 01 98 0C 44 03 9F 00 02 C9 Received message is OK! Checksum is correct! 82989 Receive PCM DATAstream Send request PID_2101 to PCM 83329 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 9A 0D 8C 00 00 02 A5 00 00 0A EB 04 2C 00 00 03 1F 0B 45 03 9F 04 2D 03 20 EE B4 00 00 00 00 0C 2E 03 23 02 D9 08 E7 01 8F 0C F9 A0 00 09 CA 02 6D A9 08 01 30 18 DB 01 98 0C 44 03 9F 00 02 15 Received message is OK! Checksum is correct! 83542 Receive PCM DATAstream Send request PID_2101 to PCM 83881 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 96 0D 8C 00 00 02 A7 00 00 0B 18 04 30 00 00 03 1F 0B 3D 03 9F 04 2D 03 20 EE 75 00 00 00 00 0C 30 03 17 02 CD 08 E6 01 90 0C F7 A0 00 09 CA 02 88 A9 08 01 30 18 E0 01 98 0C 44 03 9F 00 02 06 Received message is OK! Checksum is correct! 84179 Receive PCM DATAstream Send request PID_2101 to PCM 84519 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 98 0D 8C 00 00 02 A5 00 00 0B 22 04 2D 00 00 03 1E 0B 3F 03 9E 04 2D 03 20 EE 84 00 00 00 00 0C 30 03 1C 02 D0 08 E7 01 8F 0C F7 A0 00 09 C3 02 5E A9 08 01 30 18 D9 01 97 0C 44 03 9F 00 02 EB Received message is OK! Checksum is correct! 84730 Receive PCM DATAstream Send request PID_2101 to PCM 85070 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 94 0D 8C 00 00 02 A5 00 00 0B 75 04 30 00 00 03 1F 0B 3E 03 9F 04 2D 03 20 EE 7F 00 00 00 00 0C 32 03 18 02 CF 08 E6 01 8F 0C F7 A0 00 09 D0 02 8E A9 08 01 30 18 DE 01 97 0C 44 03 9E 00 02 76 Received message is OK! Checksum is correct! 85284 Receive PCM DATAstream Send request PID_2101 to PCM 85624 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D3 01 94 0D 8C 00 00 02 A5 00 00 0A E7 04 30 00 00 03 20 0B 39 03 9F 04 2D 03 20 EE 55 00 00 00 00 0C 2E 02 ED 02 D1 08 E6 01 8F 0C F7 A0 00 09 B2 02 94 A9 08 01 30 18 D6 01 98 0C 44 03 9E 00 02 6A Received message is OK! Checksum is correct! 85837 Receive PCM DATAstream Send request PID_2101 to PCM 86177 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 9A 0D 8E 00 00 02 A3 00 00 0B 14 04 30 00 00 03 1F 0B 3B 03 9F 04 2D 03 20 EE 65 00 00 00 00 0C 30 02 F3 02 CB 08 E6 01 90 0C F7 A0 00 09 B5 02 82 AD 08 01 30 18 CF 01 96 0C 44 03 9F 00 02 A1 Received message is OK! Checksum is correct! 86388 Receive PCM DATAstream Send request PID_2101 to PCM 86728 Receive PCM: 80 F1 11 4C 61 01 01 16 35 AA 00 00 00 00 0D D5 01 99 0D 8C 00 00 02 A3 00 00 0B 6B 04 2D 00 00 03 20 0B 32 03 9F 04 2D 03 20 EE 20 00 00 00 00 0C 2E 02 EE 02 C3 08 E2 01 90 0C F4 A0 00 09 CE 02 6D A9 08 01 30 18 D0 01 96 0C 43 03 9E 00 02 8E Received message is OK! Checksum is correct! 86940 Receive PCM DATAstream Send request PID_2101 to PCM 87281 Send request PID_2101 to PCM 87881 Send request PID_2101 to PCM 88482 Send request PID_2101 to PCM 89083 Send request PID_2101 to PCM 89684 Send request PID_2101 to PCM 903471563 работает, не экране не отображается. заметил 6 запросов потом подвис и сново 6 запросов и подвис. отчет
мой старый рабочий скетч
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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(); }У меня 32U4 на 16 МГц по 10 раз в секунду успевает принять ~100 байт от GPS и полностью обновить картинку на OLED 128х64 по I2C. Так что два камня для Вашего проекта это много.
Из Вашего лога вижу что принято то 76, то 77, то 78 байт - теряется всего от 5 до 3 байт. Это прямая логика Вам подсказывает, что Вы опустошаете буфер в лупе. А если какая то библа забирает время по прерыванию ??? Запретить прерывания полностью, то же нельзя, т.к. Softserial сам на прерывании ловит байты. Вообщем я бы проверил идею с размером буфера - делов то на пару минут.