Softwareserial ловит стартбит по прерыванию. Видимо какая то из библиотек их запрещает на время и часть ответа ЕБУ летит мимо цели. Аппаратный serial работает немного иначе и может с ним не будет такого косяка.
Глянул код по диагонали:
MaksVV я правильно вижу - что на каждый байт от ЕБУ проворачивается основной луп ??? Часы обновляются раз в три секунды ???
Может так будет правильнее:
...
receivePCM (); // приём сообщений от PCM
if (header != 4) {
Menu ();
if (curmillis - prevWatch > 3000) { Watch (); prevWatch = curmillis;}
if (curmillis - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 290, 5);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curmillis; Dvoet=!Dvoet;}
}
}// end loop
...
И процесс приёма пакета не будет отвлекаться в критический момент ?
нет между приёмом каждого байта от эбу стоит таймер в 1 мс. Т.е. часть циклов луп в холостую пролетает не читая буфер, а то паразитные ноли появляются. Не спорю на харде может и лучше будет. Я не знаю почему тут софт сериал, помоему раньше на харде висело.
Командир там понимаешь есть два обмена к-лайн. ВВторой мы ещё тут не добавли (со щитком приборов). По меню то не нада летать, а вот второй к-лайн нада читать чтоб без ошибок.
Если ниче не получится придётся вернуть к старой схеме. Я просто хотел правильный алгоритм отработать. Я ж не предполагал, что вся периферия ппц как тормозит скетч
во блин задачка. 2 облом разберать всю панель. 1 на крайняк будет лучшим вариантомю. хотелось бы твою новую систему, может 3? на моем из за шрифта мигает а так норм работает
ща доработаю шриф и сниму видео и кину на ютуб, потом кину сюда. Макс тебе в очередной раз огромное сапсибо. ТЫ ГЕНИЙ я два года уже об этом говорю. Командир тебе тоже огромное спасибо за подсказку. ждите видео
MaksVV машина Subaru c электронной педалью акселератора.
железо уже сделано: 32U4 общается с ЭБУ, с GPS, выводит на OLED по I2C, отслеживает нажатия SKRHABE10, отслеживает уровень от родной педали, отслеживает сигналы от датчика скорости, выставляет уровень замещающий родную педаль через ЦАП по I2C. Сброс по тормозу, сцеплению, нейтрали - аппартный.
Всё это работает. Изучаю алгоритмы поддержания скорости ориентируясь на сигналы с датчика скорости.
не прописываею шрифт только размер прописываю myGLCD.setTextSize(2); не мигает но шрифт меньше чем нужен и шире.
любой адафрутовский шриф myGLCD.setFont(&FreeSerifItalic12pt7b); блин мигает.....
особенность библиотеки. При использовании встроенных шрифтов у каждого символа есть фон, который затирает прежнюю надпись. А у Адафрутовских шрифтов фона нет. если их выводить непосредственно - новые символы будут накладываться на старые. Поэтому при выводе такого шрифта сначала выполняется заливка старого текста цветом фона, а потом выводится новый - вот это и видно как "мигание".
бороться - либо борать более быстрый МК. либо кардинально переписывать библиотеку.
тоесть Командир найти в библе адафруита стандартный шрифт и перерисовать его на свой? вопрос где он лежит в font лежат шрифты но там нет стандарт или чета похожее......... я бы поигрался бы и перерисовл , я же художник:) , порылся бы как это сделать...... на сколько я понимаю так как он работает через конветрер <UTFTGLUE.h> то он использует стандартный шрифт UTFT библы? правильно?
ты имеешь в виду твой пост 1594?
viki13viki Да. Исправьте размер и пересоберите тот же самый скетч, что сыплет таймаутами. Залейте и посмотрите как будет работать.
по умолчанию уже стоит #define _SS_MAX_RX_BUFF 100 // RX buffer size
Поиск тут корявый - да нашел пост об этом http://arduino.ru/forum/proekty/bortovoi-kompyuter-dlya-opel-zafira?page=10#comment-294279
Softwareserial ловит стартбит по прерыванию. Видимо какая то из библиотек их запрещает на время и часть ответа ЕБУ летит мимо цели. Аппаратный serial работает немного иначе и может с ним не будет такого косяка.
Глянул код по диагонали:
MaksVV я правильно вижу - что на каждый байт от ЕБУ проворачивается основной луп ??? Часы обновляются раз в три секунды ???
Может так будет правильнее:
... receivePCM (); // приём сообщений от PCM if (header != 4) { Menu (); if (curmillis - prevWatch > 3000) { Watch (); prevWatch = curmillis;} if (curmillis - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 290, 5);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curmillis; Dvoet=!Dvoet;} } }// end loop ...И процесс приёма пакета не будет отвлекаться в критический момент ?
нет между приёмом каждого байта от эбу стоит таймер в 1 мс. Т.е. часть циклов луп в холостую пролетает не читая буфер, а то паразитные ноли появляются. Не спорю на харде может и лучше будет. Я не знаю почему тут софт сериал, помоему раньше на харде висело.
по моему Макс изначально я как нашел первые скетчи когда только начинал, там был сериал, так он до конца и остался. на сколько я помню
байты от ЭБУ летят с задержкой между ними по 1мс. Таков уж протокол. Поэтому сообщение в 80мс меньше чем за 200мс не принять по идее
1536 нормально отображает? не мигает? В нем нет цикла тача. Видимо тач все и тормозит. Добавь туда тач и проверь стало ли глючить
Если идёт тело пакета (самый критический момент) зачем бегать по меню, часам и двоеточиям ???
ИМХО с моими двумя строчками из 1604 думаю всё взлетит. Хотел выделить эти две строки жирным, но не вышло - они внутри тега strong получились
Командир там понимаешь есть два обмена к-лайн. ВВторой мы ещё тут не добавли (со щитком приборов). По меню то не нада летать, а вот второй к-лайн нада читать чтоб без ошибок.
Если ниче не получится придётся вернуть к старой схеме. Я просто хотел правильный алгоритм отработать. Я ж не предполагал, что вся периферия ппц как тормозит скетч
Если идёт тело пакета (самый критический момент) зачем бегать по меню, часам и двоеточиям ???
ИМХО с моими двумя строчками из 1604 думаю всё взлетит.
не, там надо цикл Menu() в это время отменять, но тогда тач хрен дотыкаешься
да 1536 мелкий шрифт, не мигает норм отображает. не тач не причем закоменчен шрифт, он и тормозил 99 проциков. а и френд закоменчен
не там надо цикл Menu() в это время отменять, но тогда тач хрен дотыкаешься
80 мс и хрен дотыкаешься ???
дак в 1536 не вставлен цикл тача, работает там тач чтоли?
тебе говорят между байтами ещё 1 мс от блока задержки . итого примерно 160...200мс тач не робит
Но это 5 раз в секунду по любому
в 1536 Menu убит
нет, не так. Алгоритм такой по кругу
Запрос. Ответ от эбу (160мс...200мс). Задержка между посылками 80мс(тут тач робит), запрос, Ответ от эбу (160мс...200мс)
вот и выяснили тормозило две вещи шрифт и тач. Так что ....
я ещё 1579 писал
Вам надо определить что максимально критично - верные данные или тач.
С аппаратным сериалом можно вечно сидеть в таче и по прерыванию забирать данные от ЕБУ.
С программным надо все равно приоритет для данных отдавать.
да друзья разкоментил в 1536 меню Menu (); и изображение на экране пропало..........
viki13viki сделайте как я писал в 1604 и посмотрите как будет тач себя вести ?
MaksVV зачем задержка между байтами если Вы проверяете available ?
уже пробовал ошибка компиляц
expected primary-expression before '<' token
там все <strong> надо убрать это я хотел ЖИРНЫМ выделить, а оно в код попало
должно быть
if (header != 4) {
и закрывающая
}
viki13viki, как твой рабочий скетч без шрифта , нормально робит?
Есть четыре варианта.
1. Немного улучшить твой рабочий скетч оставив его также на delay, но только по лучше не 195.
2. Попробовать по новой схеме но на хард сериале.
3. Добивать или искать другую библу тача и шрифта чтобы она так сильно не тормозила луп.
4. добавить ещё одну ардуино. которая будет тачить и экранить
во блин задачка. 2 облом разберать всю панель. 1 на крайняк будет лучшим вариантомю. хотелось бы твою новую систему, может 3? на моем из за шрифта мигает а так норм работает
да, но без неё не работало, точно помню. Надо ещё раз заморочиться по тестировать. Давно дело было.
на моем если убрать шриф то и тач работает и не мигает. ща скажу точно проверю.
да на моем все работает включая тач и ошибки только шрифт маленький а так все пучком
viki13viki разобрались с компиляцией 1604 ?
тогда вариант 1 будет норм
viki13viki разобрались с компиляцией 1604 ?
дак выяснили что тормозят не те функции, надо таким макаром menu() банить , а вижу исправил
не с компиляцией не разробрался
)
да Макс наверное модифицировать по возможности мой это лучший вариант.
вот мой рабочий
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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(); }... receivePCM (); // приём сообщений от PCM if (header != 4) { Menu (); if (curmillis - prevWatch > 3000) { Watch (); prevWatch = curmillis;} if (curmillis - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 290, 5);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curmillis; Dvoet=!Dvoet;} } }// end loop ...Меню отключается только в момент приёма тела пакета
Тач может обрести некую задумчивость ...
Командир ты серьезно? это сработало..... Блин все четко работает....
Тач сильно тормозит ?
Хоть бы одним газом увидеть - как оно выглядит :-)
работает мгновенно. Макс возьми себе это на заметку на будущее. пригодится
вот скетч
#include <Adafruit_GFX.h> #include <MCUFRIEND_kbv.h> #include <UTFTGLUE.h>//use GLUE class and constructor #include "TouchScreen.h" #include <stdint.h> #include <SPI.h> #include <EEPROM.h> MCUFRIEND_kbv tft; //#include "Fonts/Gobold_Bold14pt7b.h"; #define MINPRESSURE 200 #define MAXPRESSURE 1000 //pin 20 SCL , 21 SDA датчик реального времени #include <Wire.h> #include "RTClib.h" RTC_DS3231 rtc; UTFTGLUE myGLCD(0x1581,A2,A1,A3,A4,A0); //all dummy args const int XP = 6, XM = A2, YP = A1, YM = 7; const int TS_LEFT = 136, TS_RT = 907, TS_TOP = 139, TS_BOT = 942; TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); uint16_t ID; int x, y; char currentPage; float h; float t; bool Dvoet = 0; #include <SoftwareSerial.h> #define TX_PCM 13 SoftwareSerial K_LINE_PCM (12, TX_PCM); //RХ,TХ #define PCM_address 0x11 // адрес PCM #define DIAG_address 0xF1 // адрес диагностики #define debugPCM // раскоментировать эту строку для отладки в Serial порту обмена с PCM //#define debugGAUGE // раскоментировать эту строку для отладки в Serial порту обмена co щитком приборов uint32_t curmillis = 0; // снимок текущего времени uint32_t prevRequest = 0; // таймер периодических запосов на PCM uint16_t RequestPeriod = 3500; // периодичность запросов на PCM uint32_t prevRESETheader=0; // таймер сброса сообщения, если данные оборвались посередине сообщения bool RESETheader_timer; // таймер сброса сообщения, если данные оборвались посередине сообщения uint32_t prev_NOanswer=0; // таймер контроля неответов от ЭБУ после подачи запросов bool NOanswer_timer = 0; // таймер контроля неответов от ЭБУ после подачи запросов byte noanswers = 0; // количество подряд неответов от ЭБУ uint32_t timerdelay = 0; // таймер ожидания байт (для успевания появления данных в буфере UART) bool Delay = 0; // таймер ожидания байт (для успевания появления данных в буфере UART) byte waitbyte_RX = 1; // задержка, мс для успевания появления данных в буфере RX // (подрегулировать в зависимости от уровня жизнидеятельности на Марсе) #define TIMER_DELAY Delay = 0; timerdelay = curmillis // включение этого таймера byte delaybyte_TX = 1; // задержка между отправкой байт в запросах, мс byte header = 0; // состояние заголовка byte message_size = 0; // размер тела сообщения byte j = 3; // инкремент byte n = 3; // количество старт байт const byte bufsize = 150; // размер буфера принятого сообщения byte MessageRx_PCM [bufsize] = {0}; // буфер принятого сообщения byte crc =0; // байт контрольной суммы // возможные варианты запросов на ЭБУ: enum REQUEST { INIT, PID, DTCERASE, DTCREAD, PRESENT, }; // текстовки запросов для отладки char* textRequest[] = { "INIT", "PID_2101", "DTC_ERASE", "DTC_READ", "PRESENT", } ; // сами запросы byte PCM_Message_TX[][5] = { {1, 0x81, 0,0,0}, // запрос инициализации {2, 0x21,0x01, 0,0}, // запрос пид 2101 {3, 0x14,0xFF,0x00, 0}, // запрос на стирание ошибок {4, 0x18,0x00,0xFF,0x00 }, // запрос на чтение ошибок {1, 0x3E, 0,0,0}, // запрос присутствия }; byte request = INIT; // переменная, показывающая какой запрос будем делать //-------------------------------------------переменные бортовика float L100M = 0; //расход на 100 км измеренный за поездку float L100 = 0; //мгновенный расход литров на 100км float LHor = 0; //мгновенный расход топлива литров в час float L100SR = 0; //расход литров на 100км измеренный раз в интервал kmL float L100SR_TFT = 0; // самый средний из расходов на 100км, он выводится на экран int L100_Eeprom[11]= {10,10,10,10,10,10,10,10,10,10,10}; int FuelZamer[10]= {0}; // массив для измерения уровня (количества) топлива int ZamerNumber = 0; // номер замера уровня (количества) топлива int n_eeprom = 0; // текущий адрес ячейки еепром для записи расхода int MAF = 0; //26,27 байты Sensor de flujo de aire en masa float BoostPres = 0; //28,29 байты Presión de refuerzo int RPM = 0; //32,33 байты Velocidad del motor int EGRmg = 0; //34,35 байты Comando EGR (Comando de recirculación de gases de escape) float BoostPresCom = 0; //38,39 байты Comando de presión de refuerzo int Speed = 0; //44,45 байты Velocidad del vehículo float DesaInjQua = 0; //50,51 байты Cantidad de inyección deseada float InjQua = 0; //52,53 байты Cantidad de la inyección float StaDaliv = 0; //54,55 байты Inicio de la entrega int PumpRPM = 0; //56,57 байты Velocidad de la bomba float EGRPul = 0; //62,63 байты Relación de impulsos EGR (recirculación de gases de escape float SolenPul = 0; //64,65 байты Velocidad de solenoide de control de nivel de remolino Relación de impulsos float SolenPre = 0; //70,71 байты Relación de impulsos Presión Electroválvula de presión float DesInj = 0; //72,73 байты Inyección deseada Inicio float ActInj = 0; //16,17 байты Inicio de la inyección real int TempAir = 0; //74,75 байты Temperatura del aire de admisión int Temp = 0; //14,15 байты Temperatura del refrigerante int TempOil = 0; //18,19 байты Temperatura del aceite del motor int TempFuel = 0; //58,59 байты Temperatura del combustible //все что касается топлива float Fuel = 0; //остаток топлива float Fuel2 = 0; //остаток мгновенного топлива байт 16 , датчика в баке int FuelIGN = 0; // количество топлвива в баке на момент включения зажигания int Fuel_last = 0; // для формул bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания float FuelTrip = 0; // количество литров топлива, израсходованное за один цикл включения зажигания //все что касается километража float kmAge = 0; //пробег, полученный со щитка приборов int kmAgeIGN = 0; //пробег который был в момент включения зажигания int kmAge_last = 0; // для формул bool flagkmAgeIGN = 0; //флаг записан ли пробег в момент вкл. зажигания float kmTrip = 0; //пробег за один цикл включения зажигания int kmL = 10; // интервал, через который будет происходить обновление среднего расхода на 100км int km = 0; // переменная для расчетов int kmeeprom = 10; // интервал, через который будет происходить подсчет среднеарифмитического расхода L100SR_TFT int kmTFT = 0; // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT int kmREFUELING = 0; // пробег до заправки на остатке топлива unsigned long prevWatch = 0; unsigned long prevDvoet = 0; unsigned long prevData = 0; void setup() { uint16_t ID = myGLCD.readID(); if (ID == 0xD3D3) ID = 0x1581; // write-only shield myGLCD.begin(ID); myGLCD.InitLCD(3); myGLCD.clrScr(); // myGLCD.setFont(&Gobold_Bold14pt7b); Wire.begin(); rtc.begin(); //загрузка стартовой страницы currentPage = '0'; drawHomeScreen(); //подсчет среднеарифметического усредненного расхода for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i); for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT + L100_Eeprom [i]; L100SR_TFT = (float)L100SR_TFT/110.0; if (L100SR_TFT<0) L100SR_TFT = 0; if (L100SR_TFT>99) L100SR_TFT = 99; // строка ниже используется для настройки даты и времени часов // раскоментировать, выставить времая и дату, залить в ардуино. в скетче закоментировать // обратно и залить еще раз, иначе каждый раз будет по новой выствлятся это же время и дата // (год, месяц, день, часы, минуты, секунды) //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0)); #if defined debugPCM or debugGAUGE Serial.begin(115200); #endif K_LINE_PCM.begin(10400); pinMode(TX_PCM, OUTPUT); } void loop() { curmillis = millis(); // снимок текущего времени if (curmillis - prevRequest > RequestPeriod && header == 0) { if (request == INIT) fastinit(); // при необходимости делаем переподключение к PCM else {sendMessagePCM(request); if (request == PID) RequestPeriod = 600; } // отправляем на PCM текущий запрос prevRequest = curmillis; } receivePCM (); // приём сообщений от PCM if (header != 4) { Menu (); if (curmillis - prevWatch > 3000) { Watch (); prevWatch = curmillis;} if (curmillis - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 290, 5);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curmillis; Dvoet=!Dvoet;} } }// end loop void fastinit() { digitalWrite (TX_PCM, HIGH); // bus idle delay(1500); digitalWrite (TX_PCM, LOW); // first part fastinit (25 ms LOW) delay(25); digitalWrite (TX_PCM, HIGH); // second part fastinit (25 ms HIGH) delay(25); K_LINE_PCM.begin(10400); sendMessagePCM(INIT); // send start communication message } void receivePCM () { if (K_LINE_PCM.available() ){ // первый старт байт if (header == 0 && Delay){TIMER_DELAY ; MessageRx_PCM[0]=K_LINE_PCM.read(); if (MessageRx_PCM[0]!=0xFF && bitRead (MessageRx_PCM[0],7)){header = 1; RESETheader_timer = 1; prevRESETheader = curmillis; #ifdef debugPCM Serial.print (F("Receive PCM: ")); printDebugRX(MessageRx_PCM[0]); #endif } } // второй старт байт if (header == 1 && Delay){TIMER_DELAY ; MessageRx_PCM[1]=K_LINE_PCM.read(); #ifdef debugPCM printDebugRX (MessageRx_PCM[1]); #endif if (MessageRx_PCM[1]==DIAG_address){ header = 2;} else { #ifdef debugPCM Serial.println(F(" PCM Message fail address")); #endif header = 0; RESETheader_timer = 0;}} // третий старт байт if (header == 2 && Delay){ TIMER_DELAY ; MessageRx_PCM[2]=K_LINE_PCM.read(); #ifdef debugPCM printDebugRX (MessageRx_PCM[2]); #endif if (MessageRx_PCM[2]==PCM_address){ message_size = MessageRx_PCM[0]; prevRESETheader = curmillis; if (MessageRx_PCM[0] !=0x80) {header = 4; bitWrite (message_size, 7 , 0);j=3;n=3;} else {header = 3; j=4;n=4;} if (message_size > bufsize) message_size = bufsize; crc = 0;} else {header = 0; #ifdef debugPCM Serial.println(F("PCM Message fail address")); #endif RESETheader_timer = 0;} } // если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт: if (header == 3 && Delay){ TIMER_DELAY ; prevRESETheader = curmillis; MessageRx_PCM[3]=K_LINE_PCM.read(); #ifdef debugPCM printDebugRX(MessageRx_PCM[3]); #endif message_size = MessageRx_PCM[3]; if (message_size > bufsize) message_size = bufsize; crc = 0; header = 4; } // пишем тело сообщения if (header == 4 && Delay && j< message_size+n+1) { MessageRx_PCM[j] = K_LINE_PCM.read(); prevRESETheader = curmillis; if (j<message_size+n) crc+= MessageRx_PCM[j]; // подсчёт КС if (j==message_size+n) header = 5; TIMER_DELAY ; #ifdef debugPCM printDebugRX(MessageRx_PCM[j]); #endif j++; } } // сообщение приняли, действуем if (header == 5) {TIMER_DELAY ; #ifdef debugPCM Serial.println(); #endif NOanswer_timer = 0; noanswers = 0; // сбрасываем таймер контроля неответов for(byte i = 0; i<n; i++) crc+=MessageRx_PCM[i]; // прибавляем к контрольной сумме старт байты // если контрольная сумма верна: if ( crc == MessageRx_PCM[message_size+n]) { #ifdef debugPCM Serial.print (F("Received message is OK! Checksum is correct!")); Serial.print (F(" ")); Serial.println (millis()); // Если КС совпала, тут чёнибудь нужное делаем printDebugRX_CSgood(); #endif if (MessageRx_PCM[n]==0xC1 && MessageRx_PCM[n+1]==0x6B && MessageRx_PCM[n+2]==0x8F) { if (currentPage!=3) {request = PID; RequestPeriod = 70;} else request = DTCREAD, RequestPeriod = 3000; prevRequest = curmillis; // receive good INIT } else if (MessageRx_PCM[n]==0x58) Troublecodes (); // DTC else if (MessageRx_PCM[n]==0x54 && MessageRx_PCM[n+1]==0xFF && MessageRx_PCM[n+2]==0x00){ request = DTCREAD; RequestPeriod = 3000; prevRequest = curmillis;} // DTC are cleared else if (MessageRx_PCM[n]==0x61 && MessageRx_PCM[n+1]==0x01) {dataVars() ; RequestPeriod = 70; prevRequest = curmillis; } // receive DataStream } // если контрольная сумма не совпала: #ifdef debugPCM else Serial.println("CRC fail!!!" ); #endif message_size = 0; header=0; RESETheader_timer = 0; j=3; crc = 0; } // таймер ожидания байт (для успевания появления данных в буфере UART) if (!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1; // таймер сброса целостности сообщения (если данные оборвались посередине сообщения) if (RESETheader_timer && curmillis - prevRESETheader > 200) { #ifdef debugPCM Serial.println(F("Message fail timeout")); #endif RESETheader_timer = 0; header = 0;} // если нет ответа после запроса: +1 к счетчику неответов. Если накопилось 6 и более: делаем реинит. if (request!=INIT && NOanswer_timer && curmillis - prev_NOanswer > RequestPeriod - RequestPeriod/10) { NOanswer_timer = 0; noanswers++; if (noanswers>=6) { noanswers = 0; request = INIT; RequestPeriod = 3500;} } }// end receivePCM void Troublecodes () { if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1]==0x00){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("NO DTC", 165, 145); Serial.println (" NO DTC "); } //при получении этого сообщения выдавать на третий экран "DTC BORRADO" if (MessageRx_PCM[n]==0x54 && MessageRx_PCM[n+1]==0xFF && MessageRx_PCM[n+2]==0x00){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("DTC BORRADO", 165, 145); Serial.println (" DTC BORRADO "); } // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1]>0){ Serial.println ("DTC is found!"); myGLCD.clrScr(); drawscreen_three(); for (int i=0; i<MessageRx_PCM[n+8-7]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; if (!bitRead(MessageRx_PCM[n+11-7+(i*3)],6) && bitRead(MessageRx_PCM[n+11-7+(i*3)],7)){ myGLCD.setColor (0,255,0); myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет зеленый if (bitRead(MessageRx_PCM[n+11-7+(i*3)],7) && bitRead(MessageRx_PCM[n+11-7+(i*3)],6)) {myGLCD.setColor (255,0,0); myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет красный myGLCD.print("ERROR ", 50, (75+y)); myGLCD.printNumI((i+1), 150, (75+y)); if (!bitRead(MessageRx_PCM[n+9-7+(i*3)],6) && !bitRead(MessageRx_PCM[n+9-7+(i*3)],7)) myGLCD.print(": P", 170, (75+y)); if (bitRead(MessageRx_PCM[n+9-7+(i*3)],6) && !bitRead(MessageRx_PCM[n+9-7+(i*3)],7)) myGLCD.print(": C", 170, (75+y)); if (!bitRead(MessageRx_PCM[n+9-7+(i*3)],6) && bitRead(MessageRx_PCM[n+9-7+(i*3)],7)) myGLCD.print(": B", 170, (75+y)); if (bitRead(MessageRx_PCM[n+9-7+(i*3)],6) && bitRead(MessageRx_PCM[n+9-7+(i*3)],7)) myGLCD.print(": U", 170, (75+y)); if (MessageRx_PCM[n+9-7+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;} if (MessageRx_PCM[n+9-7+(i*3)]<=0x0F&&MessageRx_PCM[n+9-7+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;} if (nolA)myGLCD.print(String (MessageRx_PCM[n+9-7+(i*3)],HEX), 246, (75+y)); else myGLCD.print(String (MessageRx_PCM[n+9-7+(i*3)],HEX), 230, (75+y)); if (MessageRx_PCM[n+10-7+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;} if (MessageRx_PCM[n+10-7+(i*3)]<=0x0F&&MessageRx_PCM[n+10-7+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} if (nolB)myGLCD.print(String (MessageRx_PCM[n+10-7+(i*3)]),HEX, 278, (75+y)); else myGLCD.print(String (MessageRx_PCM[n+10-7+(i*3)],HEX), 262, (75+y));}} } void dataVars() { //Barom = MessageRx_PCM[39]; L100 = (float)LHor*100.0/(float)Speed; LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85; MAF = ((MessageRx_PCM[n+22]*256)+MessageRx_PCM[n+23])/10; BoostPres = ((MessageRx_PCM[n+24]*256)+MessageRx_PCM[n+25])/1000.0; RPM = (MessageRx_PCM[n+35-7]*256)+MessageRx_PCM[n+36-7]; EGRmg = ((MessageRx_PCM[n+37-7]*256)+MessageRx_PCM[n+38-7])/10.0; BoostPresCom = ((MessageRx_PCM[n+41-7]*256)+MessageRx_PCM[n+42-7])/1000.0; Speed = ((MessageRx_PCM[n+47-7]*256)+MessageRx_PCM[n+48-7])/100; DesaInjQua = ((MessageRx_PCM[n+53-7]*256)+MessageRx_PCM[n+54-7])/100.0; InjQua = ((MessageRx_PCM[n+55-7]*256)+MessageRx_PCM[n+56-7])/100.0; StaDaliv = ((MessageRx_PCM[n+57-7]*256)+MessageRx_PCM[n+58-7])/100.0; PumpRPM = (MessageRx_PCM[n+59-7]*256)+MessageRx_PCM[n+60-7]; EGRPul = ((MessageRx_PCM[n+65-7]*256)+MessageRx_PCM[n+66-7])/100.0; SolenPul = ((MessageRx_PCM[n+67-7]*256)+MessageRx_PCM[n+68-7])/100.0; SolenPre = ((MessageRx_PCM[n+73-7]*256)+MessageRx_PCM[n+74-7])/100.0; DesInj = ((MessageRx_PCM[n+75-7]*3)+(MessageRx_PCM[n+76-7])/100.0)+0.3; ActInj = ((MessageRx_PCM[n+19-7]*3)+(MessageRx_PCM[n+20-7])/100.0)+0.3; //TempAir = ((MessageRx_PCM[n+77-7]*26)-278)+MessageRx_PCM[n+78-7]/10.0; //Temp = ((MessageRx_PCM[n+17-7]*26)-278)+MessageRx_PCM[n+18-7]/10.0; //TempOil = ((MessageRx_PCM[n+21-7]*26)-278)+MessageRx_PCM[n+22-7]/10.0; //TempFuel = ((MessageRx_PCM[n+61-7]*26)-278)+MessageRx_PCM[n+62-7]/10.0; //ниже идут расчетные формулы более точные чем те что закоментированы выше int A = 0; if (MessageRx_PCM[n+77-7]<=0x0A) A = 277; if (MessageRx_PCM[n+77-7]==0x0B || MessageRx_PCM[n+77-7]==0x0C) A = 278; if (MessageRx_PCM[n+77-7]>=0x0D) A = 279; double B = MessageRx_PCM[n+78-7]/10.0; double cel , drob ; drob = modf(B, &cel); if (drob>0.6) cel++; TempAir = ((MessageRx_PCM[n+77-7]*26)-A)+cel; if (MessageRx_PCM[n+17-7]<=0x0A) A = 277; if (MessageRx_PCM[n+17-7]==0x0B || MessageRx_PCM[n+17-7]==0x0C) A = 278; if (MessageRx_PCM[n+17-7]>=0x0D) A = 279; B = MessageRx_PCM[n+18-7]/10.0; drob = modf(B, &cel); if (drob>0.6) cel++; Temp = ((MessageRx_PCM[n+17-7]*26)-A)+cel; if (MessageRx_PCM[n+21-7]<=0x0A) A = 277; if (MessageRx_PCM[n+21-7]==0x0B || MessageRx_PCM[n+21-7]==0x0C) A = 278; if (MessageRx_PCM[n+21-7]>=0x0D) A = 279; B = MessageRx_PCM[n+22-7]/10.0; drob = modf(B, &cel); if (drob>0.6) cel++; TempOil = ((MessageRx_PCM[n+21-7]*26)-A)+cel; if (MessageRx_PCM[n+61-7]<=0x0A) A = 277; if (MessageRx_PCM[n+61-7]==0x0B || MessageRx_PCM[n+61-7]==0x0C) A = 278; if (MessageRx_PCM[n+61-7]>=0x0D) A = 279; B = MessageRx_PCM[n+62-7]/10.0; drob = modf(B, &cel); if (drob>0.6) cel++; TempFuel = ((MessageRx_PCM[n+61-7]*26)-A)+cel; myGLCD.setColor(255, 255, 255); //цвет текста myGLCD.printNumI(Speed, 350, 7, 3); //---------------------------------------------------------- //страниц HOME //---------------------------------------------------------- if (currentPage == '0') { myGLCD.printNumF(LHor, 1, 60, 40, '.',5); myGLCD.printNumF(L100, 1, 210, 40,'.',5 ); myGLCD.printNumF(L100M, 1, 60, 75,'.',5 ); myGLCD.printNumF(L100SR_TFT, 1, 210, 75,'.',5 ); myGLCD.printNumI(kmREFUELING, 60, 110,5 ); //if (Fuel<53) myGLCD.printNumF(Fuel, 1, 210, 110,'.',5); //else myGLCD.print("MAX", 210, 110); myGLCD.printNumF(kmTrip, 1, 60, 145,'.',5); myGLCD.printNumF(FuelTrip, 1, 210, 145,'.',5); myGLCD.printNumI(PumpRPM, 210, 180,5); myGLCD.printNumI(RPM, 210, 215,5); myGLCD.printNumF(Fuel2, 1, 0, 215,'.',5); myGLCD.printNumI(Temp, 415, 40, 3); myGLCD.printNumI(TempOil, 415, 75, 3); myGLCD.printNumI(TempFuel, 415, 110,3); // myGLCD.printNumI(sensors.getTempCByIndex(0), 415, 145 , 3); myGLCD.printNumI(t, 415, 180, 3); myGLCD.printNumI(TempAir, 415, 215, 3); } //---------------------------------------------------------- //страниц INF1 //---------------------------------------------------------- if (currentPage == '1') { myGLCD.printNumF(StaDaliv,1, 360, 40,'.', 3); myGLCD.printNumF(DesInj,1, 395, 75, '.', 4); myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4); myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); myGLCD.printNumI(MAF, 170, 215, 4); myGLCD.printNumF(h, 1, 418, 215); } //---------------------------------------------------------- //страниц INF2 //---------------------------------------------------------- if (currentPage == '2') { myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4); myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); myGLCD.printNumI(EGRmg, 395, 110, 4); myGLCD.printNumF(EGRPul,1, 410, 145,'.', 3); myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4); myGLCD.printNumF(SolenPre, 0, 410, 215,'.', 3); } } void sendMessagePCM(const byte &command) { #ifdef debugPCM Serial.print (F("Send request ")); Serial.print (textRequest[command]); Serial.print (F(" to PCM ")); Serial.println (millis()); #endif if (command != INIT) {NOanswer_timer = 1; prev_NOanswer = curmillis;} //т.к. сейчас будем делать запрос, то запускаем таймер контроля неответов byte size = PCM_Message_TX[command][0]; const byte siZe = size+4; byte Mes[siZe]; byte Checksum = 0; for(byte i=0; i<siZe; i++) { if (i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);} if (i==1) Mes[i] = PCM_address; if (i==2) Mes[i] = DIAG_address; if (i==3) {for (byte t=1; t<size+1; t++ ) { Mes[i]=PCM_Message_TX [command][t]; Checksum+=Mes[i] ; K_LINE_PCM.write (Mes[i]); if (command == INIT) delay (5); delay (delaybyte_TX); K_LINE_PCM.read(); i++;}} if (i!=siZe-1) Checksum+=Mes[i]; else Mes[i] = Checksum; K_LINE_PCM.write (Mes[i]); if (command == INIT) delay (5); else delay (delaybyte_TX); K_LINE_PCM.read(); } }// end sendMessagePCM #if defined debugPCM or debugGAUGE void printDebugRX (const byte &inbyte) {if (inbyte<=15) Serial.print(F("0")); Serial.print (inbyte, HEX); Serial.print (F(" "));} #endif #ifdef debugPCM void printDebugRX_CSgood(){ if (MessageRx_PCM[n]==0xC1 && MessageRx_PCM[n+1]==0x6B && MessageRx_PCM[n+2]==0x8F) {Serial.println (F(" Initialization OK!!!!")); } else if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1]==0x00) {Serial.println (F(" NO DTC "));} else if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1] >0x00) {Serial.println (F(" DTC is found!"));} else if (MessageRx_PCM[n]==0x54 && MessageRx_PCM[n+1]==0xFF && MessageRx_PCM[n+2]==0x00){Serial.println (F(" DTC CLEARED "));} else if (MessageRx_PCM[n]==0x61 && MessageRx_PCM[n+1]==0x01) {Serial.println (F(" Receive PCM DATAstream"));}} #endif void Menu () { if (currentPage == '0') { TouchHOME(); TouchINF1(); TouchINF2(); TouchCHECK(); } if (currentPage == '1') { TouchHOME(); TouchINF2(); TouchCHECK(); } if (currentPage == '2') { TouchHOME(); TouchINF1(); TouchCHECK(); } if (currentPage == '3') { TouchHOME(); TouchREAD(); TouchERASE(); }} void drawHomeScreen() { line() ; Watch (); myGLCD.setColor(255, 0, 0); // цвет линии и текста красный myGLCD.drawLine(295,35,295,248); // линия вертикальная myGLCD.drawLine(145,35,145,178); // линия вертикальная myGLCD.drawLine(80,178,80,247); // линия вертикальная myGLCD.print("L/H", 10, 40); myGLCD.print("L/A", 148, 40); myGLCD.print("L/V", 10, 75); myGLCD.print("L/M", 148, 75); myGLCD.print("D/K", 10, 110); myGLCD.print("D/L", 148, 110); myGLCD.print("V/K", 10, 145); myGLCD.print("V/L", 148, 145); myGLCD.print("PUMP RPM", 82, 180); myGLCD.print("ENGI RPM", 82, 215); myGLCD.print("D/La", 10, 180); myGLCD.print("Motor C", 300, 40); myGLCD.print("OIL C", 300, 75); myGLCD.print("FUEL C", 300, 110); myGLCD.print("INTER C", 300, 145); myGLCD.print("EXTER C", 300, 180); myGLCD.print("INTAIR C", 300, 215); myGLCD.drawRoundRect (15, 255, 145, 310); myGLCD.print("INF 1", 55, 270); myGLCD.drawRoundRect (175, 255, 305, 310); myGLCD.print("INF 2", 215, 270); myGLCD.drawRoundRect (335, 255, 465, 310); myGLCD.print("CHECK", 365, 270); myGLCD.drawRoundRect (1, 1, 77, 37); myGLCD.print("HOME", 10, 7); myGLCD.print("Km/h", 410, 7); } //------------------------------------------------- void drawscreen_one() { line() ; Watch (); myGLCD.setColor(255, 0, 0); // цвет линии и текста красный myGLCD.print("Start of Delivery *CA:", 10, 40); myGLCD.print("Desir inject Start *CA:", 10, 75); myGLCD.print("Actua Inject Start *CA:", 10, 110); myGLCD.print("Desir Inject Quan mg/s:", 10, 145); myGLCD.print("Actu Inject Quant mg/s:", 10, 180); myGLCD.print("MAF mg/s:", 10, 215); myGLCD.print("Humedad %:", 255, 215); myGLCD.drawRoundRect (175, 255, 305, 310); myGLCD.print("INF 2", 215, 270); myGLCD.drawRoundRect (335, 255, 465, 310); myGLCD.print("CHECK", 365, 270); myGLCD.drawRoundRect (1, 1, 77, 37); myGLCD.print("HOME", 10, 7); myGLCD.print("Km/h", 410, 7); } //------------------------------------------------- void drawscreen_two() { line() ; Watch (); myGLCD.setColor(255, 0, 0); // цвет линии и текста красный myGLCD.print("Boost Press Bar:", 10, 40); myGLCD.print("Boost Press Com Bar:", 10, 75); myGLCD.print("EGR command mg/s:", 10, 110); myGLCD.print("EGR Pulse Ratio %:", 10, 145); myGLCD.print("Solenoide Pulse %:", 10, 180); myGLCD.print("Solenoide Boost %:", 10, 215); myGLCD.drawRoundRect (15, 255, 145, 310); myGLCD.print("INF 1", 55, 270); myGLCD.drawRoundRect (335, 255, 465, 310); myGLCD.print("CHECK", 365, 270); myGLCD.drawRoundRect (1, 1, 77, 37); myGLCD.print("HOME", 10, 7); myGLCD.print("Km/h", 410, 7); } //---------------------------------------------------------------------------- void drawscreen_three() { Watch (); myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная myGLCD.drawRoundRect (15, 255, 145, 310); myGLCD.print("ERASE", 55, 270); myGLCD.drawRoundRect (335, 255, 465, 310); myGLCD.print("READ", 365, 270); myGLCD.drawRoundRect (1, 1, 77, 37); myGLCD.print("HOME", 10, 5); myGLCD.print("Km/h", 410, 3); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //кнопки тач . координаты и переходы ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void TouchHOME(){ TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); if (p.z > 10 && p.z < 1000) {if (p.x > 140 && p.x < 320 && p.y > 140 && p.y < 260 && p.z > MINPRESSURE && p.z < MAXPRESSURE) { myGLCD.drawRoundRect (1, 1, 77, 37); currentPage = '0'; request = PID; RequestPeriod = 600; prevRequest = curmillis; // на PCM в этом окне посылается запрос текущих параметров myGLCD.clrScr(); drawHomeScreen(); x = 0; y = 0; p.z = 0;}}} void TouchINF1(){ TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); if (p.z > 10 && p.z < 1000) { if (p.x > 150 && p.x < 450 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE) { myGLCD.drawRoundRect (15, 255, 145, 310); currentPage = '1'; request = PID; RequestPeriod = 600; prevRequest = curmillis; // на PCM в этом окне посылается запрос текущих параметров myGLCD.clrScr(); drawscreen_one(); x = 0; y = 0; p.z = 0;}}} void TouchINF2(){ TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); if (p.z > 10 && p.z < 1000) { if (p.x > 450 && p.x < 680 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE) { myGLCD.drawRoundRect (175, 255, 305, 310); currentPage = '2'; request = PID; RequestPeriod = 600; prevRequest = curmillis; // на PCM в этом окне посылается запрос текущих параметров myGLCD.clrScr(); drawscreen_two(); x = 0; y = 0; p.z = 0;}}} void TouchCHECK(){ TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); if (p.z > 10 && p.z < 1000) { if (p.x > 690 && p.x < 950 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE) { myGLCD.drawRoundRect (335, 255, 465, 310); currentPage = '3'; request = DTCREAD; RequestPeriod = 3000; prevRequest = curmillis; // на PCM в этом окне посылается запрос чтения ошибок myGLCD.clrScr(); drawscreen_three(); x = 0; y = 0; p.z = 0;}}} void TouchREAD(){ TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); if (p.z > 10 && p.z < 1000) { if (p.x > 690 && p.x < 950 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE) { myGLCD.drawRoundRect (335, 255, 465, 310); request = DTCREAD; RequestPeriod = 3000; prevRequest = curmillis; // на PCM при нажатии этой кнопки посылается запрос чтения ошибок x = 0; y = 0; p.z = 0;}}} void TouchERASE(){ TSPoint p = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); if (p.z > 10 && p.z < 1000) { if (p.x > 150 && p.x < 450 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE) { myGLCD.drawRoundRect (15, 255, 145, 310); request = DTCERASE; RequestPeriod = 3000; prevRequest = curmillis; // на PCM при нажатии этой кнопки посылается запрос удаления ошибок x = 0; y = 0; p.z = 0;}}} //////////////////////////////////////////////////////////////////////////////////////// //прорисовка линий /////////////////////////////////////////////////////////////////////////////////////// void line() { myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,73,479,73); // линия горизонтальная myGLCD.drawLine(1,108,479,108); // линия горизонтальная myGLCD.drawLine(1,143,479,143); // линия горизонтальная myGLCD.drawLine(1,178,479,178); // линия горизонтальная myGLCD.drawLine(1,212,479,212); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная } void Watch (){ DateTime now = rtc.now(); int m = now.minute(); int hour = now.hour(); int mon = now.month(); int date = now.day(); myGLCD.setColor(255, 255, 255); //белый цвет цифры if (date<10) { myGLCD.print("0", 85, 7); myGLCD.printNumI(now.day(), 100, 7); } else if (date >=10) { myGLCD.printNumI(now.day(), 85, 7); } myGLCD.print("/", 115, 7); if ( mon<10) { myGLCD.print("0", 130, 7); myGLCD.printNumI(now.month(), 145, 7);} else if (mon >=10) { myGLCD.printNumI(now.month(), 130, 7);} myGLCD.print("/", 160, 7); myGLCD.printNumI(now.year(), 175, 7); if (hour<10) { myGLCD.print("0",255, 7); myGLCD.printNumI(now.hour(), 270, 7); } else if(hour>=10){ myGLCD.printNumI(now.hour(), 255, 7); } if (m<10) { myGLCD.print("0",300, 7); myGLCD.printNumI(now.minute(), 315, 7); } else if (m>=10){ myGLCD.printNumI(now.minute(), 300, 7); } }остался шрифт :) ща разберусь
что выглядит?
Мне бы фото / видео ...
Я сижу и чиню "черную коробку" ! с чужим кодом
MaksVV Вы не богаты алгоритмами поддержания скорости круиз-контроля ?
ща доработаю шриф и сниму видео и кину на ютуб, потом кину сюда. Макс тебе в очередной раз огромное сапсибо. ТЫ ГЕНИЙ я два года уже об этом говорю. Командир тебе тоже огромное спасибо за подсказку. ждите видео
отлично что костыль заработал. я думал тач будет реально тормозить. скинь лог для прикола.
по оффтоплю . не богат по круизу. а машина то какая и что сделатьь надо?
лог
Send request INIT to PCM 5052 Receive PCM: 83 F1 11 C1 6B 8F 40 Received message is OK! Checksum is correct! 5139 Initialization OK!!!! Send request PID_2101 to PCM 5211 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 3A 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 70 03 9E 00 02 21 Received message is OK! Checksum is correct! 5445 Receive PCM DATAstream Send request PID_2101 to PCM 5842 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 70 03 9F 00 02 20 Received message is OK! Checksum is correct! 6075 Receive PCM DATAstream Send request PID_2101 to PCM 6549 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 38 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 70 03 9E 00 02 21 Received message is OK! Checksum is correct! 6786 Receive PCM DATAstream Send request PID_2101 to PCM 7183 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 70 03 9E 00 02 1F Received message is OK! Checksum is correct! 7420 Receive PCM DATAstream Send request PID_2101 to PCM 7818 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 72 03 9E 00 02 22 Received message is OK! Checksum is correct! 8052 Receive PCM DATAstream Send request PID_2101 to PCM 8450 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 72 03 9E 00 02 23 Received message is OK! Checksum is correct! 8684 Receive PCM DATAstream Send request PID_2101 to PCM 9081 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 08 93 0C 72 03 9F 00 02 23 Message fail timeout Send request PID_2101 to PCM 9684 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E6 00 00 0C 97 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 72 03 9E 00 02 21 Received message is OK! Checksum is correct! 9927 Receive PCM DATAstream Send request PID_2101 to PCM 10324 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9F 00 02 24 Received message is OK! Checksum is correct! 10555 Receive PCM DATAstream Send request PID_2101 to PCM 10952 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 73 03 9E 00 02 27 Received message is OK! Checksum is correct! 11191 Receive PCM DATAstream Send request PID_2101 to PCM 11588 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 97 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9E 00 02 21 Received message is OK! Checksum is correct! 11819 Receive PCM DATAstream Send request PID_2101 to PCM 12216 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 08 01 20 00 00 01 93 0C 73 03 9F 02 22 Message fail timeout Send request PID_2101 to PCM 12818 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9E 00 02 23 Received message is OK! Checksum is correct! 13066 Receive PCM DATAstream Send request PID_2101 to PCM 13463 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 97 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 26 Received message is OK! Checksum is correct! 13696 Receive PCM DATAstream Send request PID_2101 to PCM 14093 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 97 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 72 03 9E 00 02 22 Received message is OK! Checksum is correct! 14330 Receive PCM DATAstream Send request PID_2101 to PCM 14728 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9F 00 02 21 Received message is OK! Checksum is correct! 14960 Receive PCM DATAstream Send request PID_2101 to PCM 15357 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 00 00 01 93 0C 73 03 9F 00 02 23 Message fail timeout Send request PID_2101 to PCM 15960 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9F 00 02 1F Received message is OK! Checksum is correct! 16201 Receive PCM DATAstream Send request PID_2101 to PCM 16599 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 38 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 73 03 9E 00 02 27 Received message is OK! Checksum is correct! 16837 Receive PCM DATAstream Send request PID_2101 to PCM 17234 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 73 03 9E 00 02 24 Received message is OK! Checksum is correct! 17465 Receive PCM DATAstream Send request PID_2101 to PCM 17862 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 73 03 9E 00 02 23 Received message is OK! Checksum is correct! 18101 Receive PCM DATAstream Send request PID_2101 to PCM 18498 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 00 01 93 0C 75 03 9E 00 02 23 Message fail timeout Send request PID_2101 to PCM 19101 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 96 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 24 Received message is OK! Checksum is correct! 19344 Receive PCM DATAstream Send request PID_2101 to PCM 19741 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9F 00 02 25 Received message is OK! Checksum is correct! 19978 Receive PCM DATAstream Send request PID_2101 to PCM 20375 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 96 00 00 02 71 00 00 00 00 04 33 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9F 00 02 23 Received message is OK! Checksum is correct! 20608 Receive PCM DATAstream Send request PID_2101 to PCM 21005 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 30 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9F 00 02 20 Received message is OK! Checksum is correct! 21240 Receive PCM DATAstream Send request PID_2101 to PCM 21638 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 72 00 00 00 00 04 37 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 00 00 01 93 0C 75 03 9E 00 02 25 Message fail timeout Send request PID_2101 to PCM 22240 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 73 03 9E 00 02 21 Received message is OK! Checksum is correct! 22481 Receive PCM DATAstream Send request PID_2101 to PCM 22879 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 22 Received message is OK! Checksum is correct! 23117 Receive PCM DATAstream Send request PID_2101 to PCM 23515 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 01 20 00 00 01 93 0C 75 03 9E 00 02 26 Received message is OK! Checksum is correct! 23745 Receive PCM DATAstream Send request PID_2101 to PCM 24142 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 25 Received message is OK! Checksum is correct! 24381 Receive PCM DATAstream Send request PID_2101 to PCM 24778 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 36 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 00 00 01 93 0C 75 03 9F 00 02 26 Message fail timeout Send request PID_2101 to PCM 25380 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9F 00 02 26 Received message is OK! Checksum is correct! 25628 Receive PCM DATAstream Send request PID_2101 to PCM 26025 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 33 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9F 00 02 24 Received message is OK! Checksum is correct! 26256 Receive PCM DATAstream Send request PID_2101 to PCM 26653 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 97 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 22 Received message is OK! Checksum is correct! 26894 Receive PCM DATAstream Send request PID_2101 to PCM 27291 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 75 03 9E 00 02 23 Received message is OK! Checksum is correct! 27524 Receive PCM DATAstream Send request PID_2101 to PCM 27921 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 70 00 00 00 00 04 35 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 00 01 93 0C 75 03 9E 00 02 29 Message fail timeout Send request PID_2101 to PCM 28523 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 01 20 00 00 01 93 0C 76 03 9E 00 02 25 Received message is OK! Checksum is correct! 28762 Receive PCM DATAstream Send request PID_2101 to PCM 29159 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 96 00 00 02 71 00 00 00 00 04 36 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 75 03 9E 00 02 28 Received message is OK! Checksum is correct! 29398 Receive PCM DATAstream Send request PID_2101 to PCM 29795 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 75 03 9E 00 02 1F Received message is OK! Checksum is correct! 30027 Receive PCM DATAstream Send request PID_2101 to PCM 30425 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 75 03 9E 00 02 24 Received message is OK! Checksum is correct! 30659 Receive PCM DATAstream Send request PID_2101 to PCM 31056 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E9 00 00 0C 96 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8B A0 00 01 90 00 00 20 00 00 01 93 0C 76 03 9F 00 02 23 Message fail timeout Send request PID_2101 to PCM 31657 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9F 00 02 24 Received message is OK! Checksum is correct! 31888 Receive PCM DATAstream Send request PID_2101 to PCM 32285 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 96 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 25 Received message is OK! Checksum is correct! 32522 Receive PCM DATAstream Send request PID_2101 to PCM 32919 Send request PID_2101 to PCM 33523 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 76 03 9E 00 02 2B Received message is OK! Checksum is correct! 33766 Receive PCM DATAstream Send request PID_2101 to PCM 34163 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 A9 00 01 93 0C 76 03 9E 00 02 26 Message fail timeout Send request PID_2101 to PCM 34765 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 76 03 9F 00 02 28 Received message is OK! Checksum is correct! 35009 Receive PCM DATAstream Send request PID_2101 to PCM 35406 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 22 Received message is OK! Checksum is correct! 35643 Receive PCM DATAstream Send request PID_2101 to PCM 36040 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 76 03 9F 00 02 27 Received message is OK! Checksum is correct! 36273 Receive PCM DATAstream Send request PID_2101 to PCM 36670 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 94 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9F 00 02 24 Received message is OK! Checksum is correct! 36907 Receive PCM DATAstream Send request PID_2101 to PCM 37304 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 94 00 00 02 71 00 00 00 00 04 33 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 3B 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 A9 01 93 0C 76 03 9F 00 02 24 Message fail timeout Send request PID_2101 to PCM 37905 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 35 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 24 Received message is OK! Checksum is correct! 38148 Receive PCM DATAstream Send request PID_2101 to PCM 38545 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 38 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 27 Received message is OK! Checksum is correct! 38780 Receive PCM DATAstream Send request PID_2101 to PCM 39178 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 38 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 28 Received message is OK! Checksum is correct! 39414 Receive PCM DATAstream Send request PID_2101 to PCM 39812 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 76 03 9E 00 02 26 Received message is OK! Checksum is correct! 40044 Receive PCM DATAstream Send request PID_2101 to PCM 40441 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 00 00 01 93 0C 77 03 9E 00 02 27 Message fail timeout Send request PID_2101 to PCM 41043 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 37 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 77 03 9E 00 02 26 Received message is OK! Checksum is correct! 41275 Receive PCM DATAstream Send request PID_2101 to PCM 41672 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 94 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 AD 08 00 20 00 00 01 93 0C 77 03 9F 00 02 29 Received message is OK! Checksum is correct! 41905 Receive PCM DATAstream Send request PID_2101 to PCM 42302 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 38 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 77 03 9F 00 02 2A Received message is OK! Checksum is correct! 42534 Receive PCM DATAstream Send request PID_2101 to PCM 42932 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 79 03 9F 00 02 26 Received message is OK! Checksum is correct! 43168 Receive PCM DATAstream Send request PID_2101 to PCM 43566 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 71 00 00 00 00 04 34 00 00 00 00 32 C8 03 9E 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 A9 00 01 93 0C 77 03 9E 00 02 24 Message fail timeout Send request PID_2101 to PCM 44169 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 77 03 9E 00 02 23 Received message is OK! Checksum is correct! 44410 Receive PCM DATAstream Send request PID_2101 to PCM 44808 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 34 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 39 00 00 00 00 08 DB 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 77 03 9E 00 02 24 Received message is OK! Checksum is correct! 45038 Receive PCM DATAstream Send request PID_2101 to PCM 45435 Receive PCM: 80 F1 11 4C 61 01 00 00 00 00 00 00 00 00 0C E8 00 00 0C 95 00 00 02 70 00 00 00 00 04 33 00 00 00 00 32 C8 03 9F 04 29 03 20 E5 62 00 00 00 00 10 38 00 00 00 00 08 DC 00 00 0C 8E A0 00 01 90 00 00 A9 08 00 20 00 00 01 93 0C 77 03 9E 00 02 23 Received message is OK! Checksum is correct! 45674 Receive PCM DATAstreamне прописываею шрифт только размер прописываю myGLCD.setTextSize(2); не мигает но шрифт меньше чем нужен и шире.
любой адафрутовский шриф myGLCD.setFont(&FreeSerifItalic12pt7b); блин мигает.....
MaksVV машина Subaru c электронной педалью акселератора.
железо уже сделано: 32U4 общается с ЭБУ, с GPS, выводит на OLED по I2C, отслеживает нажатия SKRHABE10, отслеживает уровень от родной педали, отслеживает сигналы от датчика скорости, выставляет уровень замещающий родную педаль через ЦАП по I2C. Сброс по тормозу, сцеплению, нейтрали - аппартный.
Всё это работает. Изучаю алгоритмы поддержания скорости ориентируясь на сигналы с датчика скорости.
viki13viki дисплей прямого отображения что ли ? Нельзя ли формировать картинку в буфере и целиком за раз обновлять ?
извени я не програмист, я художник и музыкант:(
не прописываею шрифт только размер прописываю myGLCD.setTextSize(2); не мигает но шрифт меньше чем нужен и шире.
любой адафрутовский шриф myGLCD.setFont(&FreeSerifItalic12pt7b); блин мигает.....
особенность библиотеки. При использовании встроенных шрифтов у каждого символа есть фон, который затирает прежнюю надпись. А у Адафрутовских шрифтов фона нет. если их выводить непосредственно - новые символы будут накладываться на старые. Поэтому при выводе такого шрифта сначала выполняется заливка старого текста цветом фона, а потом выводится новый - вот это и видно как "мигание".
бороться - либо борать более быстрый МК. либо кардинально переписывать библиотеку.
Придётся видимо порисовать и заменить родной шрифт в библиотеке на нужный без привлечения сторонних источников ...
тоесть Командир найти в библе адафруита стандартный шрифт и перерисовать его на свой? вопрос где он лежит в font лежат шрифты но там нет стандарт или чета похожее......... я бы поигрался бы и перерисовл , я же художник:) , порылся бы как это сделать...... на сколько я понимаю так как он работает через конветрер <UTFTGLUE.h> то он использует стандартный шрифт UTFT библы? правильно?