короче есть ещё одна беда, скетч теперь слишком большой, видать когда второе софтсериал соединение открываешь и к тому же ещё добавляется массив сообщения второго в 60 байт
адаптер дает меньше напряжение чем нужно. на первом 10.8в а на втором только 5.4в. минимум должно быть 9.6в. блин, остальные адаптеры дома. иду разбераться. попробую другой резистер впаять.
вопрос решился так. взаимо заменил адаптеры местами, с которым до этого работал это MC33290, второй адаптер у меня на BC547(адаптер 4 , из первого моего поста) он дает меньше напругу. по ходу для 7 линии достаточно 6-8 вольт, а для 12 нет. сейчас работают оба но выдает это.
я так подозреваю что задержки когда ждём наполнения буфера каждого софтсериала, (с которой мы как раз боролись) и не дают блоку отвечать, т.к. после запроса слишком много времени проходит
если мозгов у меня не хватит как нормально это всё прописать. Берешь другую ардуино там всё спокойно пишем для 12 контакта, и можно по сериалу две переменных на большую дуню слать и всё
интересно чё вот это панель шлет 6 F0 D5 10 14 10 1 7F FF
Да. Я пробовал все. Оказался именно первый
Завтра гляну что это сообщение отображает в опкоме
короче есть ещё одна беда, скетч теперь слишком большой, видать когда второе софтсериал соединение открываешь и к тому же ещё добавляется массив сообщения второго в 60 байт
может у тебя ардуино мега, и не будет поэтому танцев с бубном?
скетч примерно такой будет
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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); 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Х SoftwareSerial mySerial_gauge (7, 8 ); //RХ,TХ #define TX_gauge 8 #define TX 11 int length5 = 5; int length6 = 6; int length8 = 8; int length7 = 7; bool Init = 0; bool InitGauge = 0; int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс int PresTime = 8000; // задержка между посылками запросов присутствия, мс int waitbyte = 1; // задержка между отправкой байт в сообщении, мс int Datadelay = 50; // задержка между отрисовкой данных на 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 Fuel = 0; //остаток топлива int kmAge = 0; //суточный пробег int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана float Barom = 0; // барометр byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения byte MessageRxGauge[60] = {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); Wire.begin(); rtc.begin(); dht.begin(); sensors.begin(); myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM); myGLCD.setFont(GroteskBold16x32); currentPage = '0'; drawHomeScreen(); // строка ниже используется для настройки даты и времени часов // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата // (год, месяц, день, часы, минуты, секунды) //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0)); Temperature (); pinMode(TX, OUTPUT); pinMode(TX_gauge, OUTPUT); fastinit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SETUP FIN ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //LOOP ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { 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 (millis() - prevPID > PIDTime) {PIDs(); PIDsGauge(); prevPID = millis();}} else if (millis() - prevpres > PresTime) {present(); prevpres = millis();} if (!InitGauge) { digitalWrite (TX_gauge, HIGH); delay (200); digitalWrite (TX_gauge, LOW); delay (20); digitalWrite (TX_gauge, HIGH ); delay (15); digitalWrite (TX_gauge, LOW); delay (5); digitalWrite (TX_gauge, HIGH); delay (5); mySerial_gauge.begin(9600); }} receive (); if (millis() - prevWatch > 3000) { Watch (); prevWatch = millis();} if (millis() - prevTemperature > 60000) { Temperature (); prevTemperature = millis();} if (millis() - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;} Menu(); LCDDataPrint(); } void LCDDataPrint(){ unsigned long curData = millis(); if (millis() - prevData > Datadelay){ myGLCD.setColor(255, 255, 255); myGLCD.printNumI(Speed, 350, 0, 3); if (currentPage == '0') { myGLCD.printNumF(LHor, 1, 165, 40, '.',5); myGLCD.printNumF(L100, 1, 165, 75,'.',5 ); myGLCD.printNumI(h, 165, 145, 5 ); myGLCD.printNumI(PumpRPM, 165, 180,5); myGLCD.printNumI(RPM, 165, 215,5); myGLCD.printNumI(Temp, 410, 40, 3); myGLCD.printNumI(TempOil, 410, 75, 3); myGLCD.printNumI(TempFuel, 410, 110,3); myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3); myGLCD.printNumI(t, 410, 180, 3); myGLCD.printNumI(TempAir, 410, 215, 3); } if (currentPage == '1') { myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3); myGLCD.printNumF(DesInj,1, 395, 75, '.', 4); myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4); myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); myGLCD.printNumI(MAF, 170, 215, 4); myGLCD.printNumF(Barom, 1, 415, 215); } //---------------------------------------------------------- //страниц INF2 //---------------------------------------------------------- if (currentPage == '2') { myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4); myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); myGLCD.printNumI(EGRmg, 395, 110, 4); myGLCD.printNumF(EGRPul,1, 395, 145,'.',3); myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4); myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3); } prevData = millis(); } } /////////////////////////////////////////////////////////////////////////// //отправка запроса пид 2101 void PIDs() { Serial.println ("Otpravil zapros 21 01"); for (int i = 0; i < length6; i++) { mySerial.write(messagePids[i]); delay (waitbyte); } } void PIDsGauge() { Serial.println (" Otpravil zapros 02 11 na panel"); mySerial_gauge.write (0x02); delay (1); mySerial_gauge.write (0x11); delay (1); mySerial_gauge.write(byte(0)); delay (1); mySerial_gauge.write (0x13); } //отправка запроса присутствия void present() { Serial.println ("Otpravil zapros Present"); for (int i = 0; i < length5; i++) { mySerial.write(messagePresent[i]); delay (waitbyte); } } ///////////////////////////////////////////////////////////////////////////////////////////// //получение данных от ЭБУ, разборка входящих сообщений ///////////////////////////////////////////////////////////////////////////////////////////// void receive () { ////////////////// работа с К-Line софт сериал 7-8 (12 контакт ОБД) if (mySerial_gauge.available()&& !InitGauge) { delay(50); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRxGauge[0]==55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1; mySerial_gauge.write (0x7F); Serial.println (" InitGauge OK!!!!: "); } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } if (mySerial_gauge.available()&& InitGauge) { delay(100); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) { // Fuel = каким байтам равен остаток топлива? // kmAge = каким байтам равен суточный пробег? } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } ////////////////// работа с К-Line софт сериал 10-11 (7 контакт ОБД) if (mySerial.available()) { delay(190); int k=0; byte inbyte=0; while( mySerial.available() && k < 110) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } Serial.print ("Receive: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1; timerenabledInit=0; Serial.println (" Initialization OK!!!!: "); } if (currentPage == '3'){ //при получении этого сообщения выдавать на третий экран "NO ERROR" if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("NO DTC", 165, 145); Serial.println (" NO DTC "); } //при получении этого сообщения выдавать на третий экран "DTC BORRADO" if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("DTC BORRADO", 165, 145); Serial.println (" DTC BORRADO "); } // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){ Serial.println ("DTC is found!"); myGLCD.clrScr(); drawscreen_three(); for (int i=0; i<MessageRx[8]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0); myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0); myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый myGLCD.print("ERROR ", 50, (75+y)); myGLCD.printNumI((i+1), 150, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y)); if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;} if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;} if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо } } //прописываем формулы к данным else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) { Barom = MessageRx[39]; L100 = (float)LHor*100.0/(float)Speed; LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85; MAF = ((MessageRx[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() ; Watch (); myGLCD.drawLine(250,35,250,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() ; 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() ; 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() { 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.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.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.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.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.print("ERASE", 25, 265); } void buttonERASETouch () { if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) { drawFrame(10, 255, 120, 310); Erase(); //потом заменить на дейсвие }} 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.print("READ", 375, 265); } void buttonREADTouch() { if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) { drawFrame(350, 255, 470, 310); Read(); //потом заменить на дейсвие }} //////////////////////////////////////////////////////////////////////////////////////// //прорисовка линий /////////////////////////////////////////////////////////////////////////////////////// void line() { myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,73,479,73); // линия горизонтальная myGLCD.drawLine(1,108,479,108); // линия горизонтальная myGLCD.drawLine(1,143,479,143); // линия горизонтальная myGLCD.drawLine(1,178,479,178); // линия горизонтальная myGLCD.drawLine(1,212,479,212); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная } ///////////////////////////////////////////////////////////////////////////////////////////// //верхняя часть экрана часы и дата отображается на всех экранах ///////////////////////////////////////////////////////////////////////////////////////////// void Watch (){ DateTime now = rtc.now(); int m = now.minute(); int hour = now.hour(); int mon = now.month(); int date = now.day(); myGLCD.setColor(0, 255, 0); //зеленый цвет цифры 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.print("Km/h", 410, 0); } void Temperature (){ h = dht.readHumidity(); t = dht.readTemperature(); sensors.requestTemperatures(); }У меня мегабайт 2560. Память большая. Скетч завтра испытаю
о круто, хоть не выеживаться. пс скетч поправил.
а нафига тогда ты используешь софтсериал, если у тебя на меге железные сериалы есть 3 штуки?
Не помню почему. Толи не получалось Толи что. Сработало это и я не менял. Было мало знаний. Что сработало в то и вцепился
понял, ладно скетч примерный есть, завтра попробуешь.
Ок
Привет MaksVV. Вот что просисходит. последний рабочийс скетч линия 7 работает отлично. Выдает это
Otpravil zapros Init Receive: 0 FF FF 83 F1 11 C1 6B 8F 40 Otpravil zapros Init Receive: FF FF 83 F1 11 C1 6B 8F 40 Initialization OK!!!!: Otpravil zapros 21 01 Receive: FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 3B 0 0 B E9 0 0 2 42 0 0 0 0 4 3E 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 9 7 0 0 0 0 9 49 0 0 C 34 A0 0 1 90 0 0 A1 8 1 21 0 0 1 C2 B EE 3 9E 0 2 20 Otpravil zapros 21 01 Receive: FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 3D 0 0 B EA 0 0 2 43 0 0 0 0 4 40 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 9 7 0 0 0 0 9 47 0 0 C 34 A0 0 1 90 0 0 A1 8 1 21 0 0 1 C1 B EF 3 9E 0 2 24 Otpravil zapros 21 01 Receive: FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 3B 0 0 B EA 0 0 2 43 0 0 0 0 4 3A 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 9 6 0 0 0 0 9 49 0 0 C 34 A0 0 1 90 0 0 A5 8 1 21 0 0 1 C2 B EF 3 9E 0 2 22 Otpravil zapros 21 01 Receive: FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 3D 0 0 B EA 0 0 2 44 0 0 0 0 4 3C 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 9 7 0 0 0 0 9 47 0 0 C 34 A0 0 1 90 0 0 A1 8 1 21 0 0 1 C1 B EF 3 9E 0 2 21 Otpravil zapros 21 01 Receive: FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 3D 0 0 B EA 0 0 2 45 0 0 0 0 4 3C 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 9 7 0 0 0 0 9 47 0 0 C 34 A0 0 1 90 0 0 A1 8 1 21 0 0 1 C1 B EF 3 9E 0 2 22 Otpravil zapros 21 01 Receive: FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 3D 0 0 B E9 0 0 2 45 0 0 0 0 4 3E 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 9 9 0 0 0 0 9 47 0 0 C 34 A0 0 1 90 0 0 A1 8 1 21 0 0 1 C1 B F0 3 9E 0 2 26 Otpravil zapros 21 01 Receive: FF FF FF 80 F1 11 4C 61 1 0 0 0 0 0 0 0 0 C 3D 0 0 B EA 0 0 2 46 0 0 0 0 4 3E 0 0 0 0 32 C8 3 9E 4 29 3 20 E5 62 0 0 0 0 9 9 0 0 0 0 9 49 0 0 C 34 A0 0 1 90 0 0 A1 8 1 21 0 0 1 C2 B F0 3 9E 0 2 2B Otpravil zapros 21 01Новый скетч выдает это
Otpravil zapros Init Receive: 0 FF FF 83 F1 11 C1 6B 8F 40 Otpravil zapros Init Receive: FF FF 83 F1 11 C1 6B 8F 40 Initialization OK!!!!: Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panelи при этом на боротовике не отображаются данные с 7 линии.
вот скетч
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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); 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Х SoftwareSerial mySerial_gauge (12, 13 ); //RХ,TХ #define TX_gauge 13 #define TX 11 int length5 = 5; int length6 = 6; int length8 = 8; int length7 = 7; bool Init = 0; bool InitGauge = 0; int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс int PresTime = 8000; // задержка между посылками запросов присутствия, мс int waitbyte = 1; // задержка между отправкой байт в сообщении, мс int Datadelay = 50; // задержка между отрисовкой данных на 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 Fuel = 0; //остаток топлива int kmAge = 0; //суточный пробег int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана float Barom = 0; // барометр byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения byte MessageRxGauge[60] = {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); Wire.begin(); rtc.begin(); dht.begin(); sensors.begin(); myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM); myGLCD.setFont(GroteskBold16x32); currentPage = '0'; drawHomeScreen(); // строка ниже используется для настройки даты и времени часов // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата // (год, месяц, день, часы, минуты, секунды) //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0)); Temperature (); pinMode(TX, OUTPUT); pinMode(TX_gauge, OUTPUT); fastinit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SETUP FIN ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //LOOP ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { 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 (millis() - prevPID > PIDTime) {PIDs(); PIDsGauge(); prevPID = millis();}} else if (millis() - prevpres > PresTime) {present(); prevpres = millis();} if (!InitGauge) { digitalWrite (TX_gauge, HIGH); delay (200); digitalWrite (TX_gauge, LOW); delay (20); digitalWrite (TX_gauge, HIGH ); delay (15); digitalWrite (TX_gauge, LOW); delay (5); digitalWrite (TX_gauge, HIGH); delay (5); mySerial_gauge.begin(9600); }} receive (); if (millis() - prevWatch > 3000) { Watch (); prevWatch = millis();} if (millis() - prevTemperature > 60000) { Temperature (); prevTemperature = millis();} if (millis() - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;} Menu(); LCDDataPrint(); } void LCDDataPrint(){ unsigned long curData = millis(); if (millis() - prevData > Datadelay){ myGLCD.setColor(255, 255, 255); myGLCD.printNumI(Speed, 350, 0, 3); if (currentPage == '0') { myGLCD.printNumF(LHor, 1, 165, 40, '.',5); myGLCD.printNumF(L100, 1, 165, 75,'.',5 ); myGLCD.printNumI(h, 165, 145, 5 ); myGLCD.printNumI(PumpRPM, 165, 180,5); myGLCD.printNumI(RPM, 165, 215,5); myGLCD.printNumI(Temp, 410, 40, 3); myGLCD.printNumI(TempOil, 410, 75, 3); myGLCD.printNumI(TempFuel, 410, 110,3); myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3); myGLCD.printNumI(t, 410, 180, 3); myGLCD.printNumI(TempAir, 410, 215, 3); } if (currentPage == '1') { myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3); myGLCD.printNumF(DesInj,1, 395, 75, '.', 4); myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4); myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); myGLCD.printNumI(MAF, 170, 215, 4); myGLCD.printNumF(Barom, 1, 415, 215); } //---------------------------------------------------------- //страниц INF2 //---------------------------------------------------------- if (currentPage == '2') { myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4); myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); myGLCD.printNumI(EGRmg, 395, 110, 4); myGLCD.printNumF(EGRPul,1, 395, 145,'.',3); myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4); myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3); } prevData = millis(); } } /////////////////////////////////////////////////////////////////////////// //отправка запроса пид 2101 void PIDs() { Serial.println ("Otpravil zapros 21 01"); for (int i = 0; i < length6; i++) { mySerial.write(messagePids[i]); delay (waitbyte); } } void PIDsGauge() { Serial.println (" Otpravil zapros 02 11 na panel"); mySerial_gauge.write (0x02); delay (1); mySerial_gauge.write (0x11); delay (1); mySerial_gauge.write(byte(0)); delay (1); mySerial_gauge.write (0x13); } //отправка запроса присутствия void present() { Serial.println ("Otpravil zapros Present"); for (int i = 0; i < length5; i++) { mySerial.write(messagePresent[i]); delay (waitbyte); } } ///////////////////////////////////////////////////////////////////////////////////////////// //получение данных от ЭБУ, разборка входящих сообщений ///////////////////////////////////////////////////////////////////////////////////////////// void receive () { ////////////////// работа с К-Line софт сериал 12-13 (12 контакт ОБД) if (mySerial_gauge.available()&& !InitGauge) { delay(50); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRxGauge[0]==55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1; mySerial_gauge.write (0x7F); Serial.println (" InitGauge OK!!!!: "); } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } if (mySerial_gauge.available()&& InitGauge) { delay(100); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) { // Fuel = каким байтам равен остаток топлива? // kmAge = каким байтам равен суточный пробег? } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } ////////////////// работа с К-Line софт сериал 10-11 (7 контакт ОБД) if (mySerial.available()) { delay(190); int k=0; byte inbyte=0; while( mySerial.available() && k < 110) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } Serial.print ("Receive: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1; timerenabledInit=0; Serial.println (" Initialization OK!!!!: "); } if (currentPage == '3'){ //при получении этого сообщения выдавать на третий экран "NO ERROR" if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("NO DTC", 165, 145); Serial.println (" NO DTC "); } //при получении этого сообщения выдавать на третий экран "DTC BORRADO" if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("DTC BORRADO", 165, 145); Serial.println (" DTC BORRADO "); } // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){ Serial.println ("DTC is found!"); myGLCD.clrScr(); drawscreen_three(); for (int i=0; i<MessageRx[8]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0); myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0); myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый myGLCD.print("ERROR ", 50, (75+y)); myGLCD.printNumI((i+1), 150, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y)); if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;} if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;} if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо } } //прописываем формулы к данным else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) { Barom = MessageRx[39]; L100 = (float)LHor*100.0/(float)Speed; LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85; MAF = ((MessageRx[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() ; Watch (); myGLCD.drawLine(250,35,250,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() ; 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() ; 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() { 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.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.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.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.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.print("ERASE", 25, 265); } void buttonERASETouch () { if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) { drawFrame(10, 255, 120, 310); Erase(); //потом заменить на дейсвие }} 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.print("READ", 375, 265); } void buttonREADTouch() { if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) { drawFrame(350, 255, 470, 310); Read(); //потом заменить на дейсвие }} //////////////////////////////////////////////////////////////////////////////////////// //прорисовка линий /////////////////////////////////////////////////////////////////////////////////////// void line() { myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,73,479,73); // линия горизонтальная myGLCD.drawLine(1,108,479,108); // линия горизонтальная myGLCD.drawLine(1,143,479,143); // линия горизонтальная myGLCD.drawLine(1,178,479,178); // линия горизонтальная myGLCD.drawLine(1,212,479,212); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная } ///////////////////////////////////////////////////////////////////////////////////////////// //верхняя часть экрана часы и дата отображается на всех экранах ///////////////////////////////////////////////////////////////////////////////////////////// void Watch (){ DateTime now = rtc.now(); int m = now.minute(); int hour = now.hour(); int mon = now.month(); int date = now.day(); myGLCD.setColor(0, 255, 0); //зеленый цвет цифры 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.print("Km/h", 410, 0); } void Temperature (){ h = dht.readHumidity(); t = dht.readTemperature(); sensors.requestTemperatures(); }там пин 12 и 13 RX TX, 12 линия. как видидим 7 проходит инит но не получает сообщения и соответсвенно не выводит на экран, 12 даже не проходит инит.
эмм, понятно, мы начали запрос о данных на 12 контакт слать раньше окончания инита панели, переделаем
вот так
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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); 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Х SoftwareSerial mySerial_gauge (12, 13 ); //RХ,TХ #define TX_gauge 13 #define TX 11 int length5 = 5; int length6 = 6; int length8 = 8; int length7 = 7; bool Init = 0; bool InitGauge = 0; int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс int PresTime = 8000; // задержка между посылками запросов присутствия, мс int waitbyte = 1; // задержка между отправкой байт в сообщении, мс int Datadelay = 50; // задержка между отрисовкой данных на 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 Fuel = 0; //остаток топлива int kmAge = 0; //суточный пробег int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана float Barom = 0; // барометр byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения byte MessageRxGauge[60] = {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); Wire.begin(); rtc.begin(); dht.begin(); sensors.begin(); myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM); myGLCD.setFont(GroteskBold16x32); currentPage = '0'; drawHomeScreen(); // строка ниже используется для настройки даты и времени часов // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата // (год, месяц, день, часы, минуты, секунды) //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0)); Temperature (); pinMode(TX, OUTPUT); pinMode(TX_gauge, OUTPUT); fastinit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SETUP FIN ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //LOOP ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { 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 (millis() - prevPID > PIDTime) {PIDs(); if (InitGauge){PIDsGauge();} prevPID = millis();}} else if (millis() - prevpres > PresTime) {present(); prevpres = millis();} if (!InitGauge) { Serial.println ("Otpravil zapros adress Gauge"); digitalWrite (TX_gauge, HIGH); delay (500); digitalWrite (TX_gauge, LOW); delay (20); digitalWrite (TX_gauge, HIGH ); delay (15); digitalWrite (TX_gauge, LOW); delay (5); digitalWrite (TX_gauge, HIGH); delay (5); mySerial_gauge.begin(9600); }} receive (); if (millis() - prevWatch > 3000) { Watch (); prevWatch = millis();} if (millis() - prevTemperature > 60000) { Temperature (); prevTemperature = millis();} if (millis() - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;} Menu(); LCDDataPrint(); } void LCDDataPrint(){ unsigned long curData = millis(); if (millis() - prevData > Datadelay){ myGLCD.setColor(255, 255, 255); myGLCD.printNumI(Speed, 350, 0, 3); if (currentPage == '0') { myGLCD.printNumF(LHor, 1, 165, 40, '.',5); myGLCD.printNumF(L100, 1, 165, 75,'.',5 ); myGLCD.printNumI(h, 165, 145, 5 ); myGLCD.printNumI(PumpRPM, 165, 180,5); myGLCD.printNumI(RPM, 165, 215,5); myGLCD.printNumI(Temp, 410, 40, 3); myGLCD.printNumI(TempOil, 410, 75, 3); myGLCD.printNumI(TempFuel, 410, 110,3); myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3); myGLCD.printNumI(t, 410, 180, 3); myGLCD.printNumI(TempAir, 410, 215, 3); } if (currentPage == '1') { myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3); myGLCD.printNumF(DesInj,1, 395, 75, '.', 4); myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4); myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); myGLCD.printNumI(MAF, 170, 215, 4); myGLCD.printNumF(Barom, 1, 415, 215); } //---------------------------------------------------------- //страниц INF2 //---------------------------------------------------------- if (currentPage == '2') { myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4); myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); myGLCD.printNumI(EGRmg, 395, 110, 4); myGLCD.printNumF(EGRPul,1, 395, 145,'.',3); myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4); myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3); } prevData = millis(); } } /////////////////////////////////////////////////////////////////////////// //отправка запроса пид 2101 void PIDs() { Serial.println ("Otpravil zapros 21 01"); for (int i = 0; i < length6; i++) { mySerial.write(messagePids[i]); delay (waitbyte); } } void PIDsGauge() { Serial.println (" Otpravil zapros 02 11 na panel"); mySerial_gauge.write (0x02); delay (1); mySerial_gauge.write (0x11); delay (1); mySerial_gauge.write(byte(0)); delay (1); mySerial_gauge.write (0x13); } //отправка запроса присутствия void present() { Serial.println ("Otpravil zapros Present"); for (int i = 0; i < length5; i++) { mySerial.write(messagePresent[i]); delay (waitbyte); } } ///////////////////////////////////////////////////////////////////////////////////////////// //получение данных от ЭБУ, разборка входящих сообщений ///////////////////////////////////////////////////////////////////////////////////////////// void receive () { ////////////////// работа с К-Line софт сериал 12-13 (12 контакт ОБД) if (mySerial_gauge.available()&& !InitGauge) { delay(50); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRxGauge[0]==55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1; mySerial_gauge.write (0x7F); Serial.println (" InitGauge OK!!!!: "); } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } if (mySerial_gauge.available()&& InitGauge) { delay(100); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) { // Fuel = каким байтам равен остаток топлива? // kmAge = каким байтам равен суточный пробег? } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } ////////////////// работа с К-Line софт сериал 10-11 (7 контакт ОБД) if (mySerial.available()) { delay(190); int k=0; byte inbyte=0; while( mySerial.available() && k < 110) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } Serial.print ("Receive: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1; timerenabledInit=0; Serial.println (" Initialization OK!!!!: "); } if (currentPage == '3'){ //при получении этого сообщения выдавать на третий экран "NO ERROR" if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("NO DTC", 165, 145); Serial.println (" NO DTC "); } //при получении этого сообщения выдавать на третий экран "DTC BORRADO" if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("DTC BORRADO", 165, 145); Serial.println (" DTC BORRADO "); } // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){ Serial.println ("DTC is found!"); myGLCD.clrScr(); drawscreen_three(); for (int i=0; i<MessageRx[8]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0); myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0); myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый myGLCD.print("ERROR ", 50, (75+y)); myGLCD.printNumI((i+1), 150, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y)); if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;} if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;} if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо } } //прописываем формулы к данным else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) { Barom = MessageRx[39]; L100 = (float)LHor*100.0/(float)Speed; LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85; MAF = ((MessageRx[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() ; Watch (); myGLCD.drawLine(250,35,250,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() ; 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() ; 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() { 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.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.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.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.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.print("ERASE", 25, 265); } void buttonERASETouch () { if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) { drawFrame(10, 255, 120, 310); Erase(); //потом заменить на дейсвие }} 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.print("READ", 375, 265); } void buttonREADTouch() { if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) { drawFrame(350, 255, 470, 310); Read(); //потом заменить на дейсвие }} //////////////////////////////////////////////////////////////////////////////////////// //прорисовка линий /////////////////////////////////////////////////////////////////////////////////////// void line() { myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,73,479,73); // линия горизонтальная myGLCD.drawLine(1,108,479,108); // линия горизонтальная myGLCD.drawLine(1,143,479,143); // линия горизонтальная myGLCD.drawLine(1,178,479,178); // линия горизонтальная myGLCD.drawLine(1,212,479,212); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная } ///////////////////////////////////////////////////////////////////////////////////////////// //верхняя часть экрана часы и дата отображается на всех экранах ///////////////////////////////////////////////////////////////////////////////////////////// void Watch (){ DateTime now = rtc.now(); int m = now.minute(); int hour = now.hour(); int mon = now.month(); int date = now.day(); myGLCD.setColor(0, 255, 0); //зеленый цвет цифры 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.print("Km/h", 410, 0); } void Temperature (){ h = dht.readHumidity(); t = dht.readTemperature(); sensors.requestTemperatures(); }теперь вот так
Otpravil zapros Init Receive: 0 FF FF 83 F1 11 C1 6B 8F 40 Otpravil zapros Init Receive: FF FF 83 F1 11 C1 6B 8F 40 Initialization OK!!!!: Otpravil zapros 21 01 Otpravil zapros 21 01 ReceiveGauge: 0 0 Otpravil zapros 21 01 ReceiveGauge: 0 0 Otpravil zapros 21 01 ReceiveGauge: 0 0 Otpravil zapros 21 01 ReceiveGauge: 0 0 Otpravil zapros 21 01 ReceiveGauge: 0 0 Otpravil zapros 21 01 ReceiveGauge: 0 0 Otpravil zapros 21 01 ReceiveGauge: 0 0 Otpravil zapros 21 01поправил скетч #914, пробуй
теперь так
Otpravil zapros Init Receive: 0 FF FF 83 F1 11 C1 6B 8F 40 Otpravil zapros Init Receive: FF FF 83 F1 11 C1 6B 8F 40 Initialization OK!!!!: Otpravil zapros 21 01 Otpravil zapros adress Gauge Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 0 0 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 0 0 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 0 0 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 0 0 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 0 0 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 0 0 Otpravil zapros 21 01 Otpravil zapros adress GaugeСтранно всё это, может потому что на TX_gauge сидит встроенный ссветодиод? попробуй на другой пин переделать
или залей рабочий скетч с удачным инитом панели но на 13 пине
минутку. да чета не то. залил на 12 13 и ниче. на 10 11 работает. сейчас проверю адаптер и подключение. а потом попробую на другие пины дуни.
вот ещё вариант
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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); 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Х SoftwareSerial mySerial_gauge (12, 13 ); //RХ,TХ #define TX_gauge 13 #define TX 11 int length5 = 5; int length6 = 6; int length8 = 8; int length7 = 7; bool Init = 0; bool InitGauge = 0; int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс int PresTime = 8000; // задержка между посылками запросов присутствия, мс int waitbyte = 1; // задержка между отправкой байт в сообщении, мс int Datadelay = 50; // задержка между отрисовкой данных на 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 Fuel = 0; //остаток топлива int kmAge = 0; //суточный пробег int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана float Barom = 0; // барометр byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения byte MessageRxGauge[60] = {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); Wire.begin(); rtc.begin(); dht.begin(); sensors.begin(); myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM); myGLCD.setFont(GroteskBold16x32); currentPage = '0'; drawHomeScreen(); // строка ниже используется для настройки даты и времени часов // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата // (год, месяц, день, часы, минуты, секунды) //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0)); Temperature (); pinMode(TX, OUTPUT); pinMode(TX_gauge, OUTPUT); fastinit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SETUP FIN ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //LOOP ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { 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 (millis() - prevPID > PIDTime) {PIDs(); if (InitGauge){PIDsGauge();} prevPID = millis();}} else if (millis() - prevpres > PresTime) {present(); prevpres = millis();} if (!InitGauge) { Serial.println ("Otpravil zapros adress Gauge"); digitalWrite (TX_gauge, HIGH); delay (500); digitalWrite (TX_gauge, LOW); delay (20); digitalWrite (TX_gauge, HIGH ); delay (15); digitalWrite (TX_gauge, LOW); delay (5); digitalWrite (TX_gauge, HIGH); delay (5); mySerial_gauge.begin(9600); }} receive (); if (millis() - prevWatch > 3000) { Watch (); prevWatch = millis();} if (millis() - prevTemperature > 60000) { Temperature (); prevTemperature = millis();} if (millis() - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;} Menu(); LCDDataPrint(); } void LCDDataPrint(){ unsigned long curData = millis(); if (millis() - prevData > Datadelay){ myGLCD.setColor(255, 255, 255); myGLCD.printNumI(Speed, 350, 0, 3); if (currentPage == '0') { myGLCD.printNumF(LHor, 1, 165, 40, '.',5); myGLCD.printNumF(L100, 1, 165, 75,'.',5 ); myGLCD.printNumI(h, 165, 145, 5 ); myGLCD.printNumI(PumpRPM, 165, 180,5); myGLCD.printNumI(RPM, 165, 215,5); myGLCD.printNumI(Temp, 410, 40, 3); myGLCD.printNumI(TempOil, 410, 75, 3); myGLCD.printNumI(TempFuel, 410, 110,3); myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3); myGLCD.printNumI(t, 410, 180, 3); myGLCD.printNumI(TempAir, 410, 215, 3); } if (currentPage == '1') { myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3); myGLCD.printNumF(DesInj,1, 395, 75, '.', 4); myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4); myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); myGLCD.printNumI(MAF, 170, 215, 4); myGLCD.printNumF(Barom, 1, 415, 215); } //---------------------------------------------------------- //страниц INF2 //---------------------------------------------------------- if (currentPage == '2') { myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4); myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); myGLCD.printNumI(EGRmg, 395, 110, 4); myGLCD.printNumF(EGRPul,1, 395, 145,'.',3); myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4); myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3); } prevData = millis(); } } /////////////////////////////////////////////////////////////////////////// //отправка запроса пид 2101 void PIDs() { Serial.println ("Otpravil zapros 21 01"); for (int i = 0; i < length6; i++) { mySerial.write(messagePids[i]); delay (waitbyte); } } void PIDsGauge() { Serial.println (" Otpravil zapros 02 11 na panel"); mySerial_gauge.write (0x02); delay (1); mySerial_gauge.write (0x11); delay (1); mySerial_gauge.write(byte(0)); delay (1); mySerial_gauge.write (0x13); } //отправка запроса присутствия void present() { Serial.println ("Otpravil zapros Present"); for (int i = 0; i < length5; i++) { mySerial.write(messagePresent[i]); delay (waitbyte); } } ///////////////////////////////////////////////////////////////////////////////////////////// //получение данных от ЭБУ, разборка входящих сообщений ///////////////////////////////////////////////////////////////////////////////////////////// void receive () { ////////////////// работа с К-Line софт сериал 12-13 (12 контакт ОБД) int sh = 0; while (mySerial_gauge.available()&& !InitGauge && sh < 5) { sh++; byte inByte = mySerial_gauge.read(); Serial.print(" "); Serial.print(inByte,HEX); delay(2); if (inByte==0x80) {mySerial_gauge.write (0x7F); InitGauge=1; Serial.println (" InitGauge OK!!!!: "); } } if (mySerial_gauge.available()&& InitGauge) { delay(100); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) { // Fuel = каким байтам равен остаток топлива? // kmAge = каким байтам равен суточный пробег? } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } ////////////////// работа с К-Line софт сериал 10-11 (7 контакт ОБД) if (mySerial.available()) { delay(190); int k=0; byte inbyte=0; while( mySerial.available() && k < 110) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } Serial.print ("Receive: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1; timerenabledInit=0; Serial.println (" Initialization OK!!!!: "); } if (currentPage == '3'){ //при получении этого сообщения выдавать на третий экран "NO ERROR" if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("NO DTC", 165, 145); Serial.println (" NO DTC "); } //при получении этого сообщения выдавать на третий экран "DTC BORRADO" if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("DTC BORRADO", 165, 145); Serial.println (" DTC BORRADO "); } // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){ Serial.println ("DTC is found!"); myGLCD.clrScr(); drawscreen_three(); for (int i=0; i<MessageRx[8]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0); myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0); myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый myGLCD.print("ERROR ", 50, (75+y)); myGLCD.printNumI((i+1), 150, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y)); if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;} if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;} if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо } } //прописываем формулы к данным else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) { Barom = MessageRx[39]; L100 = (float)LHor*100.0/(float)Speed; LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85; MAF = ((MessageRx[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() ; Watch (); myGLCD.drawLine(250,35,250,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() ; 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() ; 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() { 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.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.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.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.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.print("ERASE", 25, 265); } void buttonERASETouch () { if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) { drawFrame(10, 255, 120, 310); Erase(); //потом заменить на дейсвие }} 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.print("READ", 375, 265); } void buttonREADTouch() { if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) { drawFrame(350, 255, 470, 310); Read(); //потом заменить на дейсвие }} //////////////////////////////////////////////////////////////////////////////////////// //прорисовка линий /////////////////////////////////////////////////////////////////////////////////////// void line() { myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,73,479,73); // линия горизонтальная myGLCD.drawLine(1,108,479,108); // линия горизонтальная myGLCD.drawLine(1,143,479,143); // линия горизонтальная myGLCD.drawLine(1,178,479,178); // линия горизонтальная myGLCD.drawLine(1,212,479,212); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная } ///////////////////////////////////////////////////////////////////////////////////////////// //верхняя часть экрана часы и дата отображается на всех экранах ///////////////////////////////////////////////////////////////////////////////////////////// void Watch (){ DateTime now = rtc.now(); int m = now.minute(); int hour = now.hour(); int mon = now.month(); int date = now.day(); myGLCD.setColor(0, 255, 0); //зеленый цвет цифры 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.print("Km/h", 410, 0); } void Temperature (){ h = dht.readHumidity(); t = dht.readTemperature(); sensors.requestTemperatures(); }адаптер дает меньше напряжение чем нужно. на первом 10.8в а на втором только 5.4в. минимум должно быть 9.6в. блин, остальные адаптеры дома. иду разбераться. попробую другой резистер впаять.
это какой? на MC33290? он вроде самый стабильный должен быть
проверь, также напргугу на линии питания адаптера по 12В и 5В
вопрос решился так. взаимо заменил адаптеры местами, с которым до этого работал это MC33290, второй адаптер у меня на BC547(адаптер 4 , из первого моего поста) он дает меньше напругу. по ходу для 7 линии достаточно 6-8 вольт, а для 12 нет. сейчас работают оба но выдает это.
Receive: 0 FF FF 83 F1 11 C1 6B 8F 40 Otpravil zapros Init Receive: FF FF 83 F1 11 C1 6B 8F 40 Initialization OK!!!!: Otpravil zapros 21 01 Otpravil zapros adress Gauge Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 55 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge7 контакт проходит инит но не получает данные. 12 контакт получаем 55 52 80 . продвижение однако
1. вот скетч
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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); extern uint8_t GroteskBold16x32[]; int x, y; char currentPage; float h; float t; bool Dvoet = 0; ////////////////////////////////////////////////////////////////////////////// //все что касается OBD2 /////////////////////////////////////////////////////////////////////////////// #include <SoftwareSerial.h> SoftwareSerial mySerial (12, 13); //RХ,TХ SoftwareSerial mySerial_gauge (10, 11 ); //RХ,TХ #define TX_gauge 11 #define TX 13 int length5 = 5; int length6 = 6; int length8 = 8; int length7 = 7; bool Init = 0; bool InitGauge = 0; int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс int PresTime = 8000; // задержка между посылками запросов присутствия, мс int waitbyte = 1; // задержка между отправкой байт в сообщении, мс int Datadelay = 50; // задержка между отрисовкой данных на 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 Fuel = 0; //остаток топлива int kmAge = 0; //суточный пробег int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана float Barom = 0; // барометр byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения byte MessageRxGauge[60] = {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); Wire.begin(); rtc.begin(); dht.begin(); sensors.begin(); myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM); myGLCD.setFont(GroteskBold16x32); currentPage = '0'; drawHomeScreen(); // строка ниже используется для настройки даты и времени часов // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата // (год, месяц, день, часы, минуты, секунды) //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0)); Temperature (); pinMode(TX, OUTPUT); pinMode(TX_gauge, OUTPUT); fastinit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SETUP FIN ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //LOOP ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { 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 (millis() - prevPID > PIDTime) {PIDs(); if (InitGauge){PIDsGauge();} prevPID = millis();}} else if (millis() - prevpres > PresTime) {present(); prevpres = millis();} if (!InitGauge) { Serial.println ("Otpravil zapros adress Gauge"); digitalWrite (TX_gauge, HIGH); delay (500); digitalWrite (TX_gauge, LOW); delay (20); digitalWrite (TX_gauge, HIGH ); delay (15); digitalWrite (TX_gauge, LOW); delay (5); digitalWrite (TX_gauge, HIGH); delay (5); mySerial_gauge.begin(9600); }} receive (); if (millis() - prevWatch > 3000) { Watch (); prevWatch = millis();} if (millis() - prevTemperature > 60000) { Temperature (); prevTemperature = millis();} if (millis() - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;} Menu(); LCDDataPrint(); } void LCDDataPrint(){ unsigned long curData = millis(); if (millis() - prevData > Datadelay){ myGLCD.setColor(255, 255, 255); myGLCD.printNumI(Speed, 350, 0, 3); if (currentPage == '0') { myGLCD.printNumF(LHor, 1, 165, 40, '.',5); myGLCD.printNumF(L100, 1, 165, 75,'.',5 ); myGLCD.printNumI(h, 165, 145, 5 ); myGLCD.printNumI(PumpRPM, 165, 180,5); myGLCD.printNumI(RPM, 165, 215,5); myGLCD.printNumI(Temp, 410, 40, 3); myGLCD.printNumI(TempOil, 410, 75, 3); myGLCD.printNumI(TempFuel, 410, 110,3); myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3); myGLCD.printNumI(t, 410, 180, 3); myGLCD.printNumI(TempAir, 410, 215, 3); } if (currentPage == '1') { myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3); myGLCD.printNumF(DesInj,1, 395, 75, '.', 4); myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4); myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); myGLCD.printNumI(MAF, 170, 215, 4); myGLCD.printNumF(Barom, 1, 415, 215); } //---------------------------------------------------------- //страниц INF2 //---------------------------------------------------------- if (currentPage == '2') { myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4); myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); myGLCD.printNumI(EGRmg, 395, 110, 4); myGLCD.printNumF(EGRPul,1, 395, 145,'.',3); myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4); myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3); } prevData = millis(); } } /////////////////////////////////////////////////////////////////////////// //отправка запроса пид 2101 void PIDs() { Serial.println ("Otpravil zapros 21 01"); for (int i = 0; i < length6; i++) { mySerial.write(messagePids[i]); delay (waitbyte); } } void PIDsGauge() { Serial.println (" Otpravil zapros 02 11 na panel"); mySerial_gauge.write (0x02); delay (1); mySerial_gauge.write (0x11); delay (1); mySerial_gauge.write(byte(0)); delay (1); mySerial_gauge.write (0x13); } //отправка запроса присутствия void present() { Serial.println ("Otpravil zapros Present"); for (int i = 0; i < length5; i++) { mySerial.write(messagePresent[i]); delay (waitbyte); } } ///////////////////////////////////////////////////////////////////////////////////////////// //получение данных от ЭБУ, разборка входящих сообщений ///////////////////////////////////////////////////////////////////////////////////////////// void receive () { ////////////////// работа с К-Line софт сериал 12-13 (12 контакт ОБД) if (mySerial_gauge.available()&& !InitGauge) { delay(50); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRxGauge[0]==55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1; mySerial_gauge.write (0x7F); Serial.println (" InitGauge OK!!!!: "); } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } if (mySerial_gauge.available()&& InitGauge) { delay(100); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) { // Fuel = каким байтам равен остаток топлива? // kmAge = каким байтам равен суточный пробег? } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } ////////////////// работа с К-Line софт сериал 10-11 (7 контакт ОБД) if (mySerial.available()) { delay(190); int k=0; byte inbyte=0; while( mySerial.available() && k < 110) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } Serial.print ("Receive: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1; timerenabledInit=0; Serial.println (" Initialization OK!!!!: "); } if (currentPage == '3'){ //при получении этого сообщения выдавать на третий экран "NO ERROR" if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("NO DTC", 165, 145); Serial.println (" NO DTC "); } //при получении этого сообщения выдавать на третий экран "DTC BORRADO" if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("DTC BORRADO", 165, 145); Serial.println (" DTC BORRADO "); } // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){ Serial.println ("DTC is found!"); myGLCD.clrScr(); drawscreen_three(); for (int i=0; i<MessageRx[8]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0); myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0); myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый myGLCD.print("ERROR ", 50, (75+y)); myGLCD.printNumI((i+1), 150, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y)); if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;} if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;} if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо } } //прописываем формулы к данным else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) { Barom = MessageRx[39]; L100 = (float)LHor*100.0/(float)Speed; LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85; MAF = ((MessageRx[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() ; Watch (); myGLCD.drawLine(250,35,250,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() ; 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() ; 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() { 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.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.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.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.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.print("ERASE", 25, 265); } void buttonERASETouch () { if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) { drawFrame(10, 255, 120, 310); Erase(); //потом заменить на дейсвие }} 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.print("READ", 375, 265); } void buttonREADTouch() { if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) { drawFrame(350, 255, 470, 310); Read(); //потом заменить на дейсвие }} //////////////////////////////////////////////////////////////////////////////////////// //прорисовка линий /////////////////////////////////////////////////////////////////////////////////////// void line() { myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,73,479,73); // линия горизонтальная myGLCD.drawLine(1,108,479,108); // линия горизонтальная myGLCD.drawLine(1,143,479,143); // линия горизонтальная myGLCD.drawLine(1,178,479,178); // линия горизонтальная myGLCD.drawLine(1,212,479,212); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная } ///////////////////////////////////////////////////////////////////////////////////////////// //верхняя часть экрана часы и дата отображается на всех экранах ///////////////////////////////////////////////////////////////////////////////////////////// void Watch (){ DateTime now = rtc.now(); int m = now.minute(); int hour = now.hour(); int mon = now.month(); int date = now.day(); myGLCD.setColor(0, 255, 0); //зеленый цвет цифры 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.print("Km/h", 410, 0); } void Temperature (){ h = dht.readHumidity(); t = dht.readTemperature(); sensors.requestTemperatures(); }адаптер BC547 провери залил рабочий скетч и данные пошли с 7 контакта.
2. этот скетч
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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); extern uint8_t GroteskBold16x32[]; int x, y; char currentPage; float h; float t; bool Dvoet = 0; ////////////////////////////////////////////////////////////////////////////// //все что касается OBD2 /////////////////////////////////////////////////////////////////////////////// #include <SoftwareSerial.h> SoftwareSerial mySerial (12, 13); //RХ,TХ SoftwareSerial mySerial_gauge (10, 11 ); //RХ,TХ #define TX_gauge 11 #define TX 13 int length5 = 5; int length6 = 6; int length8 = 8; int length7 = 7; bool Init = 0; bool InitGauge = 0; int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс int PresTime = 8000; // задержка между посылками запросов присутствия, мс int waitbyte = 1; // задержка между отправкой байт в сообщении, мс int Datadelay = 50; // задержка между отрисовкой данных на 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 Fuel = 0; //остаток топлива int kmAge = 0; //суточный пробег int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана float Barom = 0; // барометр byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения byte MessageRxGauge[60] = {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); Wire.begin(); rtc.begin(); dht.begin(); sensors.begin(); myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM); myGLCD.setFont(GroteskBold16x32); currentPage = '0'; drawHomeScreen(); // строка ниже используется для настройки даты и времени часов // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата // (год, месяц, день, часы, минуты, секунды) //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0)); Temperature (); pinMode(TX, OUTPUT); pinMode(TX_gauge, OUTPUT); fastinit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SETUP FIN ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //LOOP ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { 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 (millis() - prevPID > PIDTime) {PIDs(); PIDsGauge(); prevPID = millis();}} else if (millis() - prevpres > PresTime) {present(); prevpres = millis();} if (!InitGauge) { digitalWrite (TX_gauge, HIGH); delay (200); digitalWrite (TX_gauge, LOW); delay (20); digitalWrite (TX_gauge, HIGH ); delay (15); digitalWrite (TX_gauge, LOW); delay (5); digitalWrite (TX_gauge, HIGH); delay (5); mySerial_gauge.begin(9600); }} receive (); if (millis() - prevWatch > 3000) { Watch (); prevWatch = millis();} if (millis() - prevTemperature > 60000) { Temperature (); prevTemperature = millis();} if (millis() - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;} Menu(); LCDDataPrint(); } void LCDDataPrint(){ unsigned long curData = millis(); if (millis() - prevData > Datadelay){ myGLCD.setColor(255, 255, 255); myGLCD.printNumI(Speed, 350, 0, 3); if (currentPage == '0') { myGLCD.printNumF(LHor, 1, 165, 40, '.',5); myGLCD.printNumF(L100, 1, 165, 75,'.',5 ); myGLCD.printNumI(h, 165, 145, 5 ); myGLCD.printNumI(PumpRPM, 165, 180,5); myGLCD.printNumI(RPM, 165, 215,5); myGLCD.printNumI(Temp, 410, 40, 3); myGLCD.printNumI(TempOil, 410, 75, 3); myGLCD.printNumI(TempFuel, 410, 110,3); myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3); myGLCD.printNumI(t, 410, 180, 3); myGLCD.printNumI(TempAir, 410, 215, 3); } if (currentPage == '1') { myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3); myGLCD.printNumF(DesInj,1, 395, 75, '.', 4); myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4); myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); myGLCD.printNumI(MAF, 170, 215, 4); myGLCD.printNumF(Barom, 1, 415, 215); } //---------------------------------------------------------- //страниц INF2 //---------------------------------------------------------- if (currentPage == '2') { myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4); myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); myGLCD.printNumI(EGRmg, 395, 110, 4); myGLCD.printNumF(EGRPul,1, 395, 145,'.',3); myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4); myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3); } prevData = millis(); } } /////////////////////////////////////////////////////////////////////////// //отправка запроса пид 2101 void PIDs() { Serial.println ("Otpravil zapros 21 01"); for (int i = 0; i < length6; i++) { mySerial.write(messagePids[i]); delay (waitbyte); } } void PIDsGauge() { Serial.println (" Otpravil zapros 02 11 na panel"); mySerial_gauge.write (0x02); delay (1); mySerial_gauge.write (0x11); delay (1); mySerial_gauge.write(byte(0)); delay (1); mySerial_gauge.write (0x13); } //отправка запроса присутствия void present() { Serial.println ("Otpravil zapros Present"); for (int i = 0; i < length5; i++) { mySerial.write(messagePresent[i]); delay (waitbyte); } } ///////////////////////////////////////////////////////////////////////////////////////////// //получение данных от ЭБУ, разборка входящих сообщений ///////////////////////////////////////////////////////////////////////////////////////////// void receive () { ////////////////// работа с К-Line софт сериал 7-8 (12 контакт ОБД) if (mySerial_gauge.available()&& !InitGauge) { delay(50); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRxGauge[0]==55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1; mySerial_gauge.write (0x7F); Serial.println (" InitGauge OK!!!!: "); } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } if (mySerial_gauge.available()&& InitGauge) { delay(100); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) { // Fuel = каким байтам равен остаток топлива? // kmAge = каким байтам равен суточный пробег? } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } ////////////////// работа с К-Line софт сериал 10-11 (7 контакт ОБД) if (mySerial.available()) { delay(190); int k=0; byte inbyte=0; while( mySerial.available() && k < 110) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } Serial.print ("Receive: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1; timerenabledInit=0; Serial.println (" Initialization OK!!!!: "); } if (currentPage == '3'){ //при получении этого сообщения выдавать на третий экран "NO ERROR" if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("NO DTC", 165, 145); Serial.println (" NO DTC "); } //при получении этого сообщения выдавать на третий экран "DTC BORRADO" if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("DTC BORRADO", 165, 145); Serial.println (" DTC BORRADO "); } // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){ Serial.println ("DTC is found!"); myGLCD.clrScr(); drawscreen_three(); for (int i=0; i<MessageRx[8]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0); myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0); myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый myGLCD.print("ERROR ", 50, (75+y)); myGLCD.printNumI((i+1), 150, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y)); if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;} if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;} if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо } } //прописываем формулы к данным else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) { Barom = MessageRx[39]; L100 = (float)LHor*100.0/(float)Speed; LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85; MAF = ((MessageRx[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() ; Watch (); myGLCD.drawLine(250,35,250,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() ; 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() ; 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() { 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.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.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.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.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.print("ERASE", 25, 265); } void buttonERASETouch () { if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) { drawFrame(10, 255, 120, 310); Erase(); //потом заменить на дейсвие }} 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.print("READ", 375, 265); } void buttonREADTouch() { if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) { drawFrame(350, 255, 470, 310); Read(); //потом заменить на дейсвие }} //////////////////////////////////////////////////////////////////////////////////////// //прорисовка линий /////////////////////////////////////////////////////////////////////////////////////// void line() { myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,73,479,73); // линия горизонтальная myGLCD.drawLine(1,108,479,108); // линия горизонтальная myGLCD.drawLine(1,143,479,143); // линия горизонтальная myGLCD.drawLine(1,178,479,178); // линия горизонтальная myGLCD.drawLine(1,212,479,212); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная } ///////////////////////////////////////////////////////////////////////////////////////////// //верхняя часть экрана часы и дата отображается на всех экранах ///////////////////////////////////////////////////////////////////////////////////////////// void Watch (){ DateTime now = rtc.now(); int m = now.minute(); int hour = now.hour(); int mon = now.month(); int date = now.day(); myGLCD.setColor(0, 255, 0); //зеленый цвет цифры 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.print("Km/h", 410, 0); } void Temperature (){ h = dht.readHumidity(); t = dht.readTemperature(); sensors.requestTemperatures(); }выдает такое
Otpravil zapros Init Receive: 0 FF FF 83 F1 11 C1 6B 8F 40 Otpravil zapros Init Receive: FF FF 83 F1 11 C1 6B 8F 40 Initialization OK!!!!: Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 55 52 80 FF FA FF FF 52 80 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 55 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 52 80 55 FF FF FF FF 52 80 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 55 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 52 80 55 FF FF FF FF 52 80 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 55 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 52 80 55 FF FF FF FF 52 80 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 55 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 52 80 55 52 80 FF FF FF FF 0 0 55 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 52 80 55 FF FF FF FF 52 80 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 55 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 52 80 55 FF FF FF FF 52 80 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 55 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 52 80 55 52 80 FF FF FF FF 0 0 55 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 52 80 55 FF FF FF FF 52 80 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF 0 0 55 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 52 80 55 FF FF FF FF 52 80 0 0 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel3. это скетч
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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); extern uint8_t GroteskBold16x32[]; int x, y; char currentPage; float h; float t; bool Dvoet = 0; ////////////////////////////////////////////////////////////////////////////// //все что касается OBD2 /////////////////////////////////////////////////////////////////////////////// #include <SoftwareSerial.h> SoftwareSerial mySerial (12, 13); //RХ,TХ SoftwareSerial mySerial_gauge (10, 11 ); //RХ,TХ #define TX_gauge 11 #define TX 13 int length5 = 5; int length6 = 6; int length8 = 8; int length7 = 7; bool Init = 0; bool InitGauge = 0; int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс int PresTime = 8000; // задержка между посылками запросов присутствия, мс int waitbyte = 1; // задержка между отправкой байт в сообщении, мс int Datadelay = 50; // задержка между отрисовкой данных на 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 Fuel = 0; //остаток топлива int kmAge = 0; //суточный пробег int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана float Barom = 0; // барометр byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения byte MessageRxGauge[60] = {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); Wire.begin(); rtc.begin(); dht.begin(); sensors.begin(); myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM); myGLCD.setFont(GroteskBold16x32); currentPage = '0'; drawHomeScreen(); // строка ниже используется для настройки даты и времени часов // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата // (год, месяц, день, часы, минуты, секунды) //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0)); Temperature (); pinMode(TX, OUTPUT); pinMode(TX_gauge, OUTPUT); fastinit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SETUP FIN ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //LOOP ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { 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 (millis() - prevPID > PIDTime) {PIDs(); if (InitGauge){PIDsGauge();} prevPID = millis();}} else if (millis() - prevpres > PresTime) {present(); prevpres = millis();} if (!InitGauge) { Serial.println ("Otpravil zapros adress Gauge"); digitalWrite (TX_gauge, HIGH); delay (500); digitalWrite (TX_gauge, LOW); delay (20); digitalWrite (TX_gauge, HIGH ); delay (15); digitalWrite (TX_gauge, LOW); delay (5); digitalWrite (TX_gauge, HIGH); delay (5); mySerial_gauge.begin(9600); }} receive (); if (millis() - prevWatch > 3000) { Watch (); prevWatch = millis();} if (millis() - prevTemperature > 60000) { Temperature (); prevTemperature = millis();} if (millis() - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;} Menu(); LCDDataPrint(); } void LCDDataPrint(){ unsigned long curData = millis(); if (millis() - prevData > Datadelay){ myGLCD.setColor(255, 255, 255); myGLCD.printNumI(Speed, 350, 0, 3); if (currentPage == '0') { myGLCD.printNumF(LHor, 1, 165, 40, '.',5); myGLCD.printNumF(L100, 1, 165, 75,'.',5 ); myGLCD.printNumI(h, 165, 145, 5 ); myGLCD.printNumI(PumpRPM, 165, 180,5); myGLCD.printNumI(RPM, 165, 215,5); myGLCD.printNumI(Temp, 410, 40, 3); myGLCD.printNumI(TempOil, 410, 75, 3); myGLCD.printNumI(TempFuel, 410, 110,3); myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3); myGLCD.printNumI(t, 410, 180, 3); myGLCD.printNumI(TempAir, 410, 215, 3); } if (currentPage == '1') { myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3); myGLCD.printNumF(DesInj,1, 395, 75, '.', 4); myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4); myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); myGLCD.printNumI(MAF, 170, 215, 4); myGLCD.printNumF(Barom, 1, 415, 215); } //---------------------------------------------------------- //страниц INF2 //---------------------------------------------------------- if (currentPage == '2') { myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4); myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); myGLCD.printNumI(EGRmg, 395, 110, 4); myGLCD.printNumF(EGRPul,1, 395, 145,'.',3); myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4); myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3); } prevData = millis(); } } /////////////////////////////////////////////////////////////////////////// //отправка запроса пид 2101 void PIDs() { Serial.println ("Otpravil zapros 21 01"); for (int i = 0; i < length6; i++) { mySerial.write(messagePids[i]); delay (waitbyte); } } void PIDsGauge() { Serial.println (" Otpravil zapros 02 11 na panel"); mySerial_gauge.write (0x02); delay (1); mySerial_gauge.write (0x11); delay (1); mySerial_gauge.write(byte(0)); delay (1); mySerial_gauge.write (0x13); } //отправка запроса присутствия void present() { Serial.println ("Otpravil zapros Present"); for (int i = 0; i < length5; i++) { mySerial.write(messagePresent[i]); delay (waitbyte); } } ///////////////////////////////////////////////////////////////////////////////////////////// //получение данных от ЭБУ, разборка входящих сообщений ///////////////////////////////////////////////////////////////////////////////////////////// void receive () { ////////////////// работа с К-Line софт сериал 12-13 (12 контакт ОБД) if (mySerial_gauge.available()&& !InitGauge) { delay(50); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRxGauge[0]==55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1; mySerial_gauge.write (0x7F); Serial.println (" InitGauge OK!!!!: "); } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } if (mySerial_gauge.available()&& InitGauge) { delay(100); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) { // Fuel = каким байтам равен остаток топлива? // kmAge = каким байтам равен суточный пробег? } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } ////////////////// работа с К-Line софт сериал 10-11 (7 контакт ОБД) if (mySerial.available()) { delay(190); int k=0; byte inbyte=0; while( mySerial.available() && k < 110) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } Serial.print ("Receive: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1; timerenabledInit=0; Serial.println (" Initialization OK!!!!: "); } if (currentPage == '3'){ //при получении этого сообщения выдавать на третий экран "NO ERROR" if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("NO DTC", 165, 145); Serial.println (" NO DTC "); } //при получении этого сообщения выдавать на третий экран "DTC BORRADO" if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("DTC BORRADO", 165, 145); Serial.println (" DTC BORRADO "); } // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){ Serial.println ("DTC is found!"); myGLCD.clrScr(); drawscreen_three(); for (int i=0; i<MessageRx[8]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0); myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0); myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый myGLCD.print("ERROR ", 50, (75+y)); myGLCD.printNumI((i+1), 150, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y)); if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;} if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;} if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо } } //прописываем формулы к данным else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) { Barom = MessageRx[39]; L100 = (float)LHor*100.0/(float)Speed; LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85; MAF = ((MessageRx[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() ; Watch (); myGLCD.drawLine(250,35,250,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() ; 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() ; 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() { 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.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.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.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.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.print("ERASE", 25, 265); } void buttonERASETouch () { if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) { drawFrame(10, 255, 120, 310); Erase(); //потом заменить на дейсвие }} 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.print("READ", 375, 265); } void buttonREADTouch() { if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) { drawFrame(350, 255, 470, 310); Read(); //потом заменить на дейсвие }} //////////////////////////////////////////////////////////////////////////////////////// //прорисовка линий /////////////////////////////////////////////////////////////////////////////////////// void line() { myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,73,479,73); // линия горизонтальная myGLCD.drawLine(1,108,479,108); // линия горизонтальная myGLCD.drawLine(1,143,479,143); // линия горизонтальная myGLCD.drawLine(1,178,479,178); // линия горизонтальная myGLCD.drawLine(1,212,479,212); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная } ///////////////////////////////////////////////////////////////////////////////////////////// //верхняя часть экрана часы и дата отображается на всех экранах ///////////////////////////////////////////////////////////////////////////////////////////// void Watch (){ DateTime now = rtc.now(); int m = now.minute(); int hour = now.hour(); int mon = now.month(); int date = now.day(); myGLCD.setColor(0, 255, 0); //зеленый цвет цифры 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.print("Km/h", 410, 0); } void Temperature (){ h = dht.readHumidity(); t = dht.readTemperature(); sensors.requestTemperatures(); }выдает это
Otpravil zapros Init Receive: 0 FF FF 83 F1 11 C1 6B 8F 40 Otpravil zapros Init Receive: FF FF 83 F1 11 C1 6B 8F 40 Initialization OK!!!!: Otpravil zapros 21 01 Otpravil zapros adress Gauge Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 55 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 52 80 55 52 80 0 0 55 Otpravil zapros 21 01 Otpravil zapros adress Gaugeэтот скетч не катит, пробуй другие
я выложил три версии которые ты дал. вроде самый оптимальный это третий или первый
ага, понял. Но ты вроде не попробовал из сообщения 921#
921 скетч
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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); extern uint8_t GroteskBold16x32[]; int x, y; char currentPage; float h; float t; bool Dvoet = 0; ////////////////////////////////////////////////////////////////////////////// //все что касается OBD2 /////////////////////////////////////////////////////////////////////////////// #include <SoftwareSerial.h> SoftwareSerial mySerial (12, 13); //RХ,TХ SoftwareSerial mySerial_gauge (10, 11 ); //RХ,TХ #define TX_gauge 11 #define TX 13 int length5 = 5; int length6 = 6; int length8 = 8; int length7 = 7; bool Init = 0; bool InitGauge = 0; int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс int PresTime = 8000; // задержка между посылками запросов присутствия, мс int waitbyte = 1; // задержка между отправкой байт в сообщении, мс int Datadelay = 50; // задержка между отрисовкой данных на 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 Fuel = 0; //остаток топлива int kmAge = 0; //суточный пробег int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана float Barom = 0; // барометр byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения byte MessageRxGauge[60] = {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); Wire.begin(); rtc.begin(); dht.begin(); sensors.begin(); myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM); myGLCD.setFont(GroteskBold16x32); currentPage = '0'; drawHomeScreen(); // строка ниже используется для настройки даты и времени часов // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата // (год, месяц, день, часы, минуты, секунды) //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0)); Temperature (); pinMode(TX, OUTPUT); pinMode(TX_gauge, OUTPUT); fastinit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SETUP FIN ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //LOOP ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { 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 (millis() - prevPID > PIDTime) {PIDs(); if (InitGauge){PIDsGauge();} prevPID = millis();}} else if (millis() - prevpres > PresTime) {present(); prevpres = millis();} if (!InitGauge) { Serial.println ("Otpravil zapros adress Gauge"); digitalWrite (TX_gauge, HIGH); delay (500); digitalWrite (TX_gauge, LOW); delay (20); digitalWrite (TX_gauge, HIGH ); delay (15); digitalWrite (TX_gauge, LOW); delay (5); digitalWrite (TX_gauge, HIGH); delay (5); mySerial_gauge.begin(9600); }} receive (); if (millis() - prevWatch > 3000) { Watch (); prevWatch = millis();} if (millis() - prevTemperature > 60000) { Temperature (); prevTemperature = millis();} if (millis() - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;} Menu(); LCDDataPrint(); } void LCDDataPrint(){ unsigned long curData = millis(); if (millis() - prevData > Datadelay){ myGLCD.setColor(255, 255, 255); myGLCD.printNumI(Speed, 350, 0, 3); if (currentPage == '0') { myGLCD.printNumF(LHor, 1, 165, 40, '.',5); myGLCD.printNumF(L100, 1, 165, 75,'.',5 ); myGLCD.printNumI(h, 165, 145, 5 ); myGLCD.printNumI(PumpRPM, 165, 180,5); myGLCD.printNumI(RPM, 165, 215,5); myGLCD.printNumI(Temp, 410, 40, 3); myGLCD.printNumI(TempOil, 410, 75, 3); myGLCD.printNumI(TempFuel, 410, 110,3); myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3); myGLCD.printNumI(t, 410, 180, 3); myGLCD.printNumI(TempAir, 410, 215, 3); } if (currentPage == '1') { myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3); myGLCD.printNumF(DesInj,1, 395, 75, '.', 4); myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4); myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); myGLCD.printNumI(MAF, 170, 215, 4); myGLCD.printNumF(Barom, 1, 415, 215); } //---------------------------------------------------------- //страниц INF2 //---------------------------------------------------------- if (currentPage == '2') { myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4); myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); myGLCD.printNumI(EGRmg, 395, 110, 4); myGLCD.printNumF(EGRPul,1, 395, 145,'.',3); myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4); myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3); } prevData = millis(); } } /////////////////////////////////////////////////////////////////////////// //отправка запроса пид 2101 void PIDs() { Serial.println ("Otpravil zapros 21 01"); for (int i = 0; i < length6; i++) { mySerial.write(messagePids[i]); delay (waitbyte); } } void PIDsGauge() { Serial.println (" Otpravil zapros 02 11 na panel"); mySerial_gauge.write (0x02); delay (1); mySerial_gauge.write (0x11); delay (1); mySerial_gauge.write(byte(0)); delay (1); mySerial_gauge.write (0x13); } //отправка запроса присутствия void present() { Serial.println ("Otpravil zapros Present"); for (int i = 0; i < length5; i++) { mySerial.write(messagePresent[i]); delay (waitbyte); } } ///////////////////////////////////////////////////////////////////////////////////////////// //получение данных от ЭБУ, разборка входящих сообщений ///////////////////////////////////////////////////////////////////////////////////////////// void receive () { ////////////////// работа с К-Line софт сериал 12-13 (12 контакт ОБД) int sh = 0; while (mySerial_gauge.available()&& !InitGauge && sh < 5) { sh++; byte inByte = mySerial_gauge.read(); Serial.print(" "); Serial.print(inByte,HEX); if (inByte==0x80) {mySerial_gauge.write (0x7F); InitGauge=1; Serial.println (" InitGauge OK!!!!: "); } } if (mySerial_gauge.available()&& InitGauge) { delay(100); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) { // Fuel = каким байтам равен остаток топлива? // kmAge = каким байтам равен суточный пробег? } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } ////////////////// работа с К-Line софт сериал 10-11 (7 контакт ОБД) if (mySerial.available()) { delay(190); int k=0; byte inbyte=0; while( mySerial.available() && k < 110) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } Serial.print ("Receive: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1; timerenabledInit=0; Serial.println (" Initialization OK!!!!: "); } if (currentPage == '3'){ //при получении этого сообщения выдавать на третий экран "NO ERROR" if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("NO DTC", 165, 145); Serial.println (" NO DTC "); } //при получении этого сообщения выдавать на третий экран "DTC BORRADO" if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("DTC BORRADO", 165, 145); Serial.println (" DTC BORRADO "); } // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){ Serial.println ("DTC is found!"); myGLCD.clrScr(); drawscreen_three(); for (int i=0; i<MessageRx[8]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0); myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0); myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый myGLCD.print("ERROR ", 50, (75+y)); myGLCD.printNumI((i+1), 150, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y)); if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;} if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;} if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо } } //прописываем формулы к данным else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) { Barom = MessageRx[39]; L100 = (float)LHor*100.0/(float)Speed; LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85; MAF = ((MessageRx[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() ; Watch (); myGLCD.drawLine(250,35,250,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() ; 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() ; 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() { 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.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.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.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.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.print("ERASE", 25, 265); } void buttonERASETouch () { if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) { drawFrame(10, 255, 120, 310); Erase(); //потом заменить на дейсвие }} 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.print("READ", 375, 265); } void buttonREADTouch() { if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) { drawFrame(350, 255, 470, 310); Read(); //потом заменить на дейсвие }} //////////////////////////////////////////////////////////////////////////////////////// //прорисовка линий /////////////////////////////////////////////////////////////////////////////////////// void line() { myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,73,479,73); // линия горизонтальная myGLCD.drawLine(1,108,479,108); // линия горизонтальная myGLCD.drawLine(1,143,479,143); // линия горизонтальная myGLCD.drawLine(1,178,479,178); // линия горизонтальная myGLCD.drawLine(1,212,479,212); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная } ///////////////////////////////////////////////////////////////////////////////////////////// //верхняя часть экрана часы и дата отображается на всех экранах ///////////////////////////////////////////////////////////////////////////////////////////// void Watch (){ DateTime now = rtc.now(); int m = now.minute(); int hour = now.hour(); int mon = now.month(); int date = now.day(); myGLCD.setColor(0, 255, 0); //зеленый цвет цифры 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.print("Km/h", 410, 0); } void Temperature (){ h = dht.readHumidity(); t = dht.readTemperature(); sensors.requestTemperatures(); }вот результат
Otpravil zapros Init Receive: 0 FF FF 83 F1 11 C1 6B 8F 40 Otpravil zapros Init Receive: FF FF 83 F1 11 C1 6B 8F 40 Initialization OK!!!!: Otpravil zapros 21 01 Otpravil zapros adress Gauge Otpravil zapros 21 01 Otpravil zapros adress Gauge 55 52 80 InitGauge OK!!!!: ReceiveGauge: 55 52 80 0 0 FF 55 Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: 52 80 55 FF 93 FE FF 80 FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panelнашел косяк
921 дал инит ок на 12 контакт
короче вот так, но чето надо все равно менять
///////////////////////////////////////////////////////////////////////////////////////// //библиотеки /////////////////////////////////////////////////////////////////////////////////////////// #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); extern uint8_t GroteskBold16x32[]; int x, y; char currentPage; float h; float t; bool Dvoet = 0; ////////////////////////////////////////////////////////////////////////////// //все что касается OBD2 /////////////////////////////////////////////////////////////////////////////// #include <SoftwareSerial.h> SoftwareSerial mySerial (12, 13); //RХ,TХ SoftwareSerial mySerial_gauge (10, 11 ); //RХ,TХ #define TX_gauge 11 #define TX 13 int length5 = 5; int length6 = 6; int length8 = 8; int length7 = 7; bool Init = 0; bool InitGauge = 0; int PIDTime = 120; // задержка ожидания запроса следующего pid 2101, мс int PresTime = 8000; // задержка между посылками запросов присутствия, мс int waitbyte = 1; // задержка между отправкой байт в сообщении, мс int Datadelay = 50; // задержка между отрисовкой данных на 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 Fuel = 0; //остаток топлива int kmAge = 0; //суточный пробег int colerror = 0; //количество ошибок в правом верхнем углу третьего экрана float Barom = 0; // барометр byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения byte MessageRxGauge[60] = {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); Wire.begin(); rtc.begin(); dht.begin(); sensors.begin(); myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM); myGLCD.setFont(GroteskBold16x32); currentPage = '0'; drawHomeScreen(); // строка ниже используется для настройки даты и времени часов // раскоментировать, выставить ремая и дату, залить в ардуино. в скетче закоментировать // обратно. иначе каждый раз будет по новой выствлятся это это же время и дата // (год, месяц, день, часы, минуты, секунды) //rtc.adjust(DateTime(2017, 7, 21, 13, 57, 0)); Temperature (); pinMode(TX, OUTPUT); pinMode(TX_gauge, OUTPUT); fastinit(); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //SETUP FIN ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //LOOP ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { 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 (millis() - prevPID > PIDTime) {PIDs(); if (InitGauge){PIDsGauge();} prevPID = millis();}} else if (millis() - prevpres > PresTime) {present(); prevpres = millis();} if (!InitGauge) { Serial.println ("Otpravil zapros adress Gauge"); digitalWrite (TX_gauge, HIGH); delay (200); digitalWrite (TX_gauge, LOW); delay (20); digitalWrite (TX_gauge, HIGH ); delay (15); digitalWrite (TX_gauge, LOW); delay (5); digitalWrite (TX_gauge, HIGH); delay (5); mySerial_gauge.begin(9600); }} receive (); if (millis() - prevWatch > 3000) { Watch (); prevWatch = millis();} if (millis() - prevTemperature > 60000) { Temperature (); prevTemperature = millis();} if (millis() - prevDvoet > 500) { if (!Dvoet) {myGLCD.print(":", 285, 0);} else {myGLCD.print(" ", 285, 0);} prevDvoet = millis(); Dvoet=!Dvoet;} Menu(); LCDDataPrint(); } void LCDDataPrint(){ unsigned long curData = millis(); if (millis() - prevData > Datadelay){ myGLCD.setColor(255, 255, 255); myGLCD.printNumI(Speed, 350, 0, 3); if (currentPage == '0') { myGLCD.printNumF(LHor, 1, 165, 40, '.',5); myGLCD.printNumF(L100, 1, 165, 75,'.',5 ); myGLCD.printNumI(h, 165, 145, 5 ); myGLCD.printNumI(PumpRPM, 165, 180,5); myGLCD.printNumI(RPM, 165, 215,5); myGLCD.printNumI(Temp, 410, 40, 3); myGLCD.printNumI(TempOil, 410, 75, 3); myGLCD.printNumI(TempFuel, 410, 110,3); myGLCD.printNumI(sensors.getTempCByIndex(0), 410, 145 , 3); myGLCD.printNumI(t, 410, 180, 3); myGLCD.printNumI(TempAir, 410, 215, 3); } if (currentPage == '1') { myGLCD.printNumF(StaDaliv,1, 395, 40,'.', 3); myGLCD.printNumF(DesInj,1, 395, 75, '.', 4); myGLCD.printNumF(ActInj,1, 395, 110,'.', 4); myGLCD.printNumF(DesaInjQua,1, 395, 145,'.', 4); myGLCD.printNumF(InjQua,1, 395, 180,'.', 4); myGLCD.printNumI(MAF, 170, 215, 4); myGLCD.printNumF(Barom, 1, 415, 215); } //---------------------------------------------------------- //страниц INF2 //---------------------------------------------------------- if (currentPage == '2') { myGLCD.printNumF(BoostPres,1, 395, 40,'.', 4); myGLCD.printNumF(BoostPresCom,1, 395, 75,'.', 4); myGLCD.printNumI(EGRmg, 395, 110, 4); myGLCD.printNumF(EGRPul,1, 395, 145,'.',3); myGLCD.printNumF(SolenPul, 1, 395, 180,'.', 4); myGLCD.printNumF(SolenPre, 0, 395, 215,'.', 3); } prevData = millis(); } } /////////////////////////////////////////////////////////////////////////// //отправка запроса пид 2101 void PIDs() { Serial.println ("Otpravil zapros 21 01"); for (int i = 0; i < length6; i++) { mySerial.write(messagePids[i]); delay (waitbyte); } } void PIDsGauge() { Serial.println (" Otpravil zapros 02 11 na panel"); mySerial_gauge.write (0x02); delay (1); mySerial_gauge.write (0x11); delay (1); mySerial_gauge.write(byte(0)); delay (1); mySerial_gauge.write (0x13); } //отправка запроса присутствия void present() { Serial.println ("Otpravil zapros Present"); for (int i = 0; i < length5; i++) { mySerial.write(messagePresent[i]); delay (waitbyte); } } ///////////////////////////////////////////////////////////////////////////////////////////// //получение данных от ЭБУ, разборка входящих сообщений ///////////////////////////////////////////////////////////////////////////////////////////// void receive () { ////////////////// работа с К-Line софт сериал 12-13 (12 контакт ОБД) if (mySerial_gauge.available()&& InitGauge) { delay(100); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); //при получении сообщения с данными от панели приборов, запишем в переменные остаток топлива и пробег if (MessageRxGauge[0]==23 && MessageRxGauge[1]==0xA1 && MessageRxGauge[2]==0x04) { // Fuel = каким байтам равен остаток топлива? // kmAge = каким байтам равен суточный пробег? } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } if (mySerial_gauge.available()&& !InitGauge) { delay(50); int k=0; byte inbyte=0; while( mySerial_gauge.available() && k < 60) { inbyte = mySerial_gauge.read(); MessageRxGauge[k] = inbyte; k++; } Serial.print (" ReceiveGauge: "); for (int i = 0; i < k; i++) { Serial.print(MessageRxGauge[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRxGauge[0]==0x55 && MessageRxGauge[1]==0x52 && MessageRxGauge[2]==0x80) {InitGauge=1; mySerial_gauge.write (0x7F); Serial.println (" InitGauge OK!!!!: "); } for (int i = 0; i < 60; i++) MessageRxGauge[i]=0; // очистка байтов массива } ////////////////// работа с К-Line софт сериал 10-11 (7 контакт ОБД) if (mySerial.available()) { delay(190); int k=0; byte inbyte=0; while( mySerial.available() && k < 110) { inbyte = mySerial.read(); MessageRx[k] = inbyte; k++; } Serial.print ("Receive: "); for (int i = 0; i < k; i++) { Serial.print(MessageRx[i],HEX); Serial.print (" ");} Serial.println (""); if (MessageRx[2]==0x83 && MessageRx[3]==0xF1 && MessageRx[4]==0x11 && MessageRx[5]==0xC1 && MessageRx[6]==0x6B && MessageRx[7]==0x8F && MessageRx[8]==0x40) {Init=1; timerenabledInit=0; Serial.println (" Initialization OK!!!!: "); } if (currentPage == '3'){ //при получении этого сообщения выдавать на третий экран "NO ERROR" if (MessageRx[4]==0x82 && MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]==0x00 && MessageRx[9]==0xDC){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("NO DTC", 165, 145); Serial.println (" NO DTC "); } //при получении этого сообщения выдавать на третий экран "DTC BORRADO" if (MessageRx[3]==0x83 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x54 && MessageRx[7]==0xFF && MessageRx[8]==0x00 && MessageRx[9]==0xD8){ myGLCD.clrScr(); drawscreen_three(); myGLCD.print("DTC BORRADO", 165, 145); Serial.println (" DTC BORRADO "); } // при получении сообщения о наличии ошибок DTC разберем сообщение выведем на экран ошибки if (MessageRx[5]==0xF1 && MessageRx[6]==0x11 && MessageRx[7]==0x58 && MessageRx[8]>0){ Serial.println ("DTC is found!"); myGLCD.clrScr(); drawscreen_three(); for (int i=0; i<MessageRx[8]; i++ ) { int y = i*35; bool nolA=0; bool nolB =0; if (!bitRead(MessageRx[11+(i*3)],6) && bitRead(MessageRx[11+(i*3)],7)){ myGLCD.setColor (255,0,0); myGLCD.print(" -Passive-", 300, (75+y));} // если DTC пасивныый делаем цвет красный if (bitRead(MessageRx[11+(i*3)],7) && bitRead(MessageRx[11+(i*3)],6)) {myGLCD.setColor (0,255,0); myGLCD.print(" -Active-", 300, (75+y));} // если DTC активный, делаем цвет зеленый myGLCD.print("ERROR ", 50, (75+y)); myGLCD.printNumI((i+1), 150, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": P", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && !bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": C", 170, (75+y)); if (!bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": B", 170, (75+y)); if (bitRead(MessageRx[9+(i*3)],6) && bitRead(MessageRx[9+(i*3)],7)) myGLCD.print(": U", 170, (75+y)); if (MessageRx[9+(i*3)]==0x00) {myGLCD.print("00", 230, (75+y)); nolA = 1;} if (MessageRx[9+(i*3)]<=0x0F&&MessageRx[9+(i*3)]!=0) {myGLCD.print("0", 230, (75+y)); nolA = 1;}//расположение первых нулей if (nolA)myGLCD.print(String (MessageRx[9+(i*3)],HEX), 246, (75+y)); //вторая цифра расположение else myGLCD.print(String (MessageRx[9+(i*3)],HEX), 230, (75+y)); //расположение первых циыфр if (MessageRx[10+(i*3)]==0x00) {myGLCD.print("00", 262, (75+y)); nolB = 1;} if (MessageRx[10+(i*3)]<=0x0F&&MessageRx[10+(i*3)]!=0) {myGLCD.print("0", 262, (75+y)); nolB = 1;} //позиция первого ноля if (nolB)myGLCD.print(String (MessageRx[10+(i*3)]),HEX, 278, (75+y)); else myGLCD.print(String (MessageRx[10+(i*3)],HEX), 262, (75+y));} //двигает воторой байт в2 и 3 соо } } //прописываем формулы к данным else if (MessageRx[3]==0x80 && MessageRx[4]==0xF1 && MessageRx[5]==0x11 && MessageRx[6]==0x4C && MessageRx[7]==0x61 && MessageRx[8]==0x01) { Barom = MessageRx[39]; L100 = (float)LHor*100.0/(float)Speed; LHor = (float)RPM* (float)InjQua*2.00/1000.0*60.00/1000.0/0.85; MAF = ((MessageRx[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() ; Watch (); myGLCD.drawLine(250,35,250,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() ; 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() ; 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() { 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.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.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.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.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.print("ERASE", 25, 265); } void buttonERASETouch () { if ((x>=10) && (x<=120) && (y>=255) && (y<=310)) { drawFrame(10, 255, 120, 310); Erase(); //потом заменить на дейсвие }} 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.print("READ", 375, 265); } void buttonREADTouch() { if ((x>=350) && (x<=470) && (y>=255) && (y<=310)) { drawFrame(350, 255, 470, 310); Read(); //потом заменить на дейсвие }} //////////////////////////////////////////////////////////////////////////////////////// //прорисовка линий /////////////////////////////////////////////////////////////////////////////////////// void line() { myGLCD.setColor(255, 0, 0); // цвет линии красный myGLCD.drawLine(1,35,479,35); // линия горизонтальная myGLCD.drawLine(1,73,479,73); // линия горизонтальная myGLCD.drawLine(1,108,479,108); // линия горизонтальная myGLCD.drawLine(1,143,479,143); // линия горизонтальная myGLCD.drawLine(1,178,479,178); // линия горизонтальная myGLCD.drawLine(1,212,479,212); // линия горизонтальная myGLCD.drawLine(1,248,479,248); // линия горизонтальная } ///////////////////////////////////////////////////////////////////////////////////////////// //верхняя часть экрана часы и дата отображается на всех экранах ///////////////////////////////////////////////////////////////////////////////////////////// void Watch (){ DateTime now = rtc.now(); int m = now.minute(); int hour = now.hour(); int mon = now.month(); int date = now.day(); myGLCD.setColor(0, 255, 0); //зеленый цвет цифры 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.print("Km/h", 410, 0); } void Temperature (){ h = dht.readHumidity(); t = dht.readTemperature(); sensors.requestTemperatures(); }вот результат
Otpravil zapros Init Receive: 0 FF FF 83 F1 11 C1 6B 8F 40 Otpravil zapros Init Receive: FF FF 83 F1 11 C1 6B 8F 40 Initialization OK!!!!: Otpravil zapros 21 01 Otpravil zapros adress Gauge Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 55 52 80 55 52 80 0 0 InitGauge OK!!!!: Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FF Otpravil zapros 21 01 Otpravil zapros 02 11 na panel ReceiveGauge: FF FF FF FFзакоментируй строки с 284 по 333
я так подозреваю что задержки когда ждём наполнения буфера каждого софтсериала, (с которой мы как раз боролись) и не дают блоку отвечать, т.к. после запроса слишком много времени проходит
результат
Otpravil zapros Init Receive: 0 FF FF 83 F1 11 C1 6B 8F 40 Otpravil zapros Init Receive: FF FF 83 F1 11 C1 6B 8F 40 Initialization OK!!!!: Otpravil zapros 21 01 Otpravil zapros adress Gauge Otpravil zapros 21 01 Otpravil zapros adress Gauge ReceiveGauge: 55 52 80 55 52 80 0 0 InitGauge OK!!!!: Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panel Otpravil zapros 21 01 Otpravil zapros 02 11 na panelстранно почему то в с 7 контакта данные не идут, пока пусть это будет закоментировано
стоп. я не все закоментировал. теперь все
закоментируй ещё с 176 по 183, только в 183 одну } оставь
это странно, ведь они не зависимо друго от друга работают.
просто делай ведь всю программу останавливает. а запрос уже был послан. И нам ещё один делай добавился, но может тут ещё и в другом косяк, хз.
Самый высод будет в том если, 12 контакт и 7 контакт обд не могут одновременно работать
надеюсь что нет. ведь не зависимо по отдельности они идут, значит они не нужны друг другу. блин, надеюсь что это не так
пошли данные с 7 контакта
короче 200 бод инит проходит слишком долго, что убивает связь с 7 контактом, видать сеанс заканчивается, чтоли
надо думать как сделать, может сначала с панелью инит пройти а потом с 7 контактом
а если сначало провести инит на 12 а потом на 7
дак вот я и говорю, но во время инита 7 (там тоже ведь такие же задержки) , связь с 12 пропадет))
может во время 12 инита на 7 для потдержки посылать присутсвие?
если мозгов у меня не хватит как нормально это всё прописать. Берешь другую ардуино там всё спокойно пишем для 12 контакта, и можно по сериалу две переменных на большую дуню слать и всё
или перед 12 инитом сделать гдето задержку чтобы 7 начал получать данные а потом пошел 12 инит
может во время 12 инита на 7 для потдержки посылать присутсвие?
во время delay мы вообще ничего никуда посылать не можем. Программа стоит в это время