переводчик (драйвера экрана) либо UTFT.h (для твоего старого экрана), либо UTFTGLUE.h либо MCUFRIEND_kbv.h . Вместе их не надо. Последние две подходят для твоего нового экрана.
UTFTGLUE совместима по функциям с твоим новым экраном, но вроде как тормозит. MCUFRIEND_kbv.h имеет другие функции и фиг знает тормозит или нет.
и напиши простой скетч с периодическим выводом на экран статических переменных (пусть они будут, но не обновляются от эбу, чтоб скетч был простой, а просто ++ каждый вывод на экран, ну хотябы пара переменных пусть наращивается). Будет ли мигать?
дак щас вообще не инитится эбу. это нужно подправить. а потом с миганиме разбератся буду. он же уже работал, после какихто последних подправок перестал общатся с эбу. нужно вернуть состояние когда он работал, пусть мигает, я буду копать. мне главное чтобы твоя система работала. остальное я уже разберусь
вот тебе скетч для проверки экрана, тормозит или нет
uint32_t prevData = 0;
uint32_t curmillis = 0;
#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>
UTFTGLUE myGLCD(0x1581a,A2,A1,A3,A4,A0);
float L100M = 0; //расход на 100 км измеренный за поездку
float L100 = 0; //мгновенный расход литров на 100км
float LHor = 0; //мгновенный расход топлива литров в час
float L100SR = 0; //расход литров на 100км измеренный раз в интервал kmL
float L100SR_TFT = 0; // самый средний из расходов на 100км, он выводится на экран
int L100_Eeprom[11]= {10,10,10,10,10,10,10,10,10,10,10};
int FuelZamer[10]= {0}; // массив для измерения уровня (количества) топлива
int ZamerNumber = 0; // номер замера уровня (количества) топлива
int n_eeprom = 0; // текущий адрес ячейки еепром для записи расхода
int MAF = 0; //26,27 байты Sensor de flujo de aire en masa
float BoostPres = 0; //28,29 байты Presión de refuerzo
int RPM = 0; //32,33 байты Velocidad del motor
int EGRmg = 0; //34,35 байты Comando EGR (Comando de recirculación de gases de escape)
float BoostPresCom = 0; //38,39 байты Comando de presión de refuerzo
int Speed = 0; //44,45 байты Velocidad del vehículo
float DesaInjQua = 0; //50,51 байты Cantidad de inyección deseada
float InjQua = 0; //52,53 байты Cantidad de la inyección
float StaDaliv = 0; //54,55 байты Inicio de la entrega
int PumpRPM = 0; //56,57 байты Velocidad de la bomba
float EGRPul = 0; //62,63 байты Relación de impulsos EGR (recirculación de gases de escape
float SolenPul = 0; //64,65 байты Velocidad de solenoide de control de nivel de remolino Relación de impulsos
float SolenPre = 0; //70,71 байты Relación de impulsos Presión Electroválvula de presión
float DesInj = 0; //72,73 байты Inyección deseada Inicio
float ActInj = 0; //16,17 байты Inicio de la inyección real
int TempAir = 0; //74,75 байты Temperatura del aire de admisión
int Temp = 0; //14,15 байты Temperatura del refrigerante
int TempOil = 0; //18,19 байты Temperatura del aceite del motor
int TempFuel = 0; //58,59 байты Temperatura del combustible
//все что касается топлива
float Fuel = 0; //остаток топлива
float Fuel2 = 0; //остаток мгновенного топлива байт 16 , датчика в баке
int FuelIGN = 0; // количество топлвива в баке на момент включения зажигания
int Fuel_last = 0; // для формул
bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания
float FuelTrip = 0; // количество литров топлива, израсходованное за один цикл включения зажигания
//все что касается километража
float kmAge = 0; //пробег, полученный со щитка приборов
int kmAgeIGN = 0; //пробег который был в момент включения зажигания
int kmAge_last = 0; // для формул
bool flagkmAgeIGN = 0; //флаг записан ли пробег в момент вкл. зажигания
float kmTrip = 0; //пробег за один цикл включения зажигания
int kmL = 10; // интервал, через который будет происходить обновление среднего расхода на 100км
int km = 0; // переменная для расчетов
int kmeeprom = 10; // интервал, через который будет происходить подсчет среднеарифмитического расхода L100SR_TFT
int kmTFT = 0; // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT
int kmREFUELING = 0; // пробег до заправки на остатке топлива
void setup() {
Serial.begin(115200);
myGLCD.InitLCD(3);
myGLCD.clrScr();
}
void loop() {
curmillis = millis();
LCDDataPrint();
}
void LCDDataPrint(){
if (curmillis - prevData > 50){
MAF++;
RPM ++;
EGRmg++;
Speed++;
PumpRPM++;
TempAir++;
Temp++;
TempOil++;
TempFuel++;
myGLCD.setColor(255, 255, 255); //цвет текста
//myGLCD.setBackColor(0,0,0); //затирание текста
//myGLCD.setTextColor(0xFFFF, 0x0000);
myGLCD.printNumI(Speed, 350, 7, 3);
myGLCD.printNumF(LHor, 1, 60, 40, '.',5);
myGLCD.printNumF(L100, 1, 210, 40,'.',5 );
myGLCD.printNumF(L100M, 1, 60, 75,'.',5 );
myGLCD.printNumF(L100SR_TFT, 1, 210, 75,'.',5 );
myGLCD.printNumI(kmREFUELING, 60, 110,5 );
myGLCD.printNumF(Fuel, 1, 210, 110,'.',5);
myGLCD.printNumF(kmTrip, 1, 60, 145,'.',5);
myGLCD.printNumF(FuelTrip, 1, 210, 145,'.',5);
myGLCD.printNumI(PumpRPM, 210, 180,5);
myGLCD.printNumI(RPM, 210, 215,5);
myGLCD.printNumF(Fuel2, 1, 0, 215,'.',5);
myGLCD.printNumI(Temp, 415, 40, 3);
myGLCD.printNumI(TempOil, 415, 75, 3);
myGLCD.printNumI(TempFuel, 415, 110,3);
// myGLCD.printNumI(sensors.getTempCByIndex(0), 415, 145 , 3);
myGLCD.printNumI(TempAir, 415, 215, 3);
prevData = curmillis;
// Serial.println(millis());
}}
да я выше написал. сабака бы его нюхала. все работает нужно ща доработать увеличить шрифт.я закоментил френад а помом по обибкам увидел шрифты. закоментил и все стало пучком . ща с шрифтом разберусь.....
тогда так. Вернул обновление данных на экране только по получению данных от PCM. Убрал шрифт, потом с ним разберёшся. По идее все символы маленькие должны стать.
#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
#include <UTFTGLUE.h>//use GLUE class and constructor
#include "TouchScreen.h"
#include <stdint.h>
#include <SPI.h>
#include <EEPROM.h>
MCUFRIEND_kbv tft;
//#include "Fonts/Gobold_Bold14pt7b.h";
#define MINPRESSURE 200
#define MAXPRESSURE 1000
//pin 20 SCL , 21 SDA датчик реального времени
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
UTFTGLUE myGLCD(0x1581,A2,A1,A3,A4,A0); //all dummy args
const int XP = 6, XM = A2, YP = A1, YM = 7;
const int TS_LEFT = 136, TS_RT = 907, TS_TOP = 139, TS_BOT = 942;
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
uint16_t ID;
int x, y;
char currentPage;
float h;
float t;
bool Dvoet = 0;
#include <SoftwareSerial.h>
#define TX_PCM 13
SoftwareSerial K_LINE_PCM (12, TX_PCM); //RХ,TХ
#define PCM_address 0x11 // адрес PCM
#define DIAG_address 0xF1 // адрес диагностики
#define debugPCM // раскоментировать эту строку для отладки в Serial порту обмена с PCM
//#define debugGAUGE // раскоментировать эту строку для отладки в Serial порту обмена co щитком приборов
uint32_t curmillis = 0; // снимок текущего времени
uint32_t prevRequest = 0; // таймер периодических запосов на PCM
uint16_t RequestPeriod = 3500; // периодичность запросов на PCM
uint32_t prevRESETheader=0; // таймер сброса сообщения, если данные оборвались посередине сообщения
bool RESETheader_timer; // таймер сброса сообщения, если данные оборвались посередине сообщения
uint32_t prev_NOanswer=0; // таймер контроля неответов от ЭБУ после подачи запросов
bool NOanswer_timer = 0; // таймер контроля неответов от ЭБУ после подачи запросов
byte noanswers = 0; // количество подряд неответов от ЭБУ
uint32_t timerdelay = 0; // таймер ожидания байт (для успевания появления данных в буфере UART)
bool Delay = 0; // таймер ожидания байт (для успевания появления данных в буфере UART)
byte waitbyte_RX = 1; // задержка, мс для успевания появления данных в буфере RX
// (подрегулировать в зависимости от уровня жизнидеятельности на Марсе)
#define TIMER_DELAY Delay = 0; timerdelay = curmillis // включение этого таймера
byte delaybyte_TX = 1; // задержка между отправкой байт в запросах, мс
byte header = 0; // состояние заголовка
byte message_size = 0; // размер тела сообщения
byte j = 3; // инкремент
byte n = 3; // количество старт байт
const byte bufsize = 150; // размер буфера принятого сообщения
byte MessageRx_PCM [bufsize] = {0}; // буфер принятого сообщения
byte crc =0; // байт контрольной суммы
// возможные варианты запросов на ЭБУ:
enum REQUEST {
INIT,
PID,
DTCERASE,
DTCREAD,
PRESENT,
};
// текстовки запросов для отладки
char* textRequest[] = {
"INIT",
"PID_2101",
"DTC_ERASE",
"DTC_READ",
"PRESENT",
} ;
// сами запросы
byte PCM_Message_TX[][5] = {
{1, 0x81, 0,0,0}, // запрос инициализации
{2, 0x21,0x01, 0,0}, // запрос пид 2101
{3, 0x14,0xFF,0x00, 0}, // запрос на стирание ошибок
{4, 0x18,0x00,0xFF,0x00 }, // запрос на чтение ошибок
{1, 0x3E, 0,0,0}, // запрос присутствия
};
byte request = INIT; // переменная, показывающая какой запрос будем делать
//-------------------------------------------переменные бортовика
float L100M = 0; //расход на 100 км измеренный за поездку
float L100 = 0; //мгновенный расход литров на 100км
float LHor = 0; //мгновенный расход топлива литров в час
float L100SR = 0; //расход литров на 100км измеренный раз в интервал kmL
float L100SR_TFT = 0; // самый средний из расходов на 100км, он выводится на экран
int L100_Eeprom[11]= {10,10,10,10,10,10,10,10,10,10,10};
int FuelZamer[10]= {0}; // массив для измерения уровня (количества) топлива
int ZamerNumber = 0; // номер замера уровня (количества) топлива
int n_eeprom = 0; // текущий адрес ячейки еепром для записи расхода
int MAF = 0; //26,27 байты Sensor de flujo de aire en masa
float BoostPres = 0; //28,29 байты Presión de refuerzo
int RPM = 0; //32,33 байты Velocidad del motor
int EGRmg = 0; //34,35 байты Comando EGR (Comando de recirculación de gases de escape)
float BoostPresCom = 0; //38,39 байты Comando de presión de refuerzo
int Speed = 0; //44,45 байты Velocidad del vehículo
float DesaInjQua = 0; //50,51 байты Cantidad de inyección deseada
float InjQua = 0; //52,53 байты Cantidad de la inyección
float StaDaliv = 0; //54,55 байты Inicio de la entrega
int PumpRPM = 0; //56,57 байты Velocidad de la bomba
float EGRPul = 0; //62,63 байты Relación de impulsos EGR (recirculación de gases de escape
float SolenPul = 0; //64,65 байты Velocidad de solenoide de control de nivel de remolino Relación de impulsos
float SolenPre = 0; //70,71 байты Relación de impulsos Presión Electroválvula de presión
float DesInj = 0; //72,73 байты Inyección deseada Inicio
float ActInj = 0; //16,17 байты Inicio de la inyección real
int TempAir = 0; //74,75 байты Temperatura del aire de admisión
int Temp = 0; //14,15 байты Temperatura del refrigerante
int TempOil = 0; //18,19 байты Temperatura del aceite del motor
int TempFuel = 0; //58,59 байты Temperatura del combustible
//все что касается топлива
float Fuel = 0; //остаток топлива
float Fuel2 = 0; //остаток мгновенного топлива байт 16 , датчика в баке
int FuelIGN = 0; // количество топлвива в баке на момент включения зажигания
int Fuel_last = 0; // для формул
bool flagFuelIGN = 0; // флаг записан ли остаток топлива в момент вкл. зажигания
float FuelTrip = 0; // количество литров топлива, израсходованное за один цикл включения зажигания
//все что касается километража
float kmAge = 0; //пробег, полученный со щитка приборов
int kmAgeIGN = 0; //пробег который был в момент включения зажигания
int kmAge_last = 0; // для формул
bool flagkmAgeIGN = 0; //флаг записан ли пробег в момент вкл. зажигания
float kmTrip = 0; //пробег за один цикл включения зажигания
int kmL = 10; // интервал, через который будет происходить обновление среднего расхода на 100км
int km = 0; // переменная для расчетов
int kmeeprom = 10; // интервал, через который будет происходить подсчет среднеарифмитического расхода L100SR_TFT
int kmTFT = 0; // переменная для расчетов периодического подсчета среднеарифмитического расхода топлива L100SR_TFT
int kmREFUELING = 0; // пробег до заправки на остатке топлива
unsigned long prevWatch = 0;
unsigned long prevDvoet = 0;
unsigned long prevData = 0;
void setup() {
uint16_t ID = myGLCD.readID();
if (ID == 0xD3D3) ID = 0x1581; // write-only shield
myGLCD.begin(ID);
myGLCD.InitLCD(3);
myGLCD.clrScr();
//myGLCD.setFont(&Gobold_Bold14pt7b);
Wire.begin();
rtc.begin();
//загрузка стартовой страницы
currentPage = '0';
drawHomeScreen();
//подсчет среднеарифметического усредненного расхода
for (int i = 0; i < 11; i++) L100_Eeprom [i]= EEPROM.read(i);
for (int i = 0; i < 11; i++) L100SR_TFT = L100SR_TFT + L100_Eeprom [i];
L100SR_TFT = (float)L100SR_TFT/110.0;
if (L100SR_TFT<0) L100SR_TFT = 0;
if (L100SR_TFT>99) L100SR_TFT = 99;
// строка ниже используется для настройки даты и времени часов
// раскоментировать, выставить времая и дату, залить в ардуино. в скетче закоментировать
// обратно и залить еще раз, иначе каждый раз будет по новой выствлятся это же время и дата
// (год, месяц, день, часы, минуты, секунды)
//rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0));
#if defined debugPCM or debugGAUGE
Serial.begin(115200);
#endif
K_LINE_PCM.begin(10400);
pinMode(TX_PCM, OUTPUT);
}
void loop()
{
curmillis = millis(); // снимок текущего времени
if (curmillis - prevRequest > RequestPeriod && header == 0)
{
if (request == INIT) fastinit(); // при необходимости делаем переподключение к PCM
else {sendMessagePCM(request); if (request == PID) RequestPeriod = 600; } // отправляем на PCM текущий запрос
prevRequest = curmillis;
}
receivePCM (); // приём сообщений от PCM
Menu ();
if (curmillis - prevWatch > 3000) { Watch (); prevWatch = curmillis;}
if (curmillis - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 290, 5);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curmillis; Dvoet=!Dvoet;}
}// end loop
void fastinit() {
digitalWrite (TX_PCM, HIGH); // bus idle
delay(1500);
digitalWrite (TX_PCM, LOW); // first part fastinit (25 ms LOW)
delay(25);
digitalWrite (TX_PCM, HIGH); // second part fastinit (25 ms HIGH)
delay(25);
K_LINE_PCM.begin(10400);
sendMessagePCM(INIT); // send start communication message
}
void receivePCM () {
if (K_LINE_PCM.available() ){
// первый старт байт
if (header == 0 && Delay){TIMER_DELAY ; MessageRx_PCM[0]=K_LINE_PCM.read();
if (MessageRx_PCM[0]!=0xFF && bitRead (MessageRx_PCM[0],7)){header = 1; RESETheader_timer = 1; prevRESETheader = curmillis;
#ifdef debugPCM
Serial.print (F("Receive PCM: ")); printDebugRX(MessageRx_PCM[0]);
#endif
}
}
// второй старт байт
if (header == 1 && Delay){TIMER_DELAY ; MessageRx_PCM[1]=K_LINE_PCM.read();
#ifdef debugPCM
printDebugRX (MessageRx_PCM[1]);
#endif
if (MessageRx_PCM[1]==DIAG_address){ header = 2;}
else {
#ifdef debugPCM
Serial.println(F(" PCM Message fail address"));
#endif
header = 0; RESETheader_timer = 0;}}
// третий старт байт
if (header == 2 && Delay){
TIMER_DELAY ;
MessageRx_PCM[2]=K_LINE_PCM.read();
#ifdef debugPCM
printDebugRX (MessageRx_PCM[2]);
#endif
if (MessageRx_PCM[2]==PCM_address){ message_size = MessageRx_PCM[0]; prevRESETheader = curmillis;
if (MessageRx_PCM[0] !=0x80) {header = 4; bitWrite (message_size, 7 , 0);j=3;n=3;}
else {header = 3; j=4;n=4;}
if (message_size > bufsize) message_size = bufsize; crc = 0;}
else {header = 0;
#ifdef debugPCM
Serial.println(F("PCM Message fail address"));
#endif
RESETheader_timer = 0;}
}
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
if (header == 3 && Delay){
TIMER_DELAY ; prevRESETheader = curmillis;
MessageRx_PCM[3]=K_LINE_PCM.read();
#ifdef debugPCM
printDebugRX(MessageRx_PCM[3]);
#endif
message_size = MessageRx_PCM[3];
if (message_size > bufsize) message_size = bufsize;
crc = 0; header = 4;
}
// пишем тело сообщения
if (header == 4 && Delay && j< message_size+n+1) {
MessageRx_PCM[j] = K_LINE_PCM.read(); prevRESETheader = curmillis;
if (j<message_size+n) crc+= MessageRx_PCM[j]; // подсчёт КС
if (j==message_size+n) header = 5;
TIMER_DELAY ;
#ifdef debugPCM
printDebugRX(MessageRx_PCM[j]);
#endif
j++; }
}
// сообщение приняли, действуем
if (header == 5) {TIMER_DELAY ;
#ifdef debugPCM
Serial.println();
#endif
NOanswer_timer = 0; noanswers = 0; // сбрасываем таймер контроля неответов
for(byte i = 0; i<n; i++) crc+=MessageRx_PCM[i]; // прибавляем к контрольной сумме старт байты
// если контрольная сумма верна:
if ( crc == MessageRx_PCM[message_size+n])
{
#ifdef debugPCM
Serial.print (F("Received message is OK! Checksum is correct!")); Serial.print (F(" ")); Serial.println (millis()); // Если КС совпала, тут чёнибудь нужное делаем
printDebugRX_CSgood();
#endif
if (MessageRx_PCM[n]==0xC1 && MessageRx_PCM[n+1]==0x6B && MessageRx_PCM[n+2]==0x8F) {
if (currentPage!=3) {request = PID; RequestPeriod = 70;} else request = DTCREAD, RequestPeriod = 3000; prevRequest = curmillis; // receive good INIT
}
else if (MessageRx_PCM[n]==0x58) Troublecodes (); // DTC
else if (MessageRx_PCM[n]==0x54 && MessageRx_PCM[n+1]==0xFF && MessageRx_PCM[n+2]==0x00){ request = DTCREAD; RequestPeriod = 3000; prevRequest = curmillis;} // DTC are cleared
else if (MessageRx_PCM[n]==0x61 && MessageRx_PCM[n+1]==0x01) {dataVars() ; RequestPeriod = 70; prevRequest = curmillis; } // receive DataStream
}
// если контрольная сумма не совпала:
#ifdef debugPCM
else Serial.println("CRC fail!!!" );
#endif
message_size = 0; header=0; RESETheader_timer = 0; j=3; crc = 0;
}
// таймер ожидания байт (для успевания появления данных в буфере UART)
if (!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1;
// таймер сброса целостности сообщения (если данные оборвались посередине сообщения)
if (RESETheader_timer && curmillis - prevRESETheader > 200) {
#ifdef debugPCM
Serial.print(F("Message fail timeout ")); Serial.println(millis());
#endif
RESETheader_timer = 0; header = 0;}
// если нет ответа после запроса: +1 к счетчику неответов. Если накопилось 6 и более: делаем реинит.
if (request!=INIT && NOanswer_timer && curmillis - prev_NOanswer > RequestPeriod - RequestPeriod/10)
{
NOanswer_timer = 0; noanswers++;
if (noanswers>=6) { noanswers = 0; request = INIT; RequestPeriod = 3500;}
}
}// end receivePCM
void Troublecodes ()
{
if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1]==0x00){
myGLCD.clrScr();
drawscreen_three();
myGLCD.print("NO DTC", 165, 145);
Serial.println (" NO DTC "); }
//при получении этого сообщения выдавать на третий экран "DTC BORRADO"
if (MessageRx_PCM[n]==0x54 && MessageRx_PCM[n+1]==0xFF && MessageRx_PCM[n+2]==0x00){
myGLCD.clrScr();
drawscreen_three();
myGLCD.print("DTC BORRADO", 165, 145);
Serial.println (" DTC BORRADO "); }
// при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1]>0){
Serial.println ("DTC is found!");
myGLCD.clrScr();
drawscreen_three();
for (int i=0; i<MessageRx_PCM[n+8-7]; i++ ) {
int y = i*35;
bool nolA=0; bool nolB =0;
if (!bitRead(MessageRx_PCM[n+11-7+(i*3)],6) && bitRead(MessageRx_PCM[n+11-7+(i*3)],7)){ myGLCD.setColor (0,255,0);
myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет зеленый
if (bitRead(MessageRx_PCM[n+11-7+(i*3)],7) && bitRead(MessageRx_PCM[n+11-7+(i*3)],6)) {myGLCD.setColor (255,0,0);
myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет красный
myGLCD.print("ERROR ", 50, (75+y));
myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx_PCM[n+9-7+(i*3)],6) && !bitRead(MessageRx_PCM[n+9-7+(i*3)],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx_PCM[n+9-7+(i*3)],6) && !bitRead(MessageRx_PCM[n+9-7+(i*3)],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx_PCM[n+9-7+(i*3)],6) && bitRead(MessageRx_PCM[n+9-7+(i*3)],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx_PCM[n+9-7+(i*3)],6) && bitRead(MessageRx_PCM[n+9-7+(i*3)],7)) myGLCD.print(": U", 170, (75+y));
if (MessageRx_PCM[n+9-7+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;}
if (MessageRx_PCM[n+9-7+(i*3)]<=0x0F&&MessageRx_PCM[n+9-7+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}
if (nolA)myGLCD.print(String (MessageRx_PCM[n+9-7+(i*3)],HEX), 246, (75+y));
else myGLCD.print(String (MessageRx_PCM[n+9-7+(i*3)],HEX), 230, (75+y));
if (MessageRx_PCM[n+10-7+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
if (MessageRx_PCM[n+10-7+(i*3)]<=0x0F&&MessageRx_PCM[n+10-7+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;}
if (nolB)myGLCD.print(String (MessageRx_PCM[n+10-7+(i*3)]),HEX, 278, (75+y));
else myGLCD.print(String (MessageRx_PCM[n+10-7+(i*3)],HEX), 262, (75+y));}}
}
void dataVars()
{
//Barom = MessageRx_PCM[39];
L100 = (float)LHor*100.0/(float)Speed;
LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85;
MAF = ((MessageRx_PCM[n+22]*256)+MessageRx_PCM[n+23])/10;
BoostPres = ((MessageRx_PCM[n+24]*256)+MessageRx_PCM[n+25])/1000.0;
RPM = (MessageRx_PCM[n+35-7]*256)+MessageRx_PCM[n+36-7];
EGRmg = ((MessageRx_PCM[n+37-7]*256)+MessageRx_PCM[n+38-7])/10.0;
BoostPresCom = ((MessageRx_PCM[n+41-7]*256)+MessageRx_PCM[n+42-7])/1000.0;
Speed = ((MessageRx_PCM[n+47-7]*256)+MessageRx_PCM[n+48-7])/100;
DesaInjQua = ((MessageRx_PCM[n+53-7]*256)+MessageRx_PCM[n+54-7])/100.0;
InjQua = ((MessageRx_PCM[n+55-7]*256)+MessageRx_PCM[n+56-7])/100.0;
StaDaliv = ((MessageRx_PCM[n+57-7]*256)+MessageRx_PCM[n+58-7])/100.0;
PumpRPM = (MessageRx_PCM[n+59-7]*256)+MessageRx_PCM[n+60-7];
EGRPul = ((MessageRx_PCM[n+65-7]*256)+MessageRx_PCM[n+66-7])/100.0;
SolenPul = ((MessageRx_PCM[n+67-7]*256)+MessageRx_PCM[n+68-7])/100.0;
SolenPre = ((MessageRx_PCM[n+73-7]*256)+MessageRx_PCM[n+74-7])/100.0;
DesInj = ((MessageRx_PCM[n+75-7]*3)+(MessageRx_PCM[n+76-7])/100.0)+0.3;
ActInj = ((MessageRx_PCM[n+19-7]*3)+(MessageRx_PCM[n+20-7])/100.0)+0.3;
//TempAir = ((MessageRx_PCM[n+77-7]*26)-278)+MessageRx_PCM[n+78-7]/10.0;
//Temp = ((MessageRx_PCM[n+17-7]*26)-278)+MessageRx_PCM[n+18-7]/10.0;
//TempOil = ((MessageRx_PCM[n+21-7]*26)-278)+MessageRx_PCM[n+22-7]/10.0;
//TempFuel = ((MessageRx_PCM[n+61-7]*26)-278)+MessageRx_PCM[n+62-7]/10.0;
//ниже идут расчетные формулы более точные чем те что закоментированы выше
int A = 0;
if (MessageRx_PCM[n+77-7]<=0x0A) A = 277;
if (MessageRx_PCM[n+77-7]==0x0B || MessageRx_PCM[n+77-7]==0x0C) A = 278;
if (MessageRx_PCM[n+77-7]>=0x0D) A = 279;
double B = MessageRx_PCM[n+78-7]/10.0;
double cel , drob ;
drob = modf(B, &cel);
if (drob>0.6) cel++;
TempAir = ((MessageRx_PCM[n+77-7]*26)-A)+cel;
if (MessageRx_PCM[n+17-7]<=0x0A) A = 277;
if (MessageRx_PCM[n+17-7]==0x0B || MessageRx_PCM[n+17-7]==0x0C) A = 278;
if (MessageRx_PCM[n+17-7]>=0x0D) A = 279;
B = MessageRx_PCM[n+18-7]/10.0;
drob = modf(B, &cel);
if (drob>0.6) cel++;
Temp = ((MessageRx_PCM[n+17-7]*26)-A)+cel;
if (MessageRx_PCM[n+21-7]<=0x0A) A = 277;
if (MessageRx_PCM[n+21-7]==0x0B || MessageRx_PCM[n+21-7]==0x0C) A = 278;
if (MessageRx_PCM[n+21-7]>=0x0D) A = 279;
B = MessageRx_PCM[n+22-7]/10.0;
drob = modf(B, &cel);
if (drob>0.6) cel++;
TempOil = ((MessageRx_PCM[n+21-7]*26)-A)+cel;
if (MessageRx_PCM[n+61-7]<=0x0A) A = 277;
if (MessageRx_PCM[n+61-7]==0x0B || MessageRx_PCM[n+61-7]==0x0C) A = 278;
if (MessageRx_PCM[n+61-7]>=0x0D) A = 279;
B = MessageRx_PCM[n+62-7]/10.0;
drob = modf(B, &cel);
if (drob>0.6) cel++;
TempFuel = ((MessageRx_PCM[n+61-7]*26)-A)+cel;
myGLCD.setColor(255, 255, 255); //цвет текста
myGLCD.printNumI(Speed, 350, 7, 3);
//----------------------------------------------------------
//страниц HOME
//----------------------------------------------------------
if (currentPage == '0') {
myGLCD.printNumF(LHor, 1, 60, 40, '.',5);
myGLCD.printNumF(L100, 1, 210, 40,'.',5 );
myGLCD.printNumF(L100M, 1, 60, 75,'.',5 );
myGLCD.printNumF(L100SR_TFT, 1, 210, 75,'.',5 );
myGLCD.printNumI(kmREFUELING, 60, 110,5 );
//if (Fuel<53)
myGLCD.printNumF(Fuel, 1, 210, 110,'.',5);
//else myGLCD.print("MAX", 210, 110);
myGLCD.printNumF(kmTrip, 1, 60, 145,'.',5);
myGLCD.printNumF(FuelTrip, 1, 210, 145,'.',5);
myGLCD.printNumI(PumpRPM, 210, 180,5);
myGLCD.printNumI(RPM, 210, 215,5);
myGLCD.printNumF(Fuel2, 1, 0, 215,'.',5);
myGLCD.printNumI(Temp, 415, 40, 3);
myGLCD.printNumI(TempOil, 415, 75, 3);
myGLCD.printNumI(TempFuel, 415, 110,3);
// myGLCD.printNumI(sensors.getTempCByIndex(0), 415, 145 , 3);
myGLCD.printNumI(t, 415, 180, 3);
myGLCD.printNumI(TempAir, 415, 215, 3); }
//----------------------------------------------------------
//страниц INF1
//----------------------------------------------------------
if (currentPage == '1') {
myGLCD.printNumF(StaDaliv,1, 360, 40,'.', 3);
myGLCD.printNumF(DesInj,1, 395, 75, '.', 4);
myGLCD.printNumF(ActInj,1, 395, 110,'.', 4);
myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4);
myGLCD.printNumF(InjQua,1, 395, 180,'.', 4);
myGLCD.printNumI(MAF, 170, 215, 4);
myGLCD.printNumF(h, 1, 418, 215); }
//----------------------------------------------------------
//страниц INF2
//----------------------------------------------------------
if (currentPage == '2') {
myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4);
myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4);
myGLCD.printNumI(EGRmg, 395, 110, 4);
myGLCD.printNumF(EGRPul,1, 410, 145,'.', 3);
myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4);
myGLCD.printNumF(SolenPre, 0, 410, 215,'.', 3); }
}
void sendMessagePCM(const byte &command)
{
#ifdef debugPCM
Serial.print (F("Send request ")); Serial.print (textRequest[command]); Serial.print (F(" to PCM ")); Serial.println (millis());
#endif
if (command != INIT) {NOanswer_timer = 1; prev_NOanswer = curmillis;} //т.к. сейчас будем делать запрос, то запускаем таймер контроля неответов
byte size = PCM_Message_TX[command][0];
const byte siZe = size+4;
byte Mes[siZe];
byte Checksum = 0;
for(byte i=0; i<siZe; i++) {
if (i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);}
if (i==1) Mes[i] = PCM_address;
if (i==2) Mes[i] = DIAG_address;
if (i==3) {for (byte t=1; t<size+1; t++ ) {
Mes[i]=PCM_Message_TX [command][t];
Checksum+=Mes[i] ;
K_LINE_PCM.write (Mes[i]);
if (command == INIT) delay (5); delay (delaybyte_TX);
K_LINE_PCM.read();
i++;}}
if (i!=siZe-1) Checksum+=Mes[i];
else Mes[i] = Checksum;
K_LINE_PCM.write (Mes[i]);
if (command == INIT) delay (5); else delay (delaybyte_TX);
K_LINE_PCM.read();
}
}// end sendMessagePCM
#if defined debugPCM or debugGAUGE
void printDebugRX (const byte &inbyte) {if (inbyte<=15) Serial.print(F("0")); Serial.print (inbyte, HEX); Serial.print (F(" "));}
#endif
#ifdef debugPCM
void printDebugRX_CSgood(){
if (MessageRx_PCM[n]==0xC1 && MessageRx_PCM[n+1]==0x6B && MessageRx_PCM[n+2]==0x8F) {Serial.println (F(" Initialization OK!!!!")); }
else if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1]==0x00) {Serial.println (F(" NO DTC "));}
else if (MessageRx_PCM[n]==0x58 && MessageRx_PCM[n+1] >0x00) {Serial.println (F(" DTC is found!"));}
else if (MessageRx_PCM[n]==0x54 && MessageRx_PCM[n+1]==0xFF && MessageRx_PCM[n+2]==0x00){Serial.println (F(" DTC CLEARED "));}
else if (MessageRx_PCM[n]==0x61 && MessageRx_PCM[n+1]==0x01) {Serial.println (F(" Receive PCM DATAstream"));}}
#endif
void Menu () {
if (currentPage == '0') {
TouchHOME();
TouchINF1();
TouchINF2();
TouchCHECK(); }
if (currentPage == '1') {
TouchHOME();
TouchINF2();
TouchCHECK(); }
if (currentPage == '2') {
TouchHOME();
TouchINF1();
TouchCHECK(); }
if (currentPage == '3') {
TouchHOME();
TouchREAD();
TouchERASE(); }}
void drawHomeScreen() {
line() ;
Watch ();
myGLCD.setColor(255, 0, 0); // цвет линии и текста красный
myGLCD.drawLine(295,35,295,248); // линия вертикальная
myGLCD.drawLine(145,35,145,178); // линия вертикальная
myGLCD.drawLine(80,178,80,247); // линия вертикальная
myGLCD.print("L/H", 10, 40);
myGLCD.print("L/A", 148, 40);
myGLCD.print("L/V", 10, 75);
myGLCD.print("L/M", 148, 75);
myGLCD.print("D/K", 10, 110);
myGLCD.print("D/L", 148, 110);
myGLCD.print("V/K", 10, 145);
myGLCD.print("V/L", 148, 145);
myGLCD.print("PUMP RPM", 82, 180);
myGLCD.print("ENGI RPM", 82, 215);
myGLCD.print("D/La", 10, 180);
myGLCD.print("Motor C", 300, 40);
myGLCD.print("OIL C", 300, 75);
myGLCD.print("FUEL C", 300, 110);
myGLCD.print("INTER C", 300, 145);
myGLCD.print("EXTER C", 300, 180);
myGLCD.print("INTAIR C", 300, 215);
myGLCD.drawRoundRect (15, 255, 145, 310);
myGLCD.print("INF 1", 55, 270);
myGLCD.drawRoundRect (175, 255, 305, 310);
myGLCD.print("INF 2", 215, 270);
myGLCD.drawRoundRect (335, 255, 465, 310);
myGLCD.print("CHECK", 365, 270);
myGLCD.drawRoundRect (1, 1, 77, 37);
myGLCD.print("HOME", 10, 7);
myGLCD.print("Km/h", 410, 7);
}
//-------------------------------------------------
void drawscreen_one() {
line() ;
Watch ();
myGLCD.setColor(255, 0, 0); // цвет линии и текста красный
myGLCD.print("Start of Delivery *CA:", 10, 40);
myGLCD.print("Desir inject Start *CA:", 10, 75);
myGLCD.print("Actua Inject Start *CA:", 10, 110);
myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
myGLCD.print("MAF mg/s:", 10, 215);
myGLCD.print("Humedad %:", 255, 215);
myGLCD.drawRoundRect (175, 255, 305, 310);
myGLCD.print("INF 2", 215, 270);
myGLCD.drawRoundRect (335, 255, 465, 310);
myGLCD.print("CHECK", 365, 270);
myGLCD.drawRoundRect (1, 1, 77, 37);
myGLCD.print("HOME", 10, 7);
myGLCD.print("Km/h", 410, 7);
}
//-------------------------------------------------
void drawscreen_two() {
line() ;
Watch ();
myGLCD.setColor(255, 0, 0); // цвет линии и текста красный
myGLCD.print("Boost Press Bar:", 10, 40);
myGLCD.print("Boost Press Com Bar:", 10, 75);
myGLCD.print("EGR command mg/s:", 10, 110);
myGLCD.print("EGR Pulse Ratio %:", 10, 145);
myGLCD.print("Solenoide Pulse %:", 10, 180);
myGLCD.print("Solenoide Boost %:", 10, 215);
myGLCD.drawRoundRect (15, 255, 145, 310);
myGLCD.print("INF 1", 55, 270);
myGLCD.drawRoundRect (335, 255, 465, 310);
myGLCD.print("CHECK", 365, 270);
myGLCD.drawRoundRect (1, 1, 77, 37);
myGLCD.print("HOME", 10, 7);
myGLCD.print("Km/h", 410, 7);
}
//----------------------------------------------------------------------------
void drawscreen_three() {
Watch ();
myGLCD.setColor(255, 0, 0); // цвет линии красный
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
myGLCD.drawRoundRect (15, 255, 145, 310);
myGLCD.print("ERASE", 55, 270);
myGLCD.drawRoundRect (335, 255, 465, 310);
myGLCD.print("READ", 365, 270);
myGLCD.drawRoundRect (1, 1, 77, 37);
myGLCD.print("HOME", 10, 5);
myGLCD.print("Km/h", 410, 3);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//кнопки тач . координаты и переходы
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TouchHOME(){
TSPoint p = ts.getPoint();
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
{if (p.x > 140 && p.x < 320 && p.y > 140 && p.y < 260 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
{ myGLCD.drawRoundRect (1, 1, 77, 37);
currentPage = '0';
request = PID; RequestPeriod = 600; prevRequest = curmillis; // на PCM в этом окне посылается запрос текущих параметров
myGLCD.clrScr();
drawHomeScreen();
x = 0;
y = 0;
p.z = 0;}}}
void TouchINF1(){
TSPoint p = ts.getPoint();
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
{
if (p.x > 150 && p.x < 450 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
{ myGLCD.drawRoundRect (15, 255, 145, 310);
currentPage = '1';
request = PID; RequestPeriod = 600; prevRequest = curmillis; // на PCM в этом окне посылается запрос текущих параметров
myGLCD.clrScr();
drawscreen_one();
x = 0;
y = 0;
p.z = 0;}}}
void TouchINF2(){
TSPoint p = ts.getPoint();
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
{
if (p.x > 450 && p.x < 680 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
{ myGLCD.drawRoundRect (175, 255, 305, 310);
currentPage = '2';
request = PID; RequestPeriod = 600; prevRequest = curmillis; // на PCM в этом окне посылается запрос текущих параметров
myGLCD.clrScr();
drawscreen_two();
x = 0;
y = 0;
p.z = 0;}}}
void TouchCHECK(){
TSPoint p = ts.getPoint();
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
{
if (p.x > 690 && p.x < 950 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
{ myGLCD.drawRoundRect (335, 255, 465, 310);
currentPage = '3';
request = DTCREAD; RequestPeriod = 3000; prevRequest = curmillis; // на PCM в этом окне посылается запрос чтения ошибок
myGLCD.clrScr();
drawscreen_three();
x = 0;
y = 0;
p.z = 0;}}}
void TouchREAD(){
TSPoint p = ts.getPoint();
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
{
if (p.x > 690 && p.x < 950 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
{ myGLCD.drawRoundRect (335, 255, 465, 310);
request = DTCREAD; RequestPeriod = 3000; prevRequest = curmillis; // на PCM при нажатии этой кнопки посылается запрос чтения ошибок
x = 0;
y = 0;
p.z = 0;}}}
void TouchERASE(){
TSPoint p = ts.getPoint();
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if (p.z > 10 && p.z < 1000)
{
if (p.x > 150 && p.x < 450 && p.y > 770 && p.y < 890 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
{ myGLCD.drawRoundRect (15, 255, 145, 310);
request = DTCERASE; RequestPeriod = 3000; prevRequest = curmillis; // на PCM при нажатии этой кнопки посылается запрос удаления ошибок
x = 0;
y = 0;
p.z = 0;}}}
////////////////////////////////////////////////////////////////////////////////////////
//прорисовка линий
///////////////////////////////////////////////////////////////////////////////////////
void line() {
myGLCD.setColor(255, 0, 0); // цвет линии красный
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,73,479,73); // линия горизонтальная
myGLCD.drawLine(1,108,479,108); // линия горизонтальная
myGLCD.drawLine(1,143,479,143); // линия горизонтальная
myGLCD.drawLine(1,178,479,178); // линия горизонтальная
myGLCD.drawLine(1,212,479,212); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
}
void Watch (){
DateTime now = rtc.now();
int m = now.minute();
int hour = now.hour();
int mon = now.month();
int date = now.day();
myGLCD.setColor(255, 255, 255); //белый цвет цифры
if (date<10) {
myGLCD.print("0", 85, 7);
myGLCD.printNumI(now.day(), 100, 7); }
else if (date >=10) {
myGLCD.printNumI(now.day(), 85, 7); }
myGLCD.print("/", 115, 7);
if ( mon<10) {
myGLCD.print("0", 130, 7);
myGLCD.printNumI(now.month(), 145, 7);}
else if (mon >=10) {
myGLCD.printNumI(now.month(), 130, 7);}
myGLCD.print("/", 160, 7);
myGLCD.printNumI(now.year(), 175, 7);
if (hour<10) {
myGLCD.print("0",255, 7);
myGLCD.printNumI(now.hour(), 270, 7); }
else if(hour>=10){
myGLCD.printNumI(now.hour(), 255, 7); }
if (m<10) {
myGLCD.print("0",300, 7);
myGLCD.printNumI(now.minute(), 315, 7); }
else if (m>=10){
myGLCD.printNumI(now.minute(), 300, 7); }
}
ты читаешь вообще , что я пишу? Я же тебе объяснил, что обновление данных на экран запихал в момент, когда получаем данные PID 2101 от PCM. Данные идут в Serial ? если да , то и экран должен обновляться. Конечно LCDDataPrint(); дало ошибку. Эту функцию я удалил потому что.
все это очень странно. где опять засада. Вставь Serial.println ("YA V DATAVARS!!!") в начале в функции dataVars() . Чтоб посмотреть заходит ли туда программа
что то опять тормозит процесс причём конкретно. поправил отладку 1563 чтоб узнать насколько тормозит. Залей и сделай лог. Пробуй также опять по очереди убирать из лупа menu(), строку с watch, строку с двоеточием.
Я не вкуривал что за железки используются как тач и дисплей, но если в их библиотеках есть работа с прерваниями, то софтовый сериал так и будет себя вести на длинных посылках ...
у меня байты каждый проход лупа из буфера считываются. Соотвественно глубоко пофиг, что посылка длинная.
Просто я сам же сделал таймер на миллис на случай сбоев, чтоб не зависало - если байты перестают поступать посередине сообщения, то оно сбрасывается, и начинается читалка по новой. И вот после добавления экрана этот таймер начал срабатывать.
У меня уже попкорн кончился от Вашего кино с конями ...
Вы представляете сколько времени Ваш скетч находится внутри софтсериала ?
Попробуте в исходниках SoftwareSerial.h изменить #define _SS_MAX_RX_BUFF 64 на #define _SS_MAX_RX_BUFF 81 (или вместо 81 - сколько байт посылает ЕБУ в одном ответе) и перекомпилировать проект.
(По умолчанию буфер у SoftwareSerial 64 байта и он явно переполняется, а Вы чуть чуть не успеваете их забирать ...)
мы это уже проходили. Это нужно было делать в первой версии скетча, когда использовался delay195, то есть мы дожидались от ЭБУ ВСЕХ байт сообщения , которые накапливались в буфере софтсериала, и т.к. это больше 64, то увеличивали буфер. Т.е. сообщение принималось в одной итерации лупа. Сейчас же я уже написал вам, что буфер опустошается СРАЗУ после поступления в него байт сообщения. Т.е. сообщение принимается за много проходов лупа. Поэтому он не заполняется и на 10%. Проблема в том, что для надёжности я ввел таймер, который через определённый таймаут сбрасывает приём конкретного сообщения, если байты прекратили поступать. а прекратить они могли поступать, если в лупе что-то другое подвисает. И похер хард тут или софт Сериал.
Если такой таймер не ввести и поступление байт по той или иной причине прекратится, когда сообщение ещё полностью не принято, то байты уже следующего сообщения будут интерпретироваться как последние недостающие байты текущего принимаемого сообения и мы так никогда в итоге не найдём больше начальную шапку последующих сообщений. Будет дальнейший сбой приёма.
по хорошему нужно отдельную дуню на приём данных из К-лайн, которой в лупе ничего другого не будет мешать и уже она тоже по Сериал (или ещё как) будет передавать данные ардуине, отвечающей за всё остальное, датчики t , экран и т.д.
Потому что все эти библиотеки периферии гавно полное.
У меня 32U4 на 16 МГц по 10 раз в секунду успевает принять ~100 байт от GPS и полностью обновить картинку на OLED 128х64 по I2C. Так что два камня для Вашего проекта это много.
Из Вашего лога вижу что принято то 76, то 77, то 78 байт - теряется всего от 5 до 3 байт. Это прямая логика Вам подсказывает, что Вы опустошаете буфер в лупе. А если какая то библа забирает время по прерыванию ??? Запретить прерывания полностью, то же нельзя, т.к. Softserial сам на прерывании ловит байты. Вообщем я бы проверил идею с размером буфера - делов то на пару минут.
переводчик (драйвера экрана) либо UTFT.h (для твоего старого экрана), либо UTFTGLUE.h либо MCUFRIEND_kbv.h . Вместе их не надо. Последние две подходят для твоего нового экрана.
UTFTGLUE совместима по функциям с твоим новым экраном, но вроде как тормозит. MCUFRIEND_kbv.h имеет другие функции и фиг знает тормозит или нет.
Вот описание драйверов экрана MCUFRIEND_kbv.h
я закоменчу френда. но нужно чтобы скетч заработал. перекинешь сюда чтобы не бегать на прошлую страницу когда подправишь
попробовал еще раза 1536
если закоментить френда то ошибка компиляции
no matching function for call to 'UTFTGLUE::setFont(const GFXfont*)'
делай это
и напиши простой скетч с периодическим выводом на экран статических переменных (пусть они будут, но не обновляются от эбу, чтоб скетч был простой, а просто ++ каждый вывод на экран, ну хотябы пара переменных пусть наращивается). Будет ли мигать?
дак щас вообще не инитится эбу. это нужно подправить. а потом с миганиме разбератся буду. он же уже работал, после какихто последних подправок перестал общатся с эбу. нужно вернуть состояние когда он работал, пусть мигает, я буду копать. мне главное чтобы твоя система работала. остальное я уже разберусь
дак закоменти в лупе LCDDataprint() и всё.
вот тебе скетч для проверки экрана, тормозит или нет
не мигает не тормозит , цифры меняются красиво
я нашел причину. шрифт сабака такая. закоментил и все гладко работает не мигает
кстати изза шрифта как раз и тормозит наверное
закоменти в сетапе и самом верху строчки связанные со шрифтом Gobold
да я выше написал. сабака бы его нюхала. все работает нужно ща доработать увеличить шрифт.я закоментил френад а помом по обибкам увидел шрифты. закоментил и все стало пучком . ща с шрифтом разберусь.....
залил вот это
не мигает. но все данные по нулям. датапринт раскометировал
тогда так. Вернул обновление данных на экране только по получению данных от PCM. Убрал шрифт, потом с ним разберёшся. По идее все символы маленькие должны стать.
с твоим не выводится инфа на экран. только часы и дата. в лупе отсутствует . я добалил LCDDataPrint(); дало ошибку
ты читаешь вообще , что я пишу? Я же тебе объяснил, что обновление данных на экран запихал в момент, когда получаем данные PID 2101 от PCM. Данные идут в Serial ? если да , то и экран должен обновляться. Конечно LCDDataPrint(); дало ошибку. Эту функцию я удалил потому что.
в сериал то идут данные а на экране нету
все это очень странно. где опять засада. Вставь Serial.println ("YA V DATAVARS!!!") в начале в функции dataVars() . Чтоб посмотреть заходит ли туда программа
сек. да да провтыкал
блин вставь после скобки {
нет не заходит
а тебе не очем не говорит надпись Message fail timeout ? Блин это ппц
поправь значение 1563 строка 331 поставь 500 например.
извени со мной дети мои на работе. не внимательный. все внимание чтобы дети че не натворили.
ставил 300 400 500 все тотже тайм аут
так как скетч возрос, видимо не успевает он длинные сообщения за 200 мс принимать
даже на 1000 не помогает
А почему программный UART ? Может он не выдерживает задержки и теряется ?
но сегодня был какойто момент когда заработало но мигало...... ща гляну может найду
не нахожу . я вообще уже в них запутался какой когда был. по ходу который работал был мой когда я засомневался что не тот залил
что то опять тормозит процесс причём конкретно. поправил отладку 1563 чтоб узнать насколько тормозит. Залей и сделай лог. Пробуй также опять по очереди убирать из лупа menu(), строку с watch, строку с двоеточием.
Ок. Завтра утром
также вернул 1536 (блин как похоже 1563 1536 надо же ) . Попытался вернуть на тот момент когда связь была, только шрифт закоментил.
Так какой проверить 1536 или 1563?
MaksVV почему програмный порт для связи с железкой ???
Это вопрос к иаксу, он спец программист.
вопрос не ко мне))) ТС выбрал софт сериал. Но траблы совсем не из за этого.
проверь оба
Я не вкуривал что за железки используются как тач и дисплей, но если в их библиотеках есть работа с прерваниями, то софтовый сериал так и будет себя вести на длинных посылках ...
у меня байты каждый проход лупа из буфера считываются. Соотвественно глубоко пофиг, что посылка длинная.
Просто я сам же сделал таймер на миллис на случай сбоев, чтоб не зависало - если байты перестают поступать посередине сообщения, то оно сбрасывается, и начинается читалка по новой. И вот после добавления экрана этот таймер начал срабатывать.
viki13viki ,ну если есть возможность , перебрось на хард сериал К-лайник PCM. По идее да, стабильнее он работать должен.
Нет возможности. Если таки припечет то разберу панель и перекину.
Так и будете стучаться головой о сетенку. С железом должна общаться железка.
У меня два года прежний скетчь работал, и нчего. Не бился головой. Потом будет видно, может и перекину
суть проблемы тут явно не в софтсериале. Обычно софт нельзя применять на больших скоростях. А у нас 10400.
У меня уже попкорн кончился от Вашего кино с конями ...
Вы представляете сколько времени Ваш скетч находится внутри софтсериала ?
Попробуте в исходниках SoftwareSerial.h изменить #define _SS_MAX_RX_BUFF 64 на #define _SS_MAX_RX_BUFF 81 (или вместо 81 - сколько байт посылает ЕБУ в одном ответе) и перекомпилировать проект.
(По умолчанию буфер у SoftwareSerial 64 байта и он явно переполняется, а Вы чуть чуть не успеваете их забирать ...)
мы это уже проходили. Это нужно было делать в первой версии скетча, когда использовался delay195, то есть мы дожидались от ЭБУ ВСЕХ байт сообщения , которые накапливались в буфере софтсериала, и т.к. это больше 64, то увеличивали буфер. Т.е. сообщение принималось в одной итерации лупа. Сейчас же я уже написал вам, что буфер опустошается СРАЗУ после поступления в него байт сообщения. Т.е. сообщение принимается за много проходов лупа. Поэтому он не заполняется и на 10%. Проблема в том, что для надёжности я ввел таймер, который через определённый таймаут сбрасывает приём конкретного сообщения, если байты прекратили поступать. а прекратить они могли поступать, если в лупе что-то другое подвисает. И похер хард тут или софт Сериал.
Если такой таймер не ввести и поступление байт по той или иной причине прекратится, когда сообщение ещё полностью не принято, то байты уже следующего сообщения будут интерпретироваться как последние недостающие байты текущего принимаемого сообения и мы так никогда в итоге не найдём больше начальную шапку последующих сообщений. Будет дальнейший сбой приёма.
Если нужно, через час буду на работе, проверю два скетча которые ты упомянул выше, и могу скинуть старый скетчь чтобы ты глянул, может че увидешь...
ок
по хорошему нужно отдельную дуню на приём данных из К-лайн, которой в лупе ничего другого не будет мешать и уже она тоже по Сериал (или ещё как) будет передавать данные ардуине, отвечающей за всё остальное, датчики t , экран и т.д.
Потому что все эти библиотеки периферии гавно полное.
1536 работает, отображает на экране, без тача. отчет
1563 работает, не экране не отображается. заметил 6 запросов потом подвис и сново 6 запросов и подвис. отчет
мой старый рабочий скетч
У меня 32U4 на 16 МГц по 10 раз в секунду успевает принять ~100 байт от GPS и полностью обновить картинку на OLED 128х64 по I2C. Так что два камня для Вашего проекта это много.
Из Вашего лога вижу что принято то 76, то 77, то 78 байт - теряется всего от 5 до 3 байт. Это прямая логика Вам подсказывает, что Вы опустошаете буфер в лупе. А если какая то библа забирает время по прерыванию ??? Запретить прерывания полностью, то же нельзя, т.к. Softserial сам на прерывании ловит байты. Вообщем я бы проверил идею с размером буфера - делов то на пару минут.