это я имею ввиду, когда ты добьешься того, что данные пойдут обновляться, они будут не все обновляться, т.к. в середине ответа за запрос 2101 у блока задержка и ардуина вторую половинку сообщения будет видеть как новое сообщение, а у нас там проверка по начальным байтам. Надо будет с этим что то делать.
пробуй скетч #481. вставляй туда также распетатку Serial. не забудь Serial.begin и правильную проверку по начальным байтам ответа на 2101. и задержку буфера отрегулируй оптимальную , ну может 150 сделать или 180
задержка играет какю то рлоль. пытаюсь уловить что происходит при уменьшении и при увеличении. что могу сказать уже это то что если закоменитировать задержку иде 58 байт, если в районе от 10 и дальше то принемает вроде все байты но при увеличении задержки рвет так что каждое увеличение задержки уменьшает первую чатсь отрезка и увеличивает вторую чатсть отрезка. пока все
Он не успел напечатать а тут опять запрос и он после него допечатывает. Бывает что часть состоит из второй половины первого ответа и первой второго ответа
выкладывай каждый раз что происходит в сериале. В прошлый раз ты выложил, дак там каждый ответ по 63 байта присутствовало, а это как раз стандартный размер буфера Serial.available
ну понятно, буфера не хватает в нашем скетче, всё коряво конечно сделано. Самое простое сейчас. Короче залезаешь в папку Arduino. она по умолчанию обычно в Programm Files. Ищешь файл SoftwareSerial.h открываешь с помощью блокнота и меняешь в строке #define _SS_MAX_RX_BUFF 64 цифру 64 на 100 например. этого должно хватить. потом сохраняешь, и вуаля. Задержку похоже придётся около 300 делать для стабильности
да еще в сериале при работе с эмулятором у меня выводило данные с запятой типа 22,1 на экране 22. читал чуток про float что он для таких целей, увидел что ты заявил на некоторые пиды но не помогает. я попробовал заявить на StarDavil должно показывать 22,1 , не помогло все равно 22
Да MaksVV это сработало идеально, но я нашел еще один косяк, оказывается задержка которую я сегодня целый день мучал, соединяла в одном ответе два куска из разных ответов, закоментировал ее и как ты сказал вуаля!!!! завтра уже все четко проверю и отпишусь. с запятыми понял. если все пучком будет то, остается расход на 100 , в час и бак топлива ну и ошибки, чтение и стирание. Уже близок твой конец KWP2000 :)
без этой задержки ниче работать не будет. Без неё по идее по одному байту только в массив будет записываться, и будет куча однобайтовых сообщений.
вот формулы температуры точные с округлением правильным для нас второго байта и корректировкой первого байта по вычитаемому числу. Не знаю как насчет косяков, не проверял.
MAF = ((MessageRx[29]*256)+MessageRx[30])/10;
BoostPres = ((MessageRx[31]*256)+MessageRx[32])/1000;
RPM = (MessageRx[35]*256)+MessageRx[36];
EGRmg = ((MessageRx[37]*256)+MessageRx[38])/10;
BoostPresCom = ((MessageRx[41]*256)+MessageRx[42])/1000;
Speed = (MessageRx[47]*256)+MessageRx[48];
DesaInjQua = ((MessageRx[53]*256)+MessageRx[54])/100.00;
InjQua = ((MessageRx[55]*256)+MessageRx[56])/100.00;
StaDaliv = ((MessageRx[57]*256)+MessageRx[58])/100;
PumpRPM = (MessageRx[59]*256)+MessageRx[60];
EGRPul = ((MessageRx[65]*256)+MessageRx[66])/100;
SolenPul = ((MessageRx[67]*256)+MessageRx[68])/100;
SolenPre = ((MessageRx[76]*256)+MessageRx[77])/100;
DesInj = ((MessageRx[75]*3)+(MessageRx[76])/100.00)+0.3;
ActInj = ((MessageRx[19]*3)+(MessageRx[20])/100.00)+0.3;
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;
1. задержка между посвлками как в опкоме 120м/с int PIDTime = 120;
2. в void receive поставил задержку 60 м/с delay(60);
3. формулы работают, на сколько точно позже буду сравнивать с опкомом все данные.
4. прорисовку экрана сделал с 200м/с на 60м/с (curData - prevData > 60)
5. подправил интерфейс , добавил кнопку для чтения и стирания на третей страницы, ну и там еще пару мелочей.
В сериале отевты целые и не разбивает на байты. на экране все уже более мение приемелемо. данные обновляются достаточно быстро. что не так........
1. Можно ли сделать обновление цифр на экране более сглажено, не скачками?
2. очень раздражает мерцание цифр при затиранием на пробел. хотел убрать затирания (чтобы придумать что то другое), но тут проблема, если я забераю затирания и заливаю скетч то, при переходе на другую страницу обрывается связь. Не знаю как это может быть связано.......
3. проставил во всех формулах 10.0 100.0 а на экране все равно отображается только целое число,
Но скажу тебе что результат уже крутяк. вот скетч
#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, selectedUnit;
float h;
float t;
unsigned long prevWatch = 0;
unsigned long prevDvoet = 0;
unsigned long prevData = 0;
bool Dvoet = 0;
//////////////////////////////////////////////////////////////////////////////
//все что касается OBD2
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //RХ,TХ
#define TX 11
int length5 = 5;
int length6 = 6;
int pid = 1; // очередность пида
bool Init = 0;
int PIDTime = 120; // задержка между посылками запросов пидов, мс
int PresTime = 9000; // задержка между посылками запросов присутствия, мс
int waitbyte = 1; // задержка между отправкой байт в сообщении, мс
int MAF = 0; //26,27 байты
int BoostPres = 0; //28,29 байты
int RPM = 0; //32,33 байты
int EGRmg = 0; //34,35 байты
int BoostPresCom = 0; //38,39 байты
int Speed = 0; //44,45 байты
float DesaInjQua = 0.00; //50,51 байты
float InjQua = 0.00; //52,53 байты
int StaDaliv = 0; //54,55 байты
int PumpRPM = 0; //56,57 байты
int EGRPul = 0; //62,63 байты
int SolenPul = 0; //64,65 байты
int SolenPre = 0; //70,71 байты
float DesInj = 0.00; //72,73 байты
float ActInj = 0.00; //16,17 байты
int TempAir = 0; //74,75 байты
int Temp = 0; //14,15 байты
int TempOil = 0; //18,19 байты
int TempFuel = 0; //58,59 байты
// массив байтов принимаемого сообщения
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}; // запрос температуры 1
unsigned long prevPID = 0;
unsigned long prevpres = 0;
unsigned long TimewaitPID, timerwaitPID = 0;
bool timerenabledPID = 0;
#define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 1000 // здесь задержка на ожидание правильного ответа пидов, мс
unsigned long TimewaitInit, timerwaitInit = 0;
bool timerenabledInit = 0;
#define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 1000 // здесь задержка на ожидание ответа об удачной инициализации, мс
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
mySerial.begin(10400);
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
drawHomeScreen();
currentPage = '0';
selectedUnit = '0';
Wire.begin();
rtc.begin();
dht.begin();
sensors.begin();
// строка ниже используется для настройки даты и времени часов (год, месяц, день, часы, минуты, секунды)
rtc.adjust(DateTime(2017, 7, 6, 17, 35, 0));
Watch_Temperature ();
pinMode(TX, OUTPUT);
fastinit();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned long curPID = millis ();
unsigned long curpres = millis ();
TimewaitPID = millis ();
TimewaitInit = millis ();
if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
else {if (TIMEREXPIRED_Init) {timerenabledInit=0;}}}
else {
if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}
if (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}
}
receive ();
unsigned long curWatch = millis();
unsigned long curDvoet = millis();
unsigned long curData = millis();
if (curWatch - prevWatch > 10000) { Watch_Temperature (); prevWatch = curWatch;}
if (curDvoet - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
Menu();
//---------------------------------------------------------
//прописываем где и что мы хотим видеть (пиды)
if (currentPage == '0') {if (curData - prevData > 60){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//if (--<10) {myGLCD.print(" ", 166, 40); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 40); }; //затирает третюю цифру
//myGLCD.printNumI(--, 165, 40);
//if (--<10) {myGLCD.print(" ", 166, 75); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 75); }; //затирает третюю цифру
//myGLCD.printNumI(--, 165, 75);
//if (--<10) {myGLCD.print(" ", 166, 110); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 110); }; //затирает третюю цифру
//myGLCD.printNumI(--, 165, 110);
//if (--<10) {myGLCD.print(" ", 166, 145); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 145); }; //затирает третюю цифру
myGLCD.printNumI(h, 165, 145);
if (PumpRPM>10) {myGLCD.print(" ", 212, 180); }; //затираем четвертую цифру
myGLCD.printNumI(PumpRPM, 165, 180);
if (RPM>100) {myGLCD.print(" ", 212, 215);}; //затираем четвертую цифру
myGLCD.printNumI(RPM, 165, 215);
//-------------------------------------------
if (Temp<10) {myGLCD.print(" ", 426, 40); }; //затираем вторую цифру и третью
if (Temp>10) {myGLCD.print(" ", 442, 40); }; //затирает третюю цифру
myGLCD.printNumI(Temp, 410, 40);
if (TempOil<10) {myGLCD.print(" ", 426, 75); }; //затираем вторую цифру и третью
if (TempOil>10) {myGLCD.print(" ", 442, 75); }; //затирает третюю цифру
myGLCD.printNumI(TempOil, 410, 75);
if (TempFuel<10) {myGLCD.print(" ", 426, 110); }; //затираем вторую цифру и третью
if (TempFuel>10) {myGLCD.print(" ", 442, 110); }; //затирает третюю цифру
myGLCD.printNumI(TempFuel, 410, 110);
myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
myGLCD.printNumI(t, 410, 180);
if (TempAir<10) {myGLCD.print(" ", 426, 215); }; //затираем вторую цифру и третью
if (TempAir>10) {myGLCD.print(" ", 442, 215); }; //затирает третюю цифру
myGLCD.printNumI(TempAir, 410, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '1') {if (curData - prevData > 60){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
if (StaDaliv<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью
if (StaDaliv>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
myGLCD.printNumI(StaDaliv, 395, 40);
if (DesInj<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью
if (DesInj>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру
myGLCD.printNumI(DesInj, 395, 75);
if (ActInj<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью
if (ActInj>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру
myGLCD.printNumI(ActInj, 395, 110);
if (DesaInjQua<10) {myGLCD.print(" ", 411, 145); }; //затираем вторую цифру и третью
if (DesaInjQua>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру
myGLCD.printNumI(DesaInjQua, 395, 145);
if (InjQua<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью
if (InjQua>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру
myGLCD.printNumI(InjQua, 395, 180);
if (TempAir<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью
if (TempAir>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру
myGLCD.printNumI(TempAir, 395, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '2') {
if (curData - prevData > 60){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
if (BoostPres<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью
if (BoostPres>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
myGLCD.printNumI(BoostPres, 395, 40);
if (BoostPresCom<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью
if (BoostPresCom>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру
myGLCD.printNumI(BoostPresCom, 395, 75);
//if (EGRmg<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью
//if (EGRmg>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру
if (EGRmg>100) {myGLCD.print(" ", 443, 110); }; //затирает четвертую цифру
myGLCD.printNumI(EGRmg, 395, 110);
if (EGRPul<10) {myGLCD.print(" ", 411, 145); }; //затираем вторую цифру и третью
if (EGRPul>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру
myGLCD.printNumI(DesaInjQua, 395, 145);
if (SolenPul<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью
if (SolenPul>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру
myGLCD.printNumI(SolenPul, 395, 180);
if (SolenPre<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью
if (SolenPre>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру
myGLCD.printNumI(SolenPre, 395, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '3') {if (curData - prevData > 60){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
prevData = curData;
}
}
}
///////////////////////////////////////////////////////////////////////////
//отправка запросов пидов
void PIDs() {
Serial.println ("Otpravil zapros 21 01");
if (pid==1){
for (int i = 0; i < length6; i++) {
mySerial.write(messagePids[i]);
delay (waitbyte); }
}
}
void present() {
for (int i = 0; i < length5; i++) {
mySerial.write(messagePresent[i]);
delay (waitbyte); }
}
/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных из конкретных ответо, конкретные байты
void receive () {
if (mySerial.available()) {
delay(60);
int k=0;
byte inbyte=0;
while( mySerial.available() && k < 110) {
inbyte = mySerial.read();
MessageRx[k] = inbyte;
k++; }
PIDs();
Serial.print ("Recieve: ");
for (int i = 0; i < k; i++) {
Serial.print(MessageRx[i],HEX); Serial.print (" ");}
Serial.println ("");
if (MessageRx[0]==0x83 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0xC1 && MessageRx[4]==0x6B && MessageRx[5]==0x8F && MessageRx[6]==0x40) {Init=1;
timerenabledInit=0; Serial.println (" Initialization OK!!!!: ");
}
if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) {
MAF = ((MessageRx[29]*256)+MessageRx[30])/10.0;
BoostPres = ((MessageRx[21]*256)+MessageRx[22])/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];
DesaInjQua = ((MessageRx[53]*256)+MessageRx[54])/100.00;
InjQua = ((MessageRx[55]*256)+MessageRx[56])/100.00;
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.00)+0.3;
ActInj = ((MessageRx[19]*3)+(MessageRx[20])/100.00)+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() {
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 Menu () {
//Page 0 (home)
if (currentPage == '0') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
drawFrame(180, 255, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------
//Page 1
if (currentPage == '1') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
drawFrame(180, 255, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//---------------------------------------------------------------------------------------------------
//Page 2
if (currentPage == '2') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------
//Page 3
if (currentPage == '3') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
/* // Button READ
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3'; //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
Watch_Temperature ();
}
// Button ERASE
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1'; //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_one(); //потом заменить на дейсвие
Watch_Temperature ();
}
*/
}
}
}
//--------------------------------------------------------
//прописывает заголовки на всех страницах
void drawHomeScreen() {
line() ;
vista();
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();
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("Mass Air Flow mg/s:", 10, 215);
buttonHome() ;
buttonINF2() ;
buttonCHECK() ;
}
//-------------------------------------------------
void drawscreen_two() {
line() ;
vista();
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();
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(0, 255, 0); // цвет текста зеленый
myGLCD.drawRoundRect (1, 1, 65, 33); // кнопка будет рамкой
myGLCD.setFont(GroteskBold16x32); // размер шрифта
myGLCD.setBackColor(0,0,0); // цвет фона области где будет надпись и кнопки
myGLCD.print("HOME", 1, 0); // центровка строки
}
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 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 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 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 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 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_Temperature (){
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);
myGLCD.setColor(255, 255, 255);
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); }
h = dht.readHumidity();
t = dht.readTemperature();
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.print("Km/h", 410, 0);
sensors.requestTemperatures();
}
MaksVV специально для тебя видос выкинул. полюбуйся на наши труды :)
Эта PIDtime задержка работает только в случае, если блок не отвечат на запрос 2101, если ответил - таймер сбрасываетсяна 0. Т.е. после того как блок ответил, сразу опять шлётся запрос 2101. Т.е. реально данные гораздо чаще посылаются. Надеюсь так и работает. А вот если блок не отвечает, чтоб не серить запросами 2101 я сделал эту задержку. Она не тормозит программу. Тут все ништяк.
Чтоб данные обновлялись не скачками помоему тут только один выход - быстрее их обновлять. Причём как появления на экране так и сами данные. Появление на экране раз в 60мс помоему норм. А вот сами данные да и вообще вся программа немного тормозятся на реальной задержке delay ну раз ты её 60 сделал то это гуд.
На данный момент думаю надо нафиг убрать запрос присутствия - он нужен вроде как только если другие запросы не посылаются (например выбираешь параметры в опкоме или пока не открыл страницу потока данных).
И еще предлагаю откзаться от датчика DHT он глючный, температуру бывает криво показывает. Предлагаю пользовать датчики dallas DS18B20 без библиотек всяких на прерывании, так не будет задержек раз в 10 сек в цикле Watch_Temperature. Кстати попробуй закоментировть строки где d=... h=... и requestTemperatures и посмотри будут ли подтормаживания раз в 10 сек.
с дробными числами может так проканает ? myGLCD.printNumI((float)InjQua, 395, 180);
по мерцанию тему создай в разделе программитрование или аппартные вопросы - как данные правильно на твоем экране отображать, может ответит кто по существу, хотя как показывает практика это врядли что будет по существу.
Труды да, реально серьезные. Такая творческая исследовательская деятельность плюс прокачка опыта.
PIDtime c этим понял. на счет данных. задержку с 60 попробую уменьшить до предела чтобы не гнала косяки в сереале. обновление экрана тоже попробую с 60 уменьшить, я вроде пробовал 10 и было норм. запрос присутсвия согласен , нужно убрать. с этим щас попробую d=... h=... и requestTemperatures. тоже щас попробую. а вото почему при скетче без затираний при переходе на другую страницу рвет соединение? и я щас начну рыть расходы топлива и DTC ошибки. уже прослушал опком на оошибки, спецом сделал ошибку Р0115, имею запрос, ответ ошибок нет, ответ ошибка есть, стирание. щас проверю все что ты сказал, потом потытаюсь прописать DTC.
обновление страниц сделал 0м/с, тормоз из за температуры сделал с 10 секунд до 1 минуты(не кретично, не бросается в глаза, так как реже происходит. убрал присутсвие. отсальное оставил так как есть. это не помогает myGLCD.printNumI((float)InjQua, 395, 180);
да и у нас они уже заявлены float DesInj = 0.00; //72,73 байты float ActInj = 0.00; //16,17 байты. буду думать....
в скетче где опросы нажатия на кнопки убери везде Watch_Temperature (). при перелистывании скорее всего перестанет связь теряться. И че в итоге быстрее данные обновляются?
еще чуток быстрее, а без частого зависания кажется что плавнее. я в принципе доволен. от маленьких кизяков нужно только избавится, и будет ништяк. завтра попробую убрать затирание пробелом и заявить все как float, если твоя мысль Watch_Temperature () сработает. так же нужно посмотреть скорость , отображает бешанные цифры, но это буду проверять все параметры сравнивая с опкомом. вообщем начинается допиливание. :) . впорос или я в правильном направлении иду......... я начал добавлять чтение и стирание ошибок. вот запросы и ответы.
добавил проверку если есть ошибка, //ответ 85 F1 11 58 01 01 15 E1 D7 (58 положительный ответ), это ошибка Р0115.// как расшифровывать буду искать. добавил
if (MessageRx[0]==0x82 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0x58){
// здесь пишем номер байта и формулу
Serial.println (" OSHIBKA ESTY ");
}
так же добавил посылку запроса на чтения и стирания
void Read() {
Serial.println ("Zapros error; ");
for (int i = 0; i < length8; i++) {
mySerial.write(messageREAD[i]);
delay (waitbyte); }
}
void Erase() {
Serial.println ("Zapros borrar; ");
for (int i = 0; i < length7; i++) {
mySerial.write(messageERASE[i]);
delay (waitbyte); }
}
добавил в тач координаты Erase(); и Read();
идея такая при нажатии кнопики READ отправляется запрос ошибок и в зависимости от ответа выводится ответ на этомо же третем экране, при нажатии на кнопку ERASE посылается запрос на стирание ошибок и соответсвено по сообщению стерто выводить на экран BORRADO. я уже в этой всей каше так запутался....... за короткий период времени слишком много инфы, еще всю не переварил.
вот скетч
#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, selectedUnit;
float h;
float t;
unsigned long prevWatch = 0;
unsigned long prevDvoet = 0;
unsigned long prevData = 0;
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;
int pid = 1; // очередность пида
bool Init = 0;
int PIDTime = 120; // задержка между посылками запросов пидов, мс
/////////////int PresTime = 9000; // задержка между посылками запросов присутствия, мс
int waitbyte = 1; // задержка между отправкой байт в сообщении, мс
int MAF = 0; //26,27 байты
int BoostPres = 0; //28,29 байты
int RPM = 0; //32,33 байты
int EGRmg = 0; //34,35 байты
int BoostPresCom = 0; //38,39 байты
int Speed = 0; //44,45 байты
float DesaInjQua = 0.00; //50,51 байты
float InjQua = 0.00; //52,53 байты
int StaDaliv = 0; //54,55 байты
int PumpRPM = 0; //56,57 байты
int EGRPul = 0; //62,63 байты
int SolenPul = 0; //64,65 байты
int SolenPre = 0; //70,71 байты
float DesInj = 0.00; //72,73 байты
float ActInj = 0.00; //16,17 байты
int TempAir = 0; //74,75 байты
int Temp = 0; //14,15 байты
int TempOil = 0; //18,19 байты
int TempFuel = 0; //58,59 байты
// массив байтов принимаемого сообщения
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}; // запрос данных1
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 prevpres = 0;
unsigned long TimewaitPID, timerwaitPID = 0;
bool timerenabledPID = 0;
#define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 1000 // здесь задержка на ожидание правильного ответа пидов, мс
unsigned long TimewaitInit, timerwaitInit = 0;
bool timerenabledInit = 0;
#define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 1000 // здесь задержка на ожидание ответа об удачной инициализации, мс
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
mySerial.begin(10400);
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
drawHomeScreen();
currentPage = '0';
selectedUnit = '0';
Wire.begin();
rtc.begin();
dht.begin();
sensors.begin();
// строка ниже используется для настройки даты и времени часов (год, месяц, день, часы, минуты, секунды)
rtc.adjust(DateTime(2017, 7, 8, 19, 00, 0));
Watch_Temperature ();
pinMode(TX, OUTPUT);
fastinit();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned long curPID = millis ();
//////////unsigned long curpres = millis ();
TimewaitPID = millis ();
TimewaitInit = millis ();
if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
else {if (TIMEREXPIRED_Init) {timerenabledInit=0;}}}
else {
/////////if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}
if (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}
}
receive ();
unsigned long curWatch = millis();
unsigned long curDvoet = millis();
unsigned long curData = millis();
if (curWatch - prevWatch > 60000) { Watch_Temperature (); prevWatch = curWatch;}
if (curDvoet - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
Menu();
//---------------------------------------------------------
//прописываем где и что мы хотим видеть (пиды)
if (currentPage == '0') {if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//if (--<10) {myGLCD.print(" ", 166, 40); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 40); }; //затирает третюю цифру
//myGLCD.printNumI(--, 165, 40);
//if (--<10) {myGLCD.print(" ", 166, 75); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 75); }; //затирает третюю цифру
//myGLCD.printNumI(--, 165, 75);
//if (--<10) {myGLCD.print(" ", 166, 110); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 110); }; //затирает третюю цифру
//myGLCD.printNumI(--, 165, 110);
//if (--<10) {myGLCD.print(" ", 166, 145); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 145); }; //затирает третюю цифру
myGLCD.printNumI(h, 165, 145);
if (PumpRPM>10) {myGLCD.print(" ", 212, 180); }; //затираем четвертую цифру
myGLCD.printNumI(PumpRPM, 165, 180);
if (RPM>100) {myGLCD.print(" ", 212, 215);}; //затираем четвертую цифру
myGLCD.printNumI(RPM, 165, 215);
//-------------------------------------------
if (Temp<10) {myGLCD.print(" ", 426, 40); }; //затираем вторую цифру и третью
if (Temp>10) {myGLCD.print(" ", 442, 40); }; //затирает третюю цифру
myGLCD.printNumI(Temp, 410, 40);
if (TempOil<10) {myGLCD.print(" ", 426, 75); }; //затираем вторую цифру и третью
if (TempOil>10) {myGLCD.print(" ", 442, 75); }; //затирает третюю цифру
myGLCD.printNumI(TempOil, 410, 75);
if (TempFuel<10) {myGLCD.print(" ", 426, 110); }; //затираем вторую цифру и третью
if (TempFuel>10) {myGLCD.print(" ", 442, 110); }; //затирает третюю цифру
myGLCD.printNumI(TempFuel, 410, 110);
myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
myGLCD.printNumI(t, 410, 180);
if (TempAir<10) {myGLCD.print(" ", 426, 215); }; //затираем вторую цифру и третью
if (TempAir>10) {myGLCD.print(" ", 442, 215); }; //затирает третюю цифру
myGLCD.printNumI(TempAir, 410, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '1') {if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
if (StaDaliv<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью
if (StaDaliv>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
myGLCD.printNumI(StaDaliv, 395, 40);
if (DesInj<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью
if (DesInj>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру
myGLCD.printNumI(DesInj, 395, 75);
if (ActInj<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью
if (ActInj>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру
myGLCD.printNumI(ActInj, 395, 110);
if (DesaInjQua<10) {myGLCD.print(" ", 411, 145); }; //затираем вторую цифру и третью
if (DesaInjQua>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру
myGLCD.printNumI(DesaInjQua, 395, 145);
if (InjQua<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью
if (InjQua>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру
myGLCD.printNumI(InjQua, 395, 180);
if (TempAir<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью
if (TempAir>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру
myGLCD.printNumI(TempAir, 395, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '2') {
if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
if (BoostPres<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью
if (BoostPres>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
myGLCD.printNumI(BoostPres, 395, 40);
if (BoostPresCom<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью
if (BoostPresCom>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру
myGLCD.printNumI(BoostPresCom, 395, 75);
//if (EGRmg<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью
//if (EGRmg>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру
if (EGRmg>100) {myGLCD.print(" ", 443, 110); }; //затирает четвертую цифру
myGLCD.printNumI(EGRmg, 395, 110);
if (EGRPul<10) {myGLCD.print(" ", 411, 145); }; //затираем вторую цифру и третью
if (EGRPul>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру
myGLCD.printNumI(DesaInjQua, 395, 145);
if (SolenPul<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью
if (SolenPul>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру
myGLCD.printNumI(SolenPul, 395, 180);
if (SolenPre<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью
if (SolenPre>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру
myGLCD.printNumI(SolenPre, 395, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '3') {if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
prevData = curData;
}
}
}
///////////////////////////////////////////////////////////////////////////
//отправка запросов пидов
void PIDs() {
Serial.println ("Otpravil zapros 21 01");
if (pid==1){
for (int i = 0; i < length6; i++) {
mySerial.write(messagePids[i]);
delay (waitbyte); }
}
}
/*void present() {
for (int i = 0; i < length5; i++) {
mySerial.write(messagePresent[i]);
delay (waitbyte); }
}
*/
/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных из конкретных ответо, конкретные байты
void receive () {
if (mySerial.available()) {
delay(60);
int k=0;
byte inbyte=0;
while( mySerial.available() && k < 110) {
inbyte = mySerial.read();
MessageRx[k] = inbyte;
k++; }
PIDs();
Serial.print ("Recieve: ");
for (int i = 0; i < k; i++) {
Serial.print(MessageRx[i],HEX); Serial.print (" ");}
Serial.println ("");
if (MessageRx[0]==0x83 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0xC1 && MessageRx[4]==0x6B && MessageRx[5]==0x8F && MessageRx[6]==0x40) {Init=1;
timerenabledInit=0; Serial.println (" Initialization OK!!!!: ");
}
//при получении этого сообщения выдавать на третий экран "NO ERROR"
if (MessageRx[0]==0x82 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0x58 && MessageRx[4]==0x00 && MessageRx[5]==0xDC){
currentPage = '3';
myGLCD.print("NO ERROR", 165, 145);
Serial.println (" NO ERROR ");
}
// при получении отличающего сообщения конвертировать байты и выдать номер ошибки
if (MessageRx[0]==0x82 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0x58){
// здесь пишем номер байта и конвертируем в номеро ошибок, если одна и больше
Serial.println (" OSHIBKA ESTY ");
}
// при получении этого сообщения выдавать на третий экран "BORRADO" стерто
if (MessageRx[0]==0x83 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0x54 && MessageRx[4]==0xFF && MessageRx[5]==0x00 && MessageRx[6]==0xD8){
currentPage = '3';
myGLCD.print("BORRADO", 165, 145);
Serial.println (" BORRADOR ");
}
if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) {
MAF = ((MessageRx[29]*256)+MessageRx[30])/10.0;
BoostPres = ((MessageRx[21]*256)+MessageRx[22])/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];
DesaInjQua = ((MessageRx[53]*256)+MessageRx[54])/100.00;
InjQua = ((MessageRx[55]*256)+MessageRx[56])/100.00;
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.00)+0.3;
ActInj = ((MessageRx[19]*3)+(MessageRx[20])/100.00)+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() {
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 () {
//Page 0 (home)
if (currentPage == '0') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
drawFrame(180, 255, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------
//Page 1
if (currentPage == '1') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
drawFrame(180, 255, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//---------------------------------------------------------------------------------------------------
//Page 2
if (currentPage == '2') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------
//Page 3
if (currentPage == '3') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button READ
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
Read(); //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
Watch_Temperature ();
}
// Button ERASE
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
Erase(); //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
Watch_Temperature ();
}
}
}
}
//--------------------------------------------------------
//прописывает заголовки на всех страницах
void drawHomeScreen() {
line() ;
vista();
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();
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("Mass Air Flow mg/s:", 10, 215);
buttonHome() ;
buttonINF2() ;
buttonCHECK() ;
}
//-------------------------------------------------
void drawscreen_two() {
line() ;
vista();
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();
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(0, 255, 0); // цвет текста зеленый
myGLCD.drawRoundRect (1, 1, 65, 33); // кнопка будет рамкой
myGLCD.setFont(GroteskBold16x32); // размер шрифта
myGLCD.setBackColor(0,0,0); // цвет фона области где будет надпись и кнопки
myGLCD.print("HOME", 1, 0); // центровка строки
}
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 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 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 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 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 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_Temperature (){
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);
myGLCD.setColor(255, 255, 255);
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); }
h = dht.readHumidity();
t = dht.readTemperature();
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.print("Km/h", 410, 0);
sensors.requestTemperatures();
}
не забывай, в KWP есть режим 1 - считывание текущих параметров, режим 2, 3 и другие. Дак вот помоему чтоб считать ошибки нужен 3 режим, стереть ещё какой то. режим вроде как меняется так
voidinitialization() {
for(inti = 0; i < length5; i++) {
mySerial.write(messageInit[i]);
delay (5);
}
delay (55);
Не надо объявлять все переменные float, зачем? Понял как выводить на этот дисплей float
myGLCD.printNumF(Temp,2,127,127); было NumI I значит int а надо NumF F - float, цифра 2 это сколько нужно знаков после запятой. вот описание твоего LCD
только что утром читал про NumF щас собрался пробовать. на счет режимов надо почитать, но обком ничего не менят в посылках, просто посылает эти запросы. но если что то по ходу нужно при нажатии кнопки чек переходить в нужный режим. и уже потом кнопкой READ ERRASE делать их дело. щас я тут с пидами разбераюсь не точность, по ходу ошибся счетаом байт на один байт. закончу с этим и займусь ошибками. СЕНКС ЧТО НЕ БРОСАЕШЬ МЕНЯ ДО ПОСЛЕДНЕГО.
ой я не ту часть тебе показал которая режим меняет. вот это меняет режим
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
}
как ты это сниффом то увидишь? это ведь не байты, а замыкание линии на +12 на на 360мс и потом на 25мс, может и увидишь много FF хотя хз. Так что опком возможно и перводит блок в другой режим, просто мы этого не видим. Хотя если у тебя заработает, значит я не прав.
подправил байты в формулах и формулы. убрал затирания пробелом без удаления Watch_Temperature (); из кнопок, вроде все норм. с запятиыми все норм добавл F. потом подумаю с затираниями последних цифр. берусь за DTC
вот обработаный и работающий корректно скетч
#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, selectedUnit;
float h;
float t;
unsigned long prevWatch = 0;
unsigned long prevDvoet = 0;
unsigned long prevData = 0;
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;
int pid = 1; // очередность пида
bool Init = 0;
int PIDTime = 120; // задержка между посылками запросов пидов, мс
/////////////int PresTime = 9000; // задержка между посылками запросов присутствия, мс
int waitbyte = 1; // задержка между отправкой байт в сообщении, мс
int MAF = 0; //26,27 байты
float BoostPres = 0; //28,29 байты
int RPM = 0; //32,33 байты
int EGRmg = 0; //34,35 байты
float BoostPresCom = 0; //38,39 байты
int Speed = 0; //44,45 байты
float DesaInjQua = 0; //50,51 байты
float InjQua = 0; //52,53 байты
float StaDaliv = 0; //54,55 байты
int PumpRPM = 0; //56,57 байты
float EGRPul = 0; //62,63 байты
float SolenPul = 0; //64,65 байты
float SolenPre = 0; //70,71 байты
float DesInj = 0; //72,73 байты
float ActInj = 0; //16,17 байты
int TempAir = 0; //74,75 байты
int Temp = 0; //14,15 байты
int TempOil = 0; //18,19 байты
int TempFuel = 0; //58,59 байты
// массив байтов принимаемого сообщения
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}; // запрос данных1
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 prevpres = 0;
unsigned long TimewaitPID, timerwaitPID = 0;
bool timerenabledPID = 0;
#define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 1000 // здесь задержка на ожидание правильного ответа пидов, мс
unsigned long TimewaitInit, timerwaitInit = 0;
bool timerenabledInit = 0;
#define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 2000 // здесь задержка на ожидание ответа об удачной инициализации, мс
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
mySerial.begin(10400);
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
drawHomeScreen();
currentPage = '0';
selectedUnit = '0';
Wire.begin();
rtc.begin();
dht.begin();
sensors.begin();
// строка ниже используется для настройки даты и времени часов (год, месяц, день, часы, минуты, секунды)
rtc.adjust(DateTime(2017, 7, 8, 19, 00, 0));
Watch_Temperature ();
pinMode(TX, OUTPUT);
fastinit();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned long curPID = millis ();
//////////unsigned long curpres = millis ();
TimewaitPID = millis ();
TimewaitInit = millis ();
if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
else {if (TIMEREXPIRED_Init) {timerenabledInit=0;}}}
else {
/////////if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}
if (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}
}
receive ();
unsigned long curWatch = millis();
unsigned long curDvoet = millis();
unsigned long curData = millis();
if (curWatch - prevWatch > 60000) { Watch_Temperature (); prevWatch = curWatch;}
if (curDvoet - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
Menu();
//---------------------------------------------------------
//прописываем где и что мы хотим видеть (пиды)
if (currentPage == '0') {if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
//if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
//if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//if (--<10) {myGLCD.print(" ", 166, 40); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 40); }; //затирает третюю цифру
//myGLCD.printNumI(--, 165, 40);
//if (--<10) {myGLCD.print(" ", 166, 75); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 75); }; //затирает третюю цифру
//myGLCD.printNumI(--, 165, 75);
// if (Speed<10) {myGLCD.print(" ", 166, 110); }; //затираем вторую цифру и третью
// if (Speed>10) {myGLCD.print(" ", 182, 110); }; //затирает третюю цифру
// myGLCD.printNumI(Speed, 165, 110);
//if (--<10) {myGLCD.print(" ", 166, 145); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 145); }; //затирает третюю цифру
myGLCD.printNumI(h, 165, 145);
//if (PumpRPM>10) {myGLCD.print(" ", 212, 180); }; //затираем четвертую цифру
myGLCD.printNumI(PumpRPM, 165, 180);
//if (RPM>100) {myGLCD.print(" ", 212, 215);}; //затираем четвертую цифру
myGLCD.printNumI(RPM, 165, 215);
//-------------------------------------------
//if (Temp<10) {myGLCD.print(" ", 426, 40); }; //затираем вторую цифру и третью
//if (Temp>10) {myGLCD.print(" ", 442, 40); }; //затирает третюю цифру
myGLCD.printNumI(Temp, 410, 40);
//if (TempOil<10) {myGLCD.print(" ", 426, 75); }; //затираем вторую цифру и третью
//if (TempOil>10) {myGLCD.print(" ", 442, 75); }; //затирает третюю цифру
myGLCD.printNumI(TempOil, 410, 75);
//if (TempFuel<10) {myGLCD.print(" ", 426, 110); }; //затираем вторую цифру и третью
//if (TempFuel>10) {myGLCD.print(" ", 442, 110); }; //затирает третюю цифру
myGLCD.printNumI(TempFuel, 410, 110);
myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
myGLCD.printNumI(t, 410, 180);
//if (TempAir<10) {myGLCD.print(" ", 426, 215); }; //затираем вторую цифру и третью
//if (TempAir>10) {myGLCD.print(" ", 442, 215); }; //затирает третюю цифру
myGLCD.printNumI(TempAir, 410, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '1') {if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
//if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
//if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//if (StaDaliv<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью
//if (StaDaliv>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
myGLCD.printNumF(StaDaliv,1, 395, 40);
//if (DesInj<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью
//if (DesInj>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру
myGLCD.printNumF(DesInj,1, 395, 75);
//if (ActInj<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью
//if (ActInj>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру
myGLCD.printNumF(ActInj,1, 395, 110);
//if (DesaInjQua<10) {myGLCD.print(" ", 411, 145); }; //затираем вторую цифру и третью
//if (DesaInjQua>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру
myGLCD.printNumF(DesaInjQua,1, 395, 145);
//if (InjQua<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью
//if (InjQua>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру
myGLCD.printNumF(InjQua,1, 395, 180);
//if (MAF<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью
//if (MAF>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру
myGLCD.printNumI(MAF, 395, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '2') {
if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
//if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
//if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//if (BoostPres<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью
//if (BoostPres>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
myGLCD.printNumF(BoostPres,1, 395, 40);
//if (BoostPresCom<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью
//if (BoostPresCom>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру
myGLCD.printNumF(BoostPresCom,1, 395, 75);
//if (EGRmg<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью
//if (EGRmg>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру
//if (EGRmg>100) {myGLCD.print(" ", 443, 110); }; //затирает четвертую цифру
myGLCD.printNumI(EGRmg, 395, 110);
//if (EGRPul<10) {myGLCD.print(" ", 411, 145); }; //затираем вторую цифру и третью
//if (EGRPul>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру
myGLCD.printNumF(DesaInjQua,1, 395, 145);
//if (SolenPul<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью
//if (SolenPul>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру
myGLCD.printNumF(SolenPul, 1, 395, 180);
//if (SolenPre<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью
//if (SolenPre>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру
myGLCD.printNumF(SolenPre, 0, 395, 215);
prevData = curData;
}
}
//----------------------------------------------------------
if (currentPage == '3') {if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
//if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
//if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
prevData = curData;
}
}
}
///////////////////////////////////////////////////////////////////////////
//отправка запросов пидов
void PIDs() {
Serial.println ("Otpravil zapros 21 01");
if (pid==1){
for (int i = 0; i < length6; i++) {
mySerial.write(messagePids[i]);
delay (waitbyte); }
}
}
/*void present() {
for (int i = 0; i < length5; i++) {
mySerial.write(messagePresent[i]);
delay (waitbyte); }
}
*/
/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных из конкретных ответо, конкретные байты
void receive () {
if (mySerial.available()) {
delay(60);
int k=0;
byte inbyte=0;
while( mySerial.available() && k < 110) {
inbyte = mySerial.read();
MessageRx[k] = inbyte;
k++; }
PIDs();
Serial.print ("Recieve: ");
for (int i = 0; i < k; i++) {
Serial.print(MessageRx[i],HEX); Serial.print (" ");}
Serial.println ("");
if (MessageRx[0]==0x83 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0xC1 && MessageRx[4]==0x6B && MessageRx[5]==0x8F && MessageRx[6]==0x40) {Init=1;
timerenabledInit=0;
Serial.println (" Initialization OK!!!!: ");
}
//при получении этого сообщения выдавать на третий экран "NO ERROR"
if (MessageRx[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58 && MessageRx[7]==0x00 && MessageRx[8]==0xDC){
currentPage = '3';
myGLCD.print("NO ERROR", 165, 145);
Serial.println (" NO ERROR ");
}
// при получении отличающего сообщения конвертировать байты и выдать номер ошибки
if (MessageRx[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58){
// здесь пишем номер байта и конвертируем в номеро ошибок, если одна и больше
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){
currentPage = '3';
myGLCD.print("BORRADO", 165, 145);
Serial.println (" BORRADOR ");
}
if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) {
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() {
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 () {
//Page 0 (home)
if (currentPage == '0') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
drawFrame(180, 255, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------
//Page 1
if (currentPage == '1') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
drawFrame(180, 255, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//---------------------------------------------------------------------------------------------------
//Page 2
if (currentPage == '2') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------
//Page 3
if (currentPage == '3') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button READ
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
Read(); //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
Watch_Temperature ();
}
// Button ERASE
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
Erase(); //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
Watch_Temperature ();
}
}
}
}
//--------------------------------------------------------
//прописывает заголовки на всех страницах
void drawHomeScreen() {
line() ;
vista();
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();
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("Mass Air Flow mg/s:", 10, 215);
buttonHome() ;
buttonINF2() ;
buttonCHECK() ;
}
//-------------------------------------------------
void drawscreen_two() {
line() ;
vista();
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();
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(0, 255, 0); // цвет текста зеленый
myGLCD.drawRoundRect (1, 1, 65, 33); // кнопка будет рамкой
myGLCD.setFont(GroteskBold16x32); // размер шрифта
myGLCD.setBackColor(0,0,0); // цвет фона области где будет надпись и кнопки
myGLCD.print("HOME", 1, 0); // центровка строки
}
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 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 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 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 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 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_Temperature (){
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);
myGLCD.setColor(255, 255, 255);
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); }
h = dht.readHumidity();
t = dht.readTemperature();
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.print("Km/h", 410, 0);
sensors.requestTemperatures();
}
я даже не видел что он там. сегодня проехал 200 км в одну сторону и 200 обратно. работает отличено быстро обновляется. щас уберу pids() и попробую или будет работать так же. и щас отпишусь. скажи мне пожалуйста Intak Air Temperature это ни датчик температуры в бампере впереди?
Я тебя наверно удивлюсь, но если убрать Pids(): то получаю подряд только положительные сообщения о онициализации. поставил в начале лупа, не работает. поставил перед последней закрывающей скобкой и заработало но с миниальной задержко в 210м/с , если меньше то не с того ни сего пропадат связь. но зато выяснился косяк с третей страницей, переставил Pids(): в луп и третья страница заработала. и даже я уже отправляю кнопкой read запрос на ошибки и на экран получаю NO ERROR и при нажатии на кнопку ERASE получаю ответ на экран BORRADO. :). из за задерки в 210 м/с заметно медленне обновляются данные. думаю нужно искать куда коррекно вставить Pids():. если его убрать из ресиве и луп, то его не отправляет, где то есть косяк. вот скетч
#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, selectedUnit;
//температура и влажность
float h;
float t;
unsigned long prevWatch = 0;
unsigned long prevDvoet = 0;
unsigned long prevData = 0;
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;
int pid = 1; // очередность пида
bool Init = 0;
int PIDTime = 120; // задержка между посылками запросов пидов, мс
int waitbyte = 1; // задержка между отправкой байт в сообщении, мс
//отображаемые параметры
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
// массив байтов принимаемого сообщения
byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения
//массивы сообщений
byte messageInit[5] = {0x81, 0x11, 0xF1, 0x81, 0x04}; // запрос инициализации
byte messagePids[6] = {0x82,0x11,0xF1,0x21,0x01,0xA6}; // запрос данных1
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 TimewaitPID, timerwaitPID = 0;
bool timerenabledPID = 0;
#define TIMEREXPIRED_PID (TimewaitPID - timerwaitPID)> 1000 // здесь задержка на ожидание правильного ответа пидов, мс
unsigned long TimewaitInit, timerwaitInit = 0;
bool timerenabledInit = 0;
#define TIMEREXPIRED_Init (TimewaitInit - timerwaitInit)> 2000 // здесь задержка на ожидание ответа об удачной инициализации, мс
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SETUP
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
mySerial.begin(10400);
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch();
myTouch.setPrecision(PREC_MEDIUM);
drawHomeScreen();
currentPage = '0';
selectedUnit = '0';
Wire.begin();
rtc.begin();
dht.begin();
sensors.begin();
// строка ниже используется для настройки даты и времени часов (год, месяц, день, часы, минуты, секунды)
rtc.adjust(DateTime(2017, 7, 8, 19, 00, 0));
Watch_Temperature ();
pinMode(TX, OUTPUT);
fastinit();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//SETUP FIN
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//LOOP
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned long curPID = millis ();
TimewaitPID = millis ();
TimewaitInit = millis ();
if (!Init) {if (!timerenabledInit){ timerwaitInit=TimewaitInit; timerenabledInit=1; initialization(); }
else {if (TIMEREXPIRED_Init) {timerenabledInit=0;}}}
else {if (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}}
receive ();
unsigned long curWatch = millis();
unsigned long curDvoet = millis();
unsigned long curData = millis();
if (curWatch - prevWatch > 60000) { Watch_Temperature (); prevWatch = curWatch;}
if (curDvoet - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
Menu();
//-----------------------------------------------------------------------------
//прописываем где и какие данные мы хотим видеть
//-----------------------------------------------------------------------------
//страница HOME
//-------------------------------------------------------
if (currentPage == '0') {if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
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);
prevData = curData;
}
}
//----------------------------------------------------------
//страниц INF1
//----------------------------------------------------------
if (currentPage == '1') {if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
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, 395, 215);
prevData = curData;
}
}
//----------------------------------------------------------
//страниц INF2
//----------------------------------------------------------
if (currentPage == '2') {if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
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);
prevData = curData;
}
}
//----------------------------------------------------------
//страниц CHECK
//----------------------------------------------------------
if (currentPage == '3') {if (curData - prevData > 0){
myGLCD.setColor(0, 255, 0);
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
prevData = curData;
}
}
PIDs();
delay(210);
}
/////////////////////////////////////////////////////////////////////////////
//LOOP FIN
///////////////////////////////////////////////////////////////////////////
//отправка запра пданных
void PIDs() {
Serial.println ("Otpravil zapros 21 01");
if (pid==1){
for (int i = 0; i < length6; i++) {
mySerial.write(messagePids[i]);
delay (waitbyte); }
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
//получение данных из конкретных ответо, конкретные байты
/////////////////////////////////////////////////////////////////////////////////////////////
void receive () {
if (mySerial.available()) {
delay(60);
int k=0;
byte inbyte=0;
while( mySerial.available() && k < 110) {
inbyte = mySerial.read();
MessageRx[k] = inbyte;
k++; }
//PIDs();
Serial.print ("Recieve: ");
for (int i = 0; i < k; i++) {
Serial.print(MessageRx[i],HEX); Serial.print (" ");}
Serial.println ("");
if (MessageRx[0]==0x83 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0xC1 && MessageRx[4]==0x6B && MessageRx[5]==0x8F && MessageRx[6]==0x40) {Init=1;
timerenabledInit=0;
Serial.println (" Initialization OK!!!!: ");
}
//при получении этого сообщения выдавать на третий экран "NO ERROR"
if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){
currentPage = '3';
myGLCD.print("NO ERROR", 165, 145);
Serial.println (" NO ERROR ");
}
// при получении отличающего сообщения конвертировать байты и выдать номер ошибки
if (MessageRx[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58){
// здесь пишем номер байта и конвертируем в номеро ошибок, если одна и больше
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){
currentPage = '3';
myGLCD.print("BORRADO", 165, 145);
Serial.println (" BORRADOR ");
}
if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) {
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() {
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 () {
//Page 0 (home)
if (currentPage == '0') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
drawFrame(180, 255, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------
//Page 1
if (currentPage == '1') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF2
if ((x>=180) && (x<=300) && (y>=255) && (y<=310)) {
drawFrame(180, 255, 300, 310);
currentPage = '2';
myGLCD.clrScr();
drawscreen_two();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//---------------------------------------------------------------------------------------------------
//Page 2
if (currentPage == '2') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button INF1
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '1';
myGLCD.clrScr();
drawscreen_one();
Watch_Temperature ();
}
// Button CHECK
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
myGLCD.clrScr();
drawscreen_three();
Watch_Temperature ();
}
}
}
//----------------------------------------------------------
//Page 3
if (currentPage == '3') {
if (myTouch.dataAvailable()) {
myTouch.read();
x=myTouch.getX();
y=myTouch.getY();
// Button home
if ((x>=1) && (x<=65) &&(y>=1) && (y<=33)) {
drawFrame(1, 1, 65, 33);
currentPage = '0';
selectedUnit == 0;
myGLCD.clrScr();
drawHomeScreen();
Watch_Temperature ();
}
// Button READ
if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) {
drawFrame(350, 255, 470, 310);
currentPage = '3';
Read(); //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
Watch_Temperature ();
}
// Button ERASE
if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) {
drawFrame(10, 255, 120, 310);
currentPage = '3';
Erase(); //потом заменить на дейсвие
myGLCD.clrScr();
drawscreen_three(); //потом заменить на дейсвие
Watch_Temperature ();
}
}
}
}
//--------------------------------------------------------
//прописывает заголовки на всех страницах
void drawHomeScreen() {
line() ;
vista();
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();
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("Mass Air Flow mg/s:", 10, 215);
buttonHome() ;
buttonINF2() ;
buttonCHECK() ;
}
//-------------------------------------------------
void drawscreen_two() {
line() ;
vista();
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();
myGLCD.setColor(255, 0, 0); // цвет линии красный
myGLCD.drawLine(1,35,479,35); // линия горизонтальная
myGLCD.drawLine(1,248,479,248); // линия горизонтальная
myGLCD.print("Boost Press Bar:", 10, 40);
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(0, 255, 0); // цвет текста зеленый
myGLCD.drawRoundRect (1, 1, 65, 33); // кнопка будет рамкой
myGLCD.setFont(GroteskBold16x32); // размер шрифта
myGLCD.setBackColor(0,0,0); // цвет фона области где будет надпись и кнопки
myGLCD.print("HOME", 1, 0); // центровка строки
}
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 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 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 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 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 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_Temperature (){
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);
myGLCD.setColor(255, 255, 255);
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); }
h = dht.readHumidity();
t = dht.readTemperature();
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.print("Km/h", 410, 0);
sensors.requestTemperatures();
}
Intake Air Temperature это датчик поступающего в двигатель воздуха, обычно он совмещен с MAF. не знаю кто туда PIDs запихал? но быть ему там явно не место. Может так? подправил чуток код
#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 = 10; // задержка между отрисовкой данных на LCD, мс
int MAF = 0; //26,27 байты
float BoostPres = 0; //28,29 байты
int RPM = 0; //32,33 байты
int EGRmg = 0; //34,35 байты
float BoostPresCom = 0; //38,39 байты
int Speed = 0; //44,45 байты
float DesaInjQua = 0; //50,51 байты
float InjQua = 0; //52,53 байты
float StaDaliv = 0; //54,55 байты
int PumpRPM = 0; //56,57 байты
float EGRPul = 0; //62,63 байты
float SolenPul = 0; //64,65 байты
float SolenPre = 0; //70,71 байты
float DesInj = 0; //72,73 байты
float ActInj = 0; //16,17 байты
int TempAir = 0; //74,75 байты
int Temp = 0; //14,15 байты
int TempOil = 0; //18,19 байты
int TempFuel = 0; //58,59 байты
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 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 // здесь задержка на ожидание ответа об удачной инициализации, мс
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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));
Watch_Temperature ();
pinMode(TX, OUTPUT);
fastinit();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned long curPID = millis ();
unsigned long curpres = 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 (!timerenabledPID){if (curPID - prevPID > PIDTime) {PIDs(); timerwaitPID=TimewaitPID; timerenabledPID=1; prevPID = curPID;}}
if (timerenabledPID) {if (TIMEREXPIRED_PID) {timerenabledPID=0;}}
}
else if (curpres - prevpres > PresTime) {present(); prevpres = curpres;}}
if (curWatch - prevWatch > 60000) { Watch_Temperature (); prevWatch = curWatch;}
if (curDvoet - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = curDvoet; Dvoet=!Dvoet;}
receive ();
Menu();
LCDDataPrint();
}
void LCDDataPrint(){
unsigned long curData = millis();
if (curData - prevData > Datadelay){
if (currentPage == '0') {
myGLCD.setColor(0, 255, 0);
//if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
//if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//if (--<10) {myGLCD.print(" ", 166, 40); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 40); }; //затирает третюю цифру
//myGLCD.printNumI(--, 165, 40);
//if (--<10) {myGLCD.print(" ", 166, 75); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 75); }; //затирает третюю цифру
//myGLCD.printNumI(--, 165, 75);
// if (Speed<10) {myGLCD.print(" ", 166, 110); }; //затираем вторую цифру и третью
// if (Speed>10) {myGLCD.print(" ", 182, 110); }; //затирает третюю цифру
// myGLCD.printNumI(Speed, 165, 110);
//if (--<10) {myGLCD.print(" ", 166, 145); }; //затираем вторую цифру и третью
//if (-->10) {myGLCD.print(" ", 182, 145); }; //затирает третюю цифру
myGLCD.printNumI(h, 165, 145);
//if (PumpRPM>10) {myGLCD.print(" ", 212, 180); }; //затираем четвертую цифру
myGLCD.printNumI(PumpRPM, 165, 180);
//if (RPM>100) {myGLCD.print(" ", 212, 215);}; //затираем четвертую цифру
myGLCD.printNumI(RPM, 165, 215);
//-------------------------------------------
//if (Temp<10) {myGLCD.print(" ", 426, 40); }; //затираем вторую цифру и третью
//if (Temp>10) {myGLCD.print(" ", 442, 40); }; //затирает третюю цифру
myGLCD.printNumI(Temp, 410, 40);
//if (TempOil<10) {myGLCD.print(" ", 426, 75); }; //затираем вторую цифру и третью
//if (TempOil>10) {myGLCD.print(" ", 442, 75); }; //затирает третюю цифру
myGLCD.printNumI(TempOil, 410, 75);
//if (TempFuel<10) {myGLCD.print(" ", 426, 110); }; //затираем вторую цифру и третью
//if (TempFuel>10) {myGLCD.print(" ", 442, 110); }; //затирает третюю цифру
myGLCD.printNumI(TempFuel, 410, 110);
// myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145);
myGLCD.printNumI(t, 410, 180);
//if (TempAir<10) {myGLCD.print(" ", 426, 215); }; //затираем вторую цифру и третью
//if (TempAir>10) {myGLCD.print(" ", 442, 215); }; //затирает третюю цифру
myGLCD.printNumI(TempAir, 410, 215);
}
//----------------------------------------------------------
if (currentPage == '1') {
myGLCD.setColor(0, 255, 0);
//if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
//if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//if (StaDaliv<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью
//if (StaDaliv>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
myGLCD.printNumF(StaDaliv,1, 395, 40);
//if (DesInj<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью
//if (DesInj>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру
myGLCD.printNumF(DesInj,1, 395, 75);
//if (ActInj<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью
//if (ActInj>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру
myGLCD.printNumF(ActInj,1, 395, 110);
//if (DesaInjQua<10) {myGLCD.print(" ", 411, 145); }; //затираем вторую цифру и третью
//if (DesaInjQua>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру
myGLCD.printNumF(DesaInjQua,1, 395, 145);
//if (InjQua<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью
//if (InjQua>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру
myGLCD.printNumF(InjQua,1, 395, 180);
//if (MAF<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью
//if (MAF>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру
myGLCD.printNumI(MAF, 395, 215);
}
//----------------------------------------------------------
if (currentPage == '2') {
myGLCD.setColor(0, 255, 0);
//if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
//if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
myGLCD.printNumI(Speed, 350, 0);
myGLCD.setColor(255, 255, 255);
//if (BoostPres<10) {myGLCD.print(" ", 411, 40); }; //затираем вторую цифру и третью
//if (BoostPres>10) {myGLCD.print(" ", 427, 40); }; //затирает третюю цифру
myGLCD.printNumF(BoostPres,1, 395, 40);
//if (BoostPresCom<10) {myGLCD.print(" ", 411, 75); }; //затираем вторую цифру и третью
//if (BoostPresCom>10) {myGLCD.print(" ", 427, 75); }; //затирает третюю цифру
myGLCD.printNumF(BoostPresCom,1, 395, 75);
//if (EGRmg<10) {myGLCD.print(" ", 411, 110); }; //затираем вторую цифру и третью
//if (EGRmg>10) {myGLCD.print(" ", 427, 110); }; //затирает третюю цифру
//if (EGRmg>100) {myGLCD.print(" ", 443, 110); }; //затирает четвертую цифру
myGLCD.printNumI(EGRmg, 395, 110);
//if (EGRPul<10) {myGLCD.print(" ", 411, 145); }; //затираем вторую цифру и третью
//if (EGRPul>10) {myGLCD.print(" ", 427, 145); }; //затирает третюю цифру
myGLCD.printNumF(DesaInjQua,1, 395, 145);
//if (SolenPul<10) {myGLCD.print(" ", 411, 180); }; //затираем вторую цифру и третью
//if (SolenPul>10) {myGLCD.print(" ", 427, 180); }; //затирает третюю цифру
myGLCD.printNumF(SolenPul, 1, 395, 180);
//if (SolenPre<10) {myGLCD.print(" ", 411, 215); }; //затираем вторую цифру и третью
//if (SolenPre>10) {myGLCD.print(" ", 427, 215); }; //затирает третюю цифру
myGLCD.printNumF(SolenPre, 0, 395, 215);
}
//----------------------------------------------------------
if (currentPage == '3') {
myGLCD.setColor(0, 255, 0);
//if (Speed<10) {myGLCD.print(" ", 366, 0); }; //затираем вторую цифру
//if (Speed>10) {myGLCD.print(" ", 382, 0); }; //затирает третюю цифру
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(60);
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[0]==0x83 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0xC1 && MessageRx[4]==0x6B && MessageRx[5]==0x8F && MessageRx[6]==0x40) {Init=1;
timerenabledInit=0;
Serial.println (" Initialization OK!!!!: ");
}
if (currentPage == '3'){
//при получении этого сообщения выдавать на третий экран "NO ERROR"
if (MessageRx[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58 && MessageRx[7]==0x00 && MessageRx[8]==0xDC){
myGLCD.print("NO ERROR", 165, 145);
Serial.println (" NO ERROR ");
}
// при получении отличающего сообщения конвертировать байты и выдать номер ошибки
if (MessageRx[3]==0x82 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x58){
// здесь пишем номер байта и конвертируем в номеро ошибок, если одна и больше
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) {
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();
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();
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("Mass Air Flow mg/s:", 10, 215);
buttonHome() ;
buttonINF2() ;
buttonCHECK() ;
}
//-------------------------------------------------
void drawscreen_two() {
line() ;
vista();
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();
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(0, 255, 0); // цвет текста зеленый
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_Temperature (){
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);
myGLCD.setColor(255, 255, 255);
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); }
h = dht.readHumidity();
t = dht.readTemperature();
myGLCD.setColor(0, 255, 0); //зеленый цвет цифры
myGLCD.print("Km/h", 410, 0);
sensors.requestTemperatures();
}
тоже самое бегут ответ на удачное соединение. и появился косяк, время и дата происовываются где то через секунд 40. и пропала наружняя температура далас.
а ты говорил не режет сообщение
видимо так и происходит
пробуй скетч #481. вставляй туда также распетатку Serial. не забудь Serial.begin и правильную проверку по начальным байтам ответа на 2101. и задержку буфера отрегулируй оптимальную , ну может 150 сделать или 180
кстати попробуй также в действующий скетч вставит строчку в самом начале программы
#define SERIAL_RX_BUFFER_SIZE 100
задержка играет какю то рлоль. пытаюсь уловить что происходит при уменьшении и при увеличении. что могу сказать уже это то что если закоменитировать задержку иде 58 байт, если в районе от 10 и дальше то принемает вроде все байты но при увеличении задержки рвет так что каждое увеличение задержки уменьшает первую чатсь отрезка и увеличивает вторую чатсть отрезка. пока все
#504 пробовал, есть изменения?
Не помогло. Рвет
У меня ощущение что очередной запрос рвет
Он не успел напечатать а тут опять запрос и он после него допечатывает. Бывает что часть состоит из второй половины первого ответа и первой второго ответа
Но я играю со своим последним скетче. Твои что для двух частей тоже самое делает, рвет. Но надо и там попробовать с задержками
выкладывай каждый раз что происходит в сериале. В прошлый раз ты выложил, дак там каждый ответ по 63 байта присутствовало, а это как раз стандартный размер буфера Serial.available
Ок. Сейчас
короче я понял как нужно сделать, щас всё будет
кстати попробуй также в действующий скетч вставит строчку в самом начале программы
#define SERIAL_RX_BUFFER_SIZE 100
вот это вообще не даст результата, ))) надо в файле библиотке Software.Serial эту строчку поменять
лови троиная цифра отдельно это задер
жка
ну понятно, буфера не хватает в нашем скетче, всё коряво конечно сделано. Самое простое сейчас. Короче залезаешь в папку Arduino. она по умолчанию обычно в Programm Files. Ищешь файл SoftwareSerial.h открываешь с помощью блокнота и меняешь в строке #define _SS_MAX_RX_BUFF 64 цифру 64 на 100 например. этого должно хватить. потом сохраняешь, и вуаля. Задержку похоже придётся около 300 делать для стабильности
Понял. Щас дома сделаю
да еще в сериале при работе с эмулятором у меня выводило данные с запятой типа 22,1 на экране 22. читал чуток про float что он для таких целей, увидел что ты заявил на некоторые пиды но не помогает. я попробовал заявить на StarDavil должно показывать 22,1 , не помогло все равно 22
ставь в формуле /100.0 вместо /100
Да MaksVV это сработало идеально, но я нашел еще один косяк, оказывается задержка которую я сегодня целый день мучал, соединяла в одном ответе два куска из разных ответов, закоментировал ее и как ты сказал вуаля!!!! завтра уже все четко проверю и отпишусь. с запятыми понял. если все пучком будет то, остается расход на 100 , в час и бак топлива ну и ошибки, чтение и стирание. Уже близок твой конец KWP2000 :)
не понял про какую ты задержку
про ние гадину.......
void receive () {
if (mySerial.available()) {
//delay(150);
int k=0;
byte inbyte=0;
эмм, ну эту задержку и надо было мучать, а чё ещё другая есть ? ))) У нас вроде как тут только и есть одна задержка.
ага, и та не нужна оказалась хи хи хи. завтра все скажу точно. на спех дома проверил, обрадовался. завтра все уточню.
без этой задержки ниче работать не будет. Без неё по идее по одному байту только в массив будет записываться, и будет куча однобайтовых сообщений.
вот формулы температуры точные с округлением правильным для нас второго байта и корректировкой первого байта по вычитаемому числу. Не знаю как насчет косяков, не проверял.
ты имеешь в виду вот такой косяк без задержки? но данные вроде продолжали идти нормально на экранчике
если да то, поставлю завтра минимальную. или подберу оптимальную. формулы завтра проверю.
надо чтоб без этих столбиков байт было
понял. завтра исправлю. поеду на работу с ним, посмотрю как он себя в дороге поведет. формулы уже тоже прописал. посмотрим.....
нашел из за чего идет подвис на секунду каждые 9 секунд. из за этого
if (curWatch - prevWatch > 10000) { Watch_Temperature (); prevWatch = curWatch;}
ставлю на 1000 то идет каждую секунду подтормаживание всего на экране
Это скорее всего изза корявой библиотеки даллас
MaksVV результат уже приятныей, выставил
1. задержка между посвлками как в опкоме 120м/с int PIDTime = 120;
2. в void receive поставил задержку 60 м/с delay(60);
3. формулы работают, на сколько точно позже буду сравнивать с опкомом все данные.
4. прорисовку экрана сделал с 200м/с на 60м/с (curData - prevData > 60)
5. подправил интерфейс , добавил кнопку для чтения и стирания на третей страницы, ну и там еще пару мелочей.
В сериале отевты целые и не разбивает на байты. на экране все уже более мение приемелемо. данные обновляются достаточно быстро. что не так........
1. Можно ли сделать обновление цифр на экране более сглажено, не скачками?
2. очень раздражает мерцание цифр при затиранием на пробел. хотел убрать затирания (чтобы придумать что то другое), но тут проблема, если я забераю затирания и заливаю скетч то, при переходе на другую страницу обрывается связь. Не знаю как это может быть связано.......
3. проставил во всех формулах 10.0 100.0 а на экране все равно отображается только целое число,
Но скажу тебе что результат уже крутяк. вот скетч
MaksVV специально для тебя видос выкинул. полюбуйся на наши труды :)
https://www.youtube.com/watch?v=GjffV8L0QKU
PIDtime c этим понял. на счет данных. задержку с 60 попробую уменьшить до предела чтобы не гнала косяки в сереале. обновление экрана тоже попробую с 60 уменьшить, я вроде пробовал 10 и было норм. запрос присутсвия согласен , нужно убрать. с этим щас попробую d=... h=... и requestTemperatures. тоже щас попробую. а вото почему при скетче без затираний при переходе на другую страницу рвет соединение? и я щас начну рыть расходы топлива и DTC ошибки. уже прослушал опком на оошибки, спецом сделал ошибку Р0115, имею запрос, ответ ошибок нет, ответ ошибка есть, стирание. щас проверю все что ты сказал, потом потытаюсь прописать DTC.
обновление страниц сделал 0м/с, тормоз из за температуры сделал с 10 секунд до 1 минуты(не кретично, не бросается в глаза, так как реже происходит. убрал присутсвие. отсальное оставил так как есть. это не помогает myGLCD.printNumI((float)InjQua, 395, 180);
да и у нас они уже заявлены float DesInj = 0.00; //72,73 байты float ActInj = 0.00; //16,17 байты. буду думать....
в скетче где опросы нажатия на кнопки убери везде Watch_Temperature (). при перелистывании скорее всего перестанет связь теряться. И че в итоге быстрее данные обновляются?
Намного лучше. Щас домой еду посмотрю как он будет показывать. Позже отпишусь
еще чуток быстрее, а без частого зависания кажется что плавнее. я в принципе доволен. от маленьких кизяков нужно только избавится, и будет ништяк. завтра попробую убрать затирание пробелом и заявить все как float, если твоя мысль Watch_Temperature () сработает. так же нужно посмотреть скорость , отображает бешанные цифры, но это буду проверять все параметры сравнивая с опкомом. вообщем начинается допиливание. :) . впорос или я в правильном направлении иду......... я начал добавлять чтение и стирание ошибок. вот запросы и ответы.
запрос ошибок 84 11 F1 18 00 FF 00 9D . добавил
byte messageREAD[8] = {0x84,0x11,0xF1,0x18,0x00,0xFF,0x00,0x9D};
добавил проверку ответ если нет ошибок, ответ 84 11 F1 58 00 DС (58 положительный ответ) добавил
if (MessageRx[0]==0x82 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0x58 && MessageRx[4]==0x00 && MessageRx[5]==0xDC){
currentPage = '3';
myGLCD.print("NO ERROR", 165, 145);
Serial.println (" NO ERROR ");
}
добавил проверку если есть ошибка, //ответ 85 F1 11 58 01 01 15 E1 D7 (58 положительный ответ), это ошибка Р0115.// как расшифровывать буду искать. добавил
if (MessageRx[0]==0x82 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0x58){
// здесь пишем номер байта и формулу
Serial.println (" OSHIBKA ESTY ");
}
запрос стирание ошибок 83 11 F1 14 FF 00 98 , добавил
byte messageERASE[7] = {0x83,0x11,0xF1,0x14,0xFF,0x00,0x98};
проверку ответа стерто 83 F1 11 54 FF 00 D8 (54 положительный ответ)
if (MessageRx[0]==0x83 && MessageRx[1]==0xF1 && MessageRx[2]==0x11 && MessageRx[3]==0x54 && MessageRx[4]==0xFF && MessageRx[5]==0x00 && MessageRx[6]==0xD8){
currentPage = '3';
myGLCD.print("BORRADO", 165, 145);
Serial.println (" BORRADOR ");
}
так же добавил посылку запроса на чтения и стирания
void Read() {
Serial.println ("Zapros error; ");
for (int i = 0; i < length8; i++) {
mySerial.write(messageREAD[i]);
delay (waitbyte); }
}
void Erase() {
Serial.println ("Zapros borrar; ");
for (int i = 0; i < length7; i++) {
mySerial.write(messageERASE[i]);
delay (waitbyte); }
}
добавил в тач координаты Erase(); и Read();
идея такая при нажатии кнопики READ отправляется запрос ошибок и в зависимости от ответа выводится ответ на этомо же третем экране, при нажатии на кнопку ERASE посылается запрос на стирание ошибок и соответсвено по сообщению стерто выводить на экран BORRADO. я уже в этой всей каше так запутался....... за короткий период времени слишком много инфы, еще всю не переварил.
вот скетч
когда сможешь, глянешь.
не забывай, в KWP есть режим 1 - считывание текущих параметров, режим 2, 3 и другие. Дак вот помоему чтоб считать ошибки нужен 3 режим, стереть ещё какой то. режим вроде как меняется так
void
initialization() {
for
(
int
i = 0; i < length5; i++) {
mySerial.write(messageInit[i]);
delay (5);
}
delay (55);
Не надо объявлять все переменные float, зачем? Понял как выводить на этот дисплей float
myGLCD.printNumF(Temp,2,127,127); было NumI I значит int а надо NumF F - float, цифра 2 это сколько нужно знаков после запятой. вот описание твоего LCD
https://geektimes.ru/post/258166/
только что утром читал про NumF щас собрался пробовать. на счет режимов надо почитать, но обком ничего не менят в посылках, просто посылает эти запросы. но если что то по ходу нужно при нажатии кнопки чек переходить в нужный режим. и уже потом кнопкой READ ERRASE делать их дело. щас я тут с пидами разбераюсь не точность, по ходу ошибся счетаом байт на один байт. закончу с этим и займусь ошибками. СЕНКС ЧТО НЕ БРОСАЕШЬ МЕНЯ ДО ПОСЛЕДНЕГО.
ой я не ту часть тебе показал которая режим меняет. вот это меняет режим
как ты это сниффом то увидишь? это ведь не байты, а замыкание линии на +12 на на 360мс и потом на 25мс, может и увидишь много FF хотя хз. Так что опком возможно и перводит блок в другой режим, просто мы этого не видим. Хотя если у тебя заработает, значит я не прав.
спортивный интерес уже )
понял. еще не дошел. F помогло с запятыми :) , пок еще проверяю показания
подправил байты в формулах и формулы. убрал затирания пробелом без удаления Watch_Temperature (); из кнопок, вроде все норм. с запятиыми все норм добавл F. потом подумаю с затираниями последних цифр. берусь за DTC
вот обработаный и работающий корректно скетч
взял старый скетч где только температура
заменил температуру на ошибки и вуаля!!! это просто запрос, щас выложу ответ из сериала
щас есть перавая проблема, при нажатии на кнопку check и переходе на страницу 3, то рвется связь. ищу.......
Говори убери эти watch_temp после опроса кнопок, они там вообще не нужны, это я их добавил когда искал косяк с отображением данных
я уже убирал. в сериале выдает
otpravil zapros 21 01
recieve: 000000000
ставлю обратно, все гуд кроме третей страницы. пытался понять как это связано , но не понял.
а ты зачем pids() в receive () запихал? странно что у тебя вообще работает
я даже не видел что он там. сегодня проехал 200 км в одну сторону и 200 обратно. работает отличено быстро обновляется. щас уберу pids() и попробую или будет работать так же. и щас отпишусь. скажи мне пожалуйста Intak Air Temperature это ни датчик температуры в бампере впереди?
Я тебя наверно удивлюсь, но если убрать Pids(): то получаю подряд только положительные сообщения о онициализации. поставил в начале лупа, не работает. поставил перед последней закрывающей скобкой и заработало но с миниальной задержко в 210м/с , если меньше то не с того ни сего пропадат связь. но зато выяснился косяк с третей страницей, переставил Pids(): в луп и третья страница заработала. и даже я уже отправляю кнопкой read запрос на ошибки и на экран получаю NO ERROR и при нажатии на кнопку ERASE получаю ответ на экран BORRADO. :). из за задерки в 210 м/с заметно медленне обновляются данные. думаю нужно искать куда коррекно вставить Pids():. если его убрать из ресиве и луп, то его не отправляет, где то есть косяк. вот скетч
Intake Air Temperature это датчик поступающего в двигатель воздуха, обычно он совмещен с MAF. не знаю кто туда PIDs запихал? но быть ему там явно не место. Может так? подправил чуток код
тоже самое бегут ответ на удачное соединение. и появился косяк, время и дата происовываются где то через секунд 40. и пропала наружняя температура далас.