HEX все заваливаета. второй вариант работает но без HEX. подогнал координаты. отображаются нули. вот скетч с обоими вариантами но первый вариант закоментирован. получаем что и в первом варианте только с нулями, естественно в DEC.
/////////////////////////////////////////////////////////////////////////////////////////
//библиотеки
///////////////////////////////////////////////////////////////////////////////////////////
#include <UTouch.h>
#include <UTFT.h>
#include <SPI.h>
//pin 20 SCL , 21 SDA датчик реального времени
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
//датчик наружней температуры
#include <OneWire.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
#include <DallasTemperature.h>
DallasTemperature sensors(&oneWire);
//датчик внутринней температуры и влаги
#include "DHT.h"
#define DHTPIN 9
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
///////////////////////////////////////////////////////////////////////////////////
//пины экрана и тача
///////////////////////////////////////////////////////////////////////////////////
UTFT myGLCD(31,38,39,40,41);
UTouch myTouch(6,5,4,3,2);
///////////////////////////////////////////////////////////////////////////////////
//шрифты + не стандартный шрифт GroteskBold16x32.с
//////////////////////////////////////////////////////////////////////////////////
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
extern uint8_t GroteskBold16x32[];
int x, y;
char currentPage;
float h;
float t;
bool Dvoet = 0;
//////////////////////////////////////////////////////////////////////////////
//все что касается OBD2
///////////////////////////////////////////////////////////////////////////////
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //RХ,TХ
#define TX 11
int length5 = 5;
int length6 = 6;
int length8 = 8;
int length7 = 7;
bool Init = 0;
int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс
int PresTime = 8000; // задержка между посылками запросов присутствия, мс
int waitbyte = 1; // задержка между отправкой байт в сообщении, мс
int Datadelay = 100; // задержка между отрисовкой данных на LCD, мс
float L100 = 0; //расход литров на 100км
float LHor = 0; //расход топлива литров в час
int MAF = 0; //26,27 байты Sensor de flujo de aire en masa
float BoostPres = 0; //28,29 байты Presión de refuerzo
int RPM = 0; //32,33 байты Velocidad del motor
int EGRmg = 0; //34,35 байты Comando EGR (Comando de recirculación de gases de escape)
float BoostPresCom = 0; //38,39 байты Comando de presión de refuerzo
int Speed = 0; //44,45 байты Velocidad del vehículo
float DesaInjQua = 0; //50,51 байты Cantidad de inyección deseada
float InjQua = 0; //52,53 байты Cantidad de la inyección
float StaDaliv = 0; //54,55 байты Inicio de la entrega
int PumpRPM = 0; //56,57 байты Velocidad de la bomba
float EGRPul = 0; //62,63 байты Relación de impulsos EGR (recirculación de gases de escape
float SolenPul = 0; //64,65 байты Velocidad de solenoide de control de nivel de remolino Relación de impulsos
float SolenPre = 0; //70,71 байты Relación de impulsos Presión Electroválvula de presión
float DesInj = 0; //72,73 байты Inyección deseada Inicio
float ActInj = 0; //16,17 байты Inicio de la inyección real
int TempAir = 0; //74,75 байты Temperatura del aire de admisión
int Temp = 0; //14,15 байты Temperatura del refrigerante
int TempOil = 0; //18,19 байты Temperatura del aceite del motor
int TempFuel = 0; //58,59 байты Temperatura del combustible
int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана
float Barom = 0; // барометр
byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения
byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04}; // запрос инициализации
byte messagePresent[5] = {0x81,0x11,0xF1,0x3E,0xC1}; // запрос присутствия
byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6}; // запрос пид 2101
byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D}; // запрос ошибок
byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98}; // стирание ошибок
unsigned long prevPID = 0;
unsigned long prevTemperature = 0;
unsigned long prevpres = 0;
unsigned long prevWatch = 0;
unsigned long prevDvoet = 0;
unsigned long prevData = 0;
unsigned long TimewaitPID, timerwaitPID = 0;
bool timerenabledPID = 0;
#define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 200 // здесь задержка на ожидание правильного ответа пидов, мс
unsigned long TimewaitInit, timerwaitInit = 0;
bool timerenabledInit = 0;
#define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 500 // здесь задержка на ожидание ответа об удачной инициализации, мс
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SETUP
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
mySerial.begin(10400);
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
drawHomeScreen();
currentPage = '0';
Wire.begin();
rtc.begin();
dht.begin();
sensors.begin();
// строка ниже используется для настройки даты и времени часов
// раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать
// обратно. иначе каждый раз будет по новой выствлятся это это же время и дата
// (год, месяц, день, часы, минуты, секунды)
//rtc.adjust(DateTime(2017, 7, 8, 19, 00, 0));
Temperature ();
pinMode(TX, OUTPUT);
fastinit();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SETUP FIN
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//LOOP
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned long curPID = millis ();
unsigned long curpres = millis ();
unsigned long curTemperature = millis();
unsigned long curWatch = millis();
unsigned long curDvoet = millis();
TimewaitPID = millis ();
TimewaitInit = millis ();
if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
else if (TIMEREXPIRED_Init) timerenabledInit=0;}
else {
if (currentPage != '3'){ // если открыта страница 0,1 или 2 шлем запрос пид2101, если страница 3 - шлем запрос присутствия
if (curPID - prevPID > PIDTime) {PIDs(); prevPID = curPID;}}
else if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}}
if (curWatch - prevWatch > 10000) { Watch (); prevWatch = curWatch;}
if (curTemperature - prevTemperature > 60000) { Temperature (); prevTemperature = curTemperature;}
if (curDvoet - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
receive ();
Menu();
LCDDataPrint();
}
//-----------------------------------------------------------------------------
//прописываем где и какие данные мы хотим видеть
//-----------------------------------------------------------------------------
//страница HOME
//-------------------------------------------------------
void LCDDataPrint(){
unsigned long curData = millis();
if (curData - prevData > Datadelay){
if (currentPage == '0') {
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
myGLCD.printNumF(LHor, 1, 165, 40);
myGLCD.printNumF(L100, 1, 165, 75);
// myGLCD.printNumI(Speed, 165, 110);
myGLCD.printNumI(h, 165, 145);
myGLCD.printNumI(PumpRPM, 165, 180);
myGLCD.printNumI(RPM, 165, 215);
//-------------------------------------------
myGLCD.printNumI(Temp, 410, 40);
myGLCD.printNumI(TempOil, 410, 75);
myGLCD.printNumI(TempFuel, 410, 110);
myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
myGLCD.printNumI(t, 410, 180);
myGLCD.printNumI(TempAir, 410, 215);
}
//----------------------------------------------------------
//страниц INF1
//----------------------------------------------------------
if (currentPage == '1') {
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
myGLCD.printNumF(StaDaliv,1, 395, 40);
myGLCD.printNumF(DesInj,1, 395, 75);
myGLCD.printNumF(ActInj,1, 395, 110);
myGLCD.printNumF(DesaInjQua,1, 395, 145);
myGLCD.printNumF(InjQua,1, 395, 180);
myGLCD.printNumI(MAF, 170, 215);
myGLCD.printNumF(Barom, 1, 415, 215);
}
//----------------------------------------------------------
//страниц INF2
//----------------------------------------------------------
if (currentPage == '2') {
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
myGLCD.printNumF(BoostPres,1, 395, 40);
myGLCD.printNumF(BoostPresCom,1, 395, 75);
myGLCD.printNumI(EGRmg, 395, 110);
myGLCD.printNumF(DesaInjQua,1, 395, 145);
myGLCD.printNumF(SolenPul, 1, 395, 180);
myGLCD.printNumF(SolenPre, 0, 395, 215);
}
//----------------------------------------------------------
//страниц CHECK
//----------------------------------------------------------
if (currentPage == '3') {
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
}
prevData = curData;
}
}
///////////////////////////////////////////////////////////////////////////
//отправка запроса пид 2101
void PIDs() {
Serial.println ("Otpravil zapros 21 01");
for (int i = 0; i < length6; i++) {
mySerial.write(messagePids[i]);
delay (waitbyte); }
}
//отправка запроса присутствия
void present() {
Serial.println ("Otpravil zapros Present");
for (int i = 0; i < length5; i++) {
mySerial.write(messagePresent[i]);
delay (waitbyte); }
}
/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных от ЭБУ, разборка входящих сообщений
/////////////////////////////////////////////////////////////////////////////////////////////
void receive () {
if (mySerial.available()) {
delay(190);
int k=0;
byte inbyte=0;
while( mySerial.available() && k < 110) {
inbyte = mySerial.read();
MessageRx[k] = inbyte;
k++; }
Serial.print ("Receive: ");
for (int i = 0; i < k; i++) {
Serial.print(MessageRx[i],HEX); Serial.print (" ");}
Serial.println ("");
if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1;
timerenabledInit=0;
Serial.println (" Initialization OK!!!!: ");
}
if (currentPage == '3'){
//при получении этого сообщения выдавать на третий экран "NO ERROR"
if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9 ]==0xDC){
myGLCD.print("NO ERROR", 165, 145);
Serial.println (" NO ERROR ");
}
// при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки
/* if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58){
for (int i=0; i<MessageRx[8]; i++ ) {
int y = i*35;
myGLCD.setColor(255, 255, 255);
myGLCD.print("ERROR: ", 30, (75+y));
myGLCD.printNumI((i+1), 130, (75+y));
if (bitRead(MessageRx[9],6)==0 && bitRead(MessageRx[9],7)==0) myGLCD.print(": P", 160, (75+y));
if (bitRead(MessageRx[9],6)==1 && bitRead(MessageRx[9],7)==0) myGLCD.print(": C", 160, (75+y));
if (bitRead(MessageRx[9],6)==0 && bitRead(MessageRx[9],7)==1) myGLCD.print(": B", 160, (75+y));
if (bitRead(MessageRx[9],6)==1 && bitRead(MessageRx[9],7)==1) myGLCD.print(": U", 160, (75+y));
myGLCD.printNumI(MessageRx[9+(i*3)], 230, (75+y));
myGLCD.printNumI(MessageRx[10+(i*3)], 262, (75+y));}
Serial.println (" OSHIBKA ESTY ");
}
*/
for (int i=0; i<MessageRx[8]; i++ ) {
int y = i*35;
bool nolA=0; bool nolB =0;
myGLCD.print("ERROR ", 50, (75+y));
myGLCD.printNumI((i+1), 150, (75+y));
if (!bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(": P", 170, (75+y));
if (bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(": C", 170, (75+y));
if (!bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(": B", 170, (75+y));
if (bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(": U", 170, (75+y));
if (MessageRx[9+(i*3)]<=0x0F) {myGLCD.print("0", 230, (75+y)); nolA = 1;}
if (nolA) myGLCD.print(String (MessageRx[9+(i*3)]), 246, (75+y));
else myGLCD.print(String (MessageRx[9+(i*3)]), 230, (75+y));
if (MessageRx[10+(i*3)]<=0x0F) {myGLCD.print("0", 262, (75+y)); nolB = 1;}
if (nolB) myGLCD.print(String (MessageRx[10+(i*3)]), 278, (75+y));
else myGLCD.print(String (MessageRx[10+(i*3)]), 262, (75+y));}
// при получении этого сообщения выдавать на третий экран "BORRADO" стерто
if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){
myGLCD.print("BORRADO", 165, 145);
Serial.println (" BORRADOR ");
}}
//прописываем формулы к данным
else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) {
Barom = MessageRx[39];
L100 = (14.6*6.8*4.54*Speed*0.621371)/(3600*MAF/100);
LHor = ((InjQua*4)*3.6)/100.0;
MAF = ((MessageRx[29]*256)+MessageRx[30])/10;
BoostPres = ((MessageRx[31]*256)+MessageRx[32])/1000.0;
RPM = (MessageRx[35]*256)+MessageRx[36];
EGRmg = ((MessageRx[37]*256)+MessageRx[38])/10.0;
BoostPresCom = ((MessageRx[41]*256)+MessageRx[42])/1000.0;
Speed = ((MessageRx[47]*256)+MessageRx[48])/100;
DesaInjQua = ((MessageRx[53]*256)+MessageRx[54])/100.0;
InjQua = ((MessageRx[55]*256)+MessageRx[56])/100.0;
StaDaliv = ((MessageRx[57]*256)+MessageRx[58])/100.0;
PumpRPM = (MessageRx[59]*256)+MessageRx[60];
EGRPul = ((MessageRx[65]*256)+MessageRx[66])/100.0;
SolenPul = ((MessageRx[67]*256)+MessageRx[68])/100.0;
SolenPre = ((MessageRx[73]*256)+MessageRx[74])/100.0;
DesInj = ((MessageRx[75]*3)+(MessageRx[76])/100.0)+0.3;
ActInj = ((MessageRx[19]*3)+(MessageRx[20])/100.0)+0.3;
//TempAir = ((MessageRx[77]*26)-278)+MessageRx[78]/10.0;
//Temp = ((MessageRx[17]*26)-278)+MessageRx[18]/10.0;
//TempOil = ((MessageRx[21]*26)-278)+MessageRx[22]/10.0;
//TempFuel = ((MessageRx[61]*26)-278)+MessageRx[62]/10.0;
int A = 0;
if (MessageRx[77]<=0x0A) A = 277;
if (MessageRx[77]==0x0B || MessageRx[77]==0x0C) A = 278;
if (MessageRx[77]>=0x0D) A = 279;
double B = MessageRx[78]/10.0;
double cel , drob ;
drob = modf(B, &cel);
if (drob>0.6) cel++;
TempAir = ((MessageRx[77]*26)-A)+cel;
if (MessageRx[17]<=0x0A) A = 277;
if (MessageRx[17]==0x0B || MessageRx[77]==0x0C) A = 278;
if (MessageRx[17]>=0x0D) A = 279;
B = MessageRx[18]/10.0;
drob = modf(B, &cel);
if (drob>0.6) cel++;
Temp = ((MessageRx[17]*26)-A)+cel;
if (MessageRx[21]<=0x0A) A = 277;
if (MessageRx[21]==0x0B || MessageRx[77]==0x0C) A = 278;
if (MessageRx[21]>=0x0D) A = 279;
B = MessageRx[22]/10.0;
drob = modf(B, &cel);
if (drob>0.6) cel++;
TempOil = ((MessageRx[21]*26)-A)+cel;
if (MessageRx[61]<=0x0A) A = 277;
if (MessageRx[61]==0x0B || MessageRx[77]==0x0C) A = 278;
if (MessageRx[61]>=0x0D) A = 279;
B = MessageRx[62]/10.0;
drob = modf(B, &cel);
if (drob>0.6) cel++;
TempFuel = ((MessageRx[61]*26)-A)+cel;
timerenabledPID=0;
}
for (int i = 0; i < 110; i++) MessageRx[i]=0; // очистка байтов массива
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//отправка запроса на диагностическое соединение
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void initialization() {
Serial.println ("Otpravil zapros Init");
for (int i = 0; i < length5; i++) {
mySerial.write(messageInit[i]);
delay (5);
}
delay (55);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//стартовая инициализация
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void fastinit() {
digitalWrite (TX, HIGH); // makes K-line high 3
delay(360); // wait for K-line to be clear 3
digitalWrite (TX, LOW); // makes K-line low 3
delay(25);
digitalWrite (TX, HIGH); // makes K-line high 3
delay(25); //last delay before first message
mySerial.begin(10400); // baud rate of the OBD
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
//запрос чтения и стирания ошибок
///////////////////////////////////////////////////////////////////////////////////////////////////////
void Read() {
Serial.println ("Zapros error; ");
for (int i = 0; i < length8; i++) {
mySerial.write(messageREAD[i]);
delay (waitbyte); }
}
void Erase() {
Serial.println ("Zapros erase; ");
for (int i = 0; i < length7; i++) {
mySerial.write(messageERASE[i]);
delay (waitbyte); }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//прорисовка экранов и работа тачскрина
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Menu () {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
if (currentPage == '0') {
buttonHomeTouch();
buttonINF1Touch();
buttonINF2Touch();
buttonCHECKTouch(); }
if (currentPage == '1') {
buttonHomeTouch();
buttonINF2Touch();
buttonCHECKTouch(); }
if (currentPage == '2') {
buttonHomeTouch();
buttonINF1Touch();
buttonCHECKTouch(); }
if (currentPage == '3') {
buttonHomeTouch();
buttonREADTouch();
buttonERASETouch(); }}}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//прописывает заголовки на страницах
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void drawHomeScreen() {
line() ;
vista();
Watch ();
myGLCD.drawLine(239,35,239,248); // линия вертикальная
myGLCD.print("Ltr/Hor :", 10, 40);
myGLCD.print("Ltr/100 :", 10, 75);
myGLCD.print("Fuel L :", 10, 110);
myGLCD.print("Humed %:", 10, 145);
myGLCD.print("PUMP RPM:", 10, 180);
myGLCD.print("Engi RPM:", 10, 215);
myGLCD.print("Motor *C:", 255, 40);
myGLCD.print("Oil *C:", 255, 75);
myGLCD.print("Fuel *C:", 255, 110);
myGLCD.print("Inter *C:", 255, 145);
myGLCD.print("Exter *C:", 255, 180);
myGLCD.print("IntAir*C:", 255, 215);
buttonHome() ;
buttonINF1() ;
buttonINF2() ;
buttonCHECK() ;
}
//-------------------------------------------------
void drawscreen_one() {
line() ;
vista();
Watch ();
myGLCD.print("Start of Delivery *CA:", 10, 40);
myGLCD.print("Desir inject Start *CA:", 10, 75);
myGLCD.print("Actua Inject Start *CA:", 10, 110);
myGLCD.print("Desir Inject Quan mg/s:", 10, 145);
myGLCD.print("Actu Inject Quant mg/s:", 10, 180);
myGLCD.print("MAF mg/s:", 10, 215);
myGLCD.print("Barom kPa:", 255, 215);
buttonHome() ;
buttonINF2() ;
buttonCHECK() ;
}
//-------------------------------------------------
void drawscreen_two() {
line() ;
vista();
Watch ();
myGLCD.print("Boost Press Bar:", 10, 40);
myGLCD.print("Boost Press Com Bar:", 10, 75);
myGLCD.print("EGR command mg/s:", 10, 110);
myGLCD.print("EGR Pulse Ratio %:", 10, 145);
myGLCD.print("Solenoide Pulse %:", 10, 180);
myGLCD.print("Solenoide Boost %:", 10, 215);
buttonHome() ;
buttonINF1() ;
buttonCHECK() ;
}
//----------------------------------------------------------------------------
void drawscreen_three() {
vista();
Watch ();
myGLCD.setColor(255, 0, 0); // цвет линии красный
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
buttonHome();
buttonERASE();
buttonREAD();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//координаты тача
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void drawFrame(int x1, int y1, int x2, int y2) {
myGLCD.setColor(255, 0, 0);
myGLCD.drawRoundRect (x1, y1, x2, y2);
while (myTouch.dataAvailable())
myTouch.read();
myGLCD.setColor(255, 255, 255);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//прорисовка кнопок и координат тача
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void buttonHome() {
myGLCD.setColor(0,0,0); // цвет кнопки -серый
myGLCD.fillRoundRect (1, 1, 80, 33); // расположение кнопки прямоугольника
myGLCD.setColor(255, 255,255); // цвет текста зеленый
myGLCD.drawRoundRect (1, 1, 65, 33); // кнопка будет рамкой
myGLCD.setFont(GroteskBold16x32); // размер шрифта
myGLCD.setBackColor(0,0,0); // цвет фона области где будет надпись и кнопки
myGLCD.print("HOME", 1, 0); // центровка строки
}
void buttonHomeTouch(){
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
myGLCD.clrScr();
drawHomeScreen();
}}
void buttonINF1() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (10, 255, 120, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (10, 255, 120, 310);
myGLCD.setFont(GroteskBold16x32);
myGLCD.setBackColor(0,0,0);
myGLCD.print("INF 1", 25, 265);
}
void buttonINF1Touch() {
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
} }
void buttonINF2() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (180, 255, 300, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (180, 255, 300, 310);
myGLCD.setFont(GroteskBold16x32);
myGLCD.setBackColor(0,0,0);
myGLCD.print("INF 2", 200, 265);
}
void buttonINF2Touch() {
if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
drawFrame(180, 255, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
}}
void buttonCHECK() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (350, 255, 470, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (350, 255, 470, 310);
myGLCD.setFont(GroteskBold16x32);
myGLCD.setBackColor(0,0,0);
myGLCD.print("CHECK", 375, 265);
}
void buttonCHECKTouch() {
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
} }
void buttonERASE() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (10, 255, 120, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (10, 255, 120, 310);
myGLCD.setFont(GroteskBold16x32);
myGLCD.setBackColor(0,0,0);
myGLCD.print("ERASE", 25, 265);
}
void buttonERASETouch () {
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
Erase(); //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
}}
void buttonREAD() {
myGLCD.setColor(0,0,0);
myGLCD.fillRoundRect (350, 255, 470, 310);
myGLCD.setColor(0, 255, 0);
myGLCD.drawRoundRect (350, 255, 470, 310);
myGLCD.setFont(GroteskBold16x32);
myGLCD.setBackColor(0,0,0);
myGLCD.print("READ", 375, 265);
}
void buttonREADTouch() {
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
Read(); //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
}}
////////////////////////////////////////////////////////////////////////////////////////
//прорисовка линий
///////////////////////////////////////////////////////////////////////////////////////
void line() {
myGLCD.setColor(255, 0, 0); // цвет линии красный
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,73,479,73); // линия горизонтальная
myGLCD.drawLine(1,108,479,108); // линия горизонтальная
myGLCD.drawLine(1,143,479,143); // линия горизонтальная
myGLCD.drawLine(1,178,479,178); // линия горизонтальная
myGLCD.drawLine(1,212,479,212); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
}
////////////////////////////////////////////////////////////////////////////////////////////
//отображение щрифта
////////////////////////////////////////////////////////////////////////////////////////////
void vista(){
myGLCD.setFont(GroteskBold16x32);
myGLCD.setColor(0, 255, 0);
myGLCD.setBackColor(0,0,0);
}
/////////////////////////////////////////////////////////////////////////////////////////////
//верхняя часть экрана часы и дата отображается на всех экранах
/////////////////////////////////////////////////////////////////////////////////////////////
void Watch (){
DateTime now = rtc.now();
int m = now.minute();
int hour = now.hour();
int mon = now.month();
int date = now.day();
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.setFont(GroteskBold16x32);
if (date<10) {
myGLCD.print("0", 85, 0);
myGLCD.printNumI(now.day(), 100, 0); }
else if (date >=10) {
myGLCD.printNumI(now.day(), 85, 0); }
myGLCD.print("/", 115, 0);
if ( mon<10) {
myGLCD.print("0", 130, 0);
myGLCD.printNumI(now.month(), 145, 0);}
else if (mon >=10) {
myGLCD.printNumI(now.month(), 130, 0);}
myGLCD.print("/", 160, 0);
myGLCD.printNumI(now.year(), 175, 0);
if (hour<10) {
myGLCD.print("0",255, 0);
myGLCD.printNumI(now.hour(), 270, 0); }
else if(hour>=10){
myGLCD.printNumI(now.hour(), 255, 0); }
if (m<10) {
myGLCD.print("0",300, 0);
myGLCD.printNumI(now.minute(), 315, 0); }
else if (m>=10){
myGLCD.printNumI(now.minute(), 300, 0); }
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.print("Km/h", 410, 0);
}
void Temperature (){
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.setFont(GroteskBold16x32);
h = dht.readHumidity();
t = dht.readTemperature();
sensors.requestTemperatures();
}
короче в ошибке конкретно Р 0400 , последний ноль не показывает. думал проблема в третьей позиции, сделал эту ошибку первой а потом остальные. в первом раяду она выглядит так же без последнего нуля.
ERROR 1: P040
ERROR 2: P1110
ERROR 3: P0115
х.з. в чем косяк. мне кажется что у нас не учтено если подряд два ноля. у нас учтено если первый ноль а если второй тоже ? может нужно задать еще строчку типа
if(MessageRx[9+(i*3)]<=0x00) {myGLCD.print("00", 180, (75+y)); nolA = 1;}
понял. попробую позже. хочу уже все сопли нормально собрать в корпус. замучался с висящими проводами. остается последняя большая проблема это затирание. ну и на последок расход в час и на 100 и бак. но сначало затирания.
по поводу активный пассивный DTC можно две строчки добавить вот сюда
for (int i=0; i<MessageRx[8]; i++ ) {
int y = i*35;
bool nolA=0; bool nolB =0;
if (!bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) setColor (0,255,0); // если пассивный DTC делаем цвет такой то
if (bitRead(MessageRx[11+(i*3)],7) && !bitRead(MessageRx[11+(i*3)],6)) setColor (255,0,0); // если активный DTC делаем цвет такой то
привет MaksVV. наконц то засунул все в коробку. сегодня попробовал твои поправки. с нулями все ок. с активен не активаен всегда красное. нас в принцыпе интересует только первая буква в третьем байте. он либо А либо Е, Activo _ En activo. изучаю вопрос затирания. на сколько я понял ты предлагешь попробовать перед каждым обновляемом месте ставить черный квадрат fillRect?
и никак не получается с расходом. с расходом в час вроде придумал так, не знаю или правильно, но, форсунка впрыскивает 7м/г в сек. четыре горшка 7*4=28 м/г в секунду, вот формула LHor = ((InjQua*4)*3.6)/100.0; получил 1 литр в час. вроде коррекно, должно быть пол мотора 2.0. но на скорости больше 5.5 литров не показывает, значит не совсем корректно. с на 100 пробовал разные формулы но я там запутываюсь с галонами , милями и т.д. вообщем пока каша. чуток осталось до финала...........
А еще на 4 цилиндра то 0.84 кг/час — самый раз.
Итого Расход в час = Gт * rpm/2 /1000*60/1000* число_цил. Если разделим на плотность топлива получим л/час. Если разделим на скорость и умножим на 100 получим л/100км.
Надо переживать эту информацию. Вечером перевариваю. Есть ещё одна вещь, пытаюсь найти остаток топлива, при прослушал опком при заходе в некую страницу инфы, опком не делает ни инициализация ни посылок в порту тишина но, он получает всю информацию с панели приборов включая топливо. Как он это получает? Полу CAN? Что ли?
Я тоже об этом думал. Нужно найти даташит на него или методом эксперимента смотреть сколько литров в баке через опком и заменрять на датчике напряжение и записывать. Потом все прописать. Я так думаю.
запускаю опком, он делает инициализацию такую в зависимости что я выберу, мотор, шасси , мобилайзер и т,д. и я выбераю панель приборов. и при выборе этой вкладки он ничего не инициализируюет и не посылает ни каких запросов а просто на экране появляется все дданные панели приборов. на счет пяти вольт, это да, но думаю что нет. завтра проверю напряжение у меня как раз почти полный бак. щас буду расчихлятся с расходом.
в том то и дело что он по той же седьмой лини вытягивает. в проге есть пункт где он показывает к какой лини он обращается. ну да ладно. завтра глаяну напругу на датчике в панели.
вот строчки по поводу активный, пассивный DTC . должно работать
for (int i=0; i<MessageRx[8]; i++ ) {
int y = i*35;
bool nolA=0; bool nolB =0;
if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0);
myGLCD.print("Active", 235, (75+y));} // если DTC активный делаем цвет красный
if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0);
myGLCD.print("Passive", 235, (75+y));} // если DTC пассивный, делаем цвет зеленый
далее остальное
Не проходит проверку он у тебя когда более 1 дтс
точно. ну да когда меняется мой любимый нолевой байт :) про который я вечно забываю
Проверку 4 байта просто убери и все
убрал иду проверю
А что ты тогда убрал? Непонятно
убрал пер вый проверочный байт 85. сделал три ошибки
FF FF FF FF 8B F1 11 58 3 1 15 E1 11 10 E4 4 0 E4 CC
все пошло на экране , подогнал координаты буквы и цыфры,
вот что получаем , а получаем DEC
ERROR: 1 : p 1 21 P0115
ERROR: 2 : p 1716 P1110
ERROR: 3 : p 4 0 Pне помню
Надо добавить прописывание нуля, если байт менее или равен 0х0F
А еррор точно во всех строках 1?
испарвил. просто копировал
но не внрное отображение ERROR: 1 : p 1 21 P0115
поправлю позже
ок. сенкс
скинь последнюю версию той части скетча
короче как то так, корректируй координаты под свои
последняя версия
HEX все заваливаета. второй вариант работает но без HEX. подогнал координаты. отображаются нули. вот скетч с обоими вариантами но первый вариант закоментирован. получаем что и в первом варианте только с нулями, естественно в DEC.
а где проверка по байтам сообщения с ошибками в последнем скетче?
подгоняй координаты
Закоментировал. Случайно.
PS поправил кое че. забыл в одном месте HEX поставить
да я увиидел
да. очередная победа. единственное в третей ошибке пропал 0
ERROR 1: P0115
ERROR 2: P1110
ERROR 3: P040
щас еще раз пойду и проверю.
по поводу нуля с координатами чето, у меня показывает
вот эту часть надо вот так , а то P для всех ошибок рисуется по первой, а надо для каждой своё
короче в ошибке конкретно Р 0400 , последний ноль не показывает. думал проблема в третьей позиции, сделал эту ошибку первой а потом остальные. в первом раяду она выглядит так же без последнего нуля.
ERROR 1: P040
ERROR 2: P1110
ERROR 3: P0115
х.з. в чем косяк. мне кажется что у нас не учтено если подряд два ноля. у нас учтено если первый ноль а если второй тоже ? может нужно задать еще строчку типа
if
(MessageRx[9+(i*3)]<=0x00) {myGLCD.print(
"00"
, 180, (75+y)); nolA = 1;}
if
(MessageRx[10+(i*3)]<=0x00) {myGLCD.print(
"00"
, 212, (75+y)); nolB = 1;}
но это мое предположение. х.з...... чуток позже попробую
нет, разнеси байты по координатам подальше друг от друга
и выложи код , как у тебя
ок.
в конце каждой сточки обьяснение что двигается при изменении координат. раздвинул по дальше , результат тотже. вот с описанием
ERROR 1: P040
ERROR 2: P1110
ERROR 3: P0115
помогло вот это, то что я предлагал. но не знаю или это правильно. но получил 0400.
if (MessageRx[10+(i*3)]<=0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;}
сделал так вроде все нормально отображает.
тогда уж вот так
понял. попробую позже. хочу уже все сопли нормально собрать в корпус. замучался с висящими проводами. остается последняя большая проблема это затирание. ну и на последок расход в час и на 100 и бак. но сначало затирания.
по поводу активный пассивный DTC можно две строчки добавить вот сюда
очень хотелось, но не хотел уже тебя напрягать. обязательно сегодня попробую
затирание, попробуй через рисование черного прямоугольника, описание как сделать найдешь по ссылке работы с твоим экраном, я выше давал
ок. гляну
привет MaksVV. наконц то засунул все в коробку. сегодня попробовал твои поправки. с нулями все ок. с активен не активаен всегда красное. нас в принцыпе интересует только первая буква в третьем байте. он либо А либо Е, Activo _ En activo. изучаю вопрос затирания. на сколько я понял ты предлагешь попробовать перед каждым обновляемом месте ставить черный квадрат fillRect?
сделал так
myGLCD.setColor(0, 0, 0);
myGLCD.fillRect (160, 215, 235, 245);
myGLCD.setColor(255, 255, 255);
myGLCD.printNumI(RPM, 165, 215);
мерцает........
и никак не получается с расходом. с расходом в час вроде придумал так, не знаю или правильно, но, форсунка впрыскивает 7м/г в сек. четыре горшка 7*4=28 м/г в секунду, вот формула LHor = ((InjQua*4)*3.6)/100.0; получил 1 литр в час. вроде коррекно, должно быть пол мотора 2.0. но на скорости больше 5.5 литров не показывает, значит не совсем корректно. с на 100 пробовал разные формулы но я там запутываюсь с галонами , милями и т.д. вообщем пока каша. чуток осталось до финала...........
А там точно в секунду? Бывает мг/такт.
я так думал. посмотрел mg/strk. ты прав такт.
Допустим 1000 об/мин значит 500тактов/мин.
Если ест 7мг/такт. Умножаем. 3500 мг/мин или 3.5 г/мин или 210 г/час или 0,21 кг/час. Чето мало
А еще на 4 цилиндра то 0.84 кг/час — самый раз.
Итого Расход в час = Gт * rpm/2 /1000*60/1000* число_цил. Если разделим на плотность топлива получим л/час. Если разделим на скорость и умножим на 100 получим л/100км.
Нужно потом еще с еепром поработать. Т.е. запоминать средний расход на 100 км
Надо переживать эту информацию. Вечером перевариваю. Есть ещё одна вещь, пытаюсь найти остаток топлива, при прослушал опком при заходе в некую страницу инфы, опком не делает ни инициализация ни посылок в порту тишина но, он получает всю информацию с панели приборов включая топливо. Как он это получает? Полу CAN? Что ли?
....
Можно к панели прицепиться напрямую к датчику уровня
Я тоже об этом думал. Нужно найти даташит на него или методом эксперимента смотреть сколько литров в баке через опком и заменрять на датчике напряжение и записывать. Потом все прописать. Я так думаю.
Это ты к панели подключаешься опкомом? Или в параметрах двс есть остаток топлива?
Да так можно сделать. Хорошо бы выше 5 вольт не поднималось
запускаю опком, он делает инициализацию такую в зависимости что я выберу, мотор, шасси , мобилайзер и т,д. и я выбераю панель приборов. и при выборе этой вкладки он ничего не инициализируюет и не посылает ни каких запросов а просто на экране появляется все дданные панели приборов. на счет пяти вольт, это да, но думаю что нет. завтра проверю напряжение у меня как раз почти полный бак. щас буду расчихлятся с расходом.
да, наверное там своя шина, может и не кан конечно, но на другом пине ,видать, в разъеме обд сидит.
в том то и дело что он по той же седьмой лини вытягивает. в проге есть пункт где он показывает к какой лини он обращается. ну да ладно. завтра глаяну напругу на датчике в панели.
число циклов это как?
вот строчки по поводу активный, пассивный DTC . должно работать