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
поправлю позже
ок. сенкс
скинь последнюю версию той части скетча
короче как то так, корректируй координаты под свои
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), 130, (75+y)); if (!bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(": P", 140, (75+y)); if (bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(": C", 140, (75+y)); if (!bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(": B", 140, (75+y)); if (bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(": U", 140, (75+y)); if (MessageRx[9+(i*3)]<=0x0F) {myGLCD.print("0", 180, (75+y)); nolA = 1;} if (nolA) myGLCD.print(String (MessageRx[9+(i*3)],HEX), 190, (75+y)); else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 180, (75+y)); if (MessageRx[10+(i*3)]<=0x0F) {myGLCD.print("0", 180, (75+y)); nolB = 1;} if (nolB) myGLCD.print(String (MessageRx[10+(i*3)],HEX), 190, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 180, (75+y));}последняя версия
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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 "); } // при получении этого сообщения выдавать на третий экран "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(); }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(); }а где проверка по байтам сообщения с ошибками в последнем скетче?
подгоняй координаты
if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58){ Serial.println ("DTC is found!"); for (int i=0; i<MessageRx[8]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; myGLCD.print("ERROR ", 0, (75+y)); myGLCD.printNumI((i+1), 100, (75+y)); if (!bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(": P", 120, (75+y)); if (bitRead(MessageRx[9],6) && !bitRead(MessageRx[9],7)) myGLCD.print(": C", 120, (75+y)); if (!bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(": B", 120, (75+y)); if (bitRead(MessageRx[9],6) && bitRead(MessageRx[9],7)) myGLCD.print(": U", 120, (75+y)); if (MessageRx[9+(i*3)]<=0x0F) {myGLCD.print("0", 180, (75+y)); nolA = 1;} if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 190, (75+y)); else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 180, (75+y)); if (MessageRx[10+(i*3)]<=0x0F) {myGLCD.print("0", 212, (75+y)); nolB = 1;} if (nolB) myGLCD.print(String (MessageRx[10+(i*3)],HEX), 222, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 212, (75+y));} }Закоментировал. Случайно.
PS поправил кое че. забыл в одном месте HEX поставить
да я увиидел
да. очередная победа. единственное в третей ошибке пропал 0
ERROR 1: P0115
ERROR 2: P1110
ERROR 3: P040
щас еще раз пойду и проверю.
по поводу нуля с координатами чето, у меня показывает
вот эту часть надо вот так , а то P для всех ошибок рисуется по первой, а надо для каждой своё
if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 160, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 160, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 160, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 160, (75+y));короче в ошибке конкретно Р 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;}
сделал так вроде все нормально отображает.
тогда уж вот так
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));} //двигает воторой байт в2 и 3 соопонял. попробую позже. хочу уже все сопли нормально собрать в корпус. замучался с висящими проводами. остается последняя большая проблема это затирание. ну и на последок расход в час и на 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?
сделал так
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 . должно работать
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 пассивный, делаем цвет зеленый далее остальное