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